diff --git a/.github/actions/deploy-cloudflare-worker/action.yml b/.github/actions/deploy-cloudflare-worker/action.yml index 0fd58a68f..41c58aa14 100644 --- a/.github/actions/deploy-cloudflare-worker/action.yml +++ b/.github/actions/deploy-cloudflare-worker/action.yml @@ -1,5 +1,5 @@ -name: 'Print Wrangler Logs' -description: 'Prints Wrangler logs files if exist' +name: 'Deploy worker' +description: 'Deploys worker' inputs: WORKERS_AI_API_KEY: description: 'The Workers AI API Key' @@ -12,7 +12,7 @@ inputs: required: true BUCKET_SECRET_KEY: description: 'The Bucket Secret Key' - requuired: true + required: true GOOGLE_CLIENT_SECRET: description: 'The Google client secret' required: true @@ -59,7 +59,7 @@ inputs: runs: using: 'composite' steps: - - name: Deploy database + - name: Deploy worker uses: cloudflare/wrangler-action@v3.3.2 with: wranglerVersion: '3.75.0' diff --git a/.github/actions/migrate-d1-database/action.yml b/.github/actions/migrate-d1-database/action.yml index 3388d50f2..0ed1b06bd 100644 --- a/.github/actions/migrate-d1-database/action.yml +++ b/.github/actions/migrate-d1-database/action.yml @@ -1,5 +1,5 @@ -name: 'Print Wrangler Logs' -description: 'Prints Wrangler logs files if exist' +name: 'Migrate DB' +description: 'Applies DB migrations' inputs: CLOUDFLARE_API_TOKEN: description: 'Cloudflare API Token' diff --git a/.github/actions/setup-wrangler-toml/action.yml b/.github/actions/setup-wrangler-toml-and-dotenv/action.yml similarity index 70% rename from .github/actions/setup-wrangler-toml/action.yml rename to .github/actions/setup-wrangler-toml-and-dotenv/action.yml index 4b30474c7..65a3daec7 100644 --- a/.github/actions/setup-wrangler-toml/action.yml +++ b/.github/actions/setup-wrangler-toml-and-dotenv/action.yml @@ -1,52 +1,53 @@ -name: "Generate Wrangler TOML" -description: "Generates the wrangler.toml file for Cloudflare Workers" +name: 'Generate Wrangler TOML and Dotenv File' +description: 'Generates wrangler.toml and .env files for Cloudflare Workers' inputs: APP_URL: - description: "The Application URL" + description: 'The Application URL' required: true AWS_SIGN_ALGORITHM: - description: "The AWS sign algorithm" + description: 'The AWS sign algorithm' required: true BUCKET_ENDPOINT: - description: "The bucket endpoint" + description: 'The bucket endpoint' required: true BUCKET_NAME: - description: "The bucket name" + description: 'The bucket name' required: true BUCKET_REGION: - description: "The bucket region" + description: 'The bucket region' required: true BUCKET_SERVICE: - description: "The bucket service" + description: 'The bucket service' required: true BUCKET_SESSION_TOKEN: - description: "The bucket session token" + description: 'The bucket session token' required: true environment: - description: "The current environment" + description: 'The current environment' required: true CLOUDFLARE_ACCOUNT_ID: - description: "Cloudflare Account ID" + description: 'Cloudflare Account ID' required: true DB_ID: - description: "The database ID" + description: 'The database ID' required: true GOOGLE_CLIENT_ID: - description: "Google Client ID" + description: 'Google Client ID' required: true STMP_EMAIL: - description: "SMTP Email" + description: 'SMTP Email' required: true VECTOR_INDEX_NAME: - description: "The vector index" + description: 'The vector index' required: true runs: - using: "composite" + using: 'composite' steps: - - name: Generate wrangler.toml + - name: Generate wrangler.toml and .env shell: bash working-directory: ${{ github.workspace }}/server run: | + echo 'NODE_ENV=development' > .env echo 'name = "packrat-api"' > wrangler.toml echo 'main = "src/index.ts"' >> wrangler.toml echo 'compatibility_date = "2024-03-14"' >> wrangler.toml @@ -56,11 +57,12 @@ runs: echo 'binding = "DB"' >> wrangler.toml echo 'database_name = "${{ inputs.environment }}"' >> wrangler.toml echo 'database_id = "${{ inputs.DB_ID }}"' >> wrangler.toml + echo 'migrations_dir = "${{ inputs.MIGRATIONS_PATH }}"' >> wrangler.toml + echo '[[env.${{ inputs.environment }}.r2_buckets]]' >> wrangler.toml + echo 'binding = "GEOJSON_BUCKET"' >> wrangler.toml + echo 'bucket_name = "packrat-geojson-bucket-${{ inputs.environment }}"' >> wrangler.toml echo '[env.${{ inputs.environment }}.ai]' >> wrangler.toml echo 'binding = "AI"' >> wrangler.toml - echo '[[env.${{ inputs.environment }}.vectorize]]' >> wrangler.toml - echo 'binding = "VECTOR_INDEX"' >> wrangler.toml - echo 'index_name = "${{ inputs.VECTOR_INDEX_NAME }}"' >> wrangler.toml echo '[env.${{ inputs.environment }}.vars]' >> wrangler.toml echo 'APP_URL = "${{ inputs.APP_URL }}"' >> wrangler.toml echo 'AWS_SIGN_ALGORITHM = "${{ inputs.AWS_SIGN_ALGORITHM }}"' >> wrangler.toml diff --git a/.github/workflows/backend-preview.yml b/.github/workflows/backend-preview.yml index 20b4d99b8..3a95406cd 100644 --- a/.github/workflows/backend-preview.yml +++ b/.github/workflows/backend-preview.yml @@ -8,7 +8,6 @@ on: paths: - '.github/workflows/backend-preview.yml' - 'packages/validations/**' - - 'packages/shared-types/**' - 'server/**' concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -29,8 +28,8 @@ jobs: - name: Setup JS Runtime environment uses: ./.github/actions/setup-js-runtime - - name: Generate wrangler.toml - uses: ./.github/actions/setup-wrangler-toml + - name: Generate wrangler.toml and .env + uses: ./.github/actions/setup-wrangler-toml-and-dotenv with: environment: preview APP_URL: ${{ secrets.PREVIEW_APP_URL }} @@ -42,6 +41,7 @@ jobs: BUCKET_SESSION_TOKEN: ${{ secrets.PREVIEW_BUCKET_SESSION_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.PREVIEW_CLOUDFLARE_ACCOUNT_ID }} DB_ID: ${{ secrets.PREVIEW_DB_ID }} + MIGRATIONS_PATH: migrations-preview GOOGLE_CLIENT_ID: ${{ secrets.PREVIEW_GOOGLE_CLIENT_ID }} STMP_EMAIL: ${{ secrets.PREVIEW_STMP_EMAIL }} VECTOR_INDEX_NAME: ${{ secrets.PREVIEW_VECTOR_INDEX }} diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml index 57dda3934..0e347aa86 100644 --- a/.github/workflows/backend.yml +++ b/.github/workflows/backend.yml @@ -9,7 +9,6 @@ on: paths: - '.github/workflows/backend.yml' - 'packages/validations/**' - - 'packages/shared-types/**' - 'server/**' concurrency: @@ -31,8 +30,8 @@ jobs: - name: Setup JS Runtime environment uses: ./.github/actions/setup-js-runtime - - name: Generate wrangler.toml - uses: ./.github/actions/setup-wrangler-toml + - name: Generate wrangler.toml and .env + uses: ./.github/actions/setup-wrangler-toml-and-dotenv with: environment: production APP_URL: ${{ secrets.APP_URL }} @@ -44,6 +43,7 @@ jobs: BUCKET_SESSION_TOKEN: ${{ secrets.BUCKET_SESSION_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} DB_ID: ${{ secrets.PRODUCTION_DB_ID }} + MIGRATIONS_PATH: migrations GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }} STMP_EMAIL: ${{ secrets.STMP_EMAIL }} VECTOR_INDEX_NAME: ${{ secrets.VECTOR_INDEX }} @@ -75,4 +75,3 @@ jobs: VECTORIZE_API_KEY: ${{ secrets.VECTORIZE_API_KEY }} WORKERS_AI_API_KEY: ${{ secrets.WORKERS_AI_API_KEY }} X_AMZ_SECURITY_TOKEN: ${{ secrets.X_AMZ_SECURITY_TOKEN }} - diff --git a/.github/workflows/eas-cloud.yml b/.github/workflows/eas-cloud.yml index c9a0e63fe..f3030826a 100644 --- a/.github/workflows/eas-cloud.yml +++ b/.github/workflows/eas-cloud.yml @@ -11,7 +11,6 @@ on: - 'packages/app/**' - 'apps/expo/**' - 'packages/ui/**' - - 'packages/shared-types/**' - 'packages/config/**' - 'packages/crosspath/**' diff --git a/.github/workflows/eas-local.yml b/.github/workflows/eas-local.yml index fe2803618..5a3d535fa 100644 --- a/.github/workflows/eas-local.yml +++ b/.github/workflows/eas-local.yml @@ -8,7 +8,6 @@ on: - 'packages/app/**' - 'apps/expo/**' - 'packages/ui/**' - - 'packages/shared-types/**' - 'packages/config/**' - 'packages/crosspath/**' pull_request: @@ -17,7 +16,6 @@ on: - 'packages/app/**' - 'apps/expo/**' - 'packages/ui/**' - - 'packages/shared-types/**' - 'packages/config/**' - 'packages/crosspath/**' diff --git a/apps/expo/app/(app)/(drawer)/(tabs)/(stack)/map/index.tsx b/apps/expo/app/(app)/(drawer)/(tabs)/(stack)/map/index.tsx index d0108cf7c..412f41647 100644 --- a/apps/expo/app/(app)/(drawer)/(tabs)/(stack)/map/index.tsx +++ b/apps/expo/app/(app)/(drawer)/(tabs)/(stack)/map/index.tsx @@ -21,7 +21,7 @@ export default function FeedNav() { // https://reactnavigation.org/docs/headers#replacing-the-title-with-a-custom-component }} /> - + ); } diff --git a/apps/expo/app/(app)/(drawer)/(tabs)/(stack)/maps/index.tsx b/apps/expo/app/(app)/(drawer)/(tabs)/(stack)/maps/index.tsx index c7c012c59..c632702eb 100644 --- a/apps/expo/app/(app)/(drawer)/(tabs)/(stack)/maps/index.tsx +++ b/apps/expo/app/(app)/(drawer)/(tabs)/(stack)/maps/index.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import Maps from 'app/screens/maps'; +import { OfflineMapsScreen } from 'app/modules/map/screens/OfflineMapsScreen'; import { Platform } from 'react-native'; import { Stack } from 'expo-router'; import Head from 'expo-router/head'; @@ -36,7 +36,7 @@ export default function MapsScreen() { // https://reactnavigation.org/docs/headers#replacing-the-title-with-a-custom-component }} /> - + ); } diff --git a/apps/vite/src/routeTree.gen.ts b/apps/vite/src/routeTree.gen.ts index 8e9dfcd1e..ad9342afd 100644 --- a/apps/vite/src/routeTree.gen.ts +++ b/apps/vite/src/routeTree.gen.ts @@ -339,31 +339,219 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ - IndexRoute, - DestinationQueryLazyRoute, - ItemItemIdLazyRoute, - PackIdLazyRoute, - PackCreateLazyRoute, - ProfileIdLazyRoute, - TripTripIdLazyRoute, - TripCreateLazyRoute, - AboutIndexLazyRoute, - AppearanceIndexLazyRoute, - DashboardIndexLazyRoute, - FeedIndexLazyRoute, - ItemsIndexLazyRoute, - MapIndexLazyRoute, - MapsIndexLazyRoute, - PacksIndexLazyRoute, - PasswordResetIndexLazyRoute, - PrivacyIndexLazyRoute, - ProfileIndexLazyRoute, - RegisterIndexLazyRoute, - SignInIndexLazyRoute, - TripsIndexLazyRoute, - ProfileSettingsIndexLazyRoute, -}) +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/destination/query': typeof DestinationQueryLazyRoute + '/item/$itemId': typeof ItemItemIdLazyRoute + '/pack/$id': typeof PackIdLazyRoute + '/pack/create': typeof PackCreateLazyRoute + '/profile/$id': typeof ProfileIdLazyRoute + '/trip/$tripId': typeof TripTripIdLazyRoute + '/trip/create': typeof TripCreateLazyRoute + '/about': typeof AboutIndexLazyRoute + '/appearance': typeof AppearanceIndexLazyRoute + '/dashboard': typeof DashboardIndexLazyRoute + '/feed': typeof FeedIndexLazyRoute + '/items': typeof ItemsIndexLazyRoute + '/map': typeof MapIndexLazyRoute + '/maps': typeof MapsIndexLazyRoute + '/packs': typeof PacksIndexLazyRoute + '/password-reset': typeof PasswordResetIndexLazyRoute + '/privacy': typeof PrivacyIndexLazyRoute + '/profile': typeof ProfileIndexLazyRoute + '/register': typeof RegisterIndexLazyRoute + '/sign-in': typeof SignInIndexLazyRoute + '/trips': typeof TripsIndexLazyRoute + '/profile/settings': typeof ProfileSettingsIndexLazyRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/destination/query': typeof DestinationQueryLazyRoute + '/item/$itemId': typeof ItemItemIdLazyRoute + '/pack/$id': typeof PackIdLazyRoute + '/pack/create': typeof PackCreateLazyRoute + '/profile/$id': typeof ProfileIdLazyRoute + '/trip/$tripId': typeof TripTripIdLazyRoute + '/trip/create': typeof TripCreateLazyRoute + '/about': typeof AboutIndexLazyRoute + '/appearance': typeof AppearanceIndexLazyRoute + '/dashboard': typeof DashboardIndexLazyRoute + '/feed': typeof FeedIndexLazyRoute + '/items': typeof ItemsIndexLazyRoute + '/map': typeof MapIndexLazyRoute + '/maps': typeof MapsIndexLazyRoute + '/packs': typeof PacksIndexLazyRoute + '/password-reset': typeof PasswordResetIndexLazyRoute + '/privacy': typeof PrivacyIndexLazyRoute + '/profile': typeof ProfileIndexLazyRoute + '/register': typeof RegisterIndexLazyRoute + '/sign-in': typeof SignInIndexLazyRoute + '/trips': typeof TripsIndexLazyRoute + '/profile/settings': typeof ProfileSettingsIndexLazyRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/destination/query': typeof DestinationQueryLazyRoute + '/item/$itemId': typeof ItemItemIdLazyRoute + '/pack/$id': typeof PackIdLazyRoute + '/pack/create': typeof PackCreateLazyRoute + '/profile/$id': typeof ProfileIdLazyRoute + '/trip/$tripId': typeof TripTripIdLazyRoute + '/trip/create': typeof TripCreateLazyRoute + '/about/': typeof AboutIndexLazyRoute + '/appearance/': typeof AppearanceIndexLazyRoute + '/dashboard/': typeof DashboardIndexLazyRoute + '/feed/': typeof FeedIndexLazyRoute + '/items/': typeof ItemsIndexLazyRoute + '/map/': typeof MapIndexLazyRoute + '/maps/': typeof MapsIndexLazyRoute + '/packs/': typeof PacksIndexLazyRoute + '/password-reset/': typeof PasswordResetIndexLazyRoute + '/privacy/': typeof PrivacyIndexLazyRoute + '/profile/': typeof ProfileIndexLazyRoute + '/register/': typeof RegisterIndexLazyRoute + '/sign-in/': typeof SignInIndexLazyRoute + '/trips/': typeof TripsIndexLazyRoute + '/profile/settings/': typeof ProfileSettingsIndexLazyRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '/destination/query' + | '/item/$itemId' + | '/pack/$id' + | '/pack/create' + | '/profile/$id' + | '/trip/$tripId' + | '/trip/create' + | '/about' + | '/appearance' + | '/dashboard' + | '/feed' + | '/items' + | '/map' + | '/maps' + | '/packs' + | '/password-reset' + | '/privacy' + | '/profile' + | '/register' + | '/sign-in' + | '/trips' + | '/profile/settings' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '/destination/query' + | '/item/$itemId' + | '/pack/$id' + | '/pack/create' + | '/profile/$id' + | '/trip/$tripId' + | '/trip/create' + | '/about' + | '/appearance' + | '/dashboard' + | '/feed' + | '/items' + | '/map' + | '/maps' + | '/packs' + | '/password-reset' + | '/privacy' + | '/profile' + | '/register' + | '/sign-in' + | '/trips' + | '/profile/settings' + id: + | '__root__' + | '/' + | '/destination/query' + | '/item/$itemId' + | '/pack/$id' + | '/pack/create' + | '/profile/$id' + | '/trip/$tripId' + | '/trip/create' + | '/about/' + | '/appearance/' + | '/dashboard/' + | '/feed/' + | '/items/' + | '/map/' + | '/maps/' + | '/packs/' + | '/password-reset/' + | '/privacy/' + | '/profile/' + | '/register/' + | '/sign-in/' + | '/trips/' + | '/profile/settings/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + DestinationQueryLazyRoute: typeof DestinationQueryLazyRoute + ItemItemIdLazyRoute: typeof ItemItemIdLazyRoute + PackIdLazyRoute: typeof PackIdLazyRoute + PackCreateLazyRoute: typeof PackCreateLazyRoute + ProfileIdLazyRoute: typeof ProfileIdLazyRoute + TripTripIdLazyRoute: typeof TripTripIdLazyRoute + TripCreateLazyRoute: typeof TripCreateLazyRoute + AboutIndexLazyRoute: typeof AboutIndexLazyRoute + AppearanceIndexLazyRoute: typeof AppearanceIndexLazyRoute + DashboardIndexLazyRoute: typeof DashboardIndexLazyRoute + FeedIndexLazyRoute: typeof FeedIndexLazyRoute + ItemsIndexLazyRoute: typeof ItemsIndexLazyRoute + MapIndexLazyRoute: typeof MapIndexLazyRoute + MapsIndexLazyRoute: typeof MapsIndexLazyRoute + PacksIndexLazyRoute: typeof PacksIndexLazyRoute + PasswordResetIndexLazyRoute: typeof PasswordResetIndexLazyRoute + PrivacyIndexLazyRoute: typeof PrivacyIndexLazyRoute + ProfileIndexLazyRoute: typeof ProfileIndexLazyRoute + RegisterIndexLazyRoute: typeof RegisterIndexLazyRoute + SignInIndexLazyRoute: typeof SignInIndexLazyRoute + TripsIndexLazyRoute: typeof TripsIndexLazyRoute + ProfileSettingsIndexLazyRoute: typeof ProfileSettingsIndexLazyRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + DestinationQueryLazyRoute: DestinationQueryLazyRoute, + ItemItemIdLazyRoute: ItemItemIdLazyRoute, + PackIdLazyRoute: PackIdLazyRoute, + PackCreateLazyRoute: PackCreateLazyRoute, + ProfileIdLazyRoute: ProfileIdLazyRoute, + TripTripIdLazyRoute: TripTripIdLazyRoute, + TripCreateLazyRoute: TripCreateLazyRoute, + AboutIndexLazyRoute: AboutIndexLazyRoute, + AppearanceIndexLazyRoute: AppearanceIndexLazyRoute, + DashboardIndexLazyRoute: DashboardIndexLazyRoute, + FeedIndexLazyRoute: FeedIndexLazyRoute, + ItemsIndexLazyRoute: ItemsIndexLazyRoute, + MapIndexLazyRoute: MapIndexLazyRoute, + MapsIndexLazyRoute: MapsIndexLazyRoute, + PacksIndexLazyRoute: PacksIndexLazyRoute, + PasswordResetIndexLazyRoute: PasswordResetIndexLazyRoute, + PrivacyIndexLazyRoute: PrivacyIndexLazyRoute, + ProfileIndexLazyRoute: ProfileIndexLazyRoute, + RegisterIndexLazyRoute: RegisterIndexLazyRoute, + SignInIndexLazyRoute: SignInIndexLazyRoute, + TripsIndexLazyRoute: TripsIndexLazyRoute, + ProfileSettingsIndexLazyRoute: ProfileSettingsIndexLazyRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/packages/app/components/Fab/FabNative.tsx b/packages/app/components/Fab/FabNative.tsx index 81cbe2cec..500203c6b 100644 --- a/packages/app/components/Fab/FabNative.tsx +++ b/packages/app/components/Fab/FabNative.tsx @@ -34,7 +34,6 @@ const loadStyles = (theme) => { bottom: 70, right: 40, zIndex: 1, - backgroundColor: currentTheme.colors.background, height: 54, width: 150, borderRadius: 5, diff --git a/packages/app/components/Fab/FabWeb.tsx b/packages/app/components/Fab/FabWeb.tsx index a25ff8786..cd6e9753b 100644 --- a/packages/app/components/Fab/FabWeb.tsx +++ b/packages/app/components/Fab/FabWeb.tsx @@ -32,7 +32,6 @@ const loadStyles = (theme) => { top: 50, right: 10, zIndex: 1, - backgroundColor: currentTheme.colors.background, height: 54, width: 150, borderRadius: 5, diff --git a/packages/app/components/ScoreContainer.tsx b/packages/app/components/ScoreContainer.tsx index 5e821fe1c..994589ac5 100644 --- a/packages/app/components/ScoreContainer.tsx +++ b/packages/app/components/ScoreContainer.tsx @@ -206,11 +206,11 @@ export const ScoreContainer: React.FC = ({ {description} - {isOwner && ( + {/* {isOwner && ( Calculate Score - )} + )} */} {isAlreadyScored && ( = ({ score }) => { + const { currentTheme } = useTheme(); + + return ( + + + {score} + + ); +}; diff --git a/packages/app/components/ScoreLabel/index.ts b/packages/app/components/ScoreLabel/index.ts new file mode 100644 index 000000000..738a85c08 --- /dev/null +++ b/packages/app/components/ScoreLabel/index.ts @@ -0,0 +1 @@ +export * from './ScoreLable'; diff --git a/packages/app/components/SearchInput/SearchInput.tsx b/packages/app/components/SearchInput/SearchInput.tsx index 4b80163ed..baa9ab039 100644 --- a/packages/app/components/SearchInput/SearchInput.tsx +++ b/packages/app/components/SearchInput/SearchInput.tsx @@ -170,11 +170,13 @@ export const SearchInput = forwardRef( alignSelf="center" position="relative" backgroundColor={currentTheme.colors.background} + paddingTop={10} borderRadius={8} > ( padding: 0, margin: 0, flex: 1, + fontSize: 20, }} /> {searchString && searchString.trim().length > 0 && ( diff --git a/packages/app/components/card/LargeCard.tsx b/packages/app/components/card/LargeCard.tsx index 1868503cf..4fb23bb3d 100644 --- a/packages/app/components/card/LargeCard.tsx +++ b/packages/app/components/card/LargeCard.tsx @@ -52,7 +52,8 @@ const LargeCard: React.FC = ({ }) => { const { enableDarkMode, enableLightMode, isDark, isLight, currentTheme } = useTheme(); - const containerStyle = customStyle || getContainerStyle(type); + // const containerStyle = customStyle || getContainerStyle(type); + const containerStyle = { ...getContainerStyle(type), ...(customStyle || {}) }; return ( = ({ flexDirection: 'row', gap: 15, alignItems: 'center', - paddingVertical: 15, }} > {Icon ? : null} @@ -106,9 +106,9 @@ const loadStyles = (theme: any) => { padding: currentTheme.size.mobilePadding, justifyContent: 'space-between', alignItems: 'center', - gap: 25, - flex: 1, - paddingHorizontal: 100, + // gap: 25, + // flex: 1, + // paddingHorizontal: 100, }, searchContainer: { backgroundColor: currentTheme.colors.card, @@ -127,7 +127,7 @@ const loadStyles = (theme: any) => { alignItems: 'center', textAlign: 'center', padding: Platform.OS === 'web' ? '5%' : currentTheme.size.mobilePadding, - paddingHorizontal: currentTheme.padding.paddingInside, + paddingHorizontal: 20, marginBottom: 20, height: Platform.OS === 'web' ? 'calc(min( 80vh, 80vw))' : '23%', minHeight: 350, diff --git a/packages/app/components/card/PackCardHeader/PackCardHeader.tsx b/packages/app/components/card/PackCardHeader/PackCardHeader.tsx index 2b1ed6f60..006e131c8 100644 --- a/packages/app/components/card/PackCardHeader/PackCardHeader.tsx +++ b/packages/app/components/card/PackCardHeader/PackCardHeader.tsx @@ -3,7 +3,7 @@ import useTheme from 'app/hooks/useTheme'; import { CustomCardHeader } from '../CustomCardHeader'; import { AntDesign, MaterialIcons } from '@expo/vector-icons'; import { useAuthUser } from 'app/modules/auth'; -import { CascadedDropdownComponent } from '@packrat/ui/src/CascadedDropdown'; +import { ActionsDropdownComponent } from '@packrat/ui'; import { EditableText } from '@packrat/ui/src/EditableText'; import RStack from '@packrat/ui/src/RStack'; import RIconButton from '@packrat/ui/src/RIconButton'; @@ -93,19 +93,10 @@ export const PackCardHeader = ({ data, title }: PackCardHeaderProps) => { maxWidth: 100, }} > - handleActionsOpenChange(value)} - placeholder={ - } - style={{ - height: 20, - }} - /> - } native={true} /> diff --git a/packages/app/components/card/TripCardHeader/TripCardHeader.tsx b/packages/app/components/card/TripCardHeader/TripCardHeader.tsx index 1ea206a6e..6eaa70a27 100644 --- a/packages/app/components/card/TripCardHeader/TripCardHeader.tsx +++ b/packages/app/components/card/TripCardHeader/TripCardHeader.tsx @@ -5,8 +5,8 @@ import useTheme from 'app/hooks/useTheme'; import { CustomCardHeader } from '../CustomCardHeader'; import RStack from '@packrat/ui/src/RStack'; import RIconButton from '@packrat/ui/src/RIconButton'; -import { AntDesign, MaterialIcons } from '@expo/vector-icons'; -import { CascadedDropdownComponent } from '@packrat/ui/src/CascadedDropdown'; +import { AntDesign } from '@expo/vector-icons'; +import { ActionsDropdownComponent } from '@packrat/ui/src/CascadedDropdown'; import { useFetchSingleTrip } from 'app/hooks/singletrips/useFetchSingleTrip'; import { useTripActions } from './useTripActions'; import { useAuthUser } from 'app/modules/auth'; @@ -83,19 +83,10 @@ export const TripCardHeader = ({ data, title }: TripCardHeaderProps) => { maxWidth: 100, }} > - handleActionsOpenChange(value)} - placeholder={ - } - style={{ - height: 20, - }} - /> - } native={true} /> diff --git a/packages/app/components/destination/index.tsx b/packages/app/components/destination/index.tsx index 5f53f18ca..de53d61ef 100644 --- a/packages/app/components/destination/index.tsx +++ b/packages/app/components/destination/index.tsx @@ -157,7 +157,7 @@ export const DestinationPage = () => { ) : ( { - + Search by park, city, or trail @@ -198,7 +195,7 @@ export const DestinationPage = () => { contentProps={{ shape }} type="map" /> - + {/* */} )} @@ -222,7 +219,7 @@ const loadStyles = (theme) => { headerContainer: { alignSelf: 'center', width: '90%', - backgroundColor: isDark ? '#2D2D2D' : currentTheme.colors.white, + backgroundColor: currentTheme.colors.card, padding: 25, borderRadius: 10, marginBottom: 20, diff --git a/packages/app/components/trip/TripCard.tsx b/packages/app/components/trip/TripCard.tsx index e55e4826d..01facfff0 100644 --- a/packages/app/components/trip/TripCard.tsx +++ b/packages/app/components/trip/TripCard.tsx @@ -11,7 +11,7 @@ import useCustomStyles from 'app/hooks/useCustomStyles'; import useTheme from '../../hooks/useTheme'; import { theme } from '../../theme/index'; import Carousel from '../carousel'; -import { Map } from '@packrat/map'; +import { Map } from 'app/modules/map'; import { PlacesAutocomplete } from '../PlacesAutocomplete/PlacesAutocomplete'; interface TripCardProps { diff --git a/packages/app/components/trip/TripCards/TripMapCard.tsx b/packages/app/components/trip/TripCards/TripMapCard.tsx index 69e00e388..07d5bac3d 100644 --- a/packages/app/components/trip/TripCards/TripMapCard.tsx +++ b/packages/app/components/trip/TripCards/TripMapCard.tsx @@ -1,16 +1,26 @@ import { ErrorBoundary, RStack, RText } from '@packrat/ui'; -import { Map } from '@packrat/map'; +import { Map } from 'app/modules/map'; import useTheme from 'app/hooks/useTheme'; import { TripCardBase } from './TripCardBase'; import { FontAwesome5 } from '@expo/vector-icons'; import React from 'react'; +import { getTripGEOURI } from '../utils'; interface TripMapCardProps { isLoading?: boolean; - shape: any; + shape?: any; + onVisibleBoundsChange?: (bounds: number[]) => void; + tripId?: string; + initialBounds?: any; } -export const TripMapCard = ({ isLoading, shape }: TripMapCardProps) => { +export const TripMapCard = ({ + isLoading, + shape, + initialBounds, + tripId, + onVisibleBoundsChange, +}: TripMapCardProps) => { const { currentTheme } = useTheme(); return ( @@ -31,7 +41,13 @@ export const TripMapCard = ({ isLoading, shape }: TripMapCardProps) => { ) : ( - + )} @@ -47,8 +63,7 @@ const loadStyles = (theme) => { alignItems: 'center', textAlign: 'center', padding: currentTheme.size.cardPadding, - paddingHorizontal: currentTheme.padding.paddingInside, - marginBottom: 20, + margin: 80, overflow: 'hidden', alignSelf: 'center', }; diff --git a/packages/app/components/trip/utils.ts b/packages/app/components/trip/utils.ts new file mode 100644 index 000000000..99d1120d5 --- /dev/null +++ b/packages/app/components/trip/utils.ts @@ -0,0 +1,4 @@ +import { api } from 'app/constants/api'; + +export const getTripGEOURI = (tripId: string) => + `${api}/geojson/trip/${tripId}`; diff --git a/packages/app/context/Auth/SessionProvider.tsx b/packages/app/context/Auth/SessionProvider.tsx index 47e8655d0..c5cce989a 100644 --- a/packages/app/context/Auth/SessionProvider.tsx +++ b/packages/app/context/Auth/SessionProvider.tsx @@ -1,51 +1,7 @@ -import { useRouter } from 'app/hooks/router'; - -import React, { useEffect } from 'react'; -import { useStorageState } from 'app/hooks/storage/useStorageState'; - -interface AuthContextType { - sessionSignIn: (session: any) => void; // Adjust 'any' to the specific session type - sessionSignOut: () => void; - session: string | null; - isLoading: boolean; -} - -const AuthContext = React.createContext(null); - -// // This hook can be used to access the user info. TODO: implement -export function useAuth() { - return React.useContext(AuthContext); -} - -// This hook can be used to access the user info. -export function useSession() { - const value = React.useContext(AuthContext); - if (process.env.NODE_ENV !== 'production') { - if (!value) { - throw new Error('useSession must be wrapped in a '); - } - } - - return value; -} +import { useUserQuery } from 'app/modules/auth'; export function SessionProvider(props) { - const [[isLoading, session], setSession] = useStorageState('session'); + useUserQuery(); - return ( - { - setSession(session); - }, - sessionSignOut: () => { - setSession(null); - }, - session, - isLoading, - }} - > - {props.children} - - ); + return props.children; } diff --git a/packages/app/hooks/common/index.ts b/packages/app/hooks/common/index.ts index 63fc28537..4599f670a 100644 --- a/packages/app/hooks/common/index.ts +++ b/packages/app/hooks/common/index.ts @@ -7,3 +7,4 @@ export { useScreenWidth } from './useScreenWidth'; export { useDebounce } from './useDebounce'; export { useHaptic } from './useHaptic'; export { useValidateSchema } from './useValidateSchema'; +export * from './usePreviewResourceState'; diff --git a/packages/app/hooks/common/usePreviewResourceState.ts b/packages/app/hooks/common/usePreviewResourceState.ts new file mode 100644 index 000000000..c820d6b46 --- /dev/null +++ b/packages/app/hooks/common/usePreviewResourceState.ts @@ -0,0 +1,35 @@ +import { useEffect, useState } from 'react'; +import { type PaginationReturn } from 'app/hooks/pagination'; + +interface PreviewResourceState { + isSeeAllModalOpen: boolean; + isAllQueryEnabled: boolean; + setIsSeeAllModalOpen: React.Dispatch>; +} + +export interface PreviewResourceStateWithData + extends PreviewResourceState, + Partial { + isPreviewLoading: boolean; + previewData: any; + isAllQueryLoading: boolean; + allQueryData: any; + nextPage?: number; + fetchNextPage: () => void; +} +export const usePreviewResourceState = (): PreviewResourceState => { + const [isSeeAllModalOpen, setIsSeeAllModalOpen] = useState(false); + const [isAllQueryEnabled, setIsAllQueryEnabled] = useState(false); + + useEffect(() => { + if (isSeeAllModalOpen) { + setIsAllQueryEnabled(true); + } + }, [isSeeAllModalOpen]); + + return { + isSeeAllModalOpen, + setIsSeeAllModalOpen, + isAllQueryEnabled, + }; +}; diff --git a/packages/app/hooks/pagination/index.ts b/packages/app/hooks/pagination/index.ts index 2bfee8150..612e4d2be 100644 --- a/packages/app/hooks/pagination/index.ts +++ b/packages/app/hooks/pagination/index.ts @@ -1 +1 @@ -export * from './useInfinitePagination'; +export * from './usePagination'; diff --git a/packages/app/hooks/pagination/useInfinitePagination.ts b/packages/app/hooks/pagination/usePagination.ts similarity index 67% rename from packages/app/hooks/pagination/useInfinitePagination.ts rename to packages/app/hooks/pagination/usePagination.ts index 868dab37d..91e482940 100644 --- a/packages/app/hooks/pagination/useInfinitePagination.ts +++ b/packages/app/hooks/pagination/usePagination.ts @@ -13,19 +13,30 @@ export interface PaginationParams { } interface PaginationOptions { - nextPage?: number; + prevPage?: number | false; + nextPage?: number | false; enabled?: boolean; defaultPage?: number; } -export const useInfinitePagination = ( +export const usePagination = ( fetchFunction: () => void, paginationParams: PaginationParams, setPaginationParams: Dispatch>, options: PaginationOptions = {}, ) => { const initialRender = useRef(false); - const { nextPage, enabled = true } = options; + const { prevPage, nextPage, enabled = true } = options; + + const fetchPrevPage = () => { + if (prevPage === false) { + return; + } + setPaginationParams((prev) => ({ + ...prev, + offset: prevPage, + })); + }; const fetchNextPage = () => { setPaginationParams((prev) => ({ @@ -50,9 +61,18 @@ export const useInfinitePagination = ( run(); }, [paginationParams.limit, paginationParams.offset, enabled]); - return { fetchNextPage }; + return { fetchPrevPage, fetchNextPage }; }; function getOffset(page: number, limit: number) { return (page - 1) * limit; } + +export interface PaginationReturn { + hasPrevPage: boolean; + hasNextPage: boolean; + currentPage: number; + totalPages: number; + fetchPrevPage: () => void; + fetchNextPage: () => void; +} diff --git a/packages/app/hooks/useFlatList.ts b/packages/app/hooks/useFlatList.ts new file mode 100644 index 000000000..4e3fbe104 --- /dev/null +++ b/packages/app/hooks/useFlatList.ts @@ -0,0 +1,17 @@ +import { type ReactNode } from 'react'; + +export const useFlatList = ( + sections: Record, + sectionComponents: Record, +) => { + const flatListData = Object.entries(sections); + const keyExtractor = ([key, val]) => val; + const renderItem = ({ item }) => { + const sectionKey = item[1]; + + console.log({ sectionKey }); + return sectionComponents[sectionKey]; + }; + + return { flatListData, keyExtractor, renderItem }; +}; diff --git a/packages/app/modules/auth/components/AuthLoader.tsx b/packages/app/modules/auth/components/AuthLoader.tsx index 0a4b4ce67..873cfb1c2 100644 --- a/packages/app/modules/auth/components/AuthLoader.tsx +++ b/packages/app/modules/auth/components/AuthLoader.tsx @@ -1,12 +1,11 @@ -import { useUserQuery } from '../hooks'; +import { useUserLoader } from '../hooks'; export const AuthLoader = ({ children, loadingElement, unauthorizedElement, }) => { - const { isLoading, user } = useUserQuery(); - + const { user, isLoading } = useUserLoader(); if (isLoading) { return loadingElement; } diff --git a/packages/app/modules/auth/hooks/useSessionSignIn.ts b/packages/app/modules/auth/hooks/useSessionSignIn.ts index e7e2ce25b..b853bd4e8 100644 --- a/packages/app/modules/auth/hooks/useSessionSignIn.ts +++ b/packages/app/modules/auth/hooks/useSessionSignIn.ts @@ -11,6 +11,7 @@ export const useSessionSignIn = () => { (async () => { await Storage.setItem('token', tokens.accessToken); await Storage.setItem('refreshToken', tokens.refreshToken); + setUser(tokens.user); router.push('/'); })(); }, []); diff --git a/packages/app/modules/auth/hooks/useUser.ts b/packages/app/modules/auth/hooks/useUser.ts index 4a98c9c3c..04e78e535 100644 --- a/packages/app/modules/auth/hooks/useUser.ts +++ b/packages/app/modules/auth/hooks/useUser.ts @@ -1,5 +1,7 @@ +import { useState } from 'react'; import { useStorage } from 'app/hooks/storage/useStorage'; import { queryTrpc } from 'app/trpc'; +import { useLogout } from './useLogout'; export const useAuthUserToken = () => { const [[isLoading, token]] = useStorage('token'); @@ -8,30 +10,36 @@ export const useAuthUserToken = () => { }; export const useUserQuery = () => { - const { token, isLoading: isTokenLoading } = useAuthUserToken(); - const isRequestEnabled = !!token && !isTokenLoading; - - const { - refetch, - data, - isLoading: isRequestLoading, - } = queryTrpc.getMe.useQuery(undefined, { - enabled: isRequestEnabled, + const { isLoading: isTokenLoading } = useAuthUserToken(); + const [isLoading, setIsLoading] = useState(true); + const logout = useLogout(); + + const { refetch, data } = queryTrpc.getMe.useQuery(undefined, { + onSuccess: () => { + setIsLoading(false); + }, + onError: () => { + logout(); + setIsLoading(false); + }, + enabled: isTokenLoading === undefined || isTokenLoading, + retry: false, }); - // Sometimes the isLoading state don't work as expected so we have this solution here - // isLoading stays true when request is not enabled - // TODO fix loading state - const isLoading = - (isRequestEnabled && isRequestLoading) || - isTokenLoading === undefined || - isTokenLoading; - return { user: data, isLoading, refetch }; }; export const useAuthUser = () => { - const { user, isLoading, refetch } = useUserQuery(); + const { user } = useUserLoader(); return user; }; + +export const useUserLoader = () => { + const { data: user, isLoading } = queryTrpc.getMe.useQuery(undefined, { + enabled: false, + notifyOnChangeProps: 'all', + }); + + return { user, isLoading }; +}; diff --git a/packages/app/modules/dashboard/components/QuickActionSection/QuickActionSection.tsx b/packages/app/modules/dashboard/components/QuickActionSection/QuickActionSection.tsx index 09d32845b..979b49488 100644 --- a/packages/app/modules/dashboard/components/QuickActionSection/QuickActionSection.tsx +++ b/packages/app/modules/dashboard/components/QuickActionSection/QuickActionSection.tsx @@ -9,7 +9,12 @@ export const QuickActionsSection = ({ closeQuickActions }) => { const { handleActionSelect, quickActionData } = useQuickActions(); return ( - + {quickActionData.map((action) => ( { return { section: { display: 'flex', - minWidth: 250, - justifyContent: 'center', + minWidth: 200, + minHeight: 200, + justifyContent: 'flex-start', }, }; }; diff --git a/packages/app/modules/feed/components/FeedCard/FeedCard.tsx b/packages/app/modules/feed/components/FeedCard/FeedCard.tsx index 7385a5adb..7c2dcaea1 100644 --- a/packages/app/modules/feed/components/FeedCard/FeedCard.tsx +++ b/packages/app/modules/feed/components/FeedCard/FeedCard.tsx @@ -54,209 +54,3 @@ export const FeedCard: FC = ({ item, cardType, feedType }) => { /> ); }; - -/* -export function FeedCardOld({ - type, - id, - owner, - name, - total_weight, - is_public, - favorited_by, - favorites_count, - owner_id, - destination, - createdAt, - owners, - duration, - itemPacks, -}: FeedCardProps) { - console.log('CardProps:', favorited_by); - const user = useAuthUser(); - const { currentTheme } = useTheme(); - - const { addFavorite } = useAddFavorite(); - const [weightUnit] = useItemWeightUnit(); - - const router = useRouter(); - - const isFavorite = - type !== 'trip' && - favorited_by?.some((obj) => obj?.['userId'] === user?.id && user?.id); - - const handleAddToFavorite = () => { - if (!user) return; - const data = { - packId: id, - userId: user.id, - }; - addFavorite(data); - }; - - const truncatedName = truncateString(name, 25); - const truncatedDestination = truncateString(destination, 25); - const formattedWeight = convertWeight(total_weight, 'g', weightUnit); - const quantity = - itemPacks?.reduce( - (accumulator, currentValue) => accumulator + currentValue?.item?.quantity, - 0, - ) ?? 0; - let numberOfNights; - - if (duration) numberOfNights = JSON.parse(duration).numberOfNights; - - return ( - - - - - - - -

- - - {truncatedName} - - -

- - {type === 'pack' && ( - - - - - )} - {type === 'trip' && ( - - )} - -
- {type === 'pack' && ( - <> - - Total Weight: {formatNumber(formattedWeight)} {weightUnit} - - - Total Quantity: {quantity} - - - )} - {type === 'trip' && ( - {truncatedDestination} - )} - - - - - - - View{' '} - {owner?.username ? '@' + owner?.username : 'Owner'} - - - - {formatDistanceToNow(new Date(createdAt), { - addSuffix: true, - })} - - - {type === 'pack' && ( - - - - - - {favorites_count} - - - )} - {type === 'trip' && ( - - - Nights - - - {numberOfNights} - - - )} - - - -
-
- - { - router.push(type === 'pack' ? '/pack/' + id : '/trip/' + id); - }} - > - View {type} - - { - router.push(`/profile/${owner_id}`); - }} - > - View Owner - - -
-
-
-
- ); -} -*/ diff --git a/packages/app/modules/feed/components/FeedCard/utils.ts b/packages/app/modules/feed/components/FeedCard/utils.ts index 789f44cbc..ca2e06010 100644 --- a/packages/app/modules/feed/components/FeedCard/utils.ts +++ b/packages/app/modules/feed/components/FeedCard/utils.ts @@ -23,6 +23,7 @@ export const feedItemPackCardConverter: Converter< createdAt: formatDistanceToNowStrict(new Date(input.createdAt), { addSuffix: false, }), + is_public: input.is_public, title: truncateString(input.name, 25), ownerId: typeof input.owner_id === 'string' @@ -57,6 +58,7 @@ export const feedItemTripCardConverter: Converter< addSuffix: false, }), title: truncateString(input.name, 25), + is_public: input.is_public, ownerId: typeof input.owner_id === 'string' ? input.owner_id @@ -67,6 +69,7 @@ export const feedItemTripCardConverter: Converter< startDate: input.start_date, endDate: input.end_date, activity: input.activity, + score: !isNaN(input.total_score) ? roundNumber(input.total_score) : 0, }, favoriteCount: input.favorites_count, }; diff --git a/packages/app/modules/feed/hooks/index.ts b/packages/app/modules/feed/hooks/index.ts index 88c363a55..463849d6b 100644 --- a/packages/app/modules/feed/hooks/index.ts +++ b/packages/app/modules/feed/hooks/index.ts @@ -1,4 +1,7 @@ export { useFeed } from './useFeed'; export { useAddFavorite } from './useAddFavorite'; -export { useFetchUserFavorites } from './useFetchUserFavorites'; +export { + useFetchUserFavorites, + useFetchUserFavoritesWithPreview, +} from './useFetchUserFavorites'; export * from './useFeedSortOptions'; diff --git a/packages/app/modules/feed/hooks/useFeed.ts b/packages/app/modules/feed/hooks/useFeed.ts index 911e566fe..1451d7bac 100644 --- a/packages/app/modules/feed/hooks/useFeed.ts +++ b/packages/app/modules/feed/hooks/useFeed.ts @@ -3,23 +3,13 @@ import { useUserPacks, useSimilarPacks } from 'app/modules/pack'; import { useUserTrips } from 'app/modules/trip'; import { useSimilarItems } from 'app/modules/item'; import { type FeedType } from '../model'; +import { type PaginationReturn } from 'app/hooks/pagination'; -interface UseFeedResult { +interface UseFeedResult extends Partial { data: any[] | null; isLoading: boolean; refetch?: () => void; setPage?: (page: number) => void; - nextPage?: number | boolean; - fetchNextPage?: () => void; -} - -interface UseFeedResult { - data: any[] | null; - isLoading: boolean; - refetch?: () => void; - setPage?: (page: number) => void; - nextPage?: number | boolean; - fetchNextPage?: () => void; } export const useFeed = ({ diff --git a/packages/app/modules/feed/hooks/useFetchUserFavorites.ts b/packages/app/modules/feed/hooks/useFetchUserFavorites.ts index 978fc6bff..f9c1e73d7 100644 --- a/packages/app/modules/feed/hooks/useFetchUserFavorites.ts +++ b/packages/app/modules/feed/hooks/useFetchUserFavorites.ts @@ -1,17 +1,103 @@ import { queryTrpc } from 'app/trpc'; +import { + getPaginationInitialParams, + type PaginationParams, + usePagination, +} from 'app/hooks/pagination'; +import { useEffect, useState } from 'react'; +import { + type PreviewResourceStateWithData, + usePreviewResourceState, +} from 'app/hooks/common'; -export const useFetchUserFavorites = (userId: string) => { - const enabled = !!userId; +export const useFetchUserFavorites = ( + userId: string, + { queryEnabled = true, isPreview = false, searchTerm = '' } = {}, +) => { + const enabled = !!userId && queryEnabled; + const [pagination, setPagination] = useState( + getPaginationInitialParams(), + ); const { data, error, isLoading, refetch } = queryTrpc.getUserFavorites.useQuery( - { userId }, + { userId, pagination, isPreview, searchTerm }, { enabled, refetchOnWindowFocus: false, - keepPreviousData: true, }, ); + const { fetchPrevPage, fetchNextPage } = usePagination( + refetch, + pagination, + setPagination, + { + prevPage: data?.prevOffset, + nextPage: data?.nextOffset, + enabled, + }, + ); - return { data, error, isLoading, enabled, refetch }; + useEffect(() => { + setPagination(getPaginationInitialParams()); + }, [searchTerm, userId]); + + return { + data: data?.data || [], + totalCount: data?.totalCount, + error, + isLoading, + enabled, + refetch, + fetchPrevPage, + fetchNextPage, + hasPrevPage: data?.prevOffset !== false, + hasNextPage: data?.nextOffset !== false, + currentPage: data?.currentPage, + totalPages: data?.totalPages, + }; +}; + +interface FetchUserFavoritesReturn extends PreviewResourceStateWithData { + totalCount: number; +} +export const useFetchUserFavoritesWithPreview = ( + userId: string, + searchTerm: string, +): FetchUserFavoritesReturn => { + const { isAllQueryEnabled, ...previewResourceState } = + usePreviewResourceState(); + const { data: previewData, isLoading: isPreviewLoading } = + useFetchUserFavorites(userId, { isPreview: true }); + + const { + data: allQueryData, + isLoading: isAllQueryLoading, + totalCount, + fetchPrevPage, + fetchNextPage, + totalPages, + currentPage, + hasPrevPage, + hasNextPage, + } = useFetchUserFavorites(userId, { + queryEnabled: isAllQueryEnabled, + searchTerm, + }); + + return { + ...previewResourceState, + isAllQueryEnabled, + previewData, + isPreviewLoading, + allQueryData, + isAllQueryLoading, + totalCount, + fetchPrevPage, + fetchNextPage, + totalPages, + currentPage, + hasPrevPage, + hasNextPage, + }; }; diff --git a/packages/app/modules/feed/hooks/usePublicFeed.ts b/packages/app/modules/feed/hooks/usePublicFeed.ts index d7f8c6daa..2c43528a6 100644 --- a/packages/app/modules/feed/hooks/usePublicFeed.ts +++ b/packages/app/modules/feed/hooks/usePublicFeed.ts @@ -2,9 +2,9 @@ import { queryTrpc } from 'app/trpc'; import { getPaginationInitialParams, type PaginationParams, - useInfinitePagination, + usePagination, } from 'app/hooks/pagination'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; export const usePublicFeed = ( queryBy, @@ -12,7 +12,6 @@ export const usePublicFeed = ( selectedTypes, enabled = false, ) => { - const [allData, setAllData] = useState([]); const [pagination, setPagination] = useState( getPaginationInitialParams(), ); @@ -26,33 +25,34 @@ export const usePublicFeed = ( { enabled, refetchOnWindowFocus: false, - onSuccess: (newData) => { - if (newData?.data) { - setAllData((prevData) => { - if (pagination.offset === 0) { - return newData.data; - } - - return [...prevData, ...newData.data]; - }); - } - }, onError: (error) => console.error('Error fetching public packs:', error), }, ); - const { fetchNextPage } = useInfinitePagination( + const { fetchPrevPage, fetchNextPage } = usePagination( refetch, pagination, setPagination, - { nextPage: data?.nextOffset, enabled }, + { + prevPage: data?.prevOffset, + nextPage: data?.nextOffset, + enabled, + }, ); + useEffect(() => { + setPagination(getPaginationInitialParams()); + }, [queryBy, searchQuery, selectedTypes?.pack, selectedTypes?.trip]); + return { - data: allData, + data: data?.data || [], isLoading, refetch, + fetchPrevPage, fetchNextPage, - nextPage: data?.nextOffset || false, + hasPrevPage: data?.prevOffset !== false, + hasNextPage: data?.nextOffset !== false, + currentPage: data?.currentPage, + totalPages: data?.totalPages, error: null, }; }; diff --git a/packages/app/modules/feed/index.ts b/packages/app/modules/feed/index.ts index 1b1318e65..2a168a574 100644 --- a/packages/app/modules/feed/index.ts +++ b/packages/app/modules/feed/index.ts @@ -1,6 +1,12 @@ export * from './widgets'; export * from './screens'; -export { useFeed, useAddFavorite, useFetchUserFavorites } from './hooks'; +export { + useFeed, + useAddFavorite, + useFetchUserFavorites, + useFetchUserFavoritesWithPreview, + useFeedSortOptions, +} from './hooks'; export { SearchProvider, FeedSearchFilter, diff --git a/packages/app/modules/feed/model.ts b/packages/app/modules/feed/model.ts index c7f06ff96..7c22cef99 100644 --- a/packages/app/modules/feed/model.ts +++ b/packages/app/modules/feed/model.ts @@ -44,6 +44,8 @@ export interface TripFeedItem extends BaseFeedItem { start_date: string; end_date: string; activity: string; + scores: { totalScore: number }; + total_score: number; } export type FeedItem = PackFeedItem | TripFeedItem; diff --git a/packages/app/modules/feed/screens/FeedScreen.tsx b/packages/app/modules/feed/screens/FeedScreen.tsx index 794b8a7db..5f34ec767 100644 --- a/packages/app/modules/feed/screens/FeedScreen.tsx +++ b/packages/app/modules/feed/screens/FeedScreen.tsx @@ -6,7 +6,7 @@ import { fuseSearch } from 'app/utils/fuseSearch'; import useCustomStyles from 'app/hooks/useCustomStyles'; import { useFeed } from 'app/modules/feed'; import { RefreshControl } from 'react-native'; -import { RButton, RText } from '@packrat/ui'; +import { Pagination, RButton, RText } from '@packrat/ui'; import { useAuthUser } from 'app/modules/auth'; import { type FeedType } from '../model'; @@ -29,6 +29,7 @@ interface FeedProps { const Feed = memo(function Feed({ feedType = 'public' }: FeedProps) { const router = useRouter(); + console.log({ feedType }); const [queryString, setQueryString] = useState('Favorite'); const [selectedTypes, setSelectedTypes] = useState({ pack: true, @@ -41,7 +42,17 @@ const Feed = memo(function Feed({ feedType = 'public' }: FeedProps) { const user = useAuthUser(); const ownerId = user?.id; const styles = useCustomStyles(loadStyles); - const { data, isLoading, fetchNextPage, refetch, nextPage } = useFeed({ + const { + data, + isLoading, + refetch, + fetchPrevPage, + fetchNextPage, + hasPrevPage, + hasNextPage, + currentPage, + totalPages, + } = useFeed({ queryString, ownerId, feedType, @@ -144,8 +155,15 @@ const Feed = memo(function Feed({ feedType = 'public' }: FeedProps) { showsVerticalScrollIndicator={false} maxToRenderPerBatch={2} /> - {nextPage ? ( - Load more + {totalPages > 1 ? ( + ) : null} diff --git a/packages/app/modules/feed/widgets/FeedPreview/FeedPreview.tsx b/packages/app/modules/feed/widgets/FeedPreview/FeedPreview.tsx index 0950bd7d9..0bb0dfae3 100644 --- a/packages/app/modules/feed/widgets/FeedPreview/FeedPreview.tsx +++ b/packages/app/modules/feed/widgets/FeedPreview/FeedPreview.tsx @@ -17,16 +17,21 @@ const FeedPreviewScroll: React.FC = ({ id, }) => { const { data: feedData, isLoading } = useFeed({ feedType, id }); + const validFeedData = feedData?.filter?.((item) => item.id); return isLoading ? ( ) : ( - {feedData + {validFeedData ?.filter((item): item is FeedItem => item.type !== null) .map((item: FeedItem) => { return ( - + ); diff --git a/packages/app/modules/item/components/AddItem.tsx b/packages/app/modules/item/components/AddItem.tsx index 93c3afab5..ad95b563c 100644 --- a/packages/app/modules/item/components/AddItem.tsx +++ b/packages/app/modules/item/components/AddItem.tsx @@ -1,3 +1,4 @@ +import React, { useMemo } from 'react'; import { View } from 'react-native'; import { ItemForm } from './ItemForm'; // assuming you moved the form related code to a separate component import { useAddPackItem, useEditPackItem } from 'app/modules/pack'; @@ -6,8 +7,12 @@ import { editItem as editItemSchema, type Item, } from '@packrat/validations'; -import { useMemo } from 'react'; import { useAuthUser } from 'app/modules/auth'; +import { convertWeighToSmallestUnit } from '../utils'; +import { type ItemUnit } from '../model'; +import { convertWeight } from 'app/utils/convertWeight'; +import { SMALLEST_ITEM_UNIT } from '../constants'; +import { useItemWeightUnit } from '../hooks'; interface AddItemProps { id?: string; @@ -34,19 +39,13 @@ interface AddItemProps { setRefetch?: () => void; } -type AddItem = Omit & { id: string }; - export const AddItem = ({ isEdit, initialData, packId, currentPack, - editAsDuplicate, - setPage = (page: number) => {}, // temp fix, need props type - page, closeModalHandler, isItemPage, - setIsAddItemModalOpen = () => {}, }: AddItemProps) => { // const [currPackId] = usePackId(); @@ -54,59 +53,34 @@ export const AddItem = ({ const ownerId = user?.id; - const { - // mutation: addPackItemMutation - isLoading, - isError, - addPackItem, - } = useAddPackItem(); - const { - // mutation: addPackItemMutation - - editPackItem, - } = useEditPackItem(isItemPage); - - const convertWeighToSmallestUnit = (unit, weight) => { - let convertedWeight; - - if (unit === 'lb') { - convertedWeight = weight * 453.592; - } else if (unit === 'oz') { - convertedWeight = weight * 28.3495; - } else if (unit === 'kg') { - convertedWeight = weight * 1000; - } else if (unit === 'g') { - convertedWeight = weight; - } else { - throw new Error(`Unsupported unit: ${unit}`); - } - - return parseFloat(convertedWeight.toFixed(1)); - }; + const { isLoading, addPackItem } = useAddPackItem(); + const [userPreferUnit] = useItemWeightUnit(); + const { editPackItem } = useEditPackItem(isItemPage); const handleSubmit = (data: Item) => { - - const convertedData = { - ...data, - weight: convertWeighToSmallestUnit(data.unit, data.weight), - } if (isEdit) { - editPackItem(convertedData as any); + editPackItem(data as any); } else { - addPackItem(convertedData); + addPackItem(data); } if (closeModalHandler) closeModalHandler(); }; const defaultValues = useMemo(() => { if (!initialData) { - return { unit: 'lb', ownerId, packId }; + return { unit: userPreferUnit, ownerId, packId }; } const result = { id: '', ownerId, name: initialData.name || '', - weight: initialData.weight, + weight: initialData.unit + ? convertWeight( + initialData.weight, + SMALLEST_ITEM_UNIT, + initialData.unit, + ) + : undefined, quantity: initialData.quantity, type: initialData.category?.name, unit: initialData.unit, @@ -120,7 +94,7 @@ export const AddItem = ({ } return result; - }, [initialData, isEdit, packId, ownerId]); + }, [initialData, isEdit, packId, ownerId, userPreferUnit]); return ( diff --git a/packages/app/modules/item/components/ImportForm.tsx b/packages/app/modules/item/components/ImportForm.tsx index 1ca70301a..78efd4cf2 100644 --- a/packages/app/modules/item/components/ImportForm.tsx +++ b/packages/app/modules/item/components/ImportForm.tsx @@ -27,13 +27,11 @@ interface SelectedType { value: string; } -const options = [ - { label: 'bucket 1', value: 'bucket 1', key: 'bucket 1' }, - { label: 'bucket 2', value: 'bucket 2', key: 'bucket 1' }, - { label: 'bucket 3', value: 'bucket 3', key: 'bucket 1' }, - { label: 'bucket 4', value: 'bucket 4', key: 'bucket 1' }, - { label: 'bucket 5', value: 'bucket 5', key: 'bucket 1' }, -]; +const bucketCount = 6; +const options = Array.from({ length: bucketCount }, (_, i) => { + const bucket = `bucket ${i + 1}`; + return { label: bucket, value: bucket, key: bucket }; +}); const csvOption = [{ label: 'CSV', value: '.csv', key: '.csv' }]; @@ -149,7 +147,7 @@ export const ImportForm: FC = ({ }} > = ({ ); -}; \ No newline at end of file +}; diff --git a/packages/app/modules/item/constants.ts b/packages/app/modules/item/constants.ts index c905bce89..8c54122f8 100644 --- a/packages/app/modules/item/constants.ts +++ b/packages/app/modules/item/constants.ts @@ -10,3 +10,5 @@ export const ItemCategoryEnum = { // MEDICAL: 'Medical', // OTHER: 'Other', }; + +export const SMALLEST_ITEM_UNIT = 'g'; diff --git a/packages/app/modules/item/hooks/index.ts b/packages/app/modules/item/hooks/index.ts index 9e636d619..2663b2c3d 100644 --- a/packages/app/modules/item/hooks/index.ts +++ b/packages/app/modules/item/hooks/index.ts @@ -8,4 +8,5 @@ export { useItemId } from './useItemId'; export { useItem } from './useItem'; export { useItemRow } from './useItemRow'; export { useImportItem } from './useImportItem'; -export { useImportFromBucket } from './useImportFromBucket'; \ No newline at end of file +export { useImportFromBucket } from './useImportFromBucket'; +export { useItemImages } from './useItemImages'; \ No newline at end of file diff --git a/packages/app/modules/item/hooks/useItemImages.ts b/packages/app/modules/item/hooks/useItemImages.ts new file mode 100644 index 000000000..ab2340df1 --- /dev/null +++ b/packages/app/modules/item/hooks/useItemImages.ts @@ -0,0 +1,16 @@ +import { queryTrpc } from 'app/trpc'; + +export const useItemImages = (itemId?: string) => { + const { refetch, data, error, isLoading, isError } = + queryTrpc.getItemImages.useQuery( + { id: itemId }, + { + enabled: !!itemId, + refetchOnWindowFocus: false, + staleTime: Infinity, + cacheTime: Infinity, + }, + ); + + return { refetch, data, error, isLoading, isError }; +}; \ No newline at end of file diff --git a/packages/app/modules/item/model.ts b/packages/app/modules/item/model.ts new file mode 100644 index 000000000..08ddbdd5f --- /dev/null +++ b/packages/app/modules/item/model.ts @@ -0,0 +1 @@ +export type ItemUnit = 'lb' | 'oz' | 'kg' | 'g'; diff --git a/packages/app/modules/item/screens/ItemDetailsScreen.tsx b/packages/app/modules/item/screens/ItemDetailsScreen.tsx index 1a21147d6..b8f6be8ec 100644 --- a/packages/app/modules/item/screens/ItemDetailsScreen.tsx +++ b/packages/app/modules/item/screens/ItemDetailsScreen.tsx @@ -2,20 +2,25 @@ import { View } from 'react-native'; import React from 'react'; import useTheme from 'app/hooks/useTheme'; import useCustomStyles from 'app/hooks/useCustomStyles'; -import { useItem, useItemId } from 'app/modules/item'; +import { useItem, useItemId, useItemImages } from 'app/modules/item'; import { usePagination } from 'app/hooks/common'; import { RH3, RImage, RScrollView, RStack, RText, XStack } from '@packrat/ui'; import useResponsive from 'app/hooks/useResponsive'; import { CustomCard } from 'app/components/card'; import LargeCard from 'app/components/card/LargeCard'; import { FeedPreview } from 'app/modules/feed'; +import { convertWeight } from 'app/utils/convertWeight'; +import { SMALLEST_ITEM_UNIT } from '../constants'; export function ItemDetailsScreen() { - const { limit, handleLimitChange, page, handlePageChange } = usePagination(); + // const { limit, handleLimitChange, page, handlePageChange } = usePagination(); const [itemId] = useItemId(); const { data: item, isError } = useItem(itemId); const styles = useCustomStyles(loadStyles); const { currentTheme } = useTheme(); + const {data: itemImages, isError: isImagesError} = useItemImages(itemId); + + console.log('itemImages', itemImages); return ( @@ -28,7 +33,7 @@ export function ItemDetailsScreen() { content={ @@ -36,7 +41,12 @@ export function ItemDetailsScreen() { Category: {item?.category?.name || '-'} - Weight: {item?.weight} + Weight:{' '} + {convertWeight( + Number(item?.weight), + SMALLEST_ITEM_UNIT, + item?.unit as any, + )} {item?.unit} Quantity: {item?.quantity} diff --git a/packages/app/modules/item/screens/ItemsScreen.tsx b/packages/app/modules/item/screens/ItemsScreen.tsx index db51082e6..61019f527 100644 --- a/packages/app/modules/item/screens/ItemsScreen.tsx +++ b/packages/app/modules/item/screens/ItemsScreen.tsx @@ -98,9 +98,11 @@ export function ItemsScreen() { - { role === 'admin' && - - } + {role === 'admin' && ( + + + + )}
{!isError && data?.items && Array.isArray(data.items) && ( diff --git a/packages/app/modules/item/utils.ts b/packages/app/modules/item/utils.ts new file mode 100644 index 000000000..131f4a163 --- /dev/null +++ b/packages/app/modules/item/utils.ts @@ -0,0 +1,18 @@ +import { type ItemUnit } from './model'; + +export const convertWeighToSmallestUnit = (unit: ItemUnit, weight: number) => { + const conversionRates = { + lb: 453.592, + oz: 28.3495, + kg: 1000, + g: 1, + }; + + if (!conversionRates[unit]) { + return 'Not Available'; + } + + const convertedWeight = weight * conversionRates[unit]; + + return parseFloat(convertedWeight.toFixed(2)); +}; diff --git a/packages/app/modules/map/components/DownloadMapBtn/DownloadMapBtn.tsx b/packages/app/modules/map/components/DownloadMapBtn/DownloadMapBtn.tsx new file mode 100644 index 000000000..8655ed9aa --- /dev/null +++ b/packages/app/modules/map/components/DownloadMapBtn/DownloadMapBtn.tsx @@ -0,0 +1,93 @@ +import React, { type FC } from 'react'; +import { View, type TouchableOpacityProps } from 'react-native'; +import useCustomStyles from 'app/hooks/useCustomStyles'; +import { useDownloadMap } from '../../hooks/useDownloadMap'; +import { useDownloadMapProgress } from '../../hooks/useDownloadMapProgress'; +import { MapActionBtn } from '../MapActionBtn'; +import { Entypo } from '@expo/vector-icons'; +import { + BaseModal, + Form, + FormInput, + RStack, + RText, + SubmitButton, + useModalState, +} from '@packrat/ui'; + +interface MapStylePickerProps { + currentBounds: any; + style?: TouchableOpacityProps['style']; + shape: any; +} + +export const DownloadMapBtn: FC = ({ + currentBounds, + style, + shape, +}) => { + const styles = useCustomStyles(loadStyles); + const { isModalOpen, onClose, onOpen } = useModalState(); + const { downloadMap, isDownloading, progress } = useDownloadMapProgress(); + const { handleDownloadMap, isSaving } = useDownloadMap(downloadMap); + const formattedProgress = !isNaN(progress) ? Math.round(progress) : 0; + + const handleSubmit = ({ mapName }) => { + handleDownloadMap({ mapName, bounds: currentBounds.current, shape }); + onClose(); + }; + + return ( + <> + + {isDownloading || isSaving ? ( + {`${formattedProgress}%`} + ) : ( + + )} + + closeModal(), + }, + ]} + footerComponent={undefined} + > + +
+ + + + Save + + +
+
+
+ + ); +}; + +const loadStyles = () => ({ + downloadIcon: { + width: 21, + height: 21, + }, + downloadText: { + fontSize: 15, + fontWeight: '500', + marginRight: 8, + color: '#000', + }, +}); diff --git a/packages/app/modules/map/components/DownloadMapBtn/index.ts b/packages/app/modules/map/components/DownloadMapBtn/index.ts new file mode 100644 index 000000000..1a4fdb283 --- /dev/null +++ b/packages/app/modules/map/components/DownloadMapBtn/index.ts @@ -0,0 +1 @@ +export * from './DownloadMapBtn'; diff --git a/packages/app/modules/map/components/FullScreenBtn/FullScreenBtn.tsx b/packages/app/modules/map/components/FullScreenBtn/FullScreenBtn.tsx new file mode 100644 index 000000000..6d997aa95 --- /dev/null +++ b/packages/app/modules/map/components/FullScreenBtn/FullScreenBtn.tsx @@ -0,0 +1,26 @@ +import React, { type FC } from 'react'; +import { Entypo } from '@expo/vector-icons'; +import { MapActionBtn } from '../MapActionBtn'; +import { type TouchableOpacityProps } from 'react-native'; + +interface MapStylePickerProps { + isFullScreenMode: boolean; + toggleFullscreen: () => void; + style?: TouchableOpacityProps['style']; +} + +export const FullscreenBtn: FC = ({ + isFullScreenMode, + toggleFullscreen, + style, +}) => { + return ( + + + + ); +}; diff --git a/packages/app/modules/map/components/FullScreenBtn/index.ts b/packages/app/modules/map/components/FullScreenBtn/index.ts new file mode 100644 index 000000000..42e52ad25 --- /dev/null +++ b/packages/app/modules/map/components/FullScreenBtn/index.ts @@ -0,0 +1 @@ +export * from './FullScreenBtn'; diff --git a/packages/app/modules/map/components/MapActionBtn/MapActionBtn.tsx b/packages/app/modules/map/components/MapActionBtn/MapActionBtn.tsx new file mode 100644 index 000000000..f47143e83 --- /dev/null +++ b/packages/app/modules/map/components/MapActionBtn/MapActionBtn.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import useCustomStyles from 'app/hooks/useCustomStyles'; +import { type FC } from 'react'; +import { TouchableOpacity, type TouchableOpacityProps } from 'react-native'; + +interface MapActionBtnProps extends TouchableOpacityProps {} + +export const MapActionBtn: FC = ({ style, ...props }) => { + const styles = useCustomStyles(loadStyles); + + return ; +}; + +const loadStyles = () => ({ + mapActionBtn: { + justifyContent: 'center', + alignItems: 'center', + pointerEvents: 'box-only', + width: 40, + height: 40, + borderRadius: 30, + backgroundColor: 'white', + }, +}); diff --git a/packages/app/modules/map/components/MapActionBtn/index.ts b/packages/app/modules/map/components/MapActionBtn/index.ts new file mode 100644 index 000000000..9ed45165c --- /dev/null +++ b/packages/app/modules/map/components/MapActionBtn/index.ts @@ -0,0 +1 @@ +export * from './MapActionBtn'; diff --git a/packages/app/modules/map/components/MapButtonsOverlay/MapButtonsOverlay.tsx b/packages/app/modules/map/components/MapButtonsOverlay/MapButtonsOverlay.tsx new file mode 100644 index 000000000..a14cc2353 --- /dev/null +++ b/packages/app/modules/map/components/MapButtonsOverlay/MapButtonsOverlay.tsx @@ -0,0 +1,263 @@ +import React, { useState } from 'react'; +import { + TouchableOpacity, + Image, + Text, + Alert, + StyleSheet, + Platform, +} from 'react-native'; +import { + Entypo, + MaterialCommunityIcons, + FontAwesome5, +} from '@expo/vector-icons'; + +interface MapButtonsOverlayProps { + mapFullscreen: boolean; + enableFullScreen?: () => void; + disableFullScreen: () => void; + handleChangeMapStyle?: (style: string) => void; + downloadable: boolean; + downloading?: boolean; + fetchLocation?: () => void; + onDownload?: () => void; + handleGpxUpload?: () => void; + progress?: number; + navigateToMaps?: () => void; + styles?: any; + shape?: any; +} + +const MapButtonsOverlay = ({ + mapFullscreen, + enableFullScreen, + disableFullScreen, + handleChangeMapStyle, + downloadable, + downloading, + fetchLocation, + onDownload, + handleGpxUpload, + progress, + navigateToMaps, +}: MapButtonsOverlayProps) => { + const styles = StyleSheet.create(loadStyles); + + return ( + <> + {!mapFullscreen ? ( + // Preview map + <> + + + + + + + + + ) : ( + // Fullscreen map + <> + + + + + {/* Style Picker Button */} + + {/* Download Button */} + {downloadable && ( + + + + {downloading + ? `Downloading... ${ + progress ? Math.floor(progress) + '%' : '' + }` + : 'Download map'} + + + )} + + {handleGpxUpload && ( + + + + )} + + + + + {/* Location Button */} + + + + + )} + + ); +}; + +const loadStyles = { + container: { + alignItems: 'center', + justifyContent: 'center', + height: 400, + width: '100%', + borderRadius: 10, + }, + map: { + width: '100%', + minHeight: '100%', // Adjust the height to your needs + }, + stylePicker: { + // Style Picker Button + position: 'absolute', + top: 10, + left: 10, + width: 40, + height: 40, + alignItems: 'center', + justifyContent: 'center', + borderRadius: 20, + backgroundColor: 'white', + }, + styleModalContainer: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: 'rgba(0, 0, 0, 0.5)', + }, + styleModalContent: { + backgroundColor: 'white', + borderRadius: 8, + padding: 10, + }, + styleOption: { + paddingVertical: 8, + paddingHorizontal: 16, + }, + styleOptionText: { + fontSize: 16, + fontWeight: 'bold', + }, + locationButton: { + alignItems: 'center', + justifyContent: 'center', + width: 40, + height: 40, + position: 'absolute', + bottom: 30, + right: 10, + backgroundColor: 'white', + borderRadius: 30, + zIndex: 1, + }, + headerBtnView: { + justifyContent: 'center', + alignItems: 'center', + borderRadius: 30, + marginTop: 30, + backgroundColor: 'white', + }, + enterFullScreenBtn: { + width: 40, + height: 40, + position: 'absolute', + bottom: 10, + right: 10, + }, + exitFullscreenBtn: { + width: 40, + height: 40, + position: 'absolute', + top: 10, + right: 10, + }, + fullScreen: { + width: Platform.OS == 'web' ? '25%' : '70%', + height: 40, + padding: 10, + backgroundColor: 'white', + position: 'absolute', + bottom: 30, + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + alignSelf: 'center', + borderRadius: 20, + }, + downloadIcon: { + width: 21, + height: 21, + }, + downloadText: { + fontSize: 15, + fontWeight: '500', + marginRight: 8, + }, + modal: { + alignItems: 'center', + }, +} as const; + +export default MapButtonsOverlay; diff --git a/packages/app/modules/map/components/MapButtonsOverlay/index.ts b/packages/app/modules/map/components/MapButtonsOverlay/index.ts new file mode 100644 index 000000000..e69de29bb diff --git a/packages/app/modules/map/components/MapPreview/MapPreview.tsx b/packages/app/modules/map/components/MapPreview/MapPreview.tsx new file mode 100644 index 000000000..f2acdf217 --- /dev/null +++ b/packages/app/modules/map/components/MapPreview/MapPreview.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { RImage } from '@packrat/ui'; +import { + useProcessedShape, + useMapPreviewData, + useGetObjectUrlFromImageUri, +} from './hooks'; +// TODO ADD Map Preview Image +export function MapPreview({ shape }: { shape: unknown }) { + const processedShape = useProcessedShape(shape); + const mapPreviewData = useMapPreviewData(shape, processedShape); + const uri = useGetObjectUrlFromImageUri(mapPreviewData?.uri || null); + if (uri) { + alert(uri); + } + + if (!mapPreviewData || !uri) return null; + + return ( + + ); +} diff --git a/packages/app/modules/map/components/MapPreview/hooks/index.ts b/packages/app/modules/map/components/MapPreview/hooks/index.ts new file mode 100644 index 000000000..34d834417 --- /dev/null +++ b/packages/app/modules/map/components/MapPreview/hooks/index.ts @@ -0,0 +1,2 @@ +export { useGetObjectUrlFromImageUri } from './useGetObjectUrlFromImageUri'; +export * from './useMapPreview'; diff --git a/packages/app/modules/map/components/MapPreview/hooks/useGetObjectUrlFromImageUri.ts b/packages/app/modules/map/components/MapPreview/hooks/useGetObjectUrlFromImageUri.ts new file mode 100644 index 000000000..1d2741304 --- /dev/null +++ b/packages/app/modules/map/components/MapPreview/hooks/useGetObjectUrlFromImageUri.ts @@ -0,0 +1,36 @@ +import { useEffect, useState } from 'react'; +import { useAuthUserToken } from 'app/modules/auth'; + +export const useGetObjectUrlFromImageUri = (imageURI: string | null) => { + const { token } = useAuthUserToken(); + const [imageObjectURL, setImageObjectURL] = useState(null); + + useEffect(() => { + if (!imageURI) { + return; + } + const fetchImage = async () => { + try { + const response = await fetch(imageURI, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + + if (response.ok) { + const blob = await response.blob(); + const imgURL = URL.createObjectURL(blob); + setImageObjectURL(imgURL); + } else { + console.error('Failed to fetch image'); + } + } catch (error) { + console.error('Error:', error); + } + }; + + fetchImage(); + }, [imageURI, token]); + + return imageObjectURL; +}; diff --git a/packages/app/modules/map/components/MapPreview/hooks/useMapPreview.ts b/packages/app/modules/map/components/MapPreview/hooks/useMapPreview.ts new file mode 100644 index 000000000..b669b6ccd --- /dev/null +++ b/packages/app/modules/map/components/MapPreview/hooks/useMapPreview.ts @@ -0,0 +1,108 @@ +import { + getShapeSourceBounds, + isLineString, + isPolygonOrMultiPolygon, + processShapeData, + isPoint, +} from '../../../mapFunctions'; +import { API_URL } from '@packrat/config'; +import { useState, useEffect } from 'react'; + +type Feature = Record; + +interface MapPreviewData { + isPoint: boolean; + uri: string; +} + +interface ImageShape { + type: string; + features: Feature[]; +} + +const useProcessedShape = (shape) => { + const [processedShape, setProcessedShape] = useState(null); + + useEffect(() => { + const processed = processShapeData(shape); + setProcessedShape(processed); + }, [shape]); + + return processedShape; +}; + +const useMapPreviewData = (shape, processedShape) => { + const [mapPreviewData, setMapPreviewData] = useState( + null, + ); + + useEffect(() => { + if (!processedShape) return; + + const lineProperties = { + stroke: '#16b22d', + 'stroke-width': 4, + 'stroke-opacity': 1, + }; + const pointProperties = { + 'marker-color': '#16b22d', + }; + + if (isLineString(shape)) { + shape.features[0].properties = lineProperties; + } + + const imageShape: ImageShape = { type: 'FeatureCollection', features: [] }; + + const polygonObj = { + ...shape.features[0], + geometry: { + type: shape.features[0].geometry.type, + coordinates: [shape.features[0].geometry.coordinates[0]], + }, + }; + + if (isPolygonOrMultiPolygon(shape)) { + imageShape.features.push([shape.features[0].geometry.coordinates[0]]); + } else { + imageShape.features.push(shape.features[0]); + } + + processedShape.features.forEach((feature) => { + if (feature.properties.meta == 'end') { + feature.properties = pointProperties; + imageShape.features.push(feature); + } + }); + + const urlEncodedImageShapeGeoJSON = encodeURIComponent( + JSON.stringify(imageShape, null, 0), + ); + + let bounds = getShapeSourceBounds(shape); + if (Array.isArray(bounds[0]) && Array.isArray(bounds[1])) { + bounds = [bounds[0].concat(bounds[1])]; + } + + const { + coordinates: [lng, lat], + } = shape.features[0].geometry; + + const mapPreviewEndpoint = `${API_URL}/mapPreview`; + + const data = { + isPoint: isPoint(shape), + uri: isPoint(shape) + ? `${mapPreviewEndpoint}/pin-s+db4848(${lng},${lat})/${lng},${lat},8.63,0/900x400` + : `${mapPreviewEndpoint}/geojson(${urlEncodedImageShapeGeoJSON})/[${bounds.join( + ',', + )}]/900x400?padding=50,30,30,30`, + }; + + setMapPreviewData(data); + }, [shape, processedShape]); + + return mapPreviewData; +}; + +export { useProcessedShape, useMapPreviewData }; diff --git a/packages/app/modules/map/components/MapPreview/index.ts b/packages/app/modules/map/components/MapPreview/index.ts new file mode 100644 index 000000000..66877bc8b --- /dev/null +++ b/packages/app/modules/map/components/MapPreview/index.ts @@ -0,0 +1 @@ +export * from './MapPreview'; diff --git a/packages/app/modules/map/components/MapPreviewCard/MapImage.tsx b/packages/app/modules/map/components/MapPreviewCard/MapImage.tsx new file mode 100644 index 000000000..45d5f5a07 --- /dev/null +++ b/packages/app/modules/map/components/MapPreviewCard/MapImage.tsx @@ -0,0 +1,29 @@ +import React, { type FC } from 'react'; +import { View } from '@packrat/ui'; +import { MapPin } from '@tamagui/lucide-icons'; +import { type ViewProps } from 'tamagui'; + +interface MapImageProps { + style?: ViewProps['style']; +} + +export const MapImage: FC = ({ style = {} }) => { + return ( + + + + + + ); +}; diff --git a/packages/app/modules/map/components/MapPreviewCard/StatusLabel.tsx b/packages/app/modules/map/components/MapPreviewCard/StatusLabel.tsx new file mode 100644 index 000000000..cd0c7ac86 --- /dev/null +++ b/packages/app/modules/map/components/MapPreviewCard/StatusLabel.tsx @@ -0,0 +1,19 @@ +import React from 'react'; +import { RText, View } from '@packrat/ui'; +import { MaterialCommunityIcons } from '@expo/vector-icons'; + +export const StatusLabel = () => { + return ( + + + Offline + + ); +}; diff --git a/packages/app/modules/map/components/MapPreviewCard/index.tsx b/packages/app/modules/map/components/MapPreviewCard/index.tsx new file mode 100644 index 000000000..99dd531a9 --- /dev/null +++ b/packages/app/modules/map/components/MapPreviewCard/index.tsx @@ -0,0 +1,39 @@ +import React, { type FC } from 'react'; +import { StatusLabel } from './StatusLabel'; +import { View, RText, Card, YStack, Details } from '@packrat/ui'; +import useTheme from 'app/hooks/useTheme'; +import { TouchableOpacity } from 'react-native'; +import { MapImage } from './MapImage'; + +interface MapPreviewCardProps { + id: string; + title: string; + isDownloaded: boolean; + onShowMapClick: (id: string) => void; +} + +export const MapPreviewCard: FC = ({ + id, + onShowMapClick, + title, + isDownloaded, +}) => { + const { enableDarkMode, enableLightMode, isDark, isLight, currentTheme } = + useTheme(); + + return ( + : null} + link="" + image={} + isFullWidth + type="secondary" + actions={ + onShowMapClick(id)}> + Show map + + } + /> + ); +}; diff --git a/packages/app/modules/map/components/MapStylePicker/MapStylePicker.tsx b/packages/app/modules/map/components/MapStylePicker/MapStylePicker.tsx new file mode 100644 index 000000000..57207b597 --- /dev/null +++ b/packages/app/modules/map/components/MapStylePicker/MapStylePicker.tsx @@ -0,0 +1,102 @@ +import React, { useState, type FC } from 'react'; +import { + Modal, + TouchableOpacity, + type TouchableOpacityProps, + View, +} from 'react-native'; +import useCustomStyles from 'app/hooks/useCustomStyles'; +import { type MapStyle } from '../../model'; +import { RText } from '@packrat/ui'; +import { MaterialCommunityIcons } from '@expo/vector-icons'; +import { MapActionBtn } from '../MapActionBtn'; + +interface MapStylePickerProps { + mapStyles: MapStyle[]; + onStyleChange: (style: string) => void; + btnStyle?: TouchableOpacityProps['style']; +} + +export const MapStylePicker: FC = ({ + mapStyles, + btnStyle, + onStyleChange, +}) => { + const [showStyleOptions, setShowStyleOptions] = useState(false); + const styles = useCustomStyles(loadStyles); + + const handleStyleSelection = (style: string) => { + onStyleChange(style); + setShowStyleOptions(false); + }; + const handleStyleOptionPress = () => { + setShowStyleOptions(!showStyleOptions); + }; + + return ( + <> + + + + + + + {mapStyles.map((item, index) => ( + handleStyleSelection(item.style)} + > + {item.label} + + ))} + + + + + ); +}; + +const loadStyles = () => ({ + stylePicker: { + width: 40, + height: 40, + alignItems: 'center', + justifyContent: 'center', + borderRadius: 20, + backgroundColor: 'white', + }, + styleModalContainer: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: 'rgba(0, 0, 0, 0.5)', + }, + styleModalContent: { + backgroundColor: 'white', + borderRadius: 8, + padding: 10, + }, + styleOption: { + paddingVertical: 8, + paddingHorizontal: 16, + }, + styleOptionText: { + fontSize: 16, + fontWeight: 'bold', + color: '#000', + }, + modal: { + alignItems: 'center', + }, +}); diff --git a/packages/app/modules/map/components/MapStylePicker/index.ts b/packages/app/modules/map/components/MapStylePicker/index.ts new file mode 100644 index 000000000..83ce3b4fe --- /dev/null +++ b/packages/app/modules/map/components/MapStylePicker/index.ts @@ -0,0 +1 @@ +export * from './MapStylePicker'; diff --git a/packages/app/modules/map/components/index.ts b/packages/app/modules/map/components/index.ts new file mode 100644 index 000000000..b45023841 --- /dev/null +++ b/packages/app/modules/map/components/index.ts @@ -0,0 +1,4 @@ +export * from './MapPreview'; +export * from './FullScreenBtn'; +export * from './MapStylePicker'; +export * from './MapPreviewCard' diff --git a/packages/app/modules/map/hooks/index.ts b/packages/app/modules/map/hooks/index.ts new file mode 100644 index 000000000..315675587 --- /dev/null +++ b/packages/app/modules/map/hooks/index.ts @@ -0,0 +1,2 @@ +export * from './useMapStyles'; +export * from './useMapFullScreen'; diff --git a/packages/app/modules/map/hooks/useDownloadMap.tsx b/packages/app/modules/map/hooks/useDownloadMap.tsx new file mode 100644 index 000000000..3426f1589 --- /dev/null +++ b/packages/app/modules/map/hooks/useDownloadMap.tsx @@ -0,0 +1,32 @@ +import { useAuthUser } from 'app/modules/auth'; +import { queryTrpc } from 'app/trpc'; + +export const useDownloadMap = (onDownload) => { + const { mutateAsync, isLoading } = queryTrpc.saveOfflineMap.useMutation(); + const authUser = useAuthUser(); + + const handleDownloadMap = ({ mapName, bounds, shape }) => { + const downloadOptions = { + name: mapName, + styleURL: 'mapbox://styles/mapbox/outdoors-v11', + bounds, + minZoom: 0, + maxZoom: 8, + owner_id: authUser.id, + metadata: { + shape: JSON.stringify(shape), + }, + }; + + alert(JSON.stringify(downloadOptions)); + + // Save the map under user profile. + mutateAsync(downloadOptions) + .then(() => { + onDownload(downloadOptions); + }) + .catch((e) => {}); + }; + + return { handleDownloadMap, isSaving: isLoading }; +}; diff --git a/packages/app/modules/map/hooks/useDownloadMapProgress.tsx b/packages/app/modules/map/hooks/useDownloadMapProgress.tsx new file mode 100644 index 000000000..a72ae888f --- /dev/null +++ b/packages/app/modules/map/hooks/useDownloadMapProgress.tsx @@ -0,0 +1,31 @@ +import { offlineManager } from '@rnmapbox/maps'; +import { useState } from 'react'; +import { Alert } from 'react-native'; + +export const useDownloadMapProgress = () => { + const [progress, setProgress] = useState(0); + const [downloading, setDownloading] = useState(false); + + const onDownloadProgress = (offlineRegion: any, offlineRegionStatus: any) => { + setProgress(offlineRegionStatus.percentage); + setDownloading(true); + if (offlineRegionStatus.percentage === 100) { + Alert.alert('Map download successfully!'); + setDownloading(false); + } + }; + + const errorListener = (offlineRegion: any, error: any) => { + Alert.alert(error.message); + }; + + const downloadMap = async (optionsForDownload: any) => { + offlineManager + .createPack(optionsForDownload, onDownloadProgress, errorListener) + .catch((error: any) => { + Alert.alert(error.message); + }); + }; + + return { progress, isDownloading: downloading, downloadMap }; +}; diff --git a/packages/app/modules/map/hooks/useMapFullScreen.ts b/packages/app/modules/map/hooks/useMapFullScreen.ts new file mode 100644 index 000000000..33df7bd7f --- /dev/null +++ b/packages/app/modules/map/hooks/useMapFullScreen.ts @@ -0,0 +1,9 @@ +import { useState } from 'react'; + +export const useMapFullScreen = (defaultMode: boolean = false) => { + const [isFullScreenMode, setIsFullScreenMode] = useState(defaultMode); + + const toggleFullScreen = () => setIsFullScreenMode((prev) => !prev); + + return { isFullScreenMode, toggleFullScreen }; +}; diff --git a/packages/app/modules/map/hooks/useMapStyles.ts b/packages/app/modules/map/hooks/useMapStyles.ts new file mode 100644 index 000000000..5e086d664 --- /dev/null +++ b/packages/app/modules/map/hooks/useMapStyles.ts @@ -0,0 +1,21 @@ +import { useRef, useState } from 'react'; + +const MAP_STYLES = [ + { label: 'Outdoors', style: 'mapbox://styles/mapbox/outdoors-v11' }, + { label: 'Street', style: 'mapbox://styles/mapbox/streets-v11' }, + { label: 'Light', style: 'mapbox://styles/mapbox/light-v10' }, + { label: 'Dark', style: 'mapbox://styles/mapbox/dark-v10' }, + { label: 'Satellite', style: 'mapbox://styles/mapbox/satellite-v9' }, + { + label: 'Satellite Street', + style: 'mapbox://styles/mapbox/satellite-streets-v11', + }, +]; + +export const useMapStyles = () => { + const [selectedStyle, setSelectedStyle] = useState(MAP_STYLES[0].style); + + const onStyleChange = (style: string) => setSelectedStyle(style); + + return { mapStyles: MAP_STYLES, onStyleChange, selectedStyle }; +}; diff --git a/packages/app/modules/map/hooks/useOfflineMapShape.ts b/packages/app/modules/map/hooks/useOfflineMapShape.ts new file mode 100644 index 000000000..0ab080871 --- /dev/null +++ b/packages/app/modules/map/hooks/useOfflineMapShape.ts @@ -0,0 +1,31 @@ +import { offlineManager } from '@rnmapbox/maps'; +import { useEffect, useState } from 'react'; + +export const useOfflineMapShape = (offlineMapName?: string) => { + const [shape, setShape] = useState(); + const [isLoading, setIsLoading] = useState(!!offlineMapName); + useEffect(() => { + let isMounted = true; + (async () => { + if (!offlineMapName) { + return; + } + try { + const offlineMapPack = await offlineManager.getPack(offlineMapName); + if (isMounted) { + setShape(offlineMapPack.metadata.shape); + } + } finally { + if (isMounted) { + setIsLoading(false); + } + } + })(); + + return () => { + isMounted = false; + }; + }, [offlineMapName]); + + return { shape, isLoading }; +}; diff --git a/packages/app/modules/map/hooks/useOfflineMaps.ts b/packages/app/modules/map/hooks/useOfflineMaps.ts new file mode 100644 index 000000000..fc3493b0a --- /dev/null +++ b/packages/app/modules/map/hooks/useOfflineMaps.ts @@ -0,0 +1,40 @@ +import { queryTrpc } from 'app/trpc'; +import { + getPaginationInitialParams, + type PaginationParams, + usePagination, +} from 'app/hooks/pagination'; +import { useState } from 'react'; +import { useAuthUser } from 'app/modules/auth'; + +export const useOfflineMaps = () => { + const [pagination, setPagination] = useState( + getPaginationInitialParams(), + ); + const authUser = useAuthUser(); + const { data, isLoading, refetch } = queryTrpc.getOfflineMaps.useQuery( + { + ownerId: authUser.id, + pagination, + }, + { + refetchOnWindowFocus: false, + onError: (error) => console.error('Error fetching public packs:', error), + }, + ); + const { fetchPrevPage, fetchNextPage } = usePagination( + refetch, + pagination, + setPagination, + { nextPage: data?.nextOffset }, + ); + + return { + data: data?.data, + isLoading, + refetch, + fetchNextPage, + nextPage: data?.nextOffset || false, + error: null, + }; +}; diff --git a/packages/app/modules/map/index.ts b/packages/app/modules/map/index.ts index e7e7a361d..2d9518203 100644 --- a/packages/app/modules/map/index.ts +++ b/packages/app/modules/map/index.ts @@ -1 +1,2 @@ export * from './widgets'; +export { getMapGEOURI } from './utils'; diff --git a/packages/app/modules/map/lib/MapView.native.tsx b/packages/app/modules/map/lib/MapView.native.tsx new file mode 100644 index 000000000..19a0e6262 --- /dev/null +++ b/packages/app/modules/map/lib/MapView.native.tsx @@ -0,0 +1,55 @@ +import React, { useRef, type FC } from 'react'; +import MapboxGL, { Camera } from '@rnmapbox/maps'; +import { MAPBOX_ACCESS_TOKEN } from '@packrat/config'; +import { type MapViewProps } from './model'; +import { getBoundingBoxFromShape } from '../utils'; +import { View } from 'react-native'; +import flat from 'lodash/flatten'; + +MapboxGL.setAccessToken(MAPBOX_ACCESS_TOKEN); + +export const MapView: FC = ({ + shape, + shapeURI, + isInteractive, + mapStyle, + initialBounds, + onVisibleBoundsChange, +}) => { + const mapView = useRef(); + const bounds = Array.isArray(initialBounds) + ? flat(initialBounds) + : getBoundingBoxFromShape(shape); + const onCameraChange = ({ properties: { visibleBounds } }) => { + onVisibleBoundsChange(visibleBounds); + }; + + return ( + + + + + + + + + ); +}; diff --git a/packages/app/modules/map/lib/MapView.tsx b/packages/app/modules/map/lib/MapView.tsx new file mode 100644 index 000000000..a36c43c5c --- /dev/null +++ b/packages/app/modules/map/lib/MapView.tsx @@ -0,0 +1,97 @@ +import React, { useCallback, useRef, type FC } from 'react'; +import MapContainer, { Source, Layer } from 'react-map-gl'; +import { MAPBOX_ACCESS_TOKEN } from '@packrat/config'; +import MapLib, { type Map } from 'mapbox-gl'; +import 'mapbox-gl/dist/mapbox-gl.css'; +import { type MapViewProps } from './model'; +import { getBoundingBoxFromShape } from '../utils'; + +MapLib.accessToken = MAPBOX_ACCESS_TOKEN; +export const dataLayer = { + id: 'data', + type: 'fill', + paint: { + 'fill-color': { + property: 'percentile', + stops: [ + [0, '#3288bd'], + [1, '#66c2a5'], + [2, '#abdda4'], + [3, '#e6f598'], + [4, '#ffffbf'], + [5, '#fee08b'], + [6, '#fdae61'], + [7, '#f46d43'], + [8, '#d53e4f'], + ], + }, + 'fill-opacity': 0.3, + }, +}; +export const MapView: FC = ({ + shape, + shapeURI, + mapStyle, + onVisibleBoundsChange, + initialBounds, + isInteractive = true, +}) => { + const mapRef = useRef(null); + + const updateVisibleBounds = useCallback(() => { + if (mapRef.current) { + onVisibleBoundsChange(mapRef.current.getBounds().toArray()); + } + }, [onVisibleBoundsChange]); + + const onMoveEnd = useCallback(updateVisibleBounds, [updateVisibleBounds]); + const onZoomEnd = useCallback(updateVisibleBounds, [updateVisibleBounds]); + + const attachListeners = useMapListeners(onMoveEnd, onZoomEnd); + + const onMapLoad = () => { + if (mapRef.current && (shape || initialBounds)) { + const map = mapRef.current; + attachListeners(map); + + const bbox = initialBounds || getBoundingBoxFromShape(shape); + + map.fitBounds(bbox, { padding: 20 }); + } + }; + + return ( + + + + + + ); +}; + +export const useMapListeners = ( + onMoveEnd: () => void, + onZoomEnd: () => void, +) => { + const attachListeners = (map: Map) => { + if (!map) return; + + map.on('moveend', onMoveEnd); + map.on('zoomend', onZoomEnd); + + return () => { + map.off('moveend', onMoveEnd); + map.off('zoomend', onZoomEnd); + }; + }; + + return attachListeners; +}; diff --git a/packages/app/modules/map/lib/index.ts b/packages/app/modules/map/lib/index.ts new file mode 100644 index 000000000..88136a095 --- /dev/null +++ b/packages/app/modules/map/lib/index.ts @@ -0,0 +1 @@ +export * from './MapView'; diff --git a/packages/app/modules/map/lib/model.ts b/packages/app/modules/map/lib/model.ts new file mode 100644 index 000000000..feafd6582 --- /dev/null +++ b/packages/app/modules/map/lib/model.ts @@ -0,0 +1,10 @@ +export interface MapViewProps { + shape?: any; + isInteractive?: boolean; + shapeURI?: string; + mapStyle: string; + onVisibleBoundsChange: (bounds: any) => void; + initialBounds?: any; + + offlineMapName?: string; +} diff --git a/packages/app/modules/map/mapFunctions.ts b/packages/app/modules/map/mapFunctions.ts new file mode 100644 index 000000000..be1301fb3 --- /dev/null +++ b/packages/app/modules/map/mapFunctions.ts @@ -0,0 +1,452 @@ +import * as Location from 'expo-location'; + +const defaultShape = { + type: 'FeatureCollection', + features: [ + { + type: 'Feature', + geometry: { + type: 'LineString', + coordinates: [ + [-77.044211, 38.852924], + [-77.045659, 38.860158], + [-77.044232, 38.862326], + [-77.040879, 38.865454], + [-77.039936, 38.867698], + [-77.040338, 38.86943], + [-77.04264, 38.872528], + [-77.03696, 38.878424], + [-77.032309, 38.87937], + [-77.030056, 38.880945], + [-77.027645, 38.881779], + [-77.026946, 38.882645], + [-77.026942, 38.885502], + [-77.028054, 38.887449], + [-77.02806, 38.892088], + [-77.03364, 38.892108], + [-77.033643, 38.899926], + ], + }, + }, + ], +}; + +/** + * Normalize the coordinates. + * + * @param {array} coordinates - The coordinates to be normalized. + * @return {array} The normalized coordinates. + */ +function normalizeCoordinates(coordinates) { + // check if coordinates are nested, flip them if so + if (typeof coordinates[0][0] === 'number') { + // If first value is greater than 90, it's likely in the format of (longitude, latitude) + if (coordinates[0][0] > 90) { + return coordinates.map((coordinate) => [coordinate[1], coordinate[0]]); + } + return coordinates; + } + // if not nested, nest them + // If first value is greater than 90, it's likely in the format of (longitude, latitude) + if (coordinates[0] > 90) { + return [[coordinates[1], coordinates[0]]]; + } + return [[coordinates[0], coordinates[1]]]; +} + +/** + * Converts a Photon GeoJSON object to a Shape object. + * + * @param {object} photonGeoJson - The Photon GeoJSON object to convert. + * @return {object} The converted Shape object. + */ +function convertPhotonGeoJsonToShape(photonGeoJson) { + return { + type: 'FeatureCollection', + features: [photonGeoJson], + }; +} + +/** + * Calculates the minimum and maximum longitude and latitude coordinates of a given shape. + * + * @param {object} shape - The shape object containing the coordinates. + * @return {array} An array representing the minimum and maximum longitude and latitude coordinates. + */ +function getShapeSourceBounds(shape) { + let minLng = Infinity; + let maxLng = -Infinity; + let minLat = Infinity; + let maxLat = -Infinity; + shape.features[0].geometry.coordinates.forEach((coord) => { + const lng = coord[0]; + const lat = coord[1]; + + if (lng < minLng) { + minLng = lng; + } + if (lng > maxLng) { + maxLng = lng; + } + if (lat < minLat) { + minLat = lat; + } + if (lat > maxLat) { + maxLat = lat; + } + }); + + return [ + [minLng, minLat], + [maxLng, maxLat], + ]; +} + +/** + * Handles the shape source load and calculates the zoom level based on the width and height. + * + * @param {object} shape - The shape object containing the coordinates. + * @param {number} width - The width of the shape. + * @param {number} height - The height of the shape. + * @return {number|null} The calculated zoom level or null if there are no coordinates. + */ +function handleShapeSourceLoad(shape, width, height) { + if (shape?.features[0]?.geometry?.coordinates?.length > 1) { + let bounds = getShapeSourceBounds(shape); + if (bounds && bounds[0] && bounds[1]) { + bounds = [bounds[0].concat(bounds[1])]; + return calculateZoomLevel(bounds[0], { width, height }); + } + } + return null; +} + +/** + * Calculates the latitude in radians. + * + * @param {number} lat - The latitude in degrees. + * @return {number} The latitude in radians. + */ +function latRad(lat) { + const sin = Math.sin((lat * Math.PI) / 180); + const radX2 = Math.log((1 + sin) / (1 - sin)) / 2; + return Math.max(Math.min(radX2, Math.PI), -Math.PI) / 2; +} + +/** + * Calculates the zoom level of a map based on the size of the map in pixels, + * the size of the world in pixels, and a fraction. + * + * @param {number} mapPx - The size of the map in pixels. + * @param {number} worldPx - The size of the world in pixels. + * @param {number} fraction - The fraction used for the calculation. + * @return {number} The calculated zoom level. + */ +function zoom(mapPx, worldPx, fraction) { + return Math.floor(Math.log(mapPx / worldPx / fraction) / Math.LN2); +} + +/** + * Calculates the zoom level for a given map based on the provided bounds and map dimensions. + * + * @param {Array} bounds - The bounds of the map in the format [south, west, north, east]. + * @param {Object} mapDim - The dimensions of the map in the format {height: number, width: number}. + * @return {number} The calculated zoom level for the map. + */ +function calculateZoomLevel(bounds, mapDim) { + const WORLD_DIM = { height: 256, width: 256 }; + const ne = { lat: bounds[2], lng: bounds[3] }; + const sw = { lat: bounds[0], lng: bounds[1] }; + + const latFraction = (latRad(ne.lat) - latRad(sw.lat)) / Math.PI; + + const lngDiff = ne.lng - sw.lng; + const lngFraction = (lngDiff < 0 ? lngDiff + 360 : lngDiff) / 360; + + const latZoom = zoom(mapDim.height, WORLD_DIM.height, Math.abs(latFraction)); + const lngZoom = zoom(mapDim.width, WORLD_DIM.width, lngFraction); + + return latZoom; +} + +/** + * Finds the center of a trail based on its shape coordinates. + * + * @param {object} shape - The shape object containing trail coordinates. + * @return {array} The center coordinates of the trail. + */ +function findTrailCenter(shape) { + console.log('Finding trail center...', shape); + const trailCoords = shape?.features[0]?.geometry?.coordinates; + + // Flatten the coordinates array for Polygon geometries + + let avgLatitude; + let avgLongitude; + let flattenedCoords; + if (trailCoords[0][0] === undefined) { + avgLongitude = trailCoords[0]; + avgLatitude = trailCoords[1]; + } else if (Array.isArray(trailCoords[0][0][0])) { + flattenedCoords = trailCoords[0].flat(); + + const latitudes = flattenedCoords.map((coord) => coord[1]); + const longitudes = flattenedCoords.map((coord) => coord[0]); + + avgLatitude = latitudes.reduce((a, b) => a + b, 0) / latitudes.length; + avgLongitude = longitudes.reduce((a, b) => a + b, 0) / longitudes.length; + } else { + flattenedCoords = trailCoords[0]; + + const latitudes = flattenedCoords.map((coord) => coord[1]); + const longitudes = flattenedCoords.map((coord) => coord[0]); + + avgLatitude = latitudes.reduce((a, b) => a + b, 0) / latitudes.length; + avgLongitude = longitudes.reduce((a, b) => a + b, 0) / longitudes.length; + } + + console.log('Average latitude:', avgLatitude); + console.log('Average longitude:', avgLongitude); + + return [avgLongitude, avgLatitude]; +} + +/** + * Process the shape data by transforming LineString features into Points. + * + * @param {Object} shape - The shape data to be processed. + * @return {Object} The processed shape data. + */ +const processShapeData = (shape) => { + const processedShape = { ...shape }; + processedShape.features = []; + + shape.features.forEach((feature) => { + if (feature.geometry.type === 'LineString') { + // Make sure coordinates are in the correct format + feature.geometry.coordinates = ensure2DArray( + feature.geometry.coordinates, + ); + + const points = feature.geometry.coordinates.map((coord, index) => { + return { + type: 'Feature', + properties: { + // Add a `meta` property to the first and last points + meta: + index === 0 || index === feature.geometry.coordinates.length - 1 + ? 'end' + : 'middle', + }, + geometry: { + type: 'Point', + coordinates: coord, + }, + }; + }); + + processedShape.features.push(...points); + + // Keep the original LineString feature + processedShape.features.push(feature); + } + }); + + return processedShape; +}; + +/** + * Ensure the input array is a 2D array. + * + * @param {Array} arr - The input array. + * @return {Array} - The 2D array. + */ +const ensure2DArray = (arr) => { + // If the first element of the array is not an array itself, add an additional array layer + if (!Array.isArray(arr[0])) { + return [arr]; + } + // If the array is already 2D, return it as is + return arr; +}; + +const mapboxStyles = [ + { label: 'Outdoors', style: 'mapbox://styles/mapbox/outdoors-v11' }, + { label: 'Street', style: 'mapbox://styles/mapbox/streets-v11' }, + { label: 'Light', style: 'mapbox://styles/mapbox/light-v10' }, + { label: 'Dark', style: 'mapbox://styles/mapbox/dark-v10' }, + { label: 'Satellite', style: 'mapbox://styles/mapbox/satellite-v9' }, + { + label: 'Satellite Street', + style: 'mapbox://styles/mapbox/satellite-streets-v11', + }, +]; + +/** + * Retrieves the current location asynchronously. + * + * @return {Promise} The current location object. + */ +const getLocation = async () => { + const { status } = await Location.requestForegroundPermissionsAsync(); + + if (status !== 'granted') { + alert('Permission to access location was denied'); + return; + } + + const location = await Location.getCurrentPositionAsync({}); + + return location; +}; + +/** + * Checks if a shape is downloadable. + * + * @param {Object} shape - The shape object to check. + * @return {boolean} Returns true if the shape is downloadable, false otherwise. + */ +const isShapeDownloadable = (shape) => { + return shape?.features[0]?.geometry?.coordinates?.length >= 1; +}; + +/** + * Checks if the given shape is a point. + * + * @param {Object} shape - The shape object to be checked. + * @return {boolean} Returns true if the shape is a point, otherwise returns false. + */ +const isPoint = (shape) => { + return shape?.features[0]?.geometry?.type === 'Point'; +}; +/** + * Checks if the given shape is a LineString. + * + * @param {Object} shape - The shape object to be checked. + * @return {boolean} Returns true if the shape is a LineString, otherwise false. + */ +const isLineString = (shape) => { + return shape?.features[0]?.geometry?.type === 'LineString'; +}; + +/** + * Checks if the given shape is a Polygon or MultiPolygon. + * + * @param {object} shape - The shape object to be checked. + * @return {boolean} Returns true if the shape is a Polygon or MultiPolygon, otherwise returns false. + */ +const isPolygonOrMultiPolygon = (shape) => { + return ( + shape?.features[0]?.geometry?.type === 'MultiPolygon' || + shape?.features[0]?.geometry?.type === 'MultiPolygon' + ); +}; + +/** + * Calculates the bounds of a multipolygon. + * + * @param {object} multipolygonData - The multipolygon data. + * @return {array} The center longitude and latitude of the bounds. + */ +const multiPolygonBounds = (multipolygonData) => { + let coordinates = multipolygonData.geometry.coordinates[0]; + if (multipolygonData.geometry.type === 'MultiPolygon') { + coordinates = coordinates[0]; + } + let minX = Infinity; + let maxX = -Infinity; + let minY = Infinity; + let maxY = -Infinity; + + for (const [lng, lat] of coordinates) { + minX = Math.min(minX, lng); + maxX = Math.max(maxX, lng); + minY = Math.min(minY, lat); + maxY = Math.max(maxY, lat); + } + + const centerLng = (minX + maxX) / 2; + const centerLat = (minY + maxY) / 2; + + return [centerLng, centerLat]; +}; + +const validateCoordinates = (coordinates: any) => { + if (!Array.isArray(coordinates)) { + throw new Error('Invalid coordinates: Must be an array.'); + } + coordinates.forEach((coord) => { + if (!Array.isArray(coord)) { + if (typeof coord !== 'number') { + throw new Error( + 'Invalid coordinates: Each coordinate must be a number.', + ); + } + } else { + validateCoordinates(coord); + } + }); +}; + +const validateGeoJSON = (geojson: any) => { + if (!geojson || typeof geojson !== 'object') { + throw new Error('Invalid GeoJSON: Data is not an object.'); + } + if (!geojson.type) { + throw new Error('Invalid GeoJSON: Missing "type" property.'); + } + if (!geojson.features || !Array.isArray(geojson.features)) { + throw new Error('Invalid GeoJSON: Missing or invalid "features" property.'); + } + + geojson.features.forEach((feature) => { + try { + if (feature.geometry && feature.geometry.coordinates) { + if (feature.geometry.type === 'Point') { + validateCoordinates(feature.geometry.coordinates); + } else if ( + feature.geometry.type === 'LineString' || + feature.geometry.type === 'Polygon' + ) { + feature.geometry.coordinates.forEach(validateCoordinates); + } else if (feature.geometry.type === 'MultiPolygon') { + feature.geometry.coordinates.forEach((polygon) => { + polygon.forEach(validateCoordinates); + }); + } + } + } catch (e) { + throw new Error(e); + } + }); +}; + +const validateShape = (shape: any) => { + try { + validateGeoJSON(shape); + } catch (error) { + throw new Error(`Invalid shape: ${error.message}`); + } +}; + +export { + defaultShape, + getShapeSourceBounds, + handleShapeSourceLoad, + latRad, + zoom, + calculateZoomLevel, + findTrailCenter, + processShapeData, + mapboxStyles, + getLocation, + isShapeDownloadable, + convertPhotonGeoJsonToShape, + isPoint, + isLineString, + isPolygonOrMultiPolygon, + multiPolygonBounds, + validateGeoJSON, + validateShape, + validateCoordinates, +}; diff --git a/packages/app/modules/map/model.ts b/packages/app/modules/map/model.ts new file mode 100644 index 000000000..1bf997b17 --- /dev/null +++ b/packages/app/modules/map/model.ts @@ -0,0 +1,18 @@ +export type Shape = any; + +export interface MapStyle { + style: string; + label: string; +} + +export interface OfflineMap { + name: string; + styleURL: string; + bounds: [number[], number[]]; + minZoom: number; + maxZoom: number; + downloaded: boolean; + metadata: { + shape: unknown; + }; +} diff --git a/packages/app/modules/map/screens/OfflineMapsScreen/OfflineMap.tsx b/packages/app/modules/map/screens/OfflineMapsScreen/OfflineMap.tsx new file mode 100644 index 000000000..369549eb8 --- /dev/null +++ b/packages/app/modules/map/screens/OfflineMapsScreen/OfflineMap.tsx @@ -0,0 +1,20 @@ +import React, { useState, type FC } from 'react'; + +import { type OfflineMap } from './OfflineMapsScreen'; +import { getMapGEOURI, Map } from 'app/modules/map'; + +interface OfflineMapProps { + map: OfflineMap; + onClose: () => void; +} +export const OfflineMapComponent: FC = ({ map, onClose }) => { + return ( + + ); +}; diff --git a/packages/app/modules/map/screens/OfflineMapsScreen/OfflineMapsScreen.tsx b/packages/app/modules/map/screens/OfflineMapsScreen/OfflineMapsScreen.tsx new file mode 100644 index 000000000..35875b442 --- /dev/null +++ b/packages/app/modules/map/screens/OfflineMapsScreen/OfflineMapsScreen.tsx @@ -0,0 +1,121 @@ +import { Text, View } from 'react-native'; +import { offlineManager } from '@rnmapbox/maps'; +import React, { useState, useMemo, useEffect } from 'react'; +import useTheme from 'app/hooks/useTheme'; +import { RScrollView, RStack } from '@packrat/ui'; +import type OfflinePack from '@rnmapbox/maps/lib/typescript/src/modules/offline/OfflinePack'; +import { MapPreviewCard } from 'app/modules/map/components'; +import { Map } from 'app/modules/map'; +import { useOfflineMaps } from '../../hooks/useOfflineMaps'; +import { OfflineMapComponent } from './OfflineMap'; + +export interface OfflineMap { + id: string; + name: string; + styleURL: string; + bounds: [number[], number[]]; + downloaded: boolean; +} + +export const OfflineMapsScreen = () => { + const [selectedMapId, setSelectedMapId] = useState(''); + const { enableDarkMode, enableLightMode, isDark, isLight, currentTheme } = + useTheme(); + const { data } = useOfflineMaps(); + const offlineMaps = useOfflineMapWithDownloadStatus(data); + const selectedMap = useMemo(() => { + return offlineMaps?.find?.((map) => map?.id === selectedMapId); + }, [offlineMaps, selectedMapId]); + + return ( + + {selectedMap ? ( + setSelectedMapId('')} + /> + ) : null} + + {offlineMaps ? ( + + {offlineMaps.map((offlineMap) => { + // const center = getCenterCoordinates(offlineMap.bounds); + return ( + + + + ); + })} + + ) : ( + + loading... + + )} + + + ); +}; + +const useOfflineMapWithDownloadStatus = (offlineMaps) => { + const [offlineMapsWithDownloadStatus, setOfflineMapWithDownloadStatus] = + useState([]); + + useEffect(() => { + (async () => { + try { + const res = await addDownloadStatusToMaps(offlineMaps); + setOfflineMapWithDownloadStatus(res); + } catch (e) { + setOfflineMapWithDownloadStatus(offlineMaps); + } + })(); + }, [offlineMaps]); + + return offlineMapsWithDownloadStatus; +}; + +const addDownloadStatusToMaps = async (offlineMaps: OfflineMap[]) => { + const offlineMapboxPacks: OfflineMap[] = []; + for (const map of offlineMaps) { + const offlineMap: OfflineMap = { + id: map.id, + styleURL: `${map.styleURL}`, + name: `${map.name}`, + bounds: map.bounds, + downloaded: false, + }; + + let offlineMapboxPack: OfflinePack | null; + try { + offlineMapboxPack = await offlineManager.getPack(map.name); + } catch (error) { + offlineMapboxPack = null; + } + + if (offlineMapboxPack) { + offlineMap.downloaded = true; + } + + offlineMapboxPacks.push(offlineMap); + } + return offlineMapboxPacks; +}; diff --git a/packages/app/modules/map/screens/OfflineMapsScreen/index.ts b/packages/app/modules/map/screens/OfflineMapsScreen/index.ts new file mode 100644 index 000000000..9a40c6c62 --- /dev/null +++ b/packages/app/modules/map/screens/OfflineMapsScreen/index.ts @@ -0,0 +1 @@ +export * from './OfflineMapsScreen'; diff --git a/packages/app/modules/map/screens/index.ts b/packages/app/modules/map/screens/index.ts new file mode 100644 index 000000000..9a40c6c62 --- /dev/null +++ b/packages/app/modules/map/screens/index.ts @@ -0,0 +1 @@ +export * from './OfflineMapsScreen'; diff --git a/packages/app/modules/map/utils.ts b/packages/app/modules/map/utils.ts new file mode 100644 index 000000000..3bda1180e --- /dev/null +++ b/packages/app/modules/map/utils.ts @@ -0,0 +1,14 @@ +import { api } from 'app/constants/api'; +import { type Shape } from './model'; +import * as bounds from 'geojson-bounds'; + +export const getBoundingBoxFromShape = (shape: Shape) => { + if (!shape) return undefined; + return bounds.extent(shape); +}; + +export const isShapeDownloadable = (shape: Shape) => { + return shape?.features[0]?.geometry?.coordinates?.length >= 1; +}; + +export const getMapGEOURI = (mapId: string) => `${api}/geojson/map/${mapId}`; diff --git a/packages/app/modules/map/widgets/Map.tsx b/packages/app/modules/map/widgets/Map.tsx index aa036af0f..bce57ec4c 100644 --- a/packages/app/modules/map/widgets/Map.tsx +++ b/packages/app/modules/map/widgets/Map.tsx @@ -1,21 +1,78 @@ -import React, { type FC } from 'react'; -import { Map as LibMap } from '@packrat/map'; -import { StyleSheet, View } from 'react-native'; +import React, { useCallback, useRef, type FC } from 'react'; +import { MapView } from '../lib'; +import { type ViewProps } from 'react-native'; +import { useMapStyles, useMapFullScreen } from '../hooks'; +import { MapStylePicker, FullscreenBtn } from '../components'; +import { FullScreen } from '@packrat/ui'; +import { MapButtonsOverlay } from './MapButtonsOverLay'; interface MapProps { - shape: any; + shape?: any; + shapeURI?: string; + style?: ViewProps['style']; + shouldEnableDownload?: boolean; + onExitFullScreen?: () => void; + onVisibleBoundsChange?: (bounds: number[]) => void; + isFullScreenModeByDefault?: boolean; + initialBounds?: any; + offlineMapName?: string; } -export const Map: FC = ({ shape }) => { - return ; -}; +export const Map: FC = ({ + shape, + shapeURI, + style = { width: '100%', height: 420, position: 'relative' }, + shouldEnableDownload = true, + offlineMapName, + onVisibleBoundsChange, + onExitFullScreen, + isFullScreenModeByDefault, + initialBounds, +}) => { + const mapBoundsRef = useRef([]); + const { selectedStyle, mapStyles, onStyleChange } = useMapStyles(); + const { isFullScreenMode, toggleFullScreen } = useMapFullScreen( + isFullScreenModeByDefault, + ); + + const handleMapBoundsChange = useCallback((bounds) => { + mapBoundsRef.current = bounds; + onVisibleBoundsChange?.(bounds); + }, []); -const styles = StyleSheet.create({ - container: { - flex: 1, - }, - map: { - width: '100%', - height: '100%', - }, -}); + return ( + + + + + { + if (isFullScreenMode) { + onExitFullScreen?.(); + } + + toggleFullScreen(); + }} + isFullScreenMode={isFullScreenMode} + /> + + + ); +}; diff --git a/packages/app/modules/map/widgets/MapButtonsOverLay/MapButtonsOverLay.native.tsx b/packages/app/modules/map/widgets/MapButtonsOverLay/MapButtonsOverLay.native.tsx new file mode 100644 index 000000000..2076e54ae --- /dev/null +++ b/packages/app/modules/map/widgets/MapButtonsOverLay/MapButtonsOverLay.native.tsx @@ -0,0 +1,24 @@ +import React, { type FC } from 'react'; +import { type MapButtonsOverlayProps } from './model'; +import { DownloadMapBtn } from '../../components/DownloadMapBtn'; + +export const MapButtonsOverlay: FC = ({ + children, + currentBounds, + shape, + shouldEnableDownload, +}) => { + return ( + <> + {/* DISABLE OFFLINE MAPS */} + {/* {shouldEnableDownload ? ( + + ) : null} */} + {children} + + ); +}; diff --git a/packages/app/modules/map/widgets/MapButtonsOverLay/MapButtonsOverLay.tsx b/packages/app/modules/map/widgets/MapButtonsOverLay/MapButtonsOverLay.tsx new file mode 100644 index 000000000..4fa9d4727 --- /dev/null +++ b/packages/app/modules/map/widgets/MapButtonsOverLay/MapButtonsOverLay.tsx @@ -0,0 +1,6 @@ +import React, { type FC } from 'react'; +import { type MapButtonsOverlayProps } from './model'; + +export const MapButtonsOverlay: FC = ({ children }) => { + return <>{children}; +}; diff --git a/packages/app/modules/map/widgets/MapButtonsOverLay/index.ts b/packages/app/modules/map/widgets/MapButtonsOverLay/index.ts new file mode 100644 index 000000000..c31e5dbfe --- /dev/null +++ b/packages/app/modules/map/widgets/MapButtonsOverLay/index.ts @@ -0,0 +1 @@ +export * from './MapButtonsOverLay'; diff --git a/packages/app/modules/map/widgets/MapButtonsOverLay/model.ts b/packages/app/modules/map/widgets/MapButtonsOverLay/model.ts new file mode 100644 index 000000000..d737f3ba7 --- /dev/null +++ b/packages/app/modules/map/widgets/MapButtonsOverLay/model.ts @@ -0,0 +1,9 @@ +import { type ReactNode } from 'react'; +import { type Shape } from '../../model'; + +export interface MapButtonsOverlayProps { + children: ReactNode; + currentBounds?: any; + shape?: Shape; + shouldEnableDownload?: boolean; +} diff --git a/packages/app/modules/pack/components/PackCard/PackPrimaryCard.tsx b/packages/app/modules/pack/components/PackCard/PackPrimaryCard.tsx index 3494e7bdd..e1802aba4 100644 --- a/packages/app/modules/pack/components/PackCard/PackPrimaryCard.tsx +++ b/packages/app/modules/pack/components/PackCard/PackPrimaryCard.tsx @@ -10,7 +10,7 @@ import { type PackDetails } from 'app/modules/pack/model'; import { DuplicateIcon } from 'app/assets/icons'; import { useItemWeightUnit } from 'app/modules/item'; import { convertWeight } from 'app/utils/convertWeight'; -import { roundNumber } from 'app/utils'; +import { SMALLEST_ITEM_UNIT } from 'app/modules/item/constants'; interface PackCardProps extends FeedCardProps {} @@ -23,7 +23,7 @@ export const PackPrimaryCard: FC = (props) => { label: key, value: key === 'weight' - ? `${roundNumber(convertWeight(value, 'kg', weightUnit))} ${weightUnit}` + ? `${convertWeight(value, SMALLEST_ITEM_UNIT, weightUnit)} ${weightUnit}` : value, })); diff --git a/packages/app/modules/pack/components/PackTable/TableContainer.tsx b/packages/app/modules/pack/components/PackTable/TableContainer.tsx index 799e10168..ed32a7757 100644 --- a/packages/app/modules/pack/components/PackTable/TableContainer.tsx +++ b/packages/app/modules/pack/components/PackTable/TableContainer.tsx @@ -1,10 +1,7 @@ +import React from 'react'; import { RButton, RSkeleton, RText } from '@packrat/ui'; import { View } from 'react-native'; -import { - usePackTable, - useDeletePackItem, - useIsAuthUserPack, -} from 'app/modules/pack'; +import { useDeletePackItem, useIsAuthUserPack } from 'app/modules/pack'; import useCustomStyles from 'app/hooks/useCustomStyles'; import { loadStyles } from './packtable.style'; import { @@ -12,6 +9,7 @@ import { WeightUnitDropdown, ErrorMessage, } from './TableHelperComponents'; +import { usePackTable } from './usePackTable'; import { BasicTable } from '@packrat/ui/src/Bento/elements/tables'; interface TableContainerProps { @@ -59,7 +57,6 @@ export const TableContainer = ({ if (isLoading) return ; if (error) return ; - return ( {data?.length ? ( diff --git a/packages/app/modules/pack/hooks/usePackTable.tsx b/packages/app/modules/pack/components/PackTable/usePackTable.tsx similarity index 92% rename from packages/app/modules/pack/hooks/usePackTable.tsx rename to packages/app/modules/pack/components/PackTable/usePackTable.tsx index aaa2b87c9..4defafd70 100644 --- a/packages/app/modules/pack/hooks/usePackTable.tsx +++ b/packages/app/modules/pack/components/PackTable/usePackTable.tsx @@ -1,16 +1,11 @@ import { useState } from 'react'; import { convertWeight } from 'app/utils/convertWeight'; import { useAuthUser } from 'app/modules/auth'; -import { useDuplicatePackItem } from './useDuplicatePackItem'; +import { useDuplicatePackItem } from '../../hooks/useDuplicatePackItem'; import { useItemWeightUnit, ItemCategoryEnum } from 'app/modules/item'; +import { SMALLEST_ITEM_UNIT } from 'app/modules/item/constants'; -export const usePackTable = ({ - currentPack, - selectedPack, - refetch, - setRefetch, - copy, -}) => { +export const usePackTable = ({ currentPack, copy }) => { const user = useAuthUser(); const duplicatePackItem = useDuplicatePackItem(); let ids = []; @@ -80,7 +75,7 @@ export const usePackTable = ({ case ItemCategoryEnum.ESSENTIALS: { totalBaseWeight += convertWeight( itemWeight * itemQuantity, - itemUnit as any, + SMALLEST_ITEM_UNIT, weightUnit, ); break; @@ -88,7 +83,7 @@ export const usePackTable = ({ case ItemCategoryEnum.FOOD: { totalFoodWeight += convertWeight( itemWeight * itemQuantity, - itemUnit as any, + SMALLEST_ITEM_UNIT, weightUnit, ); foodItems.push(item); @@ -97,7 +92,7 @@ export const usePackTable = ({ case ItemCategoryEnum.WATER: { totalWaterWeight += convertWeight( itemWeight * itemQuantity, - itemUnit as any, + SMALLEST_ITEM_UNIT, weightUnit, ); waterItem = item; diff --git a/packages/app/modules/pack/hooks/index.ts b/packages/app/modules/pack/hooks/index.ts index 2a70cb196..8045d4f14 100644 --- a/packages/app/modules/pack/hooks/index.ts +++ b/packages/app/modules/pack/hooks/index.ts @@ -9,7 +9,6 @@ export * from './useFetchSinglePack'; export * from './useImportPackItem'; export * from './useIsAuthUserPack'; export * from './usePackId'; -export * from './usePackTable'; export * from './useSimilarPacks'; export * from './useUserPackById'; export * from './useUserPacks'; diff --git a/packages/app/modules/pack/hooks/useFetchSinglePack.ts b/packages/app/modules/pack/hooks/useFetchSinglePack.ts index 7d3a35b3f..a8839c282 100644 --- a/packages/app/modules/pack/hooks/useFetchSinglePack.ts +++ b/packages/app/modules/pack/hooks/useFetchSinglePack.ts @@ -1,7 +1,12 @@ import { useAuthUser } from 'app/modules/auth'; import { queryTrpc } from 'app/trpc'; +import { useItemWeightUnit } from 'app/modules/item'; +import { SMALLEST_ITEM_UNIT } from 'app/modules/item/constants'; +import { useMemo } from 'react'; +import { convertWeight } from 'app/utils/convertWeight'; export const useFetchSinglePack = (packId) => { + const [wightUnit] = useItemWeightUnit(); const user = useAuthUser(); const { refetch, data, error, isLoading, isError } = queryTrpc.getPackById.useQuery( diff --git a/packages/app/modules/pack/hooks/useUserPacks.ts b/packages/app/modules/pack/hooks/useUserPacks.ts index 3855f4b4b..6efe952ef 100644 --- a/packages/app/modules/pack/hooks/useUserPacks.ts +++ b/packages/app/modules/pack/hooks/useUserPacks.ts @@ -1,13 +1,18 @@ import { queryTrpc } from 'app/trpc'; import { getPaginationInitialParams, - useInfinitePagination, + usePagination, type PaginationParams, } from 'app/hooks/pagination'; -import { useState } from 'react'; +import { + type PreviewResourceStateWithData, + usePreviewResourceState, +} from 'app/hooks/common'; +import { useEffect, useState } from 'react'; interface QueryOptions { isPublic?: boolean; + isPreview?: boolean; searchTerm?: string; } @@ -17,8 +22,7 @@ export const useUserPacks = ( queryString = '', queryEnabled = false, ) => { - const { isPublic, searchTerm } = options; - const [allData, setAllData] = useState([]); + const { isPublic, searchTerm, isPreview } = options; const [pagination, setPagination] = useState( getPaginationInitialParams(), ); @@ -26,22 +30,17 @@ export const useUserPacks = ( const enabled = queryEnabled && !!ownerId; const { data, error, isLoading, refetch } = queryTrpc.getUserPacksFeed.useQuery( - { ownerId, isPublic, queryBy: queryString, pagination, searchTerm }, + { + ownerId, + isPublic, + queryBy: queryString, + pagination, + searchTerm, + isPreview, + }, { enabled, - refetchOnWindowFocus: true, - keepPreviousData: true, - onSuccess: (newData) => { - if (newData?.data) { - setAllData((prevData) => { - if (pagination.offset === 0) { - return newData.data; - } - - return [...prevData, ...newData.data]; - }); - } - }, + refetchOnWindowFocus: false, }, ); utils.getPacks.setData({ @@ -49,21 +48,80 @@ export const useUserPacks = ( queryBy: queryString, }); - const { fetchNextPage } = useInfinitePagination( + const { fetchPrevPage, fetchNextPage } = usePagination( refetch, pagination, setPagination, - { nextPage: data?.nextOffset, enabled }, + { + prevPage: data?.prevOffset, + nextPage: data?.nextOffset, + enabled, + }, ); - // Extract packs or set an empty array if data is undefined. + useEffect(() => { + setPagination(getPaginationInitialParams()); + }, [searchTerm, ownerId]); return { - data: allData, - error, + data: data?.data || [], isLoading, + totalCount: data?.totalCount, refetch, + fetchPrevPage, + fetchNextPage, + hasPrevPage: data?.prevOffset !== false, + hasNextPage: data?.nextOffset !== false, + currentPage: data?.currentPage, + totalPages: data?.totalPages, + error: null, + }; +}; + +interface FetchUserPacksPreviewReturn extends PreviewResourceStateWithData { + totalCount: number; + fetchNextPage: () => void; + nextPage?: number; +} + +export const useUserPacksWithPreview = ( + userId: string, + searchTerm: string, +): FetchUserPacksPreviewReturn => { + const { isAllQueryEnabled, ...previewResourceState } = + usePreviewResourceState(); + const { data: previewData, isLoading: isPreviewLoading } = useUserPacks( + userId, + { isPublic: true, isPreview: true }, + 'Most Recent', + true, + ); + + const { + data: allQueryData, + isLoading: isAllQueryLoading, + fetchPrevPage, + fetchNextPage, + totalCount, + hasPrevPage, + hasNextPage, + currentPage, + totalPages, + } = useUserPacks(userId, { isPublic: true, searchTerm }, 'Most Recent', true); + + return { + ...previewResourceState, + isAllQueryEnabled, + previewData, + isPreviewLoading, + allQueryData, + isAllQueryLoading, + totalCount, + fetchPrevPage, fetchNextPage, - nextPage: data?.nextOffset || false, + totalPages, + currentPage, + hasPrevPage, + hasNextPage, }; }; diff --git a/packages/app/modules/trip/components/TripCard/TripPrimaryCard.tsx b/packages/app/modules/trip/components/TripCard/TripPrimaryCard.tsx index 70f384fb1..bfa0a2333 100644 --- a/packages/app/modules/trip/components/TripCard/TripPrimaryCard.tsx +++ b/packages/app/modules/trip/components/TripCard/TripPrimaryCard.tsx @@ -9,14 +9,6 @@ import { LocationLabel } from '../LocationLabel'; interface TripCardProps extends FeedCardProps {} export const TripPrimaryCard: FC = (props) => { - const tripDetails = Object.entries(props.details) - .filter(([key]) => key !== 'description') - .map(([key, value]) => ({ - key, - label: key, - value, - })); - return ( = (props) => { {props.details.description}
{} @@ -15,6 +16,18 @@ export const TripSecondaryCard: FC = (props) => { image={ } + actions={ + + Score + + + } subtitle={} type={props.cardType} /> diff --git a/packages/app/modules/trip/hooks/useUserTrips.ts b/packages/app/modules/trip/hooks/useUserTrips.ts index 3f71a82a0..0b90197f4 100644 --- a/packages/app/modules/trip/hooks/useUserTrips.ts +++ b/packages/app/modules/trip/hooks/useUserTrips.ts @@ -1,61 +1,120 @@ import { queryTrpc } from 'app/trpc'; import { getPaginationInitialParams, - useInfinitePagination, + usePagination, type PaginationParams, } from 'app/hooks/pagination'; -import { useState } from 'react'; +import { + type PreviewResourceStateWithData, + usePreviewResourceState, +} from 'app/hooks/common'; +import { useEffect, useState } from 'react'; export const useUserTrips = ( ownerId: string | undefined, - params?: { searchTerm: string }, + params?: { searchTerm?: string; isPublic?: boolean; isPreview?: boolean }, queryEnabled: boolean = true, ) => { - const [allData, setAllData] = useState([]); const [pagination, setPagination] = useState( getPaginationInitialParams(), ); const enabled = queryEnabled && !!ownerId; - const { searchTerm } = params || {}; + const { searchTerm, isPublic, isPreview } = params || {}; // Leverage the query hook provided by tRPC const { data, error, isLoading, refetch } = queryTrpc.getUserTripsFeed.useQuery( - { ownerId, searchTerm, queryBy: 'Most Recent', pagination }, + { + ownerId, + searchTerm, + queryBy: 'Most Recent', + pagination, + isPublic, + isPreview, + }, { enabled, // This query will run only if 'enabled' is true. refetchOnWindowFocus: false, - keepPreviousData: true, - onSuccess: (newData) => { - if (newData?.data) { - setAllData((prevData) => { - if (pagination.offset === 0) { - return newData.data; - } - - return [...prevData, ...newData.data]; - }); - } - }, }, ); - const { fetchNextPage } = useInfinitePagination( + const { fetchPrevPage, fetchNextPage } = usePagination( refetch, pagination, setPagination, - { nextPage: data?.nextOffset, enabled }, + { + prevPage: data?.prevOffset, + nextPage: data?.nextOffset, + enabled, + }, ); - // Extract trips or set an empty array if data is undefined. - // const trips = data?.trips || []; + useEffect(() => { + setPagination(getPaginationInitialParams()); + }, [searchTerm, ownerId]); return { - data: allData, - error, + data: data?.data || [], isLoading, + totalCount: data?.totalCount, refetch, + fetchPrevPage, + fetchNextPage, + hasPrevPage: data?.prevOffset !== false, + hasNextPage: data?.nextOffset !== false, + currentPage: data?.currentPage, + totalPages: data?.totalPages, + error: null, + }; +}; + +interface FetchUserTripsPreviewReturn extends PreviewResourceStateWithData { + totalCount?: number; + fetchNextPage: () => void; + nextPage?: number; +} + +export const useUserTripsWithPreview = ( + userId: string, + searchTerm: string, +): FetchUserTripsPreviewReturn => { + const { isAllQueryEnabled, ...previewResourceState } = + usePreviewResourceState(); + const { data: previewData, isLoading: isPreviewLoading } = useUserTrips( + userId, + { isPublic: true, searchTerm }, + true, + ); + + const { + data: allQueryData, + isLoading: isAllQueryLoading, + totalCount, + fetchPrevPage, + fetchNextPage, + currentPage, + totalPages, + hasPrevPage, + hasNextPage, + } = useUserTrips( + userId, + { isPublic: true, searchTerm: '' }, + isAllQueryEnabled, + ); + + return { + ...previewResourceState, + isAllQueryEnabled, + previewData, + isPreviewLoading, + allQueryData, + isAllQueryLoading, + totalCount, + fetchPrevPage, fetchNextPage, - nextPage: data?.nextOffset || false, + totalPages, + currentPage, + hasPrevPage, + hasNextPage, }; }; diff --git a/packages/app/modules/trip/model.ts b/packages/app/modules/trip/model.ts index b64a30cff..4ed62a8c4 100644 --- a/packages/app/modules/trip/model.ts +++ b/packages/app/modules/trip/model.ts @@ -4,4 +4,5 @@ export interface TripDetails { description: string; destination: string; activity: string; + score: number; } diff --git a/packages/app/modules/user/components/UserDataCard.tsx b/packages/app/modules/user/components/UserDataCard.tsx index 4707b42fc..33ab2a66e 100644 --- a/packages/app/modules/user/components/UserDataCard.tsx +++ b/packages/app/modules/user/components/UserDataCard.tsx @@ -6,7 +6,6 @@ import { useAddFavorite } from 'app/modules/feed'; import { useAuthUser } from 'app/modules/auth'; import { UserTripCard } from './UserTripCard'; import { UserPackCard } from './UserPackCard'; -import { View, Text } from 'react-native'; const convertersByType = { pack: UserDataPackCardConverter, diff --git a/packages/app/modules/user/components/UserDetailList.tsx b/packages/app/modules/user/components/UserDetailList.tsx index 2b2a92386..6afdafd19 100644 --- a/packages/app/modules/user/components/UserDetailList.tsx +++ b/packages/app/modules/user/components/UserDetailList.tsx @@ -1,47 +1,38 @@ import React, { useRef, useMemo, useState } from 'react'; -import { View, FlatList, Platform } from 'react-native'; +import { + View, + FlatList, + Platform, + Dimensions, + ActivityIndicator, +} from 'react-native'; import { FeedCard, FeedSearchFilter } from 'app/modules/feed'; import { fuseSearch } from 'app/utils/fuseSearch'; -import { BaseDialog, BaseModal } from '@packrat/ui'; -// import BottomSheet from '@gorhom/bottom-sheet'; - -interface DataItem { - _id: string; - type: string; -} +import { BaseDialog, BaseModal, Pagination, RButton } from '@packrat/ui'; +import { type PreviewResourceStateWithData } from 'app/hooks/common'; interface DataListProps { - data: DataItem[]; + resource: PreviewResourceStateWithData; + search: string; + onSearchChange: (search: string) => void; } -export const UserDataList = ({ data }: DataListProps) => { - const [searchQuery, setSearchQuery] = useState(''); - const keys = ['name', 'items.name', 'items.category']; - const options = { - threshold: 0.4, - location: 0, - distance: 100, - maxPatternLength: 32, - minMatchCharLength: 1, - }; - - const results = fuseSearch(data, searchQuery, keys, options); - const filteredData = searchQuery - ? results.map((result) => result.item) - : data; - - // ref for bottom sheet - const bottomSheetRef = useRef(null); - - // variables for bottom sheet behavior - const snapPoints = useMemo(() => ['25%', '50%'], []); +const windowHeight = Dimensions.get('window').height; +export const UserDataList = ({ + resource, + search, + onSearchChange, +}: DataListProps) => { return ( <> {Platform.OS == 'web' ? ( resource.setIsSeeAllModalOpen(true)} + onClose={() => resource.setIsSeeAllModalOpen(false)} footerButtons={[ { label: 'Cancel', @@ -52,29 +43,49 @@ export const UserDataList = ({ data }: DataListProps) => { footerComponent={undefined} > - item?.id} - ItemSeparatorComponent={() => } - renderItem={({ item }) => ( - - )} - showsVerticalScrollIndicator={false} - maxToRenderPerBatch={2} + queryString={search} + setSearchQuery={onSearchChange} /> + + item?.id} + ItemSeparatorComponent={() => } + renderItem={({ item }) => ( + + )} + showsVerticalScrollIndicator={false} + maxToRenderPerBatch={2} + /> + + {resource.totalPages > 1 ? ( + + ) : null} ) : ( @@ -93,26 +104,30 @@ export const UserDataList = ({ data }: DataListProps) => { > - - item?._id} - ItemSeparatorComponent={() => } - renderItem={({ item }) => ( - - )} - showsVerticalScrollIndicator={false} - maxToRenderPerBatch={2} + queryString={search} + setSearchQuery={onSearchChange} /> + + item?._id} + ItemSeparatorComponent={() => } + renderItem={({ item }) => ( + + )} + showsVerticalScrollIndicator={false} + maxToRenderPerBatch={2} + /> + + {resource.nextPage ? ( + Load more + ) : null} )} diff --git a/packages/app/modules/user/components/UserPackCard.tsx b/packages/app/modules/user/components/UserPackCard.tsx index 936effa02..397f64c0b 100644 --- a/packages/app/modules/user/components/UserPackCard.tsx +++ b/packages/app/modules/user/components/UserPackCard.tsx @@ -9,8 +9,8 @@ import { import { type PackDetails } from 'app/modules/pack/model'; import { useEditPack } from 'app/modules/pack/hooks'; import useTheme from 'app/hooks/useTheme'; -import { StarIcon } from 'lucide-react-native'; import { useUserPacks } from 'app/modules/pack/hooks'; +import { ScoreLabel } from 'app/components/ScoreLabel'; interface PackCardProps extends FeedCardProps {} @@ -46,20 +46,13 @@ export const UserPackCard: FC = (props) => { link={`/pack/${props.id}`} image={} subtitle={ - - - - {!isNaN(props.details.similarityScore) + - + : Number(props.details.score) + } + /> } actions={ diff --git a/packages/app/modules/user/hooks/useProfile.ts b/packages/app/modules/user/hooks/useProfile.ts index 4f9191fc4..504041b8d 100644 --- a/packages/app/modules/user/hooks/useProfile.ts +++ b/packages/app/modules/user/hooks/useProfile.ts @@ -1,60 +1,66 @@ -import { useFetchUserFavorites } from 'app/modules/feed'; -import { useUserPacks } from 'app/modules/pack'; -import { useUserTrips } from 'app/hooks/singletrips'; +import { useFetchUserFavoritesWithPreview } from 'app/modules/feed'; +import { useUserPacksWithPreview } from 'app/modules/pack'; import { useAuthUser, useMatchesCurrentUser } from 'app/modules/auth'; import { useGetUser } from './useGetUser'; +import { useUserTripsWithPreview } from 'app/modules/trip/hooks/useUserTrips'; +import { useCallback, useState } from 'react'; +import type { PreviewListType } from '../model'; export const useProfile = (id = null) => { const authUser = useAuthUser(); const userId = id ?? authUser?.id; + const [searchTerms, setSearchTerms] = useState< + Record + >({ favorites: '', packs: '', trips: '' }); const isCurrentUser = useMatchesCurrentUser(userId as string); // TODO: Implement this hook in more components - const { - data: allPacks, - isLoading: allPacksLoading, - error: allPacksError, - } = useUserPacks(userId, {}, '', true); // TODO: Add enabled as parameter - - const { - data: allTrips, - isLoading: tripsIsLoading, - error: tripsError, - } = useUserTrips(userId, {}, '', true); // TODO: Add enabled as parameter - - const { - data: allFavorites, - isLoading: allFavoritesLoading, - error: allFavoritesError, - } = useFetchUserFavorites(userId as string); // TODO: Add enabled as parameter - - const { - data: userData, - isLoading: userIsLoading, - error: userError, - } = useGetUser(userId as string); + const favoritesQuery = useFetchUserFavoritesWithPreview( + userId as string, + searchTerms.favorites, + ); + const userPacksQuery = useUserPacksWithPreview( + userId as string, + searchTerms.packs, + ); + const userTripsQuery = useUserTripsWithPreview( + userId as string, + searchTerms.trips, + ); + + const onSearchChange = useCallback( + (search: string, type: PreviewListType) => { + setSearchTerms((prev) => ({ ...prev, [type]: search })); + }, + [], + ); + + const { data: userData, isLoading: userIsLoading } = useGetUser( + userId as string, + ); const user = !isCurrentUser ? userData : authUser; const isLoading = - userIsLoading || allPacksLoading || tripsIsLoading || allFavoritesLoading; - - const error = userError || allPacksError || tripsError || allFavoritesError; + userIsLoading || + userPacksQuery.isPreviewLoading || + userTripsQuery.isPreviewLoading || + favoritesQuery.isPreviewLoading; - const tripsCount = allTrips?.length ?? 0; - const packsCount = allPacks?.length ?? 0; - const favoritesCount = allFavorites?.length ?? 0; + const error = ''; return { user, - favoritesList: Array.isArray(allFavorites) ? allFavorites : [], - packsList: Array.isArray(allPacks) ? allPacks : [], - tripsList: Array.isArray(allTrips) ? allTrips : [], - tripsCount, - packsCount, - favoritesCount, + favoritesQuery, + userPacksQuery, + userTripsQuery, + tripsCount: userTripsQuery.totalCount, + packsCount: userPacksQuery.totalCount, + favoritesCount: favoritesQuery.totalCount, isLoading, error, isCurrentUser, + searchTerms, + onSearchChange, }; }; diff --git a/packages/app/modules/user/model.ts b/packages/app/modules/user/model.ts new file mode 100644 index 000000000..a664b944a --- /dev/null +++ b/packages/app/modules/user/model.ts @@ -0,0 +1 @@ +export type PreviewListType = 'favorites' | 'packs' | 'trips'; diff --git a/packages/app/modules/user/screens/SettingsScreen.tsx b/packages/app/modules/user/screens/SettingsScreen.tsx index 82c096ca3..8a5d1ba95 100644 --- a/packages/app/modules/user/screens/SettingsScreen.tsx +++ b/packages/app/modules/user/screens/SettingsScreen.tsx @@ -47,17 +47,17 @@ export function SettingsScreen() { return user ? ( - {isLoading && ( - } - /> - )} + {isLoading && } - {favoritesList.length > 0 ? ( + {favoritesQuery?.previewData?.length > 0 ? ( ) : ( )} - {packsList.length > 0 && ( + {userPacksQuery?.previewData?.length > 0 && ( )} - {/* DISABLE TRIP TEMP */} - {tripsList.length > 0 && ( + {userTripsQuery?.previewData?.length > 0 && ( )} @@ -295,8 +294,6 @@ const loadStyles = (theme) => { backgroundColor: currentTheme.colors.background, alignItems: 'center', borderRadius: 12, - marginBottom: 25, - padding: 20, shadowColor: '#000', shadowOffset: { width: 0, diff --git a/packages/app/modules/user/widgets/UserDataContainer.tsx b/packages/app/modules/user/widgets/UserDataContainer.tsx index 2396c45eb..e3e9f6f17 100644 --- a/packages/app/modules/user/widgets/UserDataContainer.tsx +++ b/packages/app/modules/user/widgets/UserDataContainer.tsx @@ -1,8 +1,8 @@ import { RLink } from '@packrat/ui'; import { RStack, RText, RButton, RSkeleton } from '@packrat/ui'; -import { VirtualizedList } from 'react-native'; +import { Platform, VirtualizedList } from 'react-native'; import { UserDataCard, UserDataList } from '../components'; -import React, { useEffect, useState } from 'react'; +import React, { memo, useEffect, useState } from 'react'; import LargeCard from 'app/components/card/LargeCard'; import useTheme from 'app/hooks/useTheme'; import { hexToRGBA } from 'app/utils/colorFunctions'; @@ -10,6 +10,8 @@ import { View } from 'react-native'; import { useAuthUser } from 'app/modules/auth'; import Layout from 'app/components/layout/Layout'; import { SearchProvider } from 'app/modules/feed'; +import { type PreviewResourceStateWithData } from 'app/hooks/common'; +import type { PreviewListType } from '../model'; // Skeleton version of the UserDataCard component const SkeletonUserDataCard = () => { @@ -26,19 +28,23 @@ const SkeletonUserDataCard = () => { }; interface UserDataContainerProps { - data: any; - type: 'packs' | 'trips' | 'favorites'; + resource: PreviewResourceStateWithData; + type: PreviewListType; userId?: string; isLoading?: boolean; SkeletonComponent?: React.ReactElement; + searchTerm: string; + onSearchChange: (search: string, type: PreviewListType) => void; } -export function UserDataContainer({ - data = [], +export const UserDataContainer = memo(function UserDataContainer({ + resource, type, userId, isLoading, SkeletonComponent, + searchTerm, + onSearchChange, }: UserDataContainerProps) { const { enableDarkMode, enableLightMode, isDark, isLight, currentTheme } = useTheme(); @@ -77,14 +83,14 @@ export function UserDataContainer({ return ( {isLoading ? ( skeletonCards - ) : data && data.length > 0 ? ( + ) : resource?.previewData && resource?.previewData.length > 0 ? ( <> data.length} + getItemCount={() => resource.previewData.length} getItem={(data, index) => data[index]} - data={data} + data={resource.previewData} keyExtractor={(item) => item.id} renderItem={Card} scrollEnabled={true} @@ -122,16 +128,17 @@ export function UserDataContainer({ horizontal={true} nestedScrollEnabled={true} contentContainerStyle={{ - padding: 10, - // paddingHorizontal: 1, - // paddingVertical: 3, - // justifyContent: 'center', - // alignItems: 'center', + paddingHorizontal: 10, }} + ItemSeparatorComponent={() => } /> - + onSearchChange(search, type)} + /> ) : currentUser?.id === userId ? ( @@ -148,4 +155,4 @@ export function UserDataContainer({ ); -} +}); diff --git a/packages/app/package.json b/packages/app/package.json index 0c7c004a9..18f3710fa 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -32,7 +32,6 @@ "@fortawesome/react-fontawesome": "^0.2.0", "@hookform/resolvers": "^3.3.4", "@packrat/crosspath": "*", - "@packrat/map": "*", "@packrat/ui": "*", "@packrat/validations": "*", "@react-native-async-storage/async-storage": "^1.23.1", @@ -46,7 +45,7 @@ "@rehookify/datepicker": "^6.6.1", "@rneui/base": "^4.0.0-rc.8", "@rneui/themed": "^4.0.0-rc.8", - "@rnmapbox/maps": "^10.1.29", + "@rnmapbox/maps": "*", "@tamagui/animations-react-native": "1.96.0", "@tamagui/babel-plugin": "1.96.0", "@tamagui/config": "1.96.0", @@ -69,6 +68,7 @@ "@trpc/client": "^10.45.1", "@trpc/react-query": "^10.45.1", "@trpc/server": "^10.45.1", + "@types/mapbox-gl": "^3.4.0", "axios": "^1.4.0", "babel-plugin-transform-inline-environment-variables": "^0.4.4", "burnt": "^0.12.2", @@ -98,11 +98,12 @@ "file-saver": "^2.0.5", "firebase": "^9.19.1", "fuse.js": "^6.6.2", + "geojson-bounds": "^1.0.4", "immer": "^10.0.3", "jotai": "^2.6.4", "lodash": "^4.17.21", "lucide-react-native": "^0.400.0", - "mapbox-gl": "1.13.3", + "mapbox-gl": "^3.6.0", "moti": "^0.27.2", "native-base": "^3.4.28", "normalize-css-color": "^1.0.2", @@ -112,6 +113,7 @@ "react-dom": "18.2.0", "react-error-boundary": "^4.0.13", "react-hook-form": "^7.51.0", + "react-map-gl": "^7.1.7", "react-native": "0.73.6", "react-native-action-button": "^2.8.5", "react-native-dotenv": "^3.4.8", diff --git a/packages/app/screens/maps/index.tsx b/packages/app/screens/maps/index.tsx deleted file mode 100644 index 863cf76ba..000000000 --- a/packages/app/screens/maps/index.tsx +++ /dev/null @@ -1,177 +0,0 @@ -import { Modal, Text, View, Image } from 'react-native'; -import { offlineManager } from '@rnmapbox/maps'; -import React, { useState, useCallback } from 'react'; -import { useFocusEffect } from 'expo-router'; -import { TouchableOpacity } from 'react-native-gesture-handler'; -import useTheme from 'app/hooks/useTheme'; -import { api } from 'app/constants/api'; -import { RButton, RScrollView, RStack } from '@packrat/ui'; -import useCustomStyles from 'app/hooks/useCustomStyles'; -import { Map } from '@packrat/map'; -import { useAuthUserToken, useUserQuery } from 'app/modules/auth'; -import type OfflinePack from '@rnmapbox/maps/lib/typescript/src/modules/offline/OfflinePack'; -import { disableScreen } from 'app/hoc/disableScreen'; - -interface OfflineMap { - name: string; - styleURL: string; - bounds: [number[], number[]]; - minZoom: number; - maxZoom: number; - downloaded: boolean; - metadata: { - shape: unknown; - }; -} - -const getCenterCoordinates = (bounds: [number[], number[]]) => { - const [ - [southWestLongitude, southWestLatitude], - [northEastLongitude, northEastLatitude], - ] = bounds; - const centerLatitude = (northEastLatitude + southWestLatitude) / 2; - const centerLongitude = (northEastLongitude + southWestLongitude) / 2; - - return [centerLongitude, centerLatitude]; -}; - -function CircleCapComp() { - const { enableDarkMode, enableLightMode, isDark, isLight, currentTheme } = - useTheme(); - - return ( - - ); -} - -function DownloadedMaps() { - const styles = useCustomStyles(loadStyles); - const { enableDarkMode, enableLightMode, isDark, isLight, currentTheme } = - useTheme(); - const { user } = useUserQuery(); - const { token } = useAuthUserToken(); - const [offlineMaps, setOfflineMaps] = useState(); - const refreshOfflineMapList = async () => { - const offlineMaps = Object.values(user.offlineMaps || {}); - const offlineMapboxPacks: OfflineMap[] = []; - for (const map of offlineMaps) { - const offlineMap: OfflineMap = { - styleURL: `${map.styleURL}`, - name: `${map.name}`, - minZoom: map.minZoom, - maxZoom: map.maxZoom, - bounds: map.bounds, - metadata: { - shape: JSON.parse(map.metadata.shape), - }, - downloaded: false, - }; - - let offlineMapboxPack: OfflinePack | null; - try { - offlineMapboxPack = await offlineManager.getPack(map.name); - } catch (error) { - console.error(error); - offlineMapboxPack = null; - } - - if (offlineMapboxPack) { - offlineMap.downloaded = true; - } - - offlineMapboxPacks.push(offlineMap); - } - - setOfflineMaps(offlineMapboxPacks); - }; - - useFocusEffect( - useCallback(() => { - refreshOfflineMapList(); - }, [user]), - ); - - return ( - - - - Downloaded Maps - - {offlineMaps ? ( - - {offlineMaps.map((offlineMap) => { - const center = getCenterCoordinates(offlineMap.bounds); - return ( - - - - {offlineMap.name} - - - ); - })} - - ) : ( - - loading... - - )} - - - ); -} - -const loadStyles = ({ currentTheme }) => { - return { - lineLayer: { - lineWidth: 4, - lineOpacity: 1, - lineColor: currentTheme.colors.cardIconColor, - }, - }; -}; - -export default disableScreen(DownloadedMaps); diff --git a/packages/app/screens/trip/TripDetails.tsx b/packages/app/screens/trip/TripDetails.tsx index 879dfe596..39731c4d4 100644 --- a/packages/app/screens/trip/TripDetails.tsx +++ b/packages/app/screens/trip/TripDetails.tsx @@ -11,17 +11,10 @@ import useCustomStyles from 'app/hooks/useCustomStyles'; import useResponsive from 'app/hooks/useResponsive'; import { useFetchSingleTrip, useTripWeather } from 'app/hooks/singletrips'; import ScoreContainer from 'app/components/ScoreContainer'; -import { - TableContainerComponent, - WeatherCardComponent, - TripCardComponent, - ScoreContainerComponent, - loadStyles, -} from './TripDetailsComponents'; +import { TableContainerComponent, loadStyles } from './TripDetailsComponents'; import { useTripId } from 'app/hooks/trips'; - -import { formatTripActivityLabel } from 'app/utils/tripUtils'; import Layout from 'app/components/layout/Layout'; +import { TripMapCard } from 'app/components/trip/TripCards'; interface TripData { packs?: any; @@ -78,8 +71,8 @@ export function TripDetails() { val} renderItem={({ item }) => { { switch (item[1]) { case SECTION.DESCRIPTION: return ( - + {data?.description}
+ + + ); case SECTION.SCORE: return ( ); diff --git a/packages/app/screens/trip/TripDetailsComponents.tsx b/packages/app/screens/trip/TripDetailsComponents.tsx index c0195069c..8fe2990a7 100644 --- a/packages/app/screens/trip/TripDetailsComponents.tsx +++ b/packages/app/screens/trip/TripDetailsComponents.tsx @@ -41,17 +41,6 @@ const WeatherCardComponent = ({ weatherObject, weatherWeek, data }) => ( ); -const TripCardComponent = ({ data, weatherObject, currentTheme }) => - (data?.geojson?.features?.length && ( - // data?.geojson && ( - - )) || ; - const ScoreContainerComponent = ({ data, isOwner }) => ( @@ -88,7 +77,6 @@ const loadStyles = (theme) => { export { TableContainerComponent, WeatherCardComponent, - TripCardComponent, ScoreContainerComponent, loadStyles, }; diff --git a/packages/app/screens/trip/createTrip.tsx b/packages/app/screens/trip/createTrip.tsx index 71921d44f..cbef0e8dd 100644 --- a/packages/app/screens/trip/createTrip.tsx +++ b/packages/app/screens/trip/createTrip.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { RStack } from '@packrat/ui'; -import { ScrollView } from 'react-native'; +import { FlatList, ScrollView } from 'react-native'; import { theme } from '../../theme'; import { useRef } from 'react'; import { GearList } from '../../components/GearList/GearList'; @@ -18,6 +18,19 @@ import { TripDateRangeCard, } from 'app/components/trip/TripCards'; import { WeatherData } from 'app/components/weather/WeatherData'; +import { useFlatList } from 'app/hooks/useFlatList'; + +const SECTIONS = { + SEARCH: 'SEARCH', + WEATHER: 'WEATHER', + TRAIL: 'TRAIL', + PARK: 'PARK', + PACK: 'PACK', + ACTIVITY: 'ACTIVITY', + DATE: 'DATE', + MAP: 'MAP', + FOOTER: 'FOOTER', +}; function Trips() { const styles = useCustomStyles(loadStyles); @@ -41,40 +54,60 @@ function Trips() { end_date: tripStore.end_date, }; + const { flatListData, keyExtractor, renderItem } = useFlatList(SECTIONS, { + [SECTIONS.SEARCH]: , + [SECTIONS.WEATHER]: latLng ? : null, + [SECTIONS.TRAIL]: ( + togglePlace('trails', trail)} + selectedValue={tripStore.trails?.map?.(({ id }) => id) || []} + /> + ), + [SECTIONS.PARK]: ( + togglePlace('parks', park)} + selectedValue={tripStore.parks?.map?.(({ id }) => id) || []} + /> + ), + [SECTIONS.PACK]: , + [SECTIONS.ACTIVITY]: ( + setTripValue('activity', activity)} + /> + ), + [SECTIONS.DATE]: ( + + ), + [SECTIONS.MAP]: + !hasPhotonError && photonDetails ? ( + { + console.log({ bounds }); + setTripValue('bounds', bounds); + }} + /> + ) : null, + [SECTIONS.FOOTER]: isValid && ( + + + + ), + }); + return ( - {/* */} - - {latLng ? : null} - togglePlace('trails', trail)} - selectedValue={tripStore.trails?.map?.(({ id }) => id) || []} - /> - togglePlace('parks', park)} - selectedValue={tripStore.parks?.map?.(({ id }) => id) || []} - /> - - setTripValue('activity', activity)} - /> - - {!hasPhotonError && photonDetails ? ( - - ) : null} - {isValid && ( - - - - )} diff --git a/packages/app/utils/convertWeight.ts b/packages/app/utils/convertWeight.ts index e42fe3351..671e25407 100644 --- a/packages/app/utils/convertWeight.ts +++ b/packages/app/utils/convertWeight.ts @@ -28,5 +28,5 @@ export const convertWeight = ( const weightInGrams = weight * units[fromUnit]; const convertedWeight = weightInGrams / units[toUnit]; - return convertedWeight; + return Number(convertedWeight.toFixed(2)); }; diff --git a/packages/crosspath/tsconfig.json b/packages/crosspath/tsconfig.json index 2d81e5d76..c26da30b1 100644 --- a/packages/crosspath/tsconfig.json +++ b/packages/crosspath/tsconfig.json @@ -8,6 +8,7 @@ "moduleResolution": "node", "esModuleInterop": true, "skipLibCheck": true, + "noCheck": true, "forceConsistentCasingInFileNames": true, }, "include": ["src"], diff --git a/packages/shared-types/CHANGELOG.md b/packages/shared-types/CHANGELOG.md deleted file mode 100644 index d6b32e324..000000000 --- a/packages/shared-types/CHANGELOG.md +++ /dev/null @@ -1,13 +0,0 @@ -# @packrat/shared-types - -## 1.1.1 - -### Patch Changes - -- d50da32: changeset commit 2 setting up initial version - -## 1.1.0 - -### Minor Changes - -- ee84040: initial changeset commit diff --git a/packages/shared-types/README.md b/packages/shared-types/README.md deleted file mode 100644 index 170dcbc0f..000000000 --- a/packages/shared-types/README.md +++ /dev/null @@ -1 +0,0 @@ -# shared-types diff --git a/packages/shared-types/package.json b/packages/shared-types/package.json deleted file mode 100644 index dacc96821..000000000 --- a/packages/shared-types/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "@packrat/shared-types", - "version": "1.1.1", - "source": "src/index.ts", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "private": true, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "build": "NODE_OPTIONS=--max_old_space_size=4096 tsc", - "build:and:install": "yarn build && yarn", - "postinstall": "yarn build", - "clean": "rm -rf dist && rm -rf node_modules" - }, - "keywords": [], - "license": "ISC", - "devDependencies": { - "typescript": "^5.5.3" - } -} diff --git a/packages/shared-types/src/index.ts b/packages/shared-types/src/index.ts deleted file mode 100644 index 39f4fde4b..000000000 --- a/packages/shared-types/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './packAndItemVisibilityFilter'; diff --git a/packages/shared-types/src/packAndItemVisibilityFilter.ts b/packages/shared-types/src/packAndItemVisibilityFilter.ts deleted file mode 100644 index ae5cb6688..000000000 --- a/packages/shared-types/src/packAndItemVisibilityFilter.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum PackAndItemVisibilityFilter { - PUBLIC = 'PUBLIC', - PRIVATE = 'PRIVATE', - ALL = 'ALL', -} diff --git a/packages/shared-types/tsconfig.json b/packages/shared-types/tsconfig.json deleted file mode 100644 index 7ae3e4157..000000000 --- a/packages/shared-types/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "module": "ESNext", - "lib": ["es6", "DOM"], - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "isolatedModules": true, - "moduleResolution": "node", - "preserveWatchOutput": true, - "skipLibCheck": true, - "allowJs": true, - "strict": true, - "outDir": "dist", - "rootDir": "src", - "declaration": true, - "sourceMap": true, - "declarationMap": true - }, - "exclude": ["node_modules"], - "include": ["src"] -} diff --git a/packages/ui/src/Bento/elements/tables/Basic.tsx b/packages/ui/src/Bento/elements/tables/Basic.tsx index d9277dba6..cd767469a 100644 --- a/packages/ui/src/Bento/elements/tables/Basic.tsx +++ b/packages/ui/src/Bento/elements/tables/Basic.tsx @@ -9,16 +9,17 @@ import * as React from 'react'; import { Text, View, getTokenValue } from 'tamagui'; import { Table } from './common/tableParts'; import { AddItem } from 'app/modules/item'; -import { DeletePackItemModal, EditPackItemModal } from 'app/modules/pack'; -import { ThreeDotsMenu, YStack, RButton, RText } from '@packrat/ui'; +import { MaterialIcons } from '@expo/vector-icons'; +import { EditPackItemModal } from 'app/modules/pack'; +import { RText } from '@packrat/ui'; -import { Platform } from 'react-native'; -import { RDropdownMenu } from '../../../ZDropdown'; import RIconButton from '../../../RIconButton'; -import { ChevronDown } from '@tamagui/lucide-icons'; import { BaseAlert } from '@packrat/ui'; import { useProfile } from 'app/modules/user/hooks'; import { useAuthUser } from 'app/modules/auth'; +import { convertWeight } from 'app/utils/convertWeight'; +import { SMALLEST_ITEM_UNIT } from 'app/modules/item/constants'; +import { ActionsDropdownComponent } from '@packrat/ui'; type ModalName = 'edit' | 'delete'; @@ -41,6 +42,11 @@ interface GroupedData { [key: string]: Item[]; } +interface optionValues { + label: string; + value: string; +} + interface BasicTableProps { groupedData: GroupedData; handleCheckboxChange: (itemId: string) => void; @@ -61,9 +67,8 @@ export function BasicTable({ setRefetch, }: BasicTableProps) { const user = useAuthUser(); - console.log('user', user) + console.log('user', user); const ActionButtons = ({ item }) => { - const [activeModal, setActiveModal] = React.useState( null, ); @@ -81,13 +86,21 @@ export function BasicTable({ setSelectedItemId(null); }; - const handleEditClick = () => { - openModal('edit', item.id); + const handleActionsOpenChange = (state) => { + switch (state) { + case 'Edit': + openModal('edit', item.id); + break; + case 'Delete': + openModal('delete', item.id); + break; + } }; - const handleDeleteClick = () => { - openModal('delete', item.id); - }; + const optionValues: optionValues[] = [ + { label: 'Edit', value: 'Edit' }, + { label: 'Delete', value: 'Delete' }, + ]; return ( <> @@ -135,57 +148,24 @@ export function BasicTable({ {hasPermissions ? ( - Platform.OS === 'android' || - Platform.OS === 'ios' || - window.innerWidth < 900 ? ( - - - } - /> - - ) : ( - - - - Edit - Delete - - - - ) + + handleActionsOpenChange(value)} + native={true} + /> + ) : null} ); }; - const convertToPreferredWeight = (preferredUnit, weightInGrams) => { - let convertedWeight; - - if (preferredUnit === 'lb') { - convertedWeight = weightInGrams / 453.592; // Convert grams to pounds - } else if (preferredUnit === 'oz') { - convertedWeight = weightInGrams / 28.3495; // Convert grams to ounces - } else if (preferredUnit === 'kg') { - convertedWeight = weightInGrams / 1000; // Convert grams to kilograms - } else if (preferredUnit === 'g') { - convertedWeight = weightInGrams; // Already in grams - } else { - throw new Error(`Unsupported unit: ${preferredUnit}`); - } - - return parseFloat(convertedWeight.toFixed(1)); - }; - const columnHelper = createColumnHelper(); const columns = [ columnHelper.accessor('name', { @@ -201,7 +181,12 @@ export function BasicTable({ columnHelper.accessor('weight', { cell: (info) => { const weightInGrams = info.getValue(); - const preferredWeight = convertToPreferredWeight(user.preferredWeight, weightInGrams); + + const preferredWeight = convertWeight( + weightInGrams, + SMALLEST_ITEM_UNIT, + info.row.original.unit as any, + ); return preferredWeight; }, header: () => 'Weight', @@ -259,14 +244,13 @@ export function BasicTable({ if (sm) { return ( - + {tableData.map((row, i) => ( @@ -275,13 +259,17 @@ export function BasicTable({ if (name === 'ownerId' || name === 'id') { return null; } + const finalValue = + name === 'weight' + ? convertWeight(value, SMALLEST_ITEM_UNIT, row.unit) + : value; return ( - + {name.charAt(0).toUpperCase() + name.slice(1)} {name === 'category' ? ( {String(value?.name)} ) : ( - {String(value)} + {String(finalValue)} )} ); @@ -332,9 +320,9 @@ export function BasicTable({ {header.isPlaceholder ? null : flexRender( - header.column.columnDef.header, - header.getContext(), - )} + header.column.columnDef.header, + header.getContext(), + )} ))} diff --git a/packages/ui/src/Bento/elements/tables/PaginatedSortedTable.tsx b/packages/ui/src/Bento/elements/tables/PaginatedSortedTable.tsx index e474a1820..f3186dda5 100644 --- a/packages/ui/src/Bento/elements/tables/PaginatedSortedTable.tsx +++ b/packages/ui/src/Bento/elements/tables/PaginatedSortedTable.tsx @@ -8,10 +8,12 @@ import { getPaginationRowModel, } from '@tanstack/react-table'; import { useMedia } from 'tamagui'; +import { convertWeight } from 'app/utils/convertWeight'; import { Text, View, Button, getTokenValue } from 'tamagui'; import { Table } from './common/tableParts'; import { Pressable } from 'react-native'; import { useRouter } from '@packrat/crosspath'; +import { SMALLEST_ITEM_UNIT } from 'app/modules/item/constants'; const ITEMS_PER_PAGE = 10; @@ -66,7 +68,12 @@ export function PaginatedSortedTable({ footer: (info) => info.column.id, }), columnHelper.accessor('weight', { - cell: (info) => info.getValue(), + cell: (info) => + convertWeight( + info.getValue(), + SMALLEST_ITEM_UNIT, + info.row.original.unit as any, + ), header: () => 'Weight', footer: (info) => info.column.id, }), diff --git a/packages/ui/src/Bento/forms/layouts/SignInScreen.tsx b/packages/ui/src/Bento/forms/layouts/SignInScreen.tsx index 714ca78d3..3c326756a 100644 --- a/packages/ui/src/Bento/forms/layouts/SignInScreen.tsx +++ b/packages/ui/src/Bento/forms/layouts/SignInScreen.tsx @@ -28,7 +28,7 @@ export function SignInScreen({ const { xxs, xs } = useResponsive(); const handleBiometricAuth = async () => { - if (Platform.OS === 'web') { + if (Platform.OS === 'web' || true) { return true; } diff --git a/packages/ui/src/CascadedDropdown.tsx b/packages/ui/src/CascadedDropdown.tsx index 76a7c56bd..f69b25e32 100644 --- a/packages/ui/src/CascadedDropdown.tsx +++ b/packages/ui/src/CascadedDropdown.tsx @@ -1,6 +1,8 @@ import { RSelect } from '@packrat/ui'; import React from 'react'; import { View, Platform } from 'react-native'; +import RIconButton from './RIconButton'; +import { MaterialIcons } from '@expo/vector-icons'; interface DropdownComponentProps { width?: string | number; @@ -38,4 +40,38 @@ export const CascadedDropdownComponent: React.FC = ({ ); }; +export const ActionsDropdownComponent: React.FC = ({ + width, + style = {}, + placeholder, + ...props +}) => { + const isWeb = Platform.OS === 'web'; + + return ( + + } + style={{ + height: 20, + pointerEvents: 'none', + }} + /> + } + {...props} + /> + + ); +}; + export default CascadedDropdownComponent; diff --git a/packages/ui/src/Details/Details.tsx b/packages/ui/src/Details/Details.tsx index 34b772ce8..a21ca217f 100644 --- a/packages/ui/src/Details/Details.tsx +++ b/packages/ui/src/Details/Details.tsx @@ -33,7 +33,7 @@ export const Details: FC = ({ items }) => { alignItems: 'center', flexWrap: 'wrap', textTransform: 'capitalize', - color: primaryColor?.val, + // color: primaryColor?.val, flex: 1, fontSize: 14, }} diff --git a/packages/ui/src/FullScreen/FullScreen.native.tsx b/packages/ui/src/FullScreen/FullScreen.native.tsx new file mode 100644 index 000000000..3e3ca6c4e --- /dev/null +++ b/packages/ui/src/FullScreen/FullScreen.native.tsx @@ -0,0 +1,39 @@ +import React, { type FC, type ReactNode, useEffect } from 'react'; +import { + View, + Platform, + StatusBar, + StyleSheet, + type ViewProps, + Dimensions, + Modal, +} from 'react-native'; + +interface FullScreenProps { + isFullScreen: boolean; + children: ReactNode; + defaultStyles: ViewProps['style']; +} + +export const FullScreen: FC = ({ + isFullScreen, + children, + defaultStyles = {}, +}) => { + useEffect(() => { + StatusBar.setHidden(isFullScreen); + }, [isFullScreen]); + const content = {children}; + + return isFullScreen ? {content} : content; +}; + +const styles = StyleSheet.create({ + fullScreen: { + position: 'relative', + top: 0, + left: 0, + width: Dimensions.get('screen').width, + zIndex: 9999, + }, +}); diff --git a/packages/ui/src/FullScreen/FullScreen.tsx b/packages/ui/src/FullScreen/FullScreen.tsx new file mode 100644 index 000000000..027d43663 --- /dev/null +++ b/packages/ui/src/FullScreen/FullScreen.tsx @@ -0,0 +1,51 @@ +import React, { type FC, type ReactNode, useEffect } from 'react'; +import { + View, + Platform, + StatusBar, + StyleSheet, + type ViewProps, + Dimensions, +} from 'react-native'; +import { useWebFullScreen } from './useWebFullScreen'; + +interface FullScreenProps { + isFullScreen: boolean; + children: ReactNode; + defaultStyles: ViewProps['style']; +} + +export const FullScreen: FC = ({ + isFullScreen, + children, + defaultStyles = {}, +}) => { + const webFullScreen = useWebFullScreen(); + + useEffect(() => { + if (isFullScreen) { + webFullScreen.enterFullScreen(); + } else { + webFullScreen.exitFullScreen(); + } + }, [isFullScreen]); + + return ( + + {children} + + ); +}; + +const styles = StyleSheet.create({ + fullScreen: { + position: 'relative', + top: 0, + left: 0, + width: Dimensions.get('screen').width, + zIndex: 9999, + }, +}); diff --git a/packages/ui/src/FullScreen/index.ts b/packages/ui/src/FullScreen/index.ts new file mode 100644 index 000000000..016845b43 --- /dev/null +++ b/packages/ui/src/FullScreen/index.ts @@ -0,0 +1 @@ +export * from './FullScreen'; diff --git a/packages/ui/src/FullScreen/useWebFullScreen.ts b/packages/ui/src/FullScreen/useWebFullScreen.ts new file mode 100644 index 000000000..4d3f6e4f6 --- /dev/null +++ b/packages/ui/src/FullScreen/useWebFullScreen.ts @@ -0,0 +1,32 @@ +import { useRef } from 'react'; + +export const useWebFullScreen = () => { + const elementRef = useRef(null); + + const enterFullScreen = () => { + const element = elementRef.current; + if (element && element.requestFullscreen) { + element.requestFullscreen(); + } else if (element && element.webkitRequestFullscreen) { + element.webkitRequestFullscreen(); + } else if (element && element.mozRequestFullScreen) { + element.mozRequestFullScreen(); + } else if (element && element.msRequestFullscreen) { + element.msRequestFullscreen(); + } + }; + + const exitFullScreen = () => { + if (document.fullscreenElement) { + document.exitFullscreen(); + } else if (document.webkitExitFullscreen) { + document.webkitExitFullscreen(); + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen(); + } else if (document.msExitFullscreen) { + document.msExitFullscreen(); + } + }; + + return { enterFullScreen, exitFullScreen, elementRef }; +}; diff --git a/packages/ui/src/Pagination/Pagination.tsx b/packages/ui/src/Pagination/Pagination.tsx new file mode 100644 index 000000000..f2acd54c5 --- /dev/null +++ b/packages/ui/src/Pagination/Pagination.tsx @@ -0,0 +1,56 @@ +import React, { type FC } from 'react'; +import { ChevronLeft, ChevronRight } from '@tamagui/lucide-icons'; +import { + Button, + Input, + Button as TButton, + Text, + XGroup, + View, + type ViewProps, + XStack, +} from 'tamagui'; + +interface PaginationProps { + style?: ViewProps['style']; + currentPage: number; + totalPages: number; + onPressPrevBtn: () => void; + onPressNextBtn: () => void; + isPrevBtnDisabled: boolean; + isNextBtnDisabled: boolean; +} + +export const Pagination: FC = ({ + currentPage, + totalPages, + style, + isPrevBtnDisabled, + isNextBtnDisabled, + onPressPrevBtn, + onPressNextBtn, +}) => { + return ( + + + + Page {currentPage} of {totalPages} + + + + ); +}; diff --git a/packages/ui/src/Pagination/index.ts b/packages/ui/src/Pagination/index.ts new file mode 100644 index 000000000..0a1fd4dad --- /dev/null +++ b/packages/ui/src/Pagination/index.ts @@ -0,0 +1 @@ +export { Pagination } from './Pagination'; diff --git a/packages/ui/src/RSelect/index.tsx b/packages/ui/src/RSelect/index.tsx index 87c07017a..1e9918f5e 100644 --- a/packages/ui/src/RSelect/index.tsx +++ b/packages/ui/src/RSelect/index.tsx @@ -1,4 +1,4 @@ -import { useMemo, useState } from 'react'; +import React, { useMemo, useState } from 'react'; import { Check, ChevronDown } from '@tamagui/lucide-icons'; import { Adapt, diff --git a/packages/ui/src/card/SecondaryCard.tsx b/packages/ui/src/card/SecondaryCard.tsx index 2459c44ac..1f5493817 100644 --- a/packages/ui/src/card/SecondaryCard.tsx +++ b/packages/ui/src/card/SecondaryCard.tsx @@ -3,7 +3,9 @@ import { type BaseCardProps } from './model'; import { Card, View, XStack, YStack } from 'tamagui'; import RText from '../RText'; -interface SecondaryCardProps extends Omit {} +interface SecondaryCardProps extends Omit { + isFullWidth?: boolean; +} export const SecondaryCard: FC = (props) => { return ( @@ -11,7 +13,7 @@ export const SecondaryCard: FC = (props) => { elevate size="$4" bordered - style={{ height: 120, width: 200 }} + style={{ height: 120, width: props.isFullWidth ? '100%' : 200 }} {...props} > {props.image} diff --git a/packages/ui/src/card/model.ts b/packages/ui/src/card/model.ts index 05b4e85ac..4a07196df 100644 --- a/packages/ui/src/card/model.ts +++ b/packages/ui/src/card/model.ts @@ -8,6 +8,7 @@ export interface BaseCardProps { image: ReactNode; subtitle: ReactNode; content?: ReactNode; + isFullWidth?: boolean; footer?: ReactNode; actions?: ReactNode; style?: any; diff --git a/packages/ui/src/index.tsx b/packages/ui/src/index.tsx index a6dc17b74..62d1ab1dc 100644 --- a/packages/ui/src/index.tsx +++ b/packages/ui/src/index.tsx @@ -33,7 +33,10 @@ export { Container } from './Container'; export { MainContentWeb } from './MainContentWeb'; export { ContextMenu, RContextMenu } from './RContextMenu'; export { DropdownComponent } from './Dropdown'; -export { CascadedDropdownComponent } from './CascadedDropdown'; +export { + CascadedDropdownComponent, + ActionsDropdownComponent, +} from './CascadedDropdown'; // export { DropdownMenu, ExampleDropdown } from './RDropdown/DropdownBase'; export { RSkeleton } from './RSkeleton'; @@ -99,9 +102,11 @@ export * from './RStack'; export * from './RTabs'; export * from './RText'; export * from './Rparagraph'; +export * from './FullScreen'; export * from './SizableText'; export * from './XStack'; export * from './YStack'; +export * from './Pagination'; // Future components // export * from './RCheckbox'; // export * from './RSelect'; diff --git a/packages/ui/src/modal/index.ts b/packages/ui/src/modal/index.ts index 2517815b1..2f690d09a 100644 --- a/packages/ui/src/modal/index.ts +++ b/packages/ui/src/modal/index.ts @@ -1,4 +1,5 @@ export { BaseModal } from './BaseModal'; export { useModal, ModalProvider } from './provider'; +export * from './useModal'; export type CloseModalHandler = () => {}; diff --git a/packages/ui/src/modal/useModal.ts b/packages/ui/src/modal/useModal.ts new file mode 100644 index 000000000..b42f63cb2 --- /dev/null +++ b/packages/ui/src/modal/useModal.ts @@ -0,0 +1,10 @@ +import { useState } from 'react'; + +export const useModalState = (defaultState = false) => { + const [isModalOpen, setIsModalOpen] = useState(defaultState); + + const onOpen = () => setIsModalOpen(true); + const onClose = () => setIsModalOpen(false); + + return { isModalOpen, onOpen, onClose }; +}; diff --git a/packages/validations/package.json b/packages/validations/package.json index 4c446cd07..e197bd10e 100644 --- a/packages/validations/package.json +++ b/packages/validations/package.json @@ -16,7 +16,6 @@ "author": "", "license": "ISC", "dependencies": { - "@packrat/shared-types": "*", "@types/express": "^4.17.17", "@types/node": "^20.14.2", "express": "^4.19.2", diff --git a/packages/validations/src/validations/itemRoutesValidator.ts b/packages/validations/src/validations/itemRoutesValidator.ts index ae6e61019..a6e999a4b 100644 --- a/packages/validations/src/validations/itemRoutesValidator.ts +++ b/packages/validations/src/validations/itemRoutesValidator.ts @@ -1,4 +1,3 @@ -import { PackAndItemVisibilityFilter } from '@packrat/shared-types'; import { z } from 'zod'; export const getItemByName = z.object({ @@ -83,9 +82,6 @@ export const getItemsGlobally = z.object({ export const getSimilarItems = z.object({ id: z.string(), limit: z.number(), - visibility: z - .nativeEnum(PackAndItemVisibilityFilter) - .default(PackAndItemVisibilityFilter.ALL), }); export const importItemHeaders = z.object({ diff --git a/packages/validations/src/validations/packRoutesValidator.ts b/packages/validations/src/validations/packRoutesValidator.ts index cb7b2edf2..8739ba230 100644 --- a/packages/validations/src/validations/packRoutesValidator.ts +++ b/packages/validations/src/validations/packRoutesValidator.ts @@ -1,5 +1,4 @@ import { z } from 'zod'; -import { PackAndItemVisibilityFilter } from '@packrat/shared-types'; export const getPacks = z.object({ ownerId: z.string(), @@ -48,7 +47,4 @@ export const duplicatePublicPack = z.object({ export const getSimilarPacks = z.object({ id: z.string(), limit: z.number(), - visibility: z - .nativeEnum(PackAndItemVisibilityFilter) - .default(PackAndItemVisibilityFilter.ALL), -}); \ No newline at end of file +}); diff --git a/packages/validations/src/validations/tripRoutesValidator/tripRoutesValidator.ts b/packages/validations/src/validations/tripRoutesValidator/tripRoutesValidator.ts index 3168a69c7..9be361e66 100644 --- a/packages/validations/src/validations/tripRoutesValidator/tripRoutesValidator.ts +++ b/packages/validations/src/validations/tripRoutesValidator/tripRoutesValidator.ts @@ -56,6 +56,7 @@ export const addTripDetails = z.object({ geoJSON: z.string(), owner_id: z.string(), pack_id: z.string(), + bounds: z.tuple([z.array(z.number()), z.array(z.number())]), }); export const addTrip = addTripDetails.merge(addTripForm); diff --git a/server/.dev.vars.example b/server/.dev.vars.example new file mode 100644 index 000000000..219808f0e --- /dev/null +++ b/server/.dev.vars.example @@ -0,0 +1,14 @@ +BUCKET_ACCESS_KEY_ID="The bucket access key ID" +BUCKET_SECRET_KEY="The bucket secret key" +GOOGLE_CLIENT_SECRET="The google client secret" +JWT_SECRET="The JWT secret" +JWT_VERIFICATION_KEY="The JWT verification key" +MAPBOX_ACCESS_TOKEN="The mapbox access token" +OPENAI_API_KEY="The openAI api key" +OPENWEATHER_KEY="The openweathermap key" +REFRESH_TOKEN_SECRET="The refresh token secret" +SEND_GRID_API_KEY="The send grid api key" +STMP_PASSWORD="The stmp password" +VECTORIZE_API_KEY="The vectorize api key" +WORKERS_AI_API_KEY="The workers AI api key" +X_AMZ_SECURITY_TOKEN="The x amz security token" \ No newline at end of file diff --git a/server/.gitignore b/server/.gitignore index fc675e15c..4134deb7b 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -3,4 +3,5 @@ node_modules .env # ignore wrangler build -.wrangler \ No newline at end of file +.wrangler +.dev.vars \ No newline at end of file diff --git a/server/env.example b/server/env.example index a22b64997..62580d140 100644 --- a/server/env.example +++ b/server/env.example @@ -1,15 +1 @@ -—————————Server Env ——————————— -BUCKET_ACCESS_KEY_ID="The bucket access key ID" -BUCKET_SECRET_KEY="The bucket secret key" -GOOGLE_CLIENT_SECRET="The google client secret" -JWT_SECRET="The JWT secret" -JWT_VERIFICATION_KEY="The JWT verification key" -MAPBOX_ACCESS_TOKEN="The mapbox access token" -OPENAI_API_KEY="The openAI api key" -OPENWEATHER_KEY="The openweathermap key" -REFRESH_TOKEN_SECRET="The refresh token secret" -SEND_GRID_API_KEY="The send grid api key" -STMP_PASSWORD="The stmp password" -VECTORIZE_API_KEY="The vectorize api key" -WORKERS_AI_API_KEY="The workers AI api key" -X_AMZ_SECURITY_TOKEN="The x amz security token" \ No newline at end of file +NODE_ENV='development' \ No newline at end of file diff --git a/server/migrations-preview/0000_modern_the_professor.sql b/server/migrations-preview/0000_modern_the_professor.sql new file mode 100644 index 000000000..5a057a5b0 --- /dev/null +++ b/server/migrations-preview/0000_modern_the_professor.sql @@ -0,0 +1,205 @@ +CREATE TABLE `conversation` ( + `id` text PRIMARY KEY NOT NULL, + `user_id` text NOT NULL, + `itemTypeId` text NOT NULL, + `history` text NOT NULL, + `created_at` text DEFAULT CURRENT_TIMESTAMP, + `updated_at` text DEFAULT CURRENT_TIMESTAMP +); +--> statement-breakpoint +CREATE TABLE `geojson` ( + `id` text PRIMARY KEY NOT NULL, + `geoJSON` text, + `created_at` text DEFAULT CURRENT_TIMESTAMP, + `updated_at` text DEFAULT CURRENT_TIMESTAMP +); +--> statement-breakpoint +CREATE TABLE `item` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `weight` real NOT NULL, + `quantity` integer NOT NULL, + `unit` text NOT NULL, + `category_id` text, + `owner_id` text, + `global` integer DEFAULT false, + `created_at` text DEFAULT CURRENT_TIMESTAMP, + `updated_at` text DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`category_id`) REFERENCES `item_category`(`id`) ON UPDATE no action ON DELETE set null, + FOREIGN KEY (`owner_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `item_category` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `created_at` text DEFAULT CURRENT_TIMESTAMP, + `updated_at` text DEFAULT CURRENT_TIMESTAMP +); +--> statement-breakpoint +CREATE TABLE `item_image` ( + `id` text PRIMARY KEY NOT NULL, + `item_id` text NOT NULL, + `url` text NOT NULL, + `created_at` text DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`item_id`) REFERENCES `item`(`id`) ON UPDATE no action ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `item_owners` ( + `item_id` text, + `owner_id` text, + PRIMARY KEY(`item_id`, `owner_id`), + FOREIGN KEY (`item_id`) REFERENCES `item`(`id`) ON UPDATE no action ON DELETE cascade, + FOREIGN KEY (`owner_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `item_packs` ( + `item_id` text, + `pack_id` text, + PRIMARY KEY(`item_id`, `pack_id`), + FOREIGN KEY (`item_id`) REFERENCES `item`(`id`) ON UPDATE no action ON DELETE cascade, + FOREIGN KEY (`pack_id`) REFERENCES `pack`(`id`) ON UPDATE no action ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `node` ( + `id` text PRIMARY KEY NOT NULL, + `osm_id` integer, + `lat` real, + `lon` real, + `tags` text, + `created_at` text DEFAULT CURRENT_TIMESTAMP, + `updated_at` text DEFAULT CURRENT_TIMESTAMP +); +--> statement-breakpoint +CREATE TABLE `offlineMap` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `bounds` text, + `minZoom` integer NOT NULL, + `maxZoom` integer NOT NULL, + `metadata` text, + `owner_id` text, + `created_at` text DEFAULT CURRENT_TIMESTAMP, + `updated_at` text DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`owner_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `pack` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `owner_id` text, + `is_public` integer DEFAULT false, + `grades` text DEFAULT '{"weight":"","essentialItems":"","redundancyAndVersatility":""}', + `scores` text DEFAULT '{"weightScore":0,"essentialItemsScore":0,"redundancyAndVersatilityScore":0}', + `type` text DEFAULT 'pack', + `created_at` text DEFAULT CURRENT_TIMESTAMP, + `updated_at` text DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`owner_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `refresh_tokens` ( + `id` text PRIMARY KEY NOT NULL, + `user_id` text, + `token` text NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `relation` ( + `id` text PRIMARY KEY NOT NULL, + `osm_id` integer, + `osm_type` text DEFAULT 'relation', + `tags` text, + `members` text, + `geo_json` text, + `created_at` text DEFAULT CURRENT_TIMESTAMP, + `updated_at` text DEFAULT CURRENT_TIMESTAMP +); +--> statement-breakpoint +CREATE TABLE `template` ( + `id` text PRIMARY KEY NOT NULL, + `type` text DEFAULT 'pack' NOT NULL, + `template_id` text NOT NULL, + `is_global_template` integer DEFAULT false, + `created_by` text, + `created_at` text DEFAULT CURRENT_TIMESTAMP, + `updated_at` text DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`created_by`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE set null +); +--> statement-breakpoint +CREATE TABLE `trip` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `description` text NOT NULL, + `parks` text, + `start_date` text NOT NULL, + `end_date` text NOT NULL, + `destination` text NOT NULL, + `owner_id` text, + `packs_id` text, + `is_public` integer, + `activity` text DEFAULT 'trip', + `bounds` text, + `type` text DEFAULT 'trip', + `scores` text DEFAULT '{"totalScore":0}', + `created_at` text DEFAULT CURRENT_TIMESTAMP, + `updated_at` text DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`owner_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade, + FOREIGN KEY (`packs_id`) REFERENCES `pack`(`id`) ON UPDATE no action ON DELETE set null +); +--> statement-breakpoint +CREATE TABLE `trip_geojsons` ( + `trip_id` text, + `geojson_id` text, + PRIMARY KEY(`geojson_id`, `trip_id`), + FOREIGN KEY (`trip_id`) REFERENCES `trip`(`id`) ON UPDATE no action ON DELETE set null, + FOREIGN KEY (`geojson_id`) REFERENCES `geojson`(`id`) ON UPDATE no action ON DELETE set null +); +--> statement-breakpoint +CREATE TABLE `user` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `password` text NOT NULL, + `email` text NOT NULL, + `google_id` text, + `code` text, + `is_certified_guide` integer, + `password_reset_token` text, + `password_reset_token_expiration` integer, + `offline_maps` text, + `role` text DEFAULT 'user', + `username` text NOT NULL, + `profile_image` text, + `preferred_weather` text DEFAULT 'celsius', + `preferred_weight` text DEFAULT 'lb', + `created_at` text DEFAULT CURRENT_TIMESTAMP, + `updated_at` text DEFAULT CURRENT_TIMESTAMP +); +--> statement-breakpoint +CREATE TABLE `user_favorite_packs` ( + `user_id` text, + `pack_id` text, + PRIMARY KEY(`pack_id`, `user_id`), + FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade, + FOREIGN KEY (`pack_id`) REFERENCES `pack`(`id`) ON UPDATE no action ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `way` ( + `id` text PRIMARY KEY NOT NULL, + `osm_id` integer, + `osm_type` text, + `tags` text, + `geo_json` text, + `created_at` text DEFAULT CURRENT_TIMESTAMP, + `updated_at` text DEFAULT CURRENT_TIMESTAMP +); +--> statement-breakpoint +CREATE TABLE `way_nodes` ( + `way_id` text, + `node_id` text, + PRIMARY KEY(`node_id`, `way_id`), + FOREIGN KEY (`way_id`) REFERENCES `way`(`id`) ON UPDATE no action ON DELETE set null, + FOREIGN KEY (`node_id`) REFERENCES `node`(`id`) ON UPDATE no action ON DELETE set null +); +--> statement-breakpoint +CREATE UNIQUE INDEX `offlineMap_name_owner_id_unique` ON `offlineMap` (`name`,`owner_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `user_email_unique` ON `user` (`email`);--> statement-breakpoint +CREATE UNIQUE INDEX `user_username_unique` ON `user` (`username`); \ No newline at end of file diff --git a/server/migrations-preview/meta/0000_snapshot.json b/server/migrations-preview/meta/0000_snapshot.json new file mode 100644 index 000000000..5d3653187 --- /dev/null +++ b/server/migrations-preview/meta/0000_snapshot.json @@ -0,0 +1,1394 @@ +{ + "version": "5", + "dialect": "sqlite", + "id": "b3663479-7080-4d0d-a708-bf60d02af6b9", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "conversation": { + "name": "conversation", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "itemTypeId": { + "name": "itemTypeId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "history": { + "name": "history", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "geojson": { + "name": "geojson", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "geoJSON": { + "name": "geoJSON", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "item": { + "name": "item", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "weight": { + "name": "weight", + "type": "real", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "unit": { + "name": "unit", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "category_id": { + "name": "category_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "global": { + "name": "global", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "item_category_id_item_category_id_fk": { + "name": "item_category_id_item_category_id_fk", + "tableFrom": "item", + "tableTo": "item_category", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "item_owner_id_user_id_fk": { + "name": "item_owner_id_user_id_fk", + "tableFrom": "item", + "tableTo": "user", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "item_category": { + "name": "item_category", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "item_image": { + "name": "item_image", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "item_id": { + "name": "item_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "item_image_item_id_item_id_fk": { + "name": "item_image_item_id_item_id_fk", + "tableFrom": "item_image", + "tableTo": "item", + "columnsFrom": [ + "item_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "item_owners": { + "name": "item_owners", + "columns": { + "item_id": { + "name": "item_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "item_owners_item_id_item_id_fk": { + "name": "item_owners_item_id_item_id_fk", + "tableFrom": "item_owners", + "tableTo": "item", + "columnsFrom": [ + "item_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "item_owners_owner_id_user_id_fk": { + "name": "item_owners_owner_id_user_id_fk", + "tableFrom": "item_owners", + "tableTo": "user", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "id": { + "columns": [ + "item_id", + "owner_id" + ], + "name": "id" + } + }, + "uniqueConstraints": {} + }, + "item_packs": { + "name": "item_packs", + "columns": { + "item_id": { + "name": "item_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "pack_id": { + "name": "pack_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "item_packs_item_id_item_id_fk": { + "name": "item_packs_item_id_item_id_fk", + "tableFrom": "item_packs", + "tableTo": "item", + "columnsFrom": [ + "item_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "item_packs_pack_id_pack_id_fk": { + "name": "item_packs_pack_id_pack_id_fk", + "tableFrom": "item_packs", + "tableTo": "pack", + "columnsFrom": [ + "pack_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "id": { + "columns": [ + "item_id", + "pack_id" + ], + "name": "id" + } + }, + "uniqueConstraints": {} + }, + "node": { + "name": "node", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "osm_id": { + "name": "osm_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "lat": { + "name": "lat", + "type": "real", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "lon": { + "name": "lon", + "type": "real", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "offlineMap": { + "name": "offlineMap", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "bounds": { + "name": "bounds", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "minZoom": { + "name": "minZoom", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "maxZoom": { + "name": "maxZoom", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "offlineMap_name_owner_id_unique": { + "name": "offlineMap_name_owner_id_unique", + "columns": [ + "name", + "owner_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "offlineMap_owner_id_user_id_fk": { + "name": "offlineMap_owner_id_user_id_fk", + "tableFrom": "offlineMap", + "tableTo": "user", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "pack": { + "name": "pack", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": false + }, + "grades": { + "name": "grades", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'{\"weight\":\"\",\"essentialItems\":\"\",\"redundancyAndVersatility\":\"\"}'" + }, + "scores": { + "name": "scores", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'{\"weightScore\":0,\"essentialItemsScore\":0,\"redundancyAndVersatilityScore\":0}'" + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'pack'" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "pack_owner_id_user_id_fk": { + "name": "pack_owner_id_user_id_fk", + "tableFrom": "pack", + "tableTo": "user", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "refresh_tokens": { + "name": "refresh_tokens", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "refresh_tokens_user_id_user_id_fk": { + "name": "refresh_tokens_user_id_user_id_fk", + "tableFrom": "refresh_tokens", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "relation": { + "name": "relation", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "osm_id": { + "name": "osm_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "osm_type": { + "name": "osm_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'relation'" + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "members": { + "name": "members", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "geo_json": { + "name": "geo_json", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "template": { + "name": "template", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pack'" + }, + "template_id": { + "name": "template_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_global_template": { + "name": "is_global_template", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": false + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "template_created_by_user_id_fk": { + "name": "template_created_by_user_id_fk", + "tableFrom": "template", + "tableTo": "user", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "trip": { + "name": "trip", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "parks": { + "name": "parks", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "start_date": { + "name": "start_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "end_date": { + "name": "end_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "destination": { + "name": "destination", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "packs_id": { + "name": "packs_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "activity": { + "name": "activity", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'trip'" + }, + "bounds": { + "name": "bounds", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'trip'" + }, + "scores": { + "name": "scores", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'{\"totalScore\":0}'" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "trip_owner_id_user_id_fk": { + "name": "trip_owner_id_user_id_fk", + "tableFrom": "trip", + "tableTo": "user", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "trip_packs_id_pack_id_fk": { + "name": "trip_packs_id_pack_id_fk", + "tableFrom": "trip", + "tableTo": "pack", + "columnsFrom": [ + "packs_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "trip_geojsons": { + "name": "trip_geojsons", + "columns": { + "trip_id": { + "name": "trip_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "geojson_id": { + "name": "geojson_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "trip_geojsons_trip_id_trip_id_fk": { + "name": "trip_geojsons_trip_id_trip_id_fk", + "tableFrom": "trip_geojsons", + "tableTo": "trip", + "columnsFrom": [ + "trip_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "trip_geojsons_geojson_id_geojson_id_fk": { + "name": "trip_geojsons_geojson_id_geojson_id_fk", + "tableFrom": "trip_geojsons", + "tableTo": "geojson", + "columnsFrom": [ + "geojson_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "id": { + "columns": [ + "geojson_id", + "trip_id" + ], + "name": "id" + } + }, + "uniqueConstraints": {} + }, + "user": { + "name": "user", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "google_id": { + "name": "google_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "code": { + "name": "code", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_certified_guide": { + "name": "is_certified_guide", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password_reset_token": { + "name": "password_reset_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password_reset_token_expiration": { + "name": "password_reset_token_expiration", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "offline_maps": { + "name": "offline_maps", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'user'" + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "profile_image": { + "name": "profile_image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "preferred_weather": { + "name": "preferred_weather", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'celsius'" + }, + "preferred_weight": { + "name": "preferred_weight", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'lb'" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "user_email_unique": { + "name": "user_email_unique", + "columns": [ + "email" + ], + "isUnique": true + }, + "user_username_unique": { + "name": "user_username_unique", + "columns": [ + "username" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_favorite_packs": { + "name": "user_favorite_packs", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "pack_id": { + "name": "pack_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_favorite_packs_user_id_user_id_fk": { + "name": "user_favorite_packs_user_id_user_id_fk", + "tableFrom": "user_favorite_packs", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_favorite_packs_pack_id_pack_id_fk": { + "name": "user_favorite_packs_pack_id_pack_id_fk", + "tableFrom": "user_favorite_packs", + "tableTo": "pack", + "columnsFrom": [ + "pack_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "id": { + "columns": [ + "pack_id", + "user_id" + ], + "name": "id" + } + }, + "uniqueConstraints": {} + }, + "way": { + "name": "way", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "osm_id": { + "name": "osm_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "osm_type": { + "name": "osm_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "geo_json": { + "name": "geo_json", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "way_nodes": { + "name": "way_nodes", + "columns": { + "way_id": { + "name": "way_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "node_id": { + "name": "node_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "way_nodes_way_id_way_id_fk": { + "name": "way_nodes_way_id_way_id_fk", + "tableFrom": "way_nodes", + "tableTo": "way", + "columnsFrom": [ + "way_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "way_nodes_node_id_node_id_fk": { + "name": "way_nodes_node_id_node_id_fk", + "tableFrom": "way_nodes", + "tableTo": "node", + "columnsFrom": [ + "node_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "id": { + "columns": [ + "node_id", + "way_id" + ], + "name": "id" + } + }, + "uniqueConstraints": {} + } + }, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + } +} \ No newline at end of file diff --git a/server/migrations-preview/meta/_journal.json b/server/migrations-preview/meta/_journal.json new file mode 100644 index 000000000..b71e74840 --- /dev/null +++ b/server/migrations-preview/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1728379132533, + "tag": "0000_modern_the_professor", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/server/migrations/0000_slow_chameleon.sql b/server/migrations/0000_slow_chameleon.sql index f8ae28a96..ef1d751f2 100644 --- a/server/migrations/0000_slow_chameleon.sql +++ b/server/migrations/0000_slow_chameleon.sql @@ -82,6 +82,14 @@ CREATE TABLE `refresh_tokens` ( FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade ); --> statement-breakpoint +CREATE TABLE `item_image` ( + `id` text PRIMARY KEY NOT NULL, + `item_id` text NOT NULL, + `url` text NOT NULL, + `created_at` text DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`item_id`) REFERENCES `item`(`id`) ON DELETE CASCADE +); +--> statement-breakpoint CREATE TABLE `relation` ( `id` text PRIMARY KEY NOT NULL, `osm_id` integer, diff --git a/server/migrations/0004_ambitious_old_lace.sql b/server/migrations/0004_ambitious_old_lace.sql new file mode 100644 index 000000000..60ee2914a --- /dev/null +++ b/server/migrations/0004_ambitious_old_lace.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS `item_image` ( + `id` text PRIMARY KEY NOT NULL, + `item_id` text NOT NULL, + `url` text NOT NULL, + `created_at` text DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`item_id`) REFERENCES `item`(`id`) ON UPDATE no action ON DELETE cascade +); +--> statement-breakpoint +ALTER TABLE trip ADD `scores` text DEFAULT '{"totalScore":0}'; \ No newline at end of file diff --git a/server/migrations/0005_heavy_the_initiative.sql b/server/migrations/0005_heavy_the_initiative.sql new file mode 100644 index 000000000..59d22bc6e --- /dev/null +++ b/server/migrations/0005_heavy_the_initiative.sql @@ -0,0 +1 @@ +ALTER TABLE trip ADD `bounds` text; \ No newline at end of file diff --git a/server/migrations/meta/0004_snapshot.json b/server/migrations/meta/0004_snapshot.json new file mode 100644 index 000000000..6b572f177 --- /dev/null +++ b/server/migrations/meta/0004_snapshot.json @@ -0,0 +1,1387 @@ +{ + "version": "5", + "dialect": "sqlite", + "id": "9f9f439c-a246-4163-bc5c-3e946edd9e5f", + "prevId": "17e6462e-98d9-46d1-bee1-e7a6791ec6b7", + "tables": { + "conversation": { + "name": "conversation", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "itemTypeId": { + "name": "itemTypeId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "history": { + "name": "history", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "geojson": { + "name": "geojson", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "geoJSON": { + "name": "geoJSON", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "item": { + "name": "item", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "weight": { + "name": "weight", + "type": "real", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "unit": { + "name": "unit", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "category_id": { + "name": "category_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "global": { + "name": "global", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "item_category_id_item_category_id_fk": { + "name": "item_category_id_item_category_id_fk", + "tableFrom": "item", + "tableTo": "item_category", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "item_owner_id_user_id_fk": { + "name": "item_owner_id_user_id_fk", + "tableFrom": "item", + "tableTo": "user", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "item_category": { + "name": "item_category", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "item_image": { + "name": "item_image", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "item_id": { + "name": "item_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "item_image_item_id_item_id_fk": { + "name": "item_image_item_id_item_id_fk", + "tableFrom": "item_image", + "tableTo": "item", + "columnsFrom": [ + "item_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "item_owners": { + "name": "item_owners", + "columns": { + "item_id": { + "name": "item_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "item_owners_item_id_item_id_fk": { + "name": "item_owners_item_id_item_id_fk", + "tableFrom": "item_owners", + "tableTo": "item", + "columnsFrom": [ + "item_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "item_owners_owner_id_user_id_fk": { + "name": "item_owners_owner_id_user_id_fk", + "tableFrom": "item_owners", + "tableTo": "user", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "id": { + "columns": [ + "item_id", + "owner_id" + ], + "name": "id" + } + }, + "uniqueConstraints": {} + }, + "item_packs": { + "name": "item_packs", + "columns": { + "item_id": { + "name": "item_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "pack_id": { + "name": "pack_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "item_packs_item_id_item_id_fk": { + "name": "item_packs_item_id_item_id_fk", + "tableFrom": "item_packs", + "tableTo": "item", + "columnsFrom": [ + "item_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "item_packs_pack_id_pack_id_fk": { + "name": "item_packs_pack_id_pack_id_fk", + "tableFrom": "item_packs", + "tableTo": "pack", + "columnsFrom": [ + "pack_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "id": { + "columns": [ + "item_id", + "pack_id" + ], + "name": "id" + } + }, + "uniqueConstraints": {} + }, + "node": { + "name": "node", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "osm_id": { + "name": "osm_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "lat": { + "name": "lat", + "type": "real", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "lon": { + "name": "lon", + "type": "real", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "offlineMap": { + "name": "offlineMap", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "bounds": { + "name": "bounds", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "minZoom": { + "name": "minZoom", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "maxZoom": { + "name": "maxZoom", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "offlineMap_name_owner_id_unique": { + "name": "offlineMap_name_owner_id_unique", + "columns": [ + "name", + "owner_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "offlineMap_owner_id_user_id_fk": { + "name": "offlineMap_owner_id_user_id_fk", + "tableFrom": "offlineMap", + "tableTo": "user", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "pack": { + "name": "pack", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": false + }, + "grades": { + "name": "grades", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'{\"weight\":\"\",\"essentialItems\":\"\",\"redundancyAndVersatility\":\"\"}'" + }, + "scores": { + "name": "scores", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'{\"weightScore\":0,\"essentialItemsScore\":0,\"redundancyAndVersatilityScore\":0}'" + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'pack'" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "pack_owner_id_user_id_fk": { + "name": "pack_owner_id_user_id_fk", + "tableFrom": "pack", + "tableTo": "user", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "refresh_tokens": { + "name": "refresh_tokens", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "refresh_tokens_user_id_user_id_fk": { + "name": "refresh_tokens_user_id_user_id_fk", + "tableFrom": "refresh_tokens", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "relation": { + "name": "relation", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "osm_id": { + "name": "osm_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "osm_type": { + "name": "osm_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'relation'" + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "members": { + "name": "members", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "geo_json": { + "name": "geo_json", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "template": { + "name": "template", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pack'" + }, + "template_id": { + "name": "template_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_global_template": { + "name": "is_global_template", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": false + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "template_created_by_user_id_fk": { + "name": "template_created_by_user_id_fk", + "tableFrom": "template", + "tableTo": "user", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "trip": { + "name": "trip", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "parks": { + "name": "parks", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "start_date": { + "name": "start_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "end_date": { + "name": "end_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "destination": { + "name": "destination", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "packs_id": { + "name": "packs_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "activity": { + "name": "activity", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'trip'" + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'trip'" + }, + "scores": { + "name": "scores", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'{\"totalScore\":0}'" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "trip_owner_id_user_id_fk": { + "name": "trip_owner_id_user_id_fk", + "tableFrom": "trip", + "tableTo": "user", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "trip_packs_id_pack_id_fk": { + "name": "trip_packs_id_pack_id_fk", + "tableFrom": "trip", + "tableTo": "pack", + "columnsFrom": [ + "packs_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "trip_geojsons": { + "name": "trip_geojsons", + "columns": { + "trip_id": { + "name": "trip_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "geojson_id": { + "name": "geojson_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "trip_geojsons_trip_id_trip_id_fk": { + "name": "trip_geojsons_trip_id_trip_id_fk", + "tableFrom": "trip_geojsons", + "tableTo": "trip", + "columnsFrom": [ + "trip_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "trip_geojsons_geojson_id_geojson_id_fk": { + "name": "trip_geojsons_geojson_id_geojson_id_fk", + "tableFrom": "trip_geojsons", + "tableTo": "geojson", + "columnsFrom": [ + "geojson_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "id": { + "columns": [ + "geojson_id", + "trip_id" + ], + "name": "id" + } + }, + "uniqueConstraints": {} + }, + "user": { + "name": "user", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "google_id": { + "name": "google_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "code": { + "name": "code", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_certified_guide": { + "name": "is_certified_guide", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password_reset_token": { + "name": "password_reset_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password_reset_token_expiration": { + "name": "password_reset_token_expiration", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "offline_maps": { + "name": "offline_maps", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'user'" + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "profile_image": { + "name": "profile_image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "preferred_weather": { + "name": "preferred_weather", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'celsius'" + }, + "preferred_weight": { + "name": "preferred_weight", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'lb'" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "user_email_unique": { + "name": "user_email_unique", + "columns": [ + "email" + ], + "isUnique": true + }, + "user_username_unique": { + "name": "user_username_unique", + "columns": [ + "username" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_favorite_packs": { + "name": "user_favorite_packs", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "pack_id": { + "name": "pack_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_favorite_packs_user_id_user_id_fk": { + "name": "user_favorite_packs_user_id_user_id_fk", + "tableFrom": "user_favorite_packs", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_favorite_packs_pack_id_pack_id_fk": { + "name": "user_favorite_packs_pack_id_pack_id_fk", + "tableFrom": "user_favorite_packs", + "tableTo": "pack", + "columnsFrom": [ + "pack_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "id": { + "columns": [ + "pack_id", + "user_id" + ], + "name": "id" + } + }, + "uniqueConstraints": {} + }, + "way": { + "name": "way", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "osm_id": { + "name": "osm_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "osm_type": { + "name": "osm_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "geo_json": { + "name": "geo_json", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "way_nodes": { + "name": "way_nodes", + "columns": { + "way_id": { + "name": "way_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "node_id": { + "name": "node_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "way_nodes_way_id_way_id_fk": { + "name": "way_nodes_way_id_way_id_fk", + "tableFrom": "way_nodes", + "tableTo": "way", + "columnsFrom": [ + "way_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "way_nodes_node_id_node_id_fk": { + "name": "way_nodes_node_id_node_id_fk", + "tableFrom": "way_nodes", + "tableTo": "node", + "columnsFrom": [ + "node_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "id": { + "columns": [ + "node_id", + "way_id" + ], + "name": "id" + } + }, + "uniqueConstraints": {} + } + }, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + } +} \ No newline at end of file diff --git a/server/migrations/meta/0005_snapshot.json b/server/migrations/meta/0005_snapshot.json new file mode 100644 index 000000000..0fb3093db --- /dev/null +++ b/server/migrations/meta/0005_snapshot.json @@ -0,0 +1,1394 @@ +{ + "version": "5", + "dialect": "sqlite", + "id": "3ab7eb05-31cb-4f55-9e77-fb8847764038", + "prevId": "9f9f439c-a246-4163-bc5c-3e946edd9e5f", + "tables": { + "conversation": { + "name": "conversation", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "itemTypeId": { + "name": "itemTypeId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "history": { + "name": "history", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "geojson": { + "name": "geojson", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "geoJSON": { + "name": "geoJSON", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "item": { + "name": "item", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "weight": { + "name": "weight", + "type": "real", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "unit": { + "name": "unit", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "category_id": { + "name": "category_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "global": { + "name": "global", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "item_category_id_item_category_id_fk": { + "name": "item_category_id_item_category_id_fk", + "tableFrom": "item", + "tableTo": "item_category", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "item_owner_id_user_id_fk": { + "name": "item_owner_id_user_id_fk", + "tableFrom": "item", + "tableTo": "user", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "item_category": { + "name": "item_category", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "item_image": { + "name": "item_image", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "item_id": { + "name": "item_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "item_image_item_id_item_id_fk": { + "name": "item_image_item_id_item_id_fk", + "tableFrom": "item_image", + "tableTo": "item", + "columnsFrom": [ + "item_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "item_owners": { + "name": "item_owners", + "columns": { + "item_id": { + "name": "item_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "item_owners_item_id_item_id_fk": { + "name": "item_owners_item_id_item_id_fk", + "tableFrom": "item_owners", + "tableTo": "item", + "columnsFrom": [ + "item_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "item_owners_owner_id_user_id_fk": { + "name": "item_owners_owner_id_user_id_fk", + "tableFrom": "item_owners", + "tableTo": "user", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "id": { + "columns": [ + "item_id", + "owner_id" + ], + "name": "id" + } + }, + "uniqueConstraints": {} + }, + "item_packs": { + "name": "item_packs", + "columns": { + "item_id": { + "name": "item_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "pack_id": { + "name": "pack_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "item_packs_item_id_item_id_fk": { + "name": "item_packs_item_id_item_id_fk", + "tableFrom": "item_packs", + "tableTo": "item", + "columnsFrom": [ + "item_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "item_packs_pack_id_pack_id_fk": { + "name": "item_packs_pack_id_pack_id_fk", + "tableFrom": "item_packs", + "tableTo": "pack", + "columnsFrom": [ + "pack_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "id": { + "columns": [ + "item_id", + "pack_id" + ], + "name": "id" + } + }, + "uniqueConstraints": {} + }, + "node": { + "name": "node", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "osm_id": { + "name": "osm_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "lat": { + "name": "lat", + "type": "real", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "lon": { + "name": "lon", + "type": "real", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "offlineMap": { + "name": "offlineMap", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "bounds": { + "name": "bounds", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "minZoom": { + "name": "minZoom", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "maxZoom": { + "name": "maxZoom", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "offlineMap_name_owner_id_unique": { + "name": "offlineMap_name_owner_id_unique", + "columns": [ + "name", + "owner_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "offlineMap_owner_id_user_id_fk": { + "name": "offlineMap_owner_id_user_id_fk", + "tableFrom": "offlineMap", + "tableTo": "user", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "pack": { + "name": "pack", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": false + }, + "grades": { + "name": "grades", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'{\"weight\":\"\",\"essentialItems\":\"\",\"redundancyAndVersatility\":\"\"}'" + }, + "scores": { + "name": "scores", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'{\"weightScore\":0,\"essentialItemsScore\":0,\"redundancyAndVersatilityScore\":0}'" + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'pack'" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "pack_owner_id_user_id_fk": { + "name": "pack_owner_id_user_id_fk", + "tableFrom": "pack", + "tableTo": "user", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "refresh_tokens": { + "name": "refresh_tokens", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "refresh_tokens_user_id_user_id_fk": { + "name": "refresh_tokens_user_id_user_id_fk", + "tableFrom": "refresh_tokens", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "relation": { + "name": "relation", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "osm_id": { + "name": "osm_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "osm_type": { + "name": "osm_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'relation'" + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "members": { + "name": "members", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "geo_json": { + "name": "geo_json", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "template": { + "name": "template", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pack'" + }, + "template_id": { + "name": "template_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_global_template": { + "name": "is_global_template", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": false + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "template_created_by_user_id_fk": { + "name": "template_created_by_user_id_fk", + "tableFrom": "template", + "tableTo": "user", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "trip": { + "name": "trip", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "parks": { + "name": "parks", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "start_date": { + "name": "start_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "end_date": { + "name": "end_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "destination": { + "name": "destination", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "packs_id": { + "name": "packs_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "activity": { + "name": "activity", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'trip'" + }, + "bounds": { + "name": "bounds", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'trip'" + }, + "scores": { + "name": "scores", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'{\"totalScore\":0}'" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": { + "trip_owner_id_user_id_fk": { + "name": "trip_owner_id_user_id_fk", + "tableFrom": "trip", + "tableTo": "user", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "trip_packs_id_pack_id_fk": { + "name": "trip_packs_id_pack_id_fk", + "tableFrom": "trip", + "tableTo": "pack", + "columnsFrom": [ + "packs_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "trip_geojsons": { + "name": "trip_geojsons", + "columns": { + "trip_id": { + "name": "trip_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "geojson_id": { + "name": "geojson_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "trip_geojsons_trip_id_trip_id_fk": { + "name": "trip_geojsons_trip_id_trip_id_fk", + "tableFrom": "trip_geojsons", + "tableTo": "trip", + "columnsFrom": [ + "trip_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "trip_geojsons_geojson_id_geojson_id_fk": { + "name": "trip_geojsons_geojson_id_geojson_id_fk", + "tableFrom": "trip_geojsons", + "tableTo": "geojson", + "columnsFrom": [ + "geojson_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "id": { + "columns": [ + "geojson_id", + "trip_id" + ], + "name": "id" + } + }, + "uniqueConstraints": {} + }, + "user": { + "name": "user", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "google_id": { + "name": "google_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "code": { + "name": "code", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_certified_guide": { + "name": "is_certified_guide", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password_reset_token": { + "name": "password_reset_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password_reset_token_expiration": { + "name": "password_reset_token_expiration", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "offline_maps": { + "name": "offline_maps", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'user'" + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "profile_image": { + "name": "profile_image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "preferred_weather": { + "name": "preferred_weather", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'celsius'" + }, + "preferred_weight": { + "name": "preferred_weight", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'lb'" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "user_email_unique": { + "name": "user_email_unique", + "columns": [ + "email" + ], + "isUnique": true + }, + "user_username_unique": { + "name": "user_username_unique", + "columns": [ + "username" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_favorite_packs": { + "name": "user_favorite_packs", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "pack_id": { + "name": "pack_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_favorite_packs_user_id_user_id_fk": { + "name": "user_favorite_packs_user_id_user_id_fk", + "tableFrom": "user_favorite_packs", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_favorite_packs_pack_id_pack_id_fk": { + "name": "user_favorite_packs_pack_id_pack_id_fk", + "tableFrom": "user_favorite_packs", + "tableTo": "pack", + "columnsFrom": [ + "pack_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "id": { + "columns": [ + "pack_id", + "user_id" + ], + "name": "id" + } + }, + "uniqueConstraints": {} + }, + "way": { + "name": "way", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "osm_id": { + "name": "osm_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "osm_type": { + "name": "osm_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "geo_json": { + "name": "geo_json", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "way_nodes": { + "name": "way_nodes", + "columns": { + "way_id": { + "name": "way_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "node_id": { + "name": "node_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "way_nodes_way_id_way_id_fk": { + "name": "way_nodes_way_id_way_id_fk", + "tableFrom": "way_nodes", + "tableTo": "way", + "columnsFrom": [ + "way_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "way_nodes_node_id_node_id_fk": { + "name": "way_nodes_node_id_node_id_fk", + "tableFrom": "way_nodes", + "tableTo": "node", + "columnsFrom": [ + "node_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "id": { + "columns": [ + "node_id", + "way_id" + ], + "name": "id" + } + }, + "uniqueConstraints": {} + } + }, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + } +} \ No newline at end of file diff --git a/server/migrations/meta/_journal.json b/server/migrations/meta/_journal.json index 5bc2b3e9a..9e63443a9 100644 --- a/server/migrations/meta/_journal.json +++ b/server/migrations/meta/_journal.json @@ -29,6 +29,20 @@ "when": 1727075301766, "tag": "0003_old_vector", "breakpoints": true + }, + { + "idx": 4, + "version": "5", + "when": 1727860846361, + "tag": "0004_ambitious_old_lace", + "breakpoints": true + }, + { + "idx": 5, + "version": "5", + "when": 1727955752820, + "tag": "0005_heavy_the_initiative", + "breakpoints": true } ] } \ No newline at end of file diff --git a/server/package.json b/server/package.json index c58ae7392..5c36092a6 100644 --- a/server/package.json +++ b/server/package.json @@ -13,6 +13,7 @@ "deploy:prod": "wrangler deploy src/index.ts --env production", "dev": "nodemon", "generate": "drizzle-kit generate:sqlite --schema=./src/db/schema.ts --out=./migrations", + "generate:preview": "drizzle-kit generate:sqlite --schema=./src/db/schema.ts --out=./migrations-preview", "lint": "eslint . --fix --ext .ts", "migrate:down:local": "drizzle-kit drop", "migrate:down": "yarn run migrate:down:local", @@ -20,10 +21,10 @@ "migrate:preview": "wrangler d1 migrations apply preview --remote --env preview", "migrate:prod": "wrangler d1 migrations apply production --remote --env production", "migrate": "yarn run migrate:local", - "postinstall": "yarn generate", + "postinstall": "yarn generate:preview", "seed:local": "wrangler d1 execute preview --local --file=./seed/seed.sql --env preview", "seed": "wrangler d1 execute production --file=./seed/seed.sql --env production", - "setup:local": "yarn generate && yarn migrate:local && yarn seed:local", + "setup:local": "yarn generate:preview && yarn migrate:local && yarn seed:local", "setup": "echo \"No setup needed\"", "start:pm2": "pm2 start dist/index.js --name server", "start:prod": "node --import tsx dist/index.js", @@ -45,7 +46,6 @@ "@hono/trpc-server": "^0.1.1", "@instructor-ai/instructor": "^1.3.0", "@libsql/client": "^0.4.0-pre.5", - "@packrat/shared-types": "*", "@packrat/validations": "*", "@paralleldrive/cuid2": "^2.2.2", "@prisma/client": "^5.7.0", diff --git a/server/src/controllers/favorite/getUserFavorites.ts b/server/src/controllers/favorite/getUserFavorites.ts index 84346df30..17e280aca 100644 --- a/server/src/controllers/favorite/getUserFavorites.ts +++ b/server/src/controllers/favorite/getUserFavorites.ts @@ -2,6 +2,7 @@ import { z } from 'zod'; import { protectedProcedure } from '../../trpc'; import { getUserFavoritesService } from '../../services/favorite/favorite.service'; import { type Context } from 'hono'; +import { getPaginationResponse } from 'src/helpers/pagination'; export const getUserFavorites = async (c: Context) => { try { @@ -15,10 +16,22 @@ export const getUserFavorites = async (c: Context) => { export function getUserFavoritesRoute() { return protectedProcedure - .input(z.object({ userId: z.string() })) + .input( + z.object({ + userId: z.string(), + pagination: z.object({ limit: z.number(), offset: z.number() }), + searchTerm: z.string().optional(), + isPreview: z.boolean().optional(), + }), + ) .query(async (opts) => { - const { userId } = opts.input; - const favorites = await getUserFavoritesService(userId); - return favorites; + const { userId, pagination, searchTerm } = opts.input; + const { data, totalCount, currentPagination } = + await getUserFavoritesService(userId, { searchTerm }, pagination); + + return { + data, + ...getPaginationResponse(currentPagination, totalCount as number), + }; }); } diff --git a/server/src/controllers/item/getItemImages.ts b/server/src/controllers/item/getItemImages.ts new file mode 100644 index 000000000..2969ef692 --- /dev/null +++ b/server/src/controllers/item/getItemImages.ts @@ -0,0 +1,24 @@ +import { protectedProcedure } from '../../trpc'; +import { getItemImagesByIdService } from '../../services/item/item.service'; +import { z } from 'zod'; +import { type Context } from 'hono'; + +export const getItemImages = async (c: Context) => { + try { + const { id } = await c.req.param(); + const item = await getItemImagesByIdService(id); + return c.json({ item }, 200); + } catch (error) { + return c.json({ error: `${error.message}` }, 500); + } +}; + +export function getItemImagesRoute() { + return protectedProcedure.input(z.object({ + id: z.string().nonempty("ID cant be empty"), + })).query(async (opts) => { + const { id } = opts.input; + const item = await getItemImagesByIdService(id); + return item; + }); +} diff --git a/server/src/controllers/item/getSimilarItems.ts b/server/src/controllers/item/getSimilarItems.ts index ad7b541d6..83ac084ff 100644 --- a/server/src/controllers/item/getSimilarItems.ts +++ b/server/src/controllers/item/getSimilarItems.ts @@ -4,13 +4,13 @@ import * as validator from '@packrat/validations'; export const getSimilarItems = async (c) => { try { - const { id, limit, visibility } = await c.req.json(); + const { id, limit } = await c.req.json(); if (limit < 1) { throw new Error('limit must be greater than 0'); } - const items = await getSimilarItemsService(id, limit, visibility); + const items = await getSimilarItemsService(id, limit); return c.json({ items }, 200); } catch (error) { return c.json( @@ -24,13 +24,13 @@ export function getSimilarItemsRoute() { return protectedProcedure .input(validator.getSimilarItems) .query(async (opts) => { - const { id, limit, visibility } = opts.input; + const { id, limit } = opts.input; if (limit < 1) { throw new Error('limit must be greater than 0'); } - const items = await getSimilarItemsService(id, limit, visibility); + const items = await getSimilarItemsService(id, limit); return items; }); } diff --git a/server/src/controllers/item/importFromBucket.ts b/server/src/controllers/item/importFromBucket.ts index 889309428..3ec08d6de 100644 --- a/server/src/controllers/item/importFromBucket.ts +++ b/server/src/controllers/item/importFromBucket.ts @@ -7,19 +7,20 @@ import { } from '../../services/item/item.service'; import { z } from 'zod'; -export const importFromBucket = async (c) => { - const { directory, ownerId } = await c.req.query(); +async function importItemsFromBucket(directory, ownerId, env, executionCtx) { + const { + BUCKET_ENDPOINT: endpoint, + BUCKET_NAME: bucket, + BUCKET_REGION: region, + BUCKET_SERVICE: service, + BUCKET_ACCESS_KEY_ID: accessKeyId, + BUCKET_SECRET_KEY: secretKey, + BUCKET_SESSION_TOKEN: sessionToken, + AWS_SIGN_ALGORITHM: algorithm, + X_AMZ_SECURITY_TOKEN: x_amz_token, + } = env; - const endpoint = c.env.BUCKET_ENDPOINT; - const bucket = c.env.BUCKET_NAME; const method = 'GET'; - const region = c.env.BUCKET_REGION; - const service = c.env.BUCKET_SERVICE; - const accessKeyId = c.env.BUCKET_ACCESS_KEY_ID; - const secretKey = c.env.BUCKET_SECRET_KEY; - const sessionToken = c.env.BUCKET_SESSION_TOKEN; - const algorithm = c.env.AWS_SIGN_ALGORITHM; - const x_amz_token = c.env.X_AMZ_SECURITY_TOKEN; try { const latestFileName = await listBucketContents( @@ -37,7 +38,7 @@ export const importFromBucket = async (c) => { ); if (!latestFileName) { - throw new Error('No files found in the supposed directory'); + throw new Error('No files found in the directory'); } const fileData = await fetchFromS3( @@ -53,17 +54,26 @@ export const importFromBucket = async (c) => { ); const itemsToInsert = await parseCSVData(fileData, ownerId); - const insertedItems = await bulkAddItemsGlobalService( - itemsToInsert, - c.executionCtx, - ); + const insertedItems = await bulkAddItemsGlobalService(itemsToInsert, executionCtx); + + return insertedItems; + } catch (err) { + console.error('Error:', err); + throw err; // Let the calling function handle the error + } +} + +export const importFromBucket = async (c) => { + const { directory, ownerId } = await c.req.query(); + + try { + const insertedItems = await importItemsFromBucket(directory, ownerId, c.env, c.executionCtx); return c.json({ message: 'Items inserted successfully', data: insertedItems, }); } catch (err) { - console.error('Error:', err); return c.json({ error: 'An error occurred' }); } }; @@ -73,44 +83,10 @@ export function importFromBucketRoute() { .input(z.object({ directory: z.string(), ownerId: z.string() })) .mutation(async (opts) => { const { directory, ownerId } = opts.input; - const { env, executionCtx }: any = opts.ctx; + const { env, executionCtx } = opts.ctx; try { - const latestFileName = await listBucketContents( - env.BUCKET_ENDPOINT, - env.BUCKET_NAME, - directory, - 'GET', - env.BUCKET_SERVICE, - env.BUCKET_REGION, - env.BUCKET_ACCESS_KEY_ID, - env.BUCKET_SECRET_KEY, - env.BUCKET_SESSION_TOKEN, - env.AWS_SIGN_ALGORITHM, - env.X_AMZ_SECURITY_TOKEN, - ); - - if (!latestFileName) { - throw new Error('No files found in the directory'); - } - - const fileData = await fetchFromS3( - `${env.BUCKET_ENDPOINT}/${env.BUCKET_NAME}/${latestFileName}`, - 'GET', - env.BUCKET_SERVICE, - env.BUCKET_REGION, - env.BUCKET_ACCESS_KEY_ID, - env.BUCKET_SECRET_KEY, - env.BUCKET_SESSION_TOKEN, - env.AWS_SIGN_ALGORITHM, - env.X_AMZ_SECURITY_TOKEN, - ); - - const itemsToInsert = await parseCSVData(fileData, ownerId); - const insertedItems = await bulkAddItemsGlobalService( - itemsToInsert, - executionCtx, - ); + const insertedItems = await importItemsFromBucket(directory, ownerId, env, executionCtx); return insertedItems; } catch (err) { diff --git a/server/src/controllers/item/importItemsGlobal.ts b/server/src/controllers/item/importItemsGlobal.ts index 0f311dba5..ebf67ac93 100644 --- a/server/src/controllers/item/importItemsGlobal.ts +++ b/server/src/controllers/item/importItemsGlobal.ts @@ -18,6 +18,7 @@ export const importItemsGlobal = async (c: Context) => { 'Unit', 'Quantity', 'Category', + 'image_urls', ]; const parsedHeaders = results.meta.fields; try { @@ -46,6 +47,7 @@ export const importItemsGlobal = async (c: Context) => { item.Category, ownerId, c.ctx.executionCtx, + item.image_urls, ); } resolve('items'); @@ -80,6 +82,7 @@ export function importItemsGlobalRoute() { 'Unit', 'Quantity', 'Category', + 'image_urls', ]; const parsedHeaders = results.meta.fields; try { @@ -110,6 +113,7 @@ export function importItemsGlobalRoute() { item.Category, ownerId, opts.ctx.executionCtx, + item.image_urls, ); } return resolve('items'); diff --git a/server/src/controllers/item/index.ts b/server/src/controllers/item/index.ts index aff900b00..41cdba713 100644 --- a/server/src/controllers/item/index.ts +++ b/server/src/controllers/item/index.ts @@ -8,6 +8,7 @@ export * from './deleteItem'; export * from './editItem'; export * from './getItems'; export * from './getItemById'; +export * from './getItemImages'; export * from './editGlobalItemAsDuplicate'; export * from './getItemsGlobally'; export * from './searchItemsByName'; diff --git a/server/src/controllers/pack/getSimilarPacks.ts b/server/src/controllers/pack/getSimilarPacks.ts index d25a0e6db..aa9c969bb 100644 --- a/server/src/controllers/pack/getSimilarPacks.ts +++ b/server/src/controllers/pack/getSimilarPacks.ts @@ -4,13 +4,13 @@ import * as validator from '@packrat/validations'; export const getSimilarPacks = async (c) => { try { - const { id, limit, visibility } = await c.req.json(); + const { id, limit } = await c.req.json(); if (limit < 1) { throw new Error('limit must be greater than 0'); } - const packs = await getSimilarPacksService(id, limit, visibility); + const packs = await getSimilarPacksService(id, limit); return c.json({ packs }, 200); } catch (error) { return c.json( @@ -24,13 +24,13 @@ export function getSimilarPacksRoute() { return protectedProcedure .input(validator.getSimilarPacks) .query(async (opts) => { - const { id, limit, visibility } = opts.input; + const { id, limit } = opts.input; if (limit < 1) { throw new Error('limit must be greater than 0'); } - const packs = await getSimilarPacksService(id, limit, visibility); + const packs = await getSimilarPacksService(id, limit); return packs; }); } diff --git a/server/src/controllers/trip/addTrip.ts b/server/src/controllers/trip/addTrip.ts index 7b94e4413..feba2d7db 100644 --- a/server/src/controllers/trip/addTrip.ts +++ b/server/src/controllers/trip/addTrip.ts @@ -15,6 +15,6 @@ export const addTrip = async (c) => { export function addTripRoute() { return protectedProcedure.input(validator.addTrip).mutation(async (opts) => { const tripData = opts.input; - return await addTripService(tripData); + return await addTripService(tripData, opts.ctx.executionCtx); }); } diff --git a/server/src/controllers/user/userSignIn.ts b/server/src/controllers/user/userSignIn.ts index 9bacbb892..7bd3f690b 100644 --- a/server/src/controllers/user/userSignIn.ts +++ b/server/src/controllers/user/userSignIn.ts @@ -33,6 +33,8 @@ export function userSignInRoute() { user.id, ); - return { accessToken, refreshToken }; + const { password, ...userResponse } = user; + + return { accessToken, refreshToken, user: userResponse }; }); } diff --git a/server/src/db/schema.ts b/server/src/db/schema.ts index 30c508ad4..0ac49512d 100644 --- a/server/src/db/schema.ts +++ b/server/src/db/schema.ts @@ -208,6 +208,17 @@ export const item = sqliteTable('item', { // @@map("items"): undefined, }); +export const itemImage = sqliteTable('item_image', { + id: text('id') + .primaryKey() + .$defaultFn(() => createId()), + itemId: text('item_id') + .references(() => item.id, { onDelete: 'cascade' }) + .notNull(), + url: text('url').notNull(), + createdAt: text('created_at').default(sql`CURRENT_TIMESTAMP`), +}); + export const offlineMap = sqliteTable( 'offlineMap', { @@ -348,7 +359,15 @@ export const trip = sqliteTable('trip', { }), is_public: integer('is_public', { mode: 'boolean' }), activity: text('activity').default('trip'), + bounds: text('bounds', { mode: 'json' }).$type(), type: text('type').default('trip'), + scores: text('scores', { mode: 'json' }) + .$type() + .default( + JSON.stringify({ + totalScore: 0, + }), + ), createdAt: text('created_at').default(sql`CURRENT_TIMESTAMP`), updatedAt: text('updated_at').default(sql`CURRENT_TIMESTAMP`), // @@map("trips"): undefined, diff --git a/server/src/drizzle/methods/Item.ts b/server/src/drizzle/methods/Item.ts index 49bb11977..249be5815 100644 --- a/server/src/drizzle/methods/Item.ts +++ b/server/src/drizzle/methods/Item.ts @@ -1,4 +1,6 @@ import { DbClient } from '../../db/client'; +import { and, count, eq, inArray, like, sql } from 'drizzle-orm'; +import { type InsertItem, item as ItemTable } from '../../db/schema'; import { and, count, eq, like, sql } from 'drizzle-orm'; import { type InsertItem, itemPacks, item as ItemTable } from '../../db/schema'; import { scorePackService } from '../../services/pack/scorePackService'; @@ -139,6 +141,13 @@ export class Item { } } + async findAllInArray(arr: string[]) { + return await DbClient.instance + .select() + .from(ItemTable) + .where(inArray(ItemTable.id, arr)); + } + async findGlobal(limit: number, offset: number, searchString: string) { try { const items = await DbClient.instance.query.item.findMany({ diff --git a/server/src/drizzle/methods/ItemImages.ts b/server/src/drizzle/methods/ItemImages.ts new file mode 100644 index 000000000..d9c3e8b72 --- /dev/null +++ b/server/src/drizzle/methods/ItemImages.ts @@ -0,0 +1,91 @@ +import { DbClient } from '../../db/client'; +import { and, count, eq, like, sql } from 'drizzle-orm'; +import { itemImage as itemImageTable } from '../../db/schema'; + +export class ItemImages { + async create(data: any) { + try { + const itemImage = await DbClient.instance + .insert(itemImageTable) + .values(data) + .returning() + .get(); + + return itemImage; + } catch (error) { + throw new Error(`Failed to create item image: ${error.message}`); + } + } + + async createBulk(data: any[]) { + try { + const insertedItemImages = []; + for (const itemImageData of data) { + const itemImage = await DbClient.instance + .insert(itemImageTable) + .values(itemImageData) + .returning() + .get(); + insertedItemImages.push(itemImage); + } + return insertedItemImages; + } catch (error) { + throw new Error(`Failed to create item images: ${error.message}`); + } + } + + async update( + id: string, + data: Partial, + filter = eq(itemImageTable.id, id), + ) { + try { + const itemImage = await DbClient.instance + .update(itemImageTable) + .set(data) + .where(filter) + .returning() + .get(); + + return itemImage; + } catch (error) { + throw new Error(`Failed to update item image: ${error.message}`); + } + } + + async delete(id: string) { + try { + await DbClient.instance.delete(itemImageTable).where(eq(itemImageTable.id, id)).execute(); + } catch (error) { + throw new Error(`Failed to delete item image: ${error.message}`); + } + } + + async getById(id: string) { + try { + const itemImage = await DbClient.instance + .select() + .from(itemImageTable) + .where(eq(itemImageTable.id, id)) + .get(); + + return itemImage; + } catch (error) { + throw new Error(`Failed to get item image: ${error.message}`); + } + } + // get all images for an item + async getByItemId({itemId}: {itemId: string}) { + try { + const itemImages = await DbClient.instance + .select() + .from(itemImageTable) + .where(eq(itemImageTable.itemId, itemId)) + .all(); + + return itemImages; + } catch (error) { + throw new Error(`Failed to get item images: ${error.message}`); + } + } +} \ No newline at end of file diff --git a/server/src/drizzle/methods/pack.ts b/server/src/drizzle/methods/pack.ts index 0ab56a51c..1b9d8b243 100644 --- a/server/src/drizzle/methods/pack.ts +++ b/server/src/drizzle/methods/pack.ts @@ -1,8 +1,11 @@ -import { eq, sql, asc, desc, and } from 'drizzle-orm'; +import { eq, sql, asc, desc, and, inArray } from 'drizzle-orm'; import { DbClient } from '../../db/client'; -import { type InsertPack, pack as PackTable, itemPacks } from '../../db/schema'; -import { convertWeight } from '../../utils/convertWeight'; - +import { + type InsertPack, + pack as PackTable, + item, + itemPacks, +} from '../../db/schema'; export class Pack { getRelations({ includeRelated, ownerId = true, completeItems = false }) { if (!includeRelated) { @@ -186,16 +189,23 @@ export class Pack { ...pack, scores: JSON.parse(pack.scores as string), grades: JSON.parse(pack.grades as string), - total_weight: this.computeTotalWeight(pack), favorites_count: this.computeFavouritesCount(pack), total_score: this.computeTotalScores(pack), items: pack.itemPacks.map((itemPack) => itemPack.item), + total_weight: sql`COALESCE(SUM(DISTINCT ${item.weight} * ${item.quantity}), 0) as total_weight`, })); } catch (error) { throw new Error(`Failed to fetch packs: ${error.message}`); } } + async findAllInArray(arr: string[]) { + return await DbClient.instance + .select() + .from(PackTable) + .where(inArray(PackTable.id, arr)); + } + async sortPacksByItems(options: any) { try { const { queryBy, sortItems, is_public, ownerId } = options; @@ -262,24 +272,6 @@ export class Pack { // } // } - computeTotalWeight(pack) { - if (pack.itemPacks && pack.itemPacks.length > 0) { - const totalWeight = pack.itemPacks.reduce( - (total: number, itemPack: any) => { - const weightInGrams = convertWeight( - itemPack.item.weight, - itemPack.item.unit, - 'g', - ); - return total + weightInGrams * itemPack.item.quantity; - }, - 0, - ); - return totalWeight; - } - return 0; - } - computeFavouritesCount(pack) { return pack.userFavoritePacks?.length ?? 0; } diff --git a/server/src/helpers/pagination.ts b/server/src/helpers/pagination.ts index 303164b38..816b91e9d 100644 --- a/server/src/helpers/pagination.ts +++ b/server/src/helpers/pagination.ts @@ -3,6 +3,14 @@ export interface PaginationParams { offset: number; } +export interface PaginationResponse { + currentPage: number; + totalCount: number; + totalPages: number; + prevOffset: number | false; + nextOffset: number | false; +} + const defaultPaginationParams: PaginationParams = { offset: 0, limit: 20, @@ -30,3 +38,42 @@ export function getNextOffset( return nextOffset; } + +export function getPrevOffset(pagination: PaginationParams): number | false { + const { limit, offset } = pagination; + + const prevOffset = offset - limit; + + if (prevOffset < 0) { + return false; + } + + return prevOffset; +} + +export function getPageInfo( + pagination: PaginationParams, + totalCount: number, +): { currentPage: number; totalPages: number } { + const { limit, offset } = pagination; + + const totalPages = Math.ceil(totalCount / limit); + const currentPage = Math.floor(offset / limit) + 1; + + return { + currentPage, + totalPages, + }; +} + +export function getPaginationResponse( + pagination: PaginationParams, + totalCount: number, +): PaginationResponse { + return { + prevOffset: getPrevOffset(pagination), + nextOffset: getNextOffset(pagination, totalCount), + totalCount, + ...getPageInfo(pagination, totalCount), + }; +} diff --git a/server/src/index.ts b/server/src/index.ts index 50f6f040c..5a2dfcfcb 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -37,11 +37,11 @@ const app = new Hono<{ Bindings: Bindings }>(); // Bun: This middleware uses CompressionStream which is not yet supported in bun. // ref: https://hono.dev/middleware/builtin/compress -// SETUP HTTPS Enforcement Middleware -// app.use('*', enforceHttps()); // Apply to all routes +// SETUP HTTPS Enforcement Middleware "This is for HTTP and has no relation to the tRPC server". and there are routes that are only available over HTTPS +app.use('*', enforceHttps()); // Apply to all routes so avoid commenting this unless you are on local -// SETUP SECURITY HEADERS -// app.use('*', securityHeaders()); // Apply to all routes +// SETUP Security Headers Middleware "This is for HTTP and has no relation to the tRPC server". and there are routes that are only available over HTTPS +app.use('*', securityHeaders()); // Apply to all routes so avoid commenting this unless you are on local // SETUP CORS app.use('*', async (c, next) => { @@ -85,5 +85,4 @@ const worker = { queue, }; -// EXPORT WORKER export default worker; diff --git a/server/src/modules/feed/controllers/getPublicFeed.ts b/server/src/modules/feed/controllers/getPublicFeed.ts index 5c98e2230..85804f831 100644 --- a/server/src/modules/feed/controllers/getPublicFeed.ts +++ b/server/src/modules/feed/controllers/getPublicFeed.ts @@ -1,4 +1,4 @@ -import { getNextOffset } from 'src/helpers/pagination'; +import { getNextOffset, getPaginationResponse } from 'src/helpers/pagination'; import { protectedProcedure } from '../../../trpc'; import { getFeedService } from '../services'; import { z } from 'zod'; @@ -17,12 +17,15 @@ export function getPublicFeedRoute() { ) .query(async (opts) => { const { queryBy, searchTerm, excludeType, pagination } = opts.input; - const { data, totalCount } = await getFeedService( + const { data, totalCount, currentPagination } = await getFeedService( queryBy, { searchTerm, isPublic: true }, excludeType, pagination, ); - return { data, nextOffset: getNextOffset(pagination, totalCount) }; + return { + data, + ...getPaginationResponse(currentPagination, totalCount as number), + }; }); } diff --git a/server/src/modules/feed/controllers/getUserPacksFeed.ts b/server/src/modules/feed/controllers/getUserPacksFeed.ts index d4b137e2e..934b08bc0 100644 --- a/server/src/modules/feed/controllers/getUserPacksFeed.ts +++ b/server/src/modules/feed/controllers/getUserPacksFeed.ts @@ -1,4 +1,4 @@ -import { getNextOffset } from 'src/helpers/pagination'; +import { getPaginationResponse } from 'src/helpers/pagination'; import { protectedProcedure } from '../../../trpc'; import { getFeedService } from '../services'; import { z } from 'zod'; @@ -10,6 +10,7 @@ export function getUserPacksFeedRoute() { queryBy: z.string(), ownerId: z.string(), isPublic: z.boolean().optional(), + isPreview: z.boolean().optional(), searchTerm: z.string().optional(), pagination: z .object({ limit: z.number(), offset: z.number() }) @@ -18,12 +19,15 @@ export function getUserPacksFeedRoute() { ) .query(async (opts) => { const { queryBy, searchTerm, ownerId, pagination, isPublic } = opts.input; - const { data, totalCount } = await getFeedService( + const { data, totalCount, currentPagination } = await getFeedService( queryBy, { searchTerm, ownerId, isPublic }, 'trips', pagination, ); - return { data, nextOffset: getNextOffset(pagination, totalCount) }; + return { + data, + ...getPaginationResponse(currentPagination, totalCount as number), + }; }); } diff --git a/server/src/modules/feed/controllers/getUserTripsFeed.ts b/server/src/modules/feed/controllers/getUserTripsFeed.ts index 89c2ff193..2751840de 100644 --- a/server/src/modules/feed/controllers/getUserTripsFeed.ts +++ b/server/src/modules/feed/controllers/getUserTripsFeed.ts @@ -1,4 +1,8 @@ -import { getNextOffset } from 'src/helpers/pagination'; +import { + getNextOffset, + getPaginationParams, + getPaginationResponse, +} from 'src/helpers/pagination'; import { protectedProcedure } from '../../../trpc'; import { getFeedService } from '../services'; import { z } from 'zod'; @@ -10,6 +14,7 @@ export function getUserTripsFeedRoute() { queryBy: z.string(), ownerId: z.string(), isPublic: z.boolean().optional(), + isPreview: z.boolean().optional(), searchTerm: z.string().optional(), pagination: z .object({ limit: z.number(), offset: z.number() }) @@ -18,12 +23,15 @@ export function getUserTripsFeedRoute() { ) .query(async (opts) => { const { queryBy, searchTerm, ownerId, pagination, isPublic } = opts.input; - const { data, totalCount } = await getFeedService( + const { data, totalCount, currentPagination } = await getFeedService( queryBy, { searchTerm, ownerId, isPublic }, 'packs', pagination, ); - return { data, nextOffset: getNextOffset(pagination, totalCount) }; + return { + data, + ...getPaginationResponse(currentPagination, totalCount as number), + }; }); } diff --git a/server/src/modules/feed/model/feed.ts b/server/src/modules/feed/model/feed.ts index 05ca65944..223c97222 100644 --- a/server/src/modules/feed/model/feed.ts +++ b/server/src/modules/feed/model/feed.ts @@ -8,9 +8,9 @@ import { userFavoritePacks, } from '../../../db/schema'; import { literal } from 'src/drizzle/helpers'; -import { convertWeight } from '../../../utils/convertWeight'; import { getPaginationParams, + getPrevOffset, type PaginationParams, } from '../../../helpers/pagination'; import { FeedQueryBy, Modifiers } from '../models'; @@ -22,6 +22,48 @@ export class Feed { modifiers?: Modifiers, excludeType?: 'trips' | 'packs', pagination?: PaginationParams, + ) { + let currentPagination = getPaginationParams(pagination); + + // it tries to load previous page if current page is empty + // Using while instead of recursion + while (true) { + const { data, totalCount } = await this.findFeedQuery( + queryBy, + modifiers, + excludeType, + currentPagination, + ); + + if (totalCount === 0 || !data?.length) { + const prevOffset = getPrevOffset(currentPagination); + if (prevOffset === false) { + return { + data: [], + totalCount: 0, + currentPagination: { offset: 0, limit: currentPagination.limit }, + }; + } + + currentPagination = { + offset: prevOffset, + limit: currentPagination.limit, + }; + } else { + return { + data, + totalCount, + currentPagination, + }; + } + } + } + + async findFeedQuery( + queryBy: FeedQueryBy, + modifiers?: Modifiers, + excludeType?: 'trips' | 'packs', + pagination?: PaginationParams, ) { try { let packsQuery = DbClient.instance @@ -38,7 +80,7 @@ export class Feed { destination: literal(''), favorites_count: sql`COALESCE(COUNT(DISTINCT ${userFavoritePacks.userId}), 0) as favorites_count`, quantity: sql`COALESCE(SUM(DISTINCT ${item.quantity}), 0)`, - userFavorites: sql`GROUP_CONCAT(DISTINCT ${userFavoritePacks.userId})`, + userFavorites: sql`GROUP_CONCAT(DISTINCT ${userFavoritePacks.userId}) as userFavorites`, total_weight: sql`COALESCE(SUM(DISTINCT ${item.weight} * ${item.quantity}), 0) as total_weight`, activity: literal(null), start_date: literal(null), @@ -50,6 +92,12 @@ export class Feed { .leftJoin(item, eq(itemPacks.itemId, item.id)) .groupBy(pack.id); + if (modifiers.includeUserFavoritesOnly) { + packsQuery = packsQuery.having( + this.generateHavingConditions(modifiers, pack), + ); + } + if (modifiers) { packsQuery = packsQuery.where( this.generateWhereConditions(modifiers, pack), @@ -63,7 +111,7 @@ export class Feed { name: trip.name, owner_id: trip.owner_id, grades: literal('{}'), - scores: literal('{}'), + scores: trip.scores, is_public: trip.is_public, type: literal('trip'), description: trip.description, @@ -173,9 +221,13 @@ export class Feed { return packQuery; } - computeTotalScores(pack) { - if (!pack.scores) return 0; - const scores = this.parseJSON(pack.scores); + computeTotalScores(resource) { + if (resource.type === 'trip') { + return resource?.scores?.totalScore || 0; + } + + if (!resource.scores) return 0; + const scores = this.parseJSON(resource.scores); const scoresArray: number[] = Object.values(scores); const sum: number = scoresArray.reduce( (total: number, score: number) => total + score, @@ -211,4 +263,19 @@ export class Feed { return conditions.length > 0 ? and(...conditions) : undefined; } + + generateHavingConditions( + modifiers: Modifiers, + table: typeof trip | typeof pack, + ) { + const conditions = []; + + if (modifiers.ownerId && modifiers.includeUserFavoritesOnly) { + conditions.push( + sql`userFavorites LIKE CONCAT('%', ${modifiers.ownerId}, '%')`, + ); + } + + return conditions.length > 0 ? and(...conditions) : undefined; + } } diff --git a/server/src/modules/feed/models.ts b/server/src/modules/feed/models.ts index e04bc3861..c82a3294d 100644 --- a/server/src/modules/feed/models.ts +++ b/server/src/modules/feed/models.ts @@ -2,6 +2,7 @@ export interface Modifiers { isPublic?: boolean; ownerId?: string; searchTerm?: string; + includeUserFavoritesOnly?: boolean; } export type FeedQueryBy = diff --git a/server/src/modules/map/controllers/getOfflineMaps.ts b/server/src/modules/map/controllers/getOfflineMaps.ts new file mode 100644 index 000000000..fbc1eed48 --- /dev/null +++ b/server/src/modules/map/controllers/getOfflineMaps.ts @@ -0,0 +1,25 @@ +import { getPaginationResponse } from 'src/helpers/pagination'; +import { protectedProcedure } from '../../../trpc'; +import { getOfflineMapsService } from '../services'; +import { z } from 'zod'; + +export function getOfflineMapsRoute() { + return protectedProcedure + .input( + z.object({ + ownerId: z.string(), + pagination: z.object({ limit: z.number(), offset: z.number() }), + }), + ) + .query(async (opts) => { + const { pagination, ownerId } = opts.input; + const { offlineMaps, totalCount } = await getOfflineMapsService( + ownerId, + pagination, + ); + return { + data: offlineMaps, + ...getPaginationResponse(pagination, totalCount), + }; + }); +} diff --git a/server/src/modules/map/controllers/index.ts b/server/src/modules/map/controllers/index.ts new file mode 100644 index 000000000..75709cf92 --- /dev/null +++ b/server/src/modules/map/controllers/index.ts @@ -0,0 +1,2 @@ +export * from './saveOfflineMap'; +export * from './getOfflineMaps'; diff --git a/server/src/modules/map/controllers/saveOfflineMap.ts b/server/src/modules/map/controllers/saveOfflineMap.ts new file mode 100644 index 000000000..e6ceec60e --- /dev/null +++ b/server/src/modules/map/controllers/saveOfflineMap.ts @@ -0,0 +1,25 @@ +import { protectedProcedure } from '../../../trpc'; +import { saveOfflineMapService } from '../services'; +import { z } from 'zod'; + +export function saveOfflineMapRoute() { + return protectedProcedure + .input( + z.object({ + name: z.string(), + styleURL: z.string(), + bounds: z.tuple([z.array(z.number()), z.array(z.number())]), + minZoom: z.number(), + maxZoom: z.number(), + owner_id: z.string(), + metadata: z.object({ shape: z.string() }), + }), + ) + .mutation(async (opts) => { + const offlineMap = await saveOfflineMapService( + opts.input, + opts.ctx.executionCtx, + ); + return offlineMap; + }); +} diff --git a/server/src/modules/map/index.ts b/server/src/modules/map/index.ts new file mode 100644 index 000000000..a3820983e --- /dev/null +++ b/server/src/modules/map/index.ts @@ -0,0 +1 @@ +export * from './routes'; diff --git a/server/src/modules/map/model/index.ts b/server/src/modules/map/model/index.ts new file mode 100644 index 000000000..4d74bf256 --- /dev/null +++ b/server/src/modules/map/model/index.ts @@ -0,0 +1 @@ +export * from './offlineMap'; diff --git a/server/src/modules/map/model/offlineMap.ts b/server/src/modules/map/model/offlineMap.ts new file mode 100644 index 000000000..56d314298 --- /dev/null +++ b/server/src/modules/map/model/offlineMap.ts @@ -0,0 +1,47 @@ +import { eq, sql } from 'drizzle-orm'; +import { DbClient } from '../../../db/client'; +import { offlineMap, offlineMap as offlineMapTable } from '../../../db/schema'; + +import { OfflineMap as IOfflineMap } from '../models'; +import { + getPaginationParams, + type PaginationParams, +} from '../../../helpers/pagination'; + +export class OfflineMap { + async findByOwnerId(ownerId: string, pagination?: PaginationParams) { + try { + const paginationParams = getPaginationParams(pagination); + const offlineMaps = await DbClient.instance.query.offlineMap.findMany({ + where: eq(offlineMap.owner_id, ownerId), + limit: paginationParams.limit, + offset: paginationParams.offset, + }); + + const totalCountQuery = await DbClient.instance + .select({ + totalCount: sql`COUNT(*)`, + }) + .from(offlineMap) + .where(eq(offlineMap.owner_id, ownerId)) + .all(); + + return { offlineMaps, totalCount: totalCountQuery?.[0]?.totalCount || 0 }; + } catch (error) { + throw new Error(`Failed to fetch offline maps: ${error.message}`); + } + } + + async create(data: IOfflineMap) { + try { + const newOfflineMap = await DbClient.instance + .insert(offlineMapTable) + .values(data) + .returning() + .get(); + return newOfflineMap; + } catch (error) { + throw new Error(`Failed to create offline map: ${error.message}`); + } + } +} diff --git a/server/src/modules/map/models.ts b/server/src/modules/map/models.ts new file mode 100644 index 000000000..76612784e --- /dev/null +++ b/server/src/modules/map/models.ts @@ -0,0 +1,10 @@ +export interface OfflineMap { + name: string; + styleURL: string; + bounds: [number[], number[]]; + minZoom: number; + maxZoom: number; + metadata: { + shape: string; + }; +} diff --git a/server/src/modules/map/routes.ts b/server/src/modules/map/routes.ts new file mode 100644 index 000000000..7cc83b238 --- /dev/null +++ b/server/src/modules/map/routes.ts @@ -0,0 +1,2 @@ +export { saveOfflineMapRoute } from './controllers/saveOfflineMap'; +export { getOfflineMapsRoute } from './controllers/getOfflineMaps'; diff --git a/server/src/modules/map/services/getOfflineMapsService.ts b/server/src/modules/map/services/getOfflineMapsService.ts new file mode 100644 index 000000000..8e53a276e --- /dev/null +++ b/server/src/modules/map/services/getOfflineMapsService.ts @@ -0,0 +1,19 @@ +import { PaginationParams } from '../../../helpers/pagination'; +import { OfflineMap } from '../model'; + +export const getOfflineMapsService = async ( + owner_id: string, + pagination?: PaginationParams, +) => { + try { + const offlineMapClass = new OfflineMap(); + const { offlineMaps, totalCount } = await offlineMapClass.findByOwnerId( + owner_id, + pagination, + ); + return { offlineMaps, totalCount }; + } catch (error) { + console.error(error); + throw new Error('Failed to fetch offline maps'); + } +}; diff --git a/server/src/modules/map/services/index.ts b/server/src/modules/map/services/index.ts new file mode 100644 index 000000000..b765a55b8 --- /dev/null +++ b/server/src/modules/map/services/index.ts @@ -0,0 +1,2 @@ +export * from './saveOfflineMapService'; +export * from './getOfflineMapsService'; diff --git a/server/src/modules/map/services/saveOfflineMapService.ts b/server/src/modules/map/services/saveOfflineMapService.ts new file mode 100644 index 000000000..6d3e595ac --- /dev/null +++ b/server/src/modules/map/services/saveOfflineMapService.ts @@ -0,0 +1,34 @@ +// services/tripService.ts + +import { GeojsonStorageService } from 'src/services/geojsonStorage'; +import { PaginationParams } from '../../../helpers/pagination'; +import { OfflineMap } from '../model'; +import { OfflineMap as IOfflineMap } from '../models'; + +export const saveOfflineMapService = async ( + offlineMap: IOfflineMap, + executionCtx: ExecutionContext, +) => { + try { + const { metadata, ...offlineMapData } = offlineMap; + const offlineMapClass = new OfflineMap(); + console.log({ offlineMapData }); + const newOfflineMap = await offlineMapClass.create({ + metadata: null, + ...offlineMapData, + }); + + executionCtx.waitUntil( + GeojsonStorageService.save( + 'map', + JSON.stringify(metadata.shape), + newOfflineMap.id, + ), + ); + + return newOfflineMap; + } catch (error) { + console.error(error); + throw new Error('Trips cannot be found'); + } +}; diff --git a/server/src/routes/geojsonRoutes.ts b/server/src/routes/geojsonRoutes.ts new file mode 100644 index 000000000..639f56ef2 --- /dev/null +++ b/server/src/routes/geojsonRoutes.ts @@ -0,0 +1,36 @@ +import { Context, Hono } from 'hono'; +import { tryCatchWrapper } from '../helpers/tryCatchWrapper'; +import { + GeojsonStorageService, + type ResourceType, +} from 'src/services/geojsonStorage'; + +const router = new Hono(); + +router.get( + '/:resource/:resourceId', + tryCatchWrapper(async (ctx: Context) => { + try { + const params = ctx.req.param(); + + const object = await GeojsonStorageService.retrieve( + params.resource as ResourceType, + params.resourceId, + ); + + const headers = new Headers(); + object.writeHttpMetadata(headers); + headers.set('etag', object.httpEtag); + headers.set('Content-Type', 'application/geo+json'); + const json = await object.json(); + + return new Response(json, { + headers, + }); + } catch (error) { + return ctx.json({ error: error.message }, 400); + } + }), +); + +export default router; diff --git a/server/src/routes/index.ts b/server/src/routes/index.ts index 5d59d5f53..fdb451b20 100644 --- a/server/src/routes/index.ts +++ b/server/src/routes/index.ts @@ -13,6 +13,7 @@ import favoriteRouters from './favoriteRoutes'; import userRoutes from './userRoutes'; import testRoutes from './testRoutes'; import mapPreviewRouter from './mapPreviewRouter'; +import geojsonRoutes from './geojsonRoutes'; import healthRoutes from './healthRoutes'; import { Hono } from 'hono'; @@ -34,6 +35,7 @@ router.route('/openai', openAiRoutes); router.route('/template', templateRoutes); router.route('/favorite', favoriteRouters); router.route('/mapPreview', mapPreviewRouter); +router.route('/geojson', geojsonRoutes); router.route('/health', healthRoutes); // Also listen to /api for backwards compatibility diff --git a/server/src/routes/trpcRouter.ts b/server/src/routes/trpcRouter.ts index 86be8bc4b..49d2e21e8 100644 --- a/server/src/routes/trpcRouter.ts +++ b/server/src/routes/trpcRouter.ts @@ -69,6 +69,7 @@ import { editGlobalItemAsDuplicateRoute, editItemRoute, getItemByIdRoute, + getItemImagesRoute, getItemsGloballyRoute, getItemsRoute, searchItemsByNameRoute, @@ -99,6 +100,8 @@ import { getUserTripsFeedRoute, } from '../modules/feed'; +import { getOfflineMapsRoute, saveOfflineMapRoute } from '../modules/map'; + export const appRouter = trpcRouter({ getUserById: getUserByIdRoute(), signIn: userSignInRoute(), @@ -122,6 +125,9 @@ export const appRouter = trpcRouter({ getPublicFeed: getPublicFeedRoute(), getUserPacksFeed: getUserPacksFeedRoute(), getUserTripsFeed: getUserTripsFeedRoute(), + // map routes + getOfflineMaps: getOfflineMapsRoute(), + saveOfflineMap: saveOfflineMapRoute(), // trips routes getPublicTripsRoute: getPublicTripsRoute(), getTrips: getTripsRoute(), @@ -163,6 +169,7 @@ export const appRouter = trpcRouter({ // item routes getItems: getItemsRoute(), getItemById: getItemByIdRoute(), + getItemImages: getItemImagesRoute(), searchItemsByName: searchItemsByNameRoute(), addItem: addItemRoute(), // Done importItems: importItemsRoute(), // Done diff --git a/server/src/services/favorite/getUserFavoritesService.ts b/server/src/services/favorite/getUserFavoritesService.ts index 5823c2781..ba27732ea 100644 --- a/server/src/services/favorite/getUserFavoritesService.ts +++ b/server/src/services/favorite/getUserFavoritesService.ts @@ -1,5 +1,6 @@ +import { Feed } from '../../modules/feed/model'; import { User } from '../../drizzle/methods/User'; -import { Pack } from '../../drizzle/methods/pack'; +import { PaginationParams } from 'src/helpers/pagination'; /** * Retrieves the favorite packs associated with a specific user. @@ -7,9 +8,14 @@ import { Pack } from '../../drizzle/methods/pack'; * @param {string} userId - The ID of the user. * @return {Promise>} An array of favorite packs. */ -export const getUserFavoritesService = async (userId: string) => { +export const getUserFavoritesService = async ( + userId: string, + options?: { searchTerm?: string }, + pagination?: PaginationParams, +) => { + const { searchTerm } = options || {}; const userClass = new User(); - const packClass = new Pack(); + const feedClass = new Feed(); const user = (await userClass.findUser({ userId, includeFavorites: true, @@ -19,13 +25,15 @@ export const getUserFavoritesService = async (userId: string) => { throw new Error(`User with id ${userId} not found`); } - const userFavorites = user.userFavoritePacks?.map((item) => ({ - ...item.pack, - scores: JSON.parse(item.pack.scores as string), - grades: JSON.parse(item.pack.grades as string), - total_weight: packClass.computeTotalWeight(item.pack), - favorites_count: packClass.computeFavouritesCount(item.pack), - total_score: packClass.computeTotalScores(item.pack), - })); + const userFavorites = await feedClass.findFeed( + 'Most Recent', + { + includeUserFavoritesOnly: true, + searchTerm, + ownerId: userId, + }, + 'trips', + pagination, + ); return userFavorites; }; diff --git a/server/src/services/geojsonStorage/index.ts b/server/src/services/geojsonStorage/index.ts new file mode 100644 index 000000000..4381e3808 --- /dev/null +++ b/server/src/services/geojsonStorage/index.ts @@ -0,0 +1,38 @@ +export type ResourceType = 'trip' | 'map'; + +export class GeojsonStorageService { + private static _bucket: R2Bucket | null = null; + private static _instance: GeojsonStorageService | null = null; + + private constructor(bucket: R2Bucket) { + GeojsonStorageService._bucket = bucket; + } + + public static init(bucketBinding: R2Bucket) { + GeojsonStorageService._instance = new GeojsonStorageService(bucketBinding); + } + + public static get instance(): R2Bucket { + if (!GeojsonStorageService._instance) { + throw new Error('GeojsonStorageService instance not initialized.'); + } + return GeojsonStorageService._bucket; + } + + public static async save( + resource: ResourceType, + geojson: string, + resourceId: string, + ): Promise { + const object = await this._bucket.put(`${resource}/${resourceId}`, geojson); + return object; + } + + public static async retrieve( + resource: ResourceType, + resourceId: string, + ): Promise { + const object = await this._bucket.get(`${resource}/${resourceId}`); + return object; + } +} diff --git a/server/src/services/item/addItemGlobalService.ts b/server/src/services/item/addItemGlobalService.ts index a023b2007..594bdb85c 100644 --- a/server/src/services/item/addItemGlobalService.ts +++ b/server/src/services/item/addItemGlobalService.ts @@ -4,6 +4,9 @@ import { Item } from '../../drizzle/methods/Item'; import { ItemCategory } from '../../drizzle/methods/itemcategory'; import { ItemCategory as categories } from '../../utils/itemCategory'; import { VectorClient } from '../../vector/client'; +import { convertWeight, SMALLEST_WEIGHT_UNIT } from 'src/utils/convertWeight'; +import { DbClient } from 'src/db/client'; +import { itemImage as itemImageTable } from '../../db/schema'; // import { prisma } from '../../prisma'; /** @@ -24,6 +27,7 @@ export const addItemGlobalService = async ( type: 'Food' | 'Water' | 'Essentials', ownerId: string, executionCtx: ExecutionContext, + image_urls?: string, ) => { let category: InsertItemCategory | null; if (!categories.includes(type)) { @@ -37,7 +41,7 @@ export const addItemGlobalService = async ( } const newItem = await itemClass.create({ name, - weight, + weight: convertWeight(Number(weight), unit as any, SMALLEST_WEIGHT_UNIT), quantity, unit, categoryId: category.id, @@ -45,6 +49,20 @@ export const addItemGlobalService = async ( ownerId, }); + if (image_urls) { + const urls = image_urls.split(','); + for (const url of urls) { + const newItemImage = { + itemId: newItem.id, + url, + }; + await DbClient.instance + .insert(itemImageTable) + .values(newItemImage) + .run(); + } + } + executionCtx.waitUntil( VectorClient.instance.syncRecord({ id: newItem.id, @@ -52,6 +70,7 @@ export const addItemGlobalService = async ( namespace: 'items', metadata: { isPublic: newItem.global, + ownerId, }, }), ); diff --git a/server/src/services/item/addItemService.ts b/server/src/services/item/addItemService.ts index 92fdfd9ad..f850eb370 100644 --- a/server/src/services/item/addItemService.ts +++ b/server/src/services/item/addItemService.ts @@ -5,6 +5,7 @@ import { ItemOwners } from '../../drizzle/methods/ItemOwners'; import { ItemCategory as categories } from '../../utils/itemCategory'; import { type InsertItemCategory } from '../../db/schema'; import { VectorClient } from '../../vector/client'; +import { convertWeight, SMALLEST_WEIGHT_UNIT } from 'src/utils/convertWeight'; import { type ExecutionContext } from 'hono'; /** @@ -42,7 +43,7 @@ export const addItemService = async ( const item = await itemClass.create( { name, - weight, + weight: convertWeight(Number(weight), unit as any, SMALLEST_WEIGHT_UNIT), quantity, unit, // packs: [packId], @@ -80,6 +81,7 @@ export const addItemService = async ( namespace: 'items', metadata: { isPublic: item.global, + ownerId, }, }), ); diff --git a/server/src/services/item/bulkAddGlobalItemService.ts b/server/src/services/item/bulkAddGlobalItemService.ts index b7733d724..7667154fd 100644 --- a/server/src/services/item/bulkAddGlobalItemService.ts +++ b/server/src/services/item/bulkAddGlobalItemService.ts @@ -2,7 +2,9 @@ import { type ExecutionContext } from 'hono'; import { type InsertItemCategory } from '../../db/schema'; import { ItemCategory } from '../../drizzle/methods/itemcategory'; import { DbClient } from 'src/db/client'; -import { item as ItemTable } from '../../db/schema'; +import { item as ItemTable, itemImage as itemImageTable } from '../../db/schema'; +import { convertWeight, SMALLEST_WEIGHT_UNIT } from 'src/utils/convertWeight'; +import { eq } from 'drizzle-orm'; export const bulkAddItemsGlobalService = async ( items: Array<{ @@ -12,6 +14,7 @@ export const bulkAddItemsGlobalService = async ( unit: string; type: 'Food' | 'Water' | 'Essentials'; ownerId: string; + image_urls?: string; }>, executionCtx: ExecutionContext, ) => { @@ -21,7 +24,7 @@ export const bulkAddItemsGlobalService = async ( const insertedItems = []; for (const itemData of items) { - const { name, weight, quantity, unit, type, ownerId } = itemData; + const { name, weight, quantity, unit, type, ownerId, image_urls } = itemData; if (!categories.includes(type)) { throw new Error(`Category must be one of: ${categories.join(', ')}`); } @@ -33,9 +36,20 @@ export const bulkAddItemsGlobalService = async ( category = await itemCategoryClass.create({ name: type }); } + // Check if item with the same name already exists + const existingItem = await DbClient.instance + .select() + .from(ItemTable) + .where(eq(ItemTable.name, name)) + .get(); + + if (existingItem) { + continue; + } + const newItem = { name, - weight, + weight: convertWeight(Number(weight), unit as any, SMALLEST_WEIGHT_UNIT), quantity, unit, categoryId: category.id, @@ -49,6 +63,21 @@ export const bulkAddItemsGlobalService = async ( .returning() .get(); + if (image_urls) { + const urls = image_urls.split(','); + for (const url of urls) { + const newItemImage = { + itemId: item.id, + url, + }; + await DbClient.instance + .insert(itemImageTable) + .values(newItemImage) + .run(); + } + console.log('Added image urls for item:', item.id); + } + insertedItems.push(item); } diff --git a/server/src/services/item/editItemService.ts b/server/src/services/item/editItemService.ts index 411d297a3..0c62ec3e7 100644 --- a/server/src/services/item/editItemService.ts +++ b/server/src/services/item/editItemService.ts @@ -6,6 +6,7 @@ import { Item } from '../../drizzle/methods/Item'; import { ItemCategory } from '../../drizzle/methods/itemcategory'; import { ItemCategory as categories } from '../../utils/itemCategory'; import { VectorClient } from '../../vector/client'; +import { convertWeight, SMALLEST_WEIGHT_UNIT } from 'src/utils/convertWeight'; /** * Edit an item in the service. @@ -55,12 +56,16 @@ export const editItemService = async ( }); } } - + const itemUnit = unit || item.unit; // const item = await itemClass.findItem({ id }); const newItem = await itemClass.update(id, { name: name || item.name, - weight: weight || item.weight, - unit: unit || item.unit, + weight: convertWeight( + Number(weight || item.weight), + itemUnit as any, + SMALLEST_WEIGHT_UNIT, + ), + unit: itemUnit, quantity: quantity || item.quantity, categoryId: category.id || item.categoryId, }); @@ -72,6 +77,7 @@ export const editItemService = async ( content: name, metadata: { isPublic: newItem.global, + ownerId: newItem.ownerId, }, namespace: 'items', }, diff --git a/server/src/services/item/getItemImagesByIdService.ts b/server/src/services/item/getItemImagesByIdService.ts new file mode 100644 index 000000000..41804043b --- /dev/null +++ b/server/src/services/item/getItemImagesByIdService.ts @@ -0,0 +1,6 @@ +import { ItemImages } from '../../drizzle/methods/ItemImages'; +export const getItemImagesByIdService = async (id: string) => { + const itemClass = new ItemImages(); + const item = await itemClass.getByItemId({ itemId: id }); + return item; +}; diff --git a/server/src/services/item/getSimilarItemsService.ts b/server/src/services/item/getSimilarItemsService.ts index 5f74b55c1..81d3d012e 100644 --- a/server/src/services/item/getSimilarItemsService.ts +++ b/server/src/services/item/getSimilarItemsService.ts @@ -1,24 +1,24 @@ -import { DbClient } from '../../db/client'; -import { Item } from '../../drizzle/methods/Item'; +import { type Item } from 'src/db/schema'; +import { Item as ItemRepository } from '../../drizzle/methods/Item'; import { VectorClient } from '../../vector/client'; -import { item as ItemsTable } from '../../db/schema'; -import { inArray } from 'drizzle-orm'; -import { PackAndItemVisibilityFilter } from '@packrat/shared-types'; + +interface SimilarItem extends Item { + similarityScore: number; +} /** * Retrieves items that are similar to the provided item. * * @param {string} id - ID of the item for which to retrive similar items for. * @param {string} limit - Max number of similar items to return (default = 5). - * @return {Promise} A promise that resolves with an array of items. + * @return {Promise} A promise that resolves with an array of items. */ export async function getSimilarItemsService( id: string, limit: number = 5, - visibility: PackAndItemVisibilityFilter, -) { - const itemObj = new Item(); - const item = await itemObj.findItem({ +): Promise { + const itemRepository = new ItemRepository(); + const item = await itemRepository.findItem({ id, }); @@ -28,37 +28,28 @@ export async function getSimilarItemsService( const { result: { matches }, - } = await VectorClient.instance.search( - item.name, - 'items', - limit, - visibility == PackAndItemVisibilityFilter.ALL - ? undefined - : { - isPublic: visibility == PackAndItemVisibilityFilter.PUBLIC, - }, - ); + } = await VectorClient.instance.search(item.name, 'items', limit, { + isPublic: true, + }); // passing empty array to the db query below throws if (!matches.length) { return []; } - const similarItemsResult = await DbClient.instance - .select() - .from(ItemsTable) - .where( - inArray( - ItemsTable.id, - matches.map((m) => m.id), - ), - ); + const array = []; + for (const m of matches) { + if (m.id == id) continue; // filter current items's id + array.push(m.id); + } + + const similarItemsResult = await itemRepository.findAllInArray(array); // add similarity score to items result - const similarItems = matches.map((match) => { + const similarItems = similarItemsResult.map((similarItem) => { return { - ...similarItemsResult.find((item) => item.id == match.id), - similarityScore: match.score, + ...similarItem, + similarityScore: matches.find((m) => m.id == similarItem.id).score, }; }); diff --git a/server/src/services/item/importFromBucketService.ts b/server/src/services/item/importFromBucketService.ts index be4cecf59..3a1fb3fe8 100644 --- a/server/src/services/item/importFromBucketService.ts +++ b/server/src/services/item/importFromBucketService.ts @@ -9,6 +9,7 @@ interface CSVType { unit: string; type: 'Essentials' | 'Food' | 'Water'; ownerId: string; + image_urls: string; } function getSignatureKey( @@ -135,6 +136,7 @@ export async function listBucketContents( { label: 'bucket 3', value: 'cabelas' }, { label: 'bucket 4', value: 'moosejaw' }, { label: 'bucket 5', value: 'backcountry' }, + { label: 'bucket 6', value: 'patagonia' }, ]; directory = @@ -177,6 +179,7 @@ export async function parseCSVData(fileData: string, ownerId: string) { unit: item.weight_unit || 'g', type: 'Essentials', ownerId, + image_urls: item.image_urls, }); } resolve(itemsToInsert); diff --git a/server/src/services/item/item.service.ts b/server/src/services/item/item.service.ts index fb24b7bc3..6f6e0aebc 100644 --- a/server/src/services/item/item.service.ts +++ b/server/src/services/item/item.service.ts @@ -11,3 +11,4 @@ export * from './searchItemsByNameService'; export * from './getItemsService'; export * from './bulkAddGlobalItemService'; export * from './importFromBucketService'; +export * from "./getItemImagesByIdService"; diff --git a/server/src/services/pack/addPackService.ts b/server/src/services/pack/addPackService.ts index d8cb914ae..3427aef98 100644 --- a/server/src/services/pack/addPackService.ts +++ b/server/src/services/pack/addPackService.ts @@ -32,6 +32,7 @@ export const addPackService = async ( content: name, metadata: { isPublic: createdPack.is_public, + ownerId: owner_id, }, namespace: 'packs', }), diff --git a/server/src/services/pack/duplicatePublicPackService.ts b/server/src/services/pack/duplicatePublicPackService.ts index 63716fe22..eede26570 100644 --- a/server/src/services/pack/duplicatePublicPackService.ts +++ b/server/src/services/pack/duplicatePublicPackService.ts @@ -41,6 +41,7 @@ export const duplicatePublicPackService = async ( content: newPack.name, metadata: { isPublic: newPack.is_public, + ownerId, }, namespace: 'packs', }), diff --git a/server/src/services/pack/editPackService.ts b/server/src/services/pack/editPackService.ts index 5b1043d63..5cd70b776 100644 --- a/server/src/services/pack/editPackService.ts +++ b/server/src/services/pack/editPackService.ts @@ -34,6 +34,7 @@ export const editPackService = async ( content: name, metadata: { isPublic: updatedData.is_public, + ownerId: pack.owner_id, }, namespace: 'packs', }, diff --git a/server/src/services/pack/getPackByIdService.ts b/server/src/services/pack/getPackByIdService.ts index 5e3a00598..82e95adb8 100644 --- a/server/src/services/pack/getPackByIdService.ts +++ b/server/src/services/pack/getPackByIdService.ts @@ -45,7 +45,7 @@ export const getPackByIdService = async (packId: string): Promise => { ...pack, scores: pack.scores ? JSON.parse(pack.scores as string) : {}, grades: pack.grades ? JSON.parse(pack.grades as string) : {}, - total_weight: packClass.computeTotalWeight(pack), + total_weight: 0, favorites_count: packClass.computeFavouritesCount(pack), total_score: packClass.computeTotalScores(pack), items: pack.itemPacks.map((itemPack) => itemPack.item), diff --git a/server/src/services/pack/getSimilarPacksService.ts b/server/src/services/pack/getSimilarPacksService.ts index 62b559b06..86bb69696 100644 --- a/server/src/services/pack/getSimilarPacksService.ts +++ b/server/src/services/pack/getSimilarPacksService.ts @@ -1,24 +1,24 @@ -import { DbClient } from '../../db/client'; -import { Pack } from '../../drizzle/methods/pack'; +import { type Pack } from 'src/db/schema'; +import { Pack as PackRepository } from '../../drizzle/methods/pack'; import { VectorClient } from '../../vector/client'; -import { pack as PacksTable } from '../../db/schema'; -import { inArray } from 'drizzle-orm'; -import { PackAndItemVisibilityFilter } from '@packrat/shared-types'; + +interface SimilarPack extends Pack { + similarityScore: number; +} /** * Retrieves packs that are similar to the provided pack. * * @param {string} id - ID of the pack for which to retrive similar packs for. * @param {string} limit - Max number of similar packs to return. - * @return {Promise} An array of similar packs. + * @return {Promise} An array of similar packs. */ export async function getSimilarPacksService( id: string, limit: number = 5, - visibility: PackAndItemVisibilityFilter, -) { - const packClass = new Pack(); - const pack = await packClass.findPack({ +): Promise { + const packRepository = new PackRepository(); + const pack = await packRepository.findPack({ id, }); @@ -28,37 +28,28 @@ export async function getSimilarPacksService( const { result: { matches }, - } = await VectorClient.instance.search( - pack.name, - 'packs', - limit, - visibility == PackAndItemVisibilityFilter.ALL - ? undefined - : { - isPublic: visibility == PackAndItemVisibilityFilter.PUBLIC, - }, - ); + } = await VectorClient.instance.search(pack.name, 'packs', limit, { + isPublic: true, + }); // passing empty array to the db query below throws if (!matches.length) { return []; } - const similarPacksResult = await DbClient.instance - .select() - .from(PacksTable) - .where( - inArray( - PacksTable.id, - matches.map((m) => m.id), - ), - ); + const array = []; + for (const m of matches) { + if (m.id == id) continue; // filter current pack's id + array.push(m.id); + } + + const similarPacksResult = await packRepository.findAllInArray(array); // add similarity score to packs result - const similarPacks = matches.map((match) => { + const similarPacks = similarPacksResult.map((similarPack) => { return { - ...similarPacksResult.find((p) => p.id == match.id), - similarityScore: match.score, + ...similarPack, + similarityScore: matches.find((m) => m.id == similarPack.id).score, }; }); diff --git a/server/src/services/trip/addTripService.ts b/server/src/services/trip/addTripService.ts index 884d59408..cece53d6d 100644 --- a/server/src/services/trip/addTripService.ts +++ b/server/src/services/trip/addTripService.ts @@ -1,12 +1,17 @@ +import { calculateTripScore } from 'src/utils/scoreTrip'; import { GeoJson } from '../../drizzle/methods/Geojson'; import { TripGeoJson } from '../../drizzle/methods/TripGeoJson'; import { Trip } from '../../drizzle/methods/trip'; import { validateGeojsonId, validateGeojsonType } from '../../utils/geojson'; +import { GeojsonStorageService } from '../geojsonStorage'; +import { scoreTripService } from './scoreTripService'; -export const addTripService = async (tripData: any) => { +export const addTripService = async ( + tripData: any, + executionCtx: ExecutionContext, +) => { try { const { geoJSON, ...otherTripData } = tripData; - console.log({ tripData }); const tripClass = new Trip(); // Create Trip const newTrip = await tripClass.create({ @@ -14,17 +19,22 @@ export const addTripService = async (tripData: any) => { trails: otherTripData.trails ? JSON.parse(otherTripData.trails) : null, parks: otherTripData.parks ? JSON.parse(otherTripData.parks) : null, }); + await scoreTripService(newTrip.id); const geojsonClass = new GeoJson(); const tripGeoJsonClass = new TripGeoJson(); if (!geoJSON) { throw new Error("Geojson data doesn't exist"); } - const insertedGeoJson = await geojsonClass.create(geoJSON); - await tripGeoJsonClass.create({ - tripId: newTrip.id, - geojsonId: insertedGeoJson.id, - }); + // const insertedGeoJson = await geojsonClass.create(geoJSON); + // await tripGeoJsonClass.create({ + // tripId: newTrip.id, + // geojsonId: insertedGeoJson.id, + // }); + + executionCtx.waitUntil( + GeojsonStorageService.save('trip', JSON.stringify(geoJSON), newTrip.id), + ); return newTrip; } catch (error) { diff --git a/server/src/services/trip/scoreTripService.ts b/server/src/services/trip/scoreTripService.ts new file mode 100644 index 000000000..560d93e9a --- /dev/null +++ b/server/src/services/trip/scoreTripService.ts @@ -0,0 +1,27 @@ +import { calculateTripScore } from 'src/utils/scoreTrip'; +import { Trip } from '../../drizzle/methods/trip'; + +export async function scoreTripService(tripId: string) { + try { + const tripClass = new Trip(); + const trip = await tripClass.findById(tripId); + + if (!trip) { + throw new Error('Pack not found'); + } + const tripScore = calculateTripScore({ + startDate: trip.start_date, + endDate: trip.end_date, + activity: trip.activity, + }); + + const updatedPack = await tripClass.update({ + id: trip.id, + scores: tripScore || null, + }); + + return updatedPack; + } catch (error) { + throw new Error('Unable to score trip: ' + error.message); + } +} diff --git a/server/src/tests/routes/item.spec.ts b/server/src/tests/routes/item.spec.ts index 7b9249bce..ccefc5c97 100644 --- a/server/src/tests/routes/item.spec.ts +++ b/server/src/tests/routes/item.spec.ts @@ -71,6 +71,7 @@ describe('Item routes', () => { unit: 'g', weight: 1, global: true, + ownerId: owner.id, }); }); @@ -123,7 +124,7 @@ describe('Item routes', () => { expect(mockSyncRecord).toHaveBeenCalledWith({ id: itemId, content: 'test', - metadata: { isPublic }, + metadata: { isPublic, ownerId: owner.id }, namespace: 'items', }); }); @@ -149,7 +150,7 @@ describe('Item routes', () => { { id: itemId, content: nameToBeUpdated, - metadata: { isPublic: true }, + metadata: { isPublic: true, ownerId: owner.id }, namespace: 'items', }, true, @@ -195,7 +196,7 @@ describe('Item routes', () => { expect(mockSyncRecord).toHaveBeenCalledWith({ id: itemId, content: 'test 123', - metadata: { isPublic: true }, + metadata: { isPublic: true, ownerId: owner.id }, namespace: 'items', }); }); @@ -234,6 +235,7 @@ describe('Item routes', () => { categoryId: dupCategory, createdAt: dupCreatedAt, global: dupGlobal, + ownerId: dupOwnerId, ...partialDuplicatedItem } = await caller.editGlobalItemAsDuplicate({ ...item, @@ -251,6 +253,7 @@ describe('Item routes', () => { categoryId, createdAt, global, + ownerId, ...partialOriginalItem } = item; @@ -283,12 +286,9 @@ describe('Item routes', () => { id: itemId, limit: 3, }); - expect(mockSearchVector).toHaveBeenCalledWith( - item.name, - 'items', - 3, - undefined, - ); + expect(mockSearchVector).toHaveBeenCalledWith(item.name, 'items', 3, { + isPublic: true, + }); }); it('should return similar items', async () => { diff --git a/server/src/tests/routes/pack.spec.ts b/server/src/tests/routes/pack.spec.ts index dd7474f00..30d201388 100644 --- a/server/src/tests/routes/pack.spec.ts +++ b/server/src/tests/routes/pack.spec.ts @@ -113,7 +113,7 @@ describe('Pack routes', () => { { id: packId, content: nameToBeUpdated, - metadata: { isPublic }, + metadata: { isPublic, ownerId: pack.owner_id }, namespace: 'packs', }, true, @@ -123,18 +123,20 @@ describe('Pack routes', () => { describe('addPack', () => { let createdPackId = null; + let ownerId = null; it('should create a pack', async () => { const { id, ...partialPack } = pack; + ownerId = + partialPack.owner_id === null + ? 'default_owner_id' + : partialPack.owner_id; const input = { ...partialPack, name: 'test 123', is_public: partialPack.is_public === null ? false : partialPack.is_public, - owner_id: - partialPack.owner_id === null - ? 'default_owner_id' - : partialPack.owner_id, + owner_id: ownerId, }; const createdPack = await caller.addPack(input); createdPackId = createdPack.id; @@ -146,7 +148,7 @@ describe('Pack routes', () => { expect(mockSyncRecord).toHaveBeenCalledWith({ id: createdPackId, content: 'test 123', - metadata: { isPublic: true }, + metadata: { isPublic: true, ownerId }, namespace: 'packs', }); }); @@ -181,12 +183,9 @@ describe('Pack routes', () => { id: packId, limit: 3, }); - expect(mockSearchVector).toHaveBeenCalledWith( - pack.name, - 'packs', - 3, - undefined, - ); + expect(mockSearchVector).toHaveBeenCalledWith(pack.name, 'packs', 3, { + isPublic: true, + }); }); it('should return similar packs', async () => { diff --git a/server/src/trpc/context.ts b/server/src/trpc/context.ts index 8292919f9..20cfe13ce 100644 --- a/server/src/trpc/context.ts +++ b/server/src/trpc/context.ts @@ -3,6 +3,8 @@ import { extractTokenAndGetUser } from './utils/auth'; import { DbClient } from '../db/client'; import { VectorClient } from '../vector/client'; import { AiClient } from '../integrations/ai/client'; +import { type R2Bucket } from '@cloudflare/workers-types'; +import { GeojsonStorageService } from 'src/services/geojsonStorage'; let DB: D1Database; @@ -13,9 +15,10 @@ type ContextEnv = Omit; */ export const createContext = (honoContext: Context) => async () => { const { env, req } = honoContext; - const { DB: db, ...restEnv } = env; + const { DB: db, GEOJSON_BUCKET, ...restEnv } = env; DB = db; + GeojsonStorageService.init(GEOJSON_BUCKET); await DbClient.init(honoContext.env.DB); await VectorClient.init({ apiKey: honoContext.env.VECTORIZE_API_KEY, @@ -33,6 +36,7 @@ export const createContext = (honoContext: Context) => async () => { return { env: restEnv as ContextEnv, + geojsonBucket: GEOJSON_BUCKET as R2Bucket, user, executionCtx: honoContext.executionCtx, }; diff --git a/server/src/utils/convertWeight.ts b/server/src/utils/convertWeight.ts index 17c1dd5cf..1676aa8c1 100644 --- a/server/src/utils/convertWeight.ts +++ b/server/src/utils/convertWeight.ts @@ -1,4 +1,5 @@ type WeightUnit = 'g' | 'kg' | 'oz' | 'lb' | 'lbs'; +export const SMALLEST_WEIGHT_UNIT = 'g'; const units: Record = { g: 1, diff --git a/server/src/utils/scoreTrip.ts b/server/src/utils/scoreTrip.ts new file mode 100644 index 000000000..e2bb89f48 --- /dev/null +++ b/server/src/utils/scoreTrip.ts @@ -0,0 +1,33 @@ +import { TripActivity } from '@packrat/validations'; + +export function calculateTripScore(trip: { + startDate: string; + endDate: string; + activity: string; +}): { totalScore: number } { + const { startDate, endDate, activity } = trip; + const start = new Date(startDate); + const end = new Date(endDate); + + const tripDuration = + (end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24); + + // Define scoring weights for each activity + const activityScores: Record = { + [TripActivity.TRIP]: 5, + [TripActivity.RUNNING]: 8, + [TripActivity.BIKING]: 9, + [TripActivity.CAMPING]: 7, + [TripActivity.FISHING]: 6, + [TripActivity.TREKKING]: 9, + [TripActivity.ROCK_CLIMBING]: 10, + [TripActivity.HIKING]: 8, + [TripActivity.SWIMMING]: 7, + }; + + const activityScore = activityScores[activity] || 5; + + const tripScore = tripDuration * activityScore; + + return { totalScore: Math.round(tripScore) }; +} diff --git a/server/src/vector/client.ts b/server/src/vector/client.ts index ac9828276..ec093c446 100644 --- a/server/src/vector/client.ts +++ b/server/src/vector/client.ts @@ -11,6 +11,10 @@ interface VectorsQueryResponse { messages: Array<{ code: number; message: string }>; } +interface Metadata { + [key: string]: string | number | boolean; +} + class VectorClient { private static _instance: VectorClient | null = null; private readonly apiKey: string; @@ -56,7 +60,7 @@ class VectorClient { id: string, values: number[], namespace: string, - metadata: { isPublic: boolean }, + metadata: Metadata, ) { const url = `${this.VECTORIZE_INDEX_URL}/insert`; const ndjsonBody = `${JSON.stringify({ id, values, namespace, metadata })}\n`; @@ -84,7 +88,7 @@ class VectorClient { id: string, values: number[], namespace: string, - metadata: { isPublic: boolean }, + metadata: Metadata, ) { const ndjsonBody = `${JSON.stringify({ id, values, namespace, metadata })}\n`; @@ -149,7 +153,7 @@ class VectorClient { content: string, namespace: string, topK: number = 3, - filter?: Record, + filter?: Record, ): Promise { const vector = await AiClient.getEmbedding(content); const url = `${this.VECTORIZE_INDEX_URL}/query`; @@ -187,7 +191,7 @@ class VectorClient { id: string; content: string; namespace: string; - metadata: { isPublic: boolean }; + metadata: Metadata; }, upsert: boolean = false, ) { diff --git a/server/wrangler.toml.example b/server/wrangler.toml.example index 04b0de600..56277582e 100644 --- a/server/wrangler.toml.example +++ b/server/wrangler.toml.example @@ -11,6 +11,10 @@ binding = "DB" database_name = "preview" database_id = "" +[[env.preview.r2_buckets]] +binding = 'GEOJSON_BUCKET' +bucket_name = 'packrat-geojson-bucket-preview' + [env.preview.ai] binding = "AI" @@ -26,11 +30,12 @@ BUCKET_NAME="packrat-scrapy-bucket" BUCKET_REGION="auto" BUCKET_SERVICE="s3" BUCKET_SESSION_TOKEN="" +CLOUDFLARE_ACCOUNT_ID="" GOOGLE_CLIENT_ID="" NODE_ENV="preview" -VECTOR_INDEX="vector-index-preview" OSM_URI="" STMP_EMAIL="" +VECTOR_INDEX="vector-index-preview" WEATHER_URL="https://api.openweathermap.org/data/2.5/forecast" @@ -40,6 +45,10 @@ WEATHER_URL="https://api.openweathermap.org/data/2.5/forecast" binding = "DB" database_name = "production" +[[env.production.r2_buckets]] +binding = 'GEOJSON_BUCKET' +bucket_name = 'packrat-geojson-bucket-production' + [env.production.ai] binding = "AI" @@ -55,9 +64,10 @@ BUCKET_NAME="packrat-scrapy-bucket" BUCKET_REGION="auto" BUCKET_SERVICE="s3" BUCKET_SESSION_TOKEN="" +CLOUDFLARE_ACCOUNT_ID="" GOOGLE_CLIENT_ID="" NODE_ENV="production" -VECTOR_INDEX="vector-index-production" OSM_URI="" STMP_EMAIL="" +VECTOR_INDEX="vector-index-production" WEATHER_URL="https://api.openweathermap.org/data/2.5/forecast" diff --git a/yarn.lock b/yarn.lock index 94b22c04a..7c27fa61d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6,14 +6,14 @@ __metadata: cacheKey: 10 "@0no-co/graphql.web@npm:^1.0.5": - version: 1.0.7 - resolution: "@0no-co/graphql.web@npm:1.0.7" + version: 1.0.8 + resolution: "@0no-co/graphql.web@npm:1.0.8" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 peerDependenciesMeta: graphql: optional: true - checksum: 10/8be5d80ba57df759a11f905ba7ac4bc6e9bc75034804bb679db4fa4eed3396f97b0191421031ba2d94af259fa7d55042a152e3f94294eba62ae81591d41bad87 + checksum: 10/d6faf7b37475ccc1666aea93f386fd8af1a705651248d11d6439d70d2b78c1eb746f82a0c0d639ea239c93c7e17fc1fdf9aa9ff66e6b2d863b0392e6233ee9b0 languageName: node linkType: hard @@ -147,15 +147,15 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.20.0, @babel/generator@npm:^7.20.5, @babel/generator@npm:^7.22.7, @babel/generator@npm:^7.23.3, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.4, @babel/generator@npm:^7.7.2": - version: 7.25.4 - resolution: "@babel/generator@npm:7.25.4" +"@babel/generator@npm:^7.20.0, @babel/generator@npm:^7.20.5, @babel/generator@npm:^7.22.7, @babel/generator@npm:^7.23.3, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.6, @babel/generator@npm:^7.7.2": + version: 7.25.6 + resolution: "@babel/generator@npm:7.25.6" dependencies: - "@babel/types": "npm:^7.25.4" + "@babel/types": "npm:^7.25.6" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^2.5.1" - checksum: 10/35b05e1f230649469c64971e034b5101079c37d23f8cc658323f1209e39daf58d29ec4ce6de1d6d31dacddd39ffbf6b7e9a2b124d4f6b360a5f7046ae10fbaf4 + checksum: 10/541e4fbb6ea7806f44232d70f25bf09dee9a57fe43d559e375536870ca5261ebb4647fec3af40dcbb3325ea2a49aff040e12a4e6f88609eaa88f10c4e27e31f8 languageName: node linkType: hard @@ -374,12 +374,12 @@ __metadata: linkType: hard "@babel/helpers@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helpers@npm:7.25.0" + version: 7.25.6 + resolution: "@babel/helpers@npm:7.25.6" dependencies: "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10/4fcb8167eba9853e30b8b235b81b923ef7b707396b0e23d7a4fa3e811729506755576cb9ec736e8b92cf19e5a1ec61e83d182904d8e6a0953803c6bebc2e1592 + "@babel/types": "npm:^7.25.6" + checksum: 10/43abc8d017b754619aa189d05e2bdb54aaf44f03ec0439e89b3e7c180d538adb01ce9014a1689f632a7e8b17655c72bfac0a92268476eec708b41d3ba0a65296 languageName: node linkType: hard @@ -395,14 +395,14 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.1.6, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.0, @babel/parser@npm:^7.20.15, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.3, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/parser@npm:7.25.4" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.1.6, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.0, @babel/parser@npm:^7.20.15, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.3, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/parser@npm:7.25.6" dependencies: - "@babel/types": "npm:^7.25.4" + "@babel/types": "npm:^7.25.6" bin: parser: ./bin/babel-parser.js - checksum: 10/343b8a76c43549e370fe96f4f6d564382a6cdff60e9c3b8a594c51e4cefd58ec9945e82e8c4dfbf15ac865a04e4b29806531440760748e28568e6aec21bc9cb5 + checksum: 10/830aab72116aa14eb8d61bfa8f9d69fc8f3a43d909ce993cb4350ae14d3af1a2f740a54410a22d821c48a253263643dfecbc094f9608e6a70ce9ff3c0bbfe91a languageName: node linkType: hard @@ -715,24 +715,24 @@ __metadata: linkType: hard "@babel/plugin-syntax-import-assertions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.7" + version: 7.25.6 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.25.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/bd065cd73ae3dbe69e6f9167aa605da3df77d69bbad2ede95e4aa9e7af7744d5bc1838b928c77338ca62df7691a7adf6e608279be50c18e4b3c70cf77e3013d7 + checksum: 10/36a756a695e2f18d406bfdfd6823023e3810d13fdb27ec2a5cb90ae95326edb1e744e3451a8a31bf6bd91646236643c5e8024ecf71102cc93309ec80592ebb17 languageName: node linkType: hard "@babel/plugin-syntax-import-attributes@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.7" + version: 7.25.6 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.25.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/22fc50bd85a491bb8d22065f330a41f60d66f2f2d7a1deb73e80c8a4b5d7a42a092a03f8da18800650eca0fc14585167cc4e5c9fab351f0d390d1592347162ae + checksum: 10/5afeba6b8979e61e8e37af905514891920eab103a08b36216f5518474328f9fae5204357bfadf6ce4cc80cb96848cdb7b8989f164ae93bd063c86f3f586728c0 languageName: node linkType: hard @@ -857,7 +857,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.21.4, @babel/plugin-syntax-typescript@npm:^7.24.7, @babel/plugin-syntax-typescript@npm:^7.7.2": +"@babel/plugin-syntax-typescript@npm:^7.21.4, @babel/plugin-syntax-typescript@npm:^7.24.7, @babel/plugin-syntax-typescript@npm:^7.25.4, @babel/plugin-syntax-typescript@npm:^7.7.2": version: 7.25.4 resolution: "@babel/plugin-syntax-typescript@npm:7.25.4" dependencies: @@ -1766,21 +1766,12 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": - version: 7.25.0 - resolution: "@babel/runtime@npm:7.25.0" +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.25.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": + version: 7.25.6 + resolution: "@babel/runtime@npm:7.25.6" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10/6870e9e0e9125075b3aeba49a266f442b10820bfc693019eb6c1785c5a0edbe927e98b8238662cdcdba17842107c040386c3b69f39a0a3b217f9d00ffe685b27 - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.5.5": - version: 7.25.4 - resolution: "@babel/runtime@npm:7.25.4" - dependencies: - regenerator-runtime: "npm:^0.14.0" - checksum: 10/70d2a420c24a3289ea6c4addaf3a1c4186bc3d001c92445faa3cd7601d7d2fbdb32c63b3a26b9771e20ff2f511fa76b726bf256f823cdb95bc37b8eadbd02f70 + checksum: 10/0c4134734deb20e1005ffb9165bf342e1074576621b246d8e5e41cc7cb315a885b7d98950fbf5c63619a2990a56ae82f444d35fe8c4691a0b70c2fe5673667dc languageName: node linkType: hard @@ -1795,29 +1786,29 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.20.0, @babel/traverse@npm:^7.23.3, @babel/traverse@npm:^7.23.7, @babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/traverse@npm:7.25.4" +"@babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.20.0, @babel/traverse@npm:^7.23.3, @babel/traverse@npm:^7.23.7, @babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.25.4, @babel/traverse@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/traverse@npm:7.25.6" dependencies: "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.4" - "@babel/parser": "npm:^7.25.4" + "@babel/generator": "npm:^7.25.6" + "@babel/parser": "npm:^7.25.6" "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.4" + "@babel/types": "npm:^7.25.6" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10/a85c16047ab8e454e2e758c75c31994cec328bd6d8b4b22e915fa7393a03b3ab96d1218f43dc7ef77c957cc488dc38100bdf504d08a80a131e89b2e49cfa2be5 + checksum: 10/de75a918299bc27a44ec973e3f2fa8c7902bbd67bd5d39a0be656f3c1127f33ebc79c12696fbc8170a0b0e1072a966d4a2126578d7ea2e241b0aeb5d16edc738 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.1.6, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.23.3, @babel/types@npm:^7.23.6, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.4, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": - version: 7.25.4 - resolution: "@babel/types@npm:7.25.4" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.1.6, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.23.3, @babel/types@npm:^7.23.6, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": + version: 7.25.6 + resolution: "@babel/types@npm:7.25.6" dependencies: "@babel/helper-string-parser": "npm:^7.24.8" "@babel/helper-validator-identifier": "npm:^7.24.7" to-fast-properties: "npm:^2.0.0" - checksum: 10/d4a1194612d0a2a6ce9a0be325578b43d74e5f5278c67409468ba0a924341f0ad349ef0245ee8a36da3766efe5cc59cd6bb52547674150f97d8dc4c8cfa5d6b8 + checksum: 10/7b54665e1b51f525fe0f451efdd9fe7a4a6dfba3fd4956c3530bc77336b66ffe3d78c093796ed044119b5d213176af7cf326f317a2057c538d575c6cefcb3562 languageName: node linkType: hard @@ -2031,15 +2022,14 @@ __metadata: languageName: node linkType: hard -"@changesets/apply-release-plan@npm:^7.0.4": - version: 7.0.4 - resolution: "@changesets/apply-release-plan@npm:7.0.4" +"@changesets/apply-release-plan@npm:^7.0.5": + version: 7.0.5 + resolution: "@changesets/apply-release-plan@npm:7.0.5" dependencies: - "@babel/runtime": "npm:^7.20.1" - "@changesets/config": "npm:^3.0.2" + "@changesets/config": "npm:^3.0.3" "@changesets/get-version-range-type": "npm:^0.4.0" - "@changesets/git": "npm:^3.0.0" - "@changesets/should-skip-package": "npm:^0.1.0" + "@changesets/git": "npm:^3.0.1" + "@changesets/should-skip-package": "npm:^0.1.1" "@changesets/types": "npm:^6.0.0" "@manypkg/get-packages": "npm:^1.1.3" detect-indent: "npm:^6.0.0" @@ -2049,22 +2039,21 @@ __metadata: prettier: "npm:^2.7.1" resolve-from: "npm:^5.0.0" semver: "npm:^7.5.3" - checksum: 10/793ea2bbe52994120a74b71428abe8c7c406e41b8e6be764069e26338cf21b860bb9609e5144a68e990d7c9115a95b9f2da1aa3631aab4034a5caf306ced41e8 + checksum: 10/4a983e3afb6c3dcd885820eba96189c9e77173ccae94e291cf2eb2264bd9000b4264d1c5295d62f490731beead30dcb6830fcc69e401d3eb80bdd425fb6413c4 languageName: node linkType: hard -"@changesets/assemble-release-plan@npm:^6.0.3": - version: 6.0.3 - resolution: "@changesets/assemble-release-plan@npm:6.0.3" +"@changesets/assemble-release-plan@npm:^6.0.4": + version: 6.0.4 + resolution: "@changesets/assemble-release-plan@npm:6.0.4" dependencies: - "@babel/runtime": "npm:^7.20.1" "@changesets/errors": "npm:^0.2.0" - "@changesets/get-dependents-graph": "npm:^2.1.1" - "@changesets/should-skip-package": "npm:^0.1.0" + "@changesets/get-dependents-graph": "npm:^2.1.2" + "@changesets/should-skip-package": "npm:^0.1.1" "@changesets/types": "npm:^6.0.0" "@manypkg/get-packages": "npm:^1.1.3" semver: "npm:^7.5.3" - checksum: 10/dca064e03369ad797227c4640f05e89971f3bf9fe05cc66e3db2c43f10910be307b2a0929f0b655321f58e98611392789ab13a542a4858c97e5ebf84db24fe88 + checksum: 10/280f31625bf39763136814a7cf2c0eefa3099c9048a6cdb8ac346fc3c420b111f62186ac436f83fe005ed8384afb3f7e2e88651511c4d9270fcea79ad66bdde7 languageName: node linkType: hard @@ -2078,59 +2067,57 @@ __metadata: linkType: hard "@changesets/cli@npm:^2.27.7": - version: 2.27.7 - resolution: "@changesets/cli@npm:2.27.7" + version: 2.27.8 + resolution: "@changesets/cli@npm:2.27.8" dependencies: - "@babel/runtime": "npm:^7.20.1" - "@changesets/apply-release-plan": "npm:^7.0.4" - "@changesets/assemble-release-plan": "npm:^6.0.3" + "@changesets/apply-release-plan": "npm:^7.0.5" + "@changesets/assemble-release-plan": "npm:^6.0.4" "@changesets/changelog-git": "npm:^0.2.0" - "@changesets/config": "npm:^3.0.2" + "@changesets/config": "npm:^3.0.3" "@changesets/errors": "npm:^0.2.0" - "@changesets/get-dependents-graph": "npm:^2.1.1" - "@changesets/get-release-plan": "npm:^4.0.3" - "@changesets/git": "npm:^3.0.0" - "@changesets/logger": "npm:^0.1.0" - "@changesets/pre": "npm:^2.0.0" - "@changesets/read": "npm:^0.6.0" - "@changesets/should-skip-package": "npm:^0.1.0" + "@changesets/get-dependents-graph": "npm:^2.1.2" + "@changesets/get-release-plan": "npm:^4.0.4" + "@changesets/git": "npm:^3.0.1" + "@changesets/logger": "npm:^0.1.1" + "@changesets/pre": "npm:^2.0.1" + "@changesets/read": "npm:^0.6.1" + "@changesets/should-skip-package": "npm:^0.1.1" "@changesets/types": "npm:^6.0.0" - "@changesets/write": "npm:^0.3.1" + "@changesets/write": "npm:^0.3.2" "@manypkg/get-packages": "npm:^1.1.3" "@types/semver": "npm:^7.5.0" ansi-colors: "npm:^4.1.3" - chalk: "npm:^2.1.0" ci-info: "npm:^3.7.0" enquirer: "npm:^2.3.0" external-editor: "npm:^3.1.0" fs-extra: "npm:^7.0.1" - human-id: "npm:^1.0.2" mri: "npm:^1.2.0" outdent: "npm:^0.5.0" p-limit: "npm:^2.2.0" - preferred-pm: "npm:^3.0.0" + package-manager-detector: "npm:^0.2.0" + picocolors: "npm:^1.1.0" resolve-from: "npm:^5.0.0" semver: "npm:^7.5.3" spawndamnit: "npm:^2.0.0" term-size: "npm:^2.1.0" bin: changeset: bin.js - checksum: 10/17998972706aad3974dfc425d523a2444462aa126bb330f653eb596d3f162eba6df0355b4f489540e20cbd6302f5794f55b5453dc07efa82c13935cd650b05f3 + checksum: 10/e5caf7efc1c4036b26aca9fd11cdcdc23f8ba96cce0a41e7951f09f461608c7c8a27f0f455a93bdf2945408e80aa1bc845140863c556133b54c975b57201fbe7 languageName: node linkType: hard -"@changesets/config@npm:^3.0.2": - version: 3.0.2 - resolution: "@changesets/config@npm:3.0.2" +"@changesets/config@npm:^3.0.3": + version: 3.0.3 + resolution: "@changesets/config@npm:3.0.3" dependencies: "@changesets/errors": "npm:^0.2.0" - "@changesets/get-dependents-graph": "npm:^2.1.1" - "@changesets/logger": "npm:^0.1.0" + "@changesets/get-dependents-graph": "npm:^2.1.2" + "@changesets/logger": "npm:^0.1.1" "@changesets/types": "npm:^6.0.0" "@manypkg/get-packages": "npm:^1.1.3" fs-extra: "npm:^7.0.1" micromatch: "npm:^4.0.2" - checksum: 10/f341b3f13b36540ee79c0bcd0ee19740c0e898b9dcb76daf8fc6906183e4154eaa72a28a254fbbc14d76307c20b36588146433dffa0e9557cc2551228507a27d + checksum: 10/4c5bc9f4ea3c8f086a2cf1d83d3b949560ccbc988107d53d4515186373d0c25112d531b2f661fd913a85c8b0b4173a2c4ddae528f70fbd5efacc6e5f652896c5 languageName: node linkType: hard @@ -2143,31 +2130,29 @@ __metadata: languageName: node linkType: hard -"@changesets/get-dependents-graph@npm:^2.1.1": - version: 2.1.1 - resolution: "@changesets/get-dependents-graph@npm:2.1.1" +"@changesets/get-dependents-graph@npm:^2.1.2": + version: 2.1.2 + resolution: "@changesets/get-dependents-graph@npm:2.1.2" dependencies: "@changesets/types": "npm:^6.0.0" "@manypkg/get-packages": "npm:^1.1.3" - chalk: "npm:^2.1.0" - fs-extra: "npm:^7.0.1" + picocolors: "npm:^1.1.0" semver: "npm:^7.5.3" - checksum: 10/abe99b47f640e48fa4cdcb79d11ce8ede21a6a0a0a9ee3cd180a5b7c9775df99f44718f4417ba7d66d9469e58a2929986d1bf1e1009fa6e44d3a174a06559eca + checksum: 10/36d9877b0b071183b253d894e0dbef56f764fe2ff592064489d4f122c419ab97f0d023c9e078849d0f48b4129f5018c7c81cb380b02d975db5e0768ab29226c1 languageName: node linkType: hard -"@changesets/get-release-plan@npm:^4.0.3": - version: 4.0.3 - resolution: "@changesets/get-release-plan@npm:4.0.3" +"@changesets/get-release-plan@npm:^4.0.4": + version: 4.0.4 + resolution: "@changesets/get-release-plan@npm:4.0.4" dependencies: - "@babel/runtime": "npm:^7.20.1" - "@changesets/assemble-release-plan": "npm:^6.0.3" - "@changesets/config": "npm:^3.0.2" - "@changesets/pre": "npm:^2.0.0" - "@changesets/read": "npm:^0.6.0" + "@changesets/assemble-release-plan": "npm:^6.0.4" + "@changesets/config": "npm:^3.0.3" + "@changesets/pre": "npm:^2.0.1" + "@changesets/read": "npm:^0.6.1" "@changesets/types": "npm:^6.0.0" "@manypkg/get-packages": "npm:^1.1.3" - checksum: 10/b85c3e873b224c771159b62512109d4fd73022cba4148d0d00614d69cc6d11dcbdb07c39d28f5e078f3221dadc0d09b93bb785dad72db9e589139a18e22767e2 + checksum: 10/d371f557556d5d8a4cb35f403304581bc8c236cd3fd9d848246382052fe37ec34d741b107f7f1bd6b76f47cf74e66377bf1d3919db61f64647dce34d365818a7 languageName: node linkType: hard @@ -2178,27 +2163,25 @@ __metadata: languageName: node linkType: hard -"@changesets/git@npm:^3.0.0": - version: 3.0.0 - resolution: "@changesets/git@npm:3.0.0" +"@changesets/git@npm:^3.0.1": + version: 3.0.1 + resolution: "@changesets/git@npm:3.0.1" dependencies: - "@babel/runtime": "npm:^7.20.1" "@changesets/errors": "npm:^0.2.0" - "@changesets/types": "npm:^6.0.0" "@manypkg/get-packages": "npm:^1.1.3" is-subdir: "npm:^1.1.1" micromatch: "npm:^4.0.2" spawndamnit: "npm:^2.0.0" - checksum: 10/483beda9523d0d353ef51b6557a0a7e18fcb8bbd7b32ded0460c893acd6ffcae7dd680c5162e26892fc08b899ca8040e655c6acc391cff088262d475747d8f76 + checksum: 10/19831196f5e3138dcbb037fd19d641fe1e428e3e4efac3cb25888e3cf8f3f269fab2b1ed270b173a0104b5d1a76d3599232836c75fbc60f4104f8f30141ed9ed languageName: node linkType: hard -"@changesets/logger@npm:^0.1.0": - version: 0.1.0 - resolution: "@changesets/logger@npm:0.1.0" +"@changesets/logger@npm:^0.1.1": + version: 0.1.1 + resolution: "@changesets/logger@npm:0.1.1" dependencies: - chalk: "npm:^2.1.0" - checksum: 10/88a54c3a757e3478892a4e455377e7d3f0df88a616476c70e4bce18d01930bb84d4ac5b8f39779f92e8a582a5527435c823b6d8fafdf7d8b124a3f3efec46959 + picocolors: "npm:^1.1.0" + checksum: 10/bbfc050ddd0afdaa95bb790e81894b7548a2def059deeaed1685e22c10ede245ec2264df42bb2200cc0c8bd040e427bcd68a7afcca2633dc263a28e923d7c175 languageName: node linkType: hard @@ -2212,43 +2195,40 @@ __metadata: languageName: node linkType: hard -"@changesets/pre@npm:^2.0.0": - version: 2.0.0 - resolution: "@changesets/pre@npm:2.0.0" +"@changesets/pre@npm:^2.0.1": + version: 2.0.1 + resolution: "@changesets/pre@npm:2.0.1" dependencies: - "@babel/runtime": "npm:^7.20.1" "@changesets/errors": "npm:^0.2.0" "@changesets/types": "npm:^6.0.0" "@manypkg/get-packages": "npm:^1.1.3" fs-extra: "npm:^7.0.1" - checksum: 10/210158d93efbb6592047340132c58beb7133d22d6bd8c668c63dc2764997591718849b77b25083383670887993c33969da0c6ca2d378ac7635db216177de993e + checksum: 10/e26ca45a1accc4c79890220acf4c85ff716bc09a8e534c91f08bf7d5272408bd76f54ddf6a01765a1aab2517b7447285ae0a9787a6f2135011ad37bcf3f70e48 languageName: node linkType: hard -"@changesets/read@npm:^0.6.0": - version: 0.6.0 - resolution: "@changesets/read@npm:0.6.0" +"@changesets/read@npm:^0.6.1": + version: 0.6.1 + resolution: "@changesets/read@npm:0.6.1" dependencies: - "@babel/runtime": "npm:^7.20.1" - "@changesets/git": "npm:^3.0.0" - "@changesets/logger": "npm:^0.1.0" + "@changesets/git": "npm:^3.0.1" + "@changesets/logger": "npm:^0.1.1" "@changesets/parse": "npm:^0.4.0" "@changesets/types": "npm:^6.0.0" - chalk: "npm:^2.1.0" fs-extra: "npm:^7.0.1" p-filter: "npm:^2.1.0" - checksum: 10/665b52499c1d9e6e837a9fc0b5fc7bade5fd10e4901557d36dfc0fa01f98884f6567acd99e1e44e072febcd7bf8025391b2d5f9f62aceb3d1842ff7ae1416ade + picocolors: "npm:^1.1.0" + checksum: 10/022e4162e3491144549d9e1e1c2dda92ba7b3bbe9ea5552359b75e52d93e6ad0750f9e5215681a18850178e46fe493bb024b84026ac10ede5c6cddd54aa4c9d0 languageName: node linkType: hard -"@changesets/should-skip-package@npm:^0.1.0": - version: 0.1.0 - resolution: "@changesets/should-skip-package@npm:0.1.0" +"@changesets/should-skip-package@npm:^0.1.1": + version: 0.1.1 + resolution: "@changesets/should-skip-package@npm:0.1.1" dependencies: - "@babel/runtime": "npm:^7.20.1" "@changesets/types": "npm:^6.0.0" "@manypkg/get-packages": "npm:^1.1.3" - checksum: 10/3c966feae085a41d4ce10a46a1b525f980cec59951f7cf23ea805866b370de5c75fdd45af326e1a5ef502fa4846f821d9df15550c2b606b96e99ed4b967f01c0 + checksum: 10/d187ef22495deb63e678d0ff65e8627701e2b52c25bd59dde10ce8646be8d605c0ed0a6af020dd825b137c2fc748fdc6cef52e7774bad4c7a4f404bf182a85cf languageName: node linkType: hard @@ -2266,16 +2246,15 @@ __metadata: languageName: node linkType: hard -"@changesets/write@npm:^0.3.1": - version: 0.3.1 - resolution: "@changesets/write@npm:0.3.1" +"@changesets/write@npm:^0.3.2": + version: 0.3.2 + resolution: "@changesets/write@npm:0.3.2" dependencies: - "@babel/runtime": "npm:^7.20.1" "@changesets/types": "npm:^6.0.0" fs-extra: "npm:^7.0.1" human-id: "npm:^1.0.2" prettier: "npm:^2.7.1" - checksum: 10/13b9284e8cb9c55456b62fe4b8e27ab615e46b0214e1a62194afd4ecb33f5e6617478e01b031209d16348e01c7bce5a37cb18afe688c81d98f3657d7c40cc2c9 + checksum: 10/c16b0a731fa43ae0028fd1f956c7b080030c42ff763f8dac74da8b178a4ea65632831c30550b784286277bdc75a3c44dda46aad8db97f43bb1eb4d61922152aa languageName: node linkType: hard @@ -2359,9 +2338,9 @@ __metadata: languageName: node linkType: hard -"@cloudflare/workerd-darwin-64@npm:1.20240821.1": - version: 1.20240821.1 - resolution: "@cloudflare/workerd-darwin-64@npm:1.20240821.1" +"@cloudflare/workerd-darwin-64@npm:1.20240909.0": + version: 1.20240909.0 + resolution: "@cloudflare/workerd-darwin-64@npm:1.20240909.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -2373,9 +2352,9 @@ __metadata: languageName: node linkType: hard -"@cloudflare/workerd-darwin-arm64@npm:1.20240821.1": - version: 1.20240821.1 - resolution: "@cloudflare/workerd-darwin-arm64@npm:1.20240821.1" +"@cloudflare/workerd-darwin-arm64@npm:1.20240909.0": + version: 1.20240909.0 + resolution: "@cloudflare/workerd-darwin-arm64@npm:1.20240909.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -2387,9 +2366,9 @@ __metadata: languageName: node linkType: hard -"@cloudflare/workerd-linux-64@npm:1.20240821.1": - version: 1.20240821.1 - resolution: "@cloudflare/workerd-linux-64@npm:1.20240821.1" +"@cloudflare/workerd-linux-64@npm:1.20240909.0": + version: 1.20240909.0 + resolution: "@cloudflare/workerd-linux-64@npm:1.20240909.0" conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -2401,9 +2380,9 @@ __metadata: languageName: node linkType: hard -"@cloudflare/workerd-linux-arm64@npm:1.20240821.1": - version: 1.20240821.1 - resolution: "@cloudflare/workerd-linux-arm64@npm:1.20240821.1" +"@cloudflare/workerd-linux-arm64@npm:1.20240909.0": + version: 1.20240909.0 + resolution: "@cloudflare/workerd-linux-arm64@npm:1.20240909.0" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -2415,24 +2394,20 @@ __metadata: languageName: node linkType: hard -"@cloudflare/workerd-windows-64@npm:1.20240821.1": - version: 1.20240821.1 - resolution: "@cloudflare/workerd-windows-64@npm:1.20240821.1" +"@cloudflare/workerd-windows-64@npm:1.20240909.0": + version: 1.20240909.0 + resolution: "@cloudflare/workerd-windows-64@npm:1.20240909.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@cloudflare/workers-shared@npm:0.3.0": - version: 0.3.0 - resolution: "@cloudflare/workers-shared@npm:0.3.0" - checksum: 10/1466e03bfea2b13306432b3a109fb1119e71dcc4d03921af7ccf724badbfca299c5dce7f80a854c085de016021328e79eef9185b63a140f2e9482cd92e68e19e - languageName: node - linkType: hard - -"@cloudflare/workers-shared@npm:0.4.1": - version: 0.4.1 - resolution: "@cloudflare/workers-shared@npm:0.4.1" - checksum: 10/6f6356ccd6633052f4713ae0c074a34608bcda8406cce3a52bded9775800c023c75a443406765adfb63a5c96fca08673531a82977395537932e6e24d823f9b70 +"@cloudflare/workers-shared@npm:0.5.3": + version: 0.5.3 + resolution: "@cloudflare/workers-shared@npm:0.5.3" + dependencies: + mime: "npm:^3.0.0" + zod: "npm:^3.22.3" + checksum: 10/043b0aa7ef901953baab52303feb85c4ac4d75865d1a44f6a09aa1c94ab656395c1bd006ddaaee37e70e177dcbaeb71addbb459a58e390c0f7cd0532aab84eca languageName: node linkType: hard @@ -3607,9 +3582,9 @@ __metadata: linkType: hard "@eslint-community/regexpp@npm:^4.11.0, @eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.11.0 - resolution: "@eslint-community/regexpp@npm:4.11.0" - checksum: 10/f053f371c281ba173fe6ee16dbc4fe544c84870d58035ccca08dba7f6ce1830d895ce3237a0db89ba37616524775dca82f1c502066b58e2d5712d7f87f5ba17c + version: 4.11.1 + resolution: "@eslint-community/regexpp@npm:4.11.1" + checksum: 10/934b6d3588c7f16b18d41efec4fdb89616c440b7e3256b8cb92cfd31ae12908600f2b986d6c1e61a84cbc10256b1dd3448cd1eec79904bd67ac365d0f1aba2e2 languageName: node linkType: hard @@ -3630,10 +3605,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.57.0": - version: 8.57.0 - resolution: "@eslint/js@npm:8.57.0" - checksum: 10/3c501ce8a997cf6cbbaf4ed358af5492875e3550c19b9621413b82caa9ae5382c584b0efa79835639e6e0ddaa568caf3499318e5bdab68643ef4199dce5eb0a0 +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 10/7562b21be10c2adbfa4aa5bb2eccec2cb9ac649a3569560742202c8d1cb6c931ce634937a2f0f551e078403a1c1285d6c2c0aa345dafc986149665cd69fe8b59 languageName: node linkType: hard @@ -4076,11 +4051,11 @@ __metadata: linkType: hard "@expo/vector-icons@npm:^14.0.0": - version: 14.0.2 - resolution: "@expo/vector-icons@npm:14.0.2" + version: 14.0.3 + resolution: "@expo/vector-icons@npm:14.0.3" dependencies: prop-types: "npm:^15.8.1" - checksum: 10/b50dab5d32907cf6b176db6b9d3c7284559ab95a1dfe0a5af530f8b27fdb5ab3c655d798ac46f78b7650ce6cf0fea682e8f6be1cc868a534f6d0debc79062c67 + checksum: 10/0e21393d8c5d4778e9c4b02122698601da5aea0b9e213ecc7b5d353c13b37efee958de1ca7ca216707dc2855fbf536077bc3ef755ced6b9cf39615fab3eb28a1 languageName: node linkType: hard @@ -4662,33 +4637,33 @@ __metadata: linkType: hard "@floating-ui/core@npm:^1.0.0, @floating-ui/core@npm:^1.6.0": - version: 1.6.7 - resolution: "@floating-ui/core@npm:1.6.7" + version: 1.6.8 + resolution: "@floating-ui/core@npm:1.6.8" dependencies: - "@floating-ui/utils": "npm:^0.2.7" - checksum: 10/e15fbb49830bef39c4ce2b2d00febc0140939c1f86f0441e38e43cbe83456fd05be674812bf747bce425318d8730e3c51c291104115f8637ce7bce2f00446743 + "@floating-ui/utils": "npm:^0.2.8" + checksum: 10/87d52989c3d2cc80373bc153b7a40814db3206ce7d0b2a2bdfb63e2ff39ffb8b999b1b0ccf28e548000ebf863bf16e2bed45eab4c4d287a5dbe974ef22368d82 languageName: node linkType: hard "@floating-ui/dom@npm:^1.0.0": - version: 1.6.10 - resolution: "@floating-ui/dom@npm:1.6.10" + version: 1.6.11 + resolution: "@floating-ui/dom@npm:1.6.11" dependencies: "@floating-ui/core": "npm:^1.6.0" - "@floating-ui/utils": "npm:^0.2.7" - checksum: 10/c100f5ecb37fc1bea4e551977eae3992f8eba351e6b7f2642e2f84a4abd269406d5a46a14505bc583caf25ddee900a667829244c4eecf1cf60f08c1dabdf3ee9 + "@floating-ui/utils": "npm:^0.2.8" + checksum: 10/8579392ad10151474869e7640af169b0d7fc2df48d4da27b6dcb1a57202329147ed986b2972787d4b8cd550c87897271b2d9c4633c2ec7d0b3ad37ce1da636f1 languageName: node linkType: hard -"@floating-ui/react-dom@npm:^2.0.0, @floating-ui/react-dom@npm:^2.0.6, @floating-ui/react-dom@npm:^2.1.1": - version: 2.1.1 - resolution: "@floating-ui/react-dom@npm:2.1.1" +"@floating-ui/react-dom@npm:^2.0.0, @floating-ui/react-dom@npm:^2.0.6, @floating-ui/react-dom@npm:^2.1.2": + version: 2.1.2 + resolution: "@floating-ui/react-dom@npm:2.1.2" dependencies: "@floating-ui/dom": "npm:^1.0.0" peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 10/cafabfb5dd0b25547863520b3bcf6faee7f087d0c3187a8779910a6838d496bf494f237bf1fe883bbfae1a7fcc399611ae52377b696065d8118bd7c1b9c0d253 + checksum: 10/2a67dc8499674e42ff32c7246bded185bb0fdd492150067caf9568569557ac4756a67787421d8604b0f241e5337de10762aee270d9aeef106d078a0ff13596c4 languageName: node linkType: hard @@ -4705,23 +4680,23 @@ __metadata: linkType: hard "@floating-ui/react@npm:^0.26.6": - version: 0.26.22 - resolution: "@floating-ui/react@npm:0.26.22" + version: 0.26.24 + resolution: "@floating-ui/react@npm:0.26.24" dependencies: - "@floating-ui/react-dom": "npm:^2.1.1" - "@floating-ui/utils": "npm:^0.2.7" + "@floating-ui/react-dom": "npm:^2.1.2" + "@floating-ui/utils": "npm:^0.2.8" tabbable: "npm:^6.0.0" peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 10/53f21ce765445733be4db2efd58c424ad1db0f369d4e20346733ff60f684574e7c435b9cea3298bf09a02484d2ebb52a4097bedda5d021430b3f08439fe91bc1 + checksum: 10/903ffbee2c6726d117086e2a83f43d6ad339970758ce7979fd16cc7cf8dc0f5b869bd72c2c8ee1bcd6c63b190bb0960effd4d403e63685fb5aeed6b185041b08 languageName: node linkType: hard -"@floating-ui/utils@npm:^0.2.7": - version: 0.2.7 - resolution: "@floating-ui/utils@npm:0.2.7" - checksum: 10/56b1bb3f73f6ec9aabf9b1fd3dc584e0f2384d319c1a6119050eab102ae6ca8b9b0eed711c2f235ffe035188cbe9727bf36e8dcb54c8bd32176737e4be47efa8 +"@floating-ui/utils@npm:^0.2.8": + version: 0.2.8 + resolution: "@floating-ui/utils@npm:0.2.8" + checksum: 10/3e3ea3b2de06badc4baebdf358b3dbd77ccd9474a257a6ef237277895943db2acbae756477ec64de65a2a1436d94aea3107129a1feeef6370675bf2b161c1abc languageName: node linkType: hard @@ -4896,14 +4871,14 @@ __metadata: linkType: hard "@graphql-tools/merge@npm:^9.0.6": - version: 9.0.6 - resolution: "@graphql-tools/merge@npm:9.0.6" + version: 9.0.7 + resolution: "@graphql-tools/merge@npm:9.0.7" dependencies: "@graphql-tools/utils": "npm:^10.5.4" tslib: "npm:^2.4.0" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 10/84ee4ca383a2b3310becb7a5306713070571ba83583fc5ebf92374531b8e1ca278fb89e32ed3a4720e5d7d01b7d4a7ccd606786b799dfc3e3f21a20b6adaec2f + checksum: 10/afe9b11f2d1e43dd3fce8e510aa20846137acfb6cb6d9362e5cfe954f2daaa5c169b77c3013a21f3263c690dee2f3b3e235e305e49c3cc398bdb166ddf2d082b languageName: node linkType: hard @@ -5041,9 +5016,11 @@ __metadata: linkType: hard "@hono/node-server@npm:^1.11.0, @hono/node-server@npm:^1.9.0": - version: 1.12.1 - resolution: "@hono/node-server@npm:1.12.1" - checksum: 10/b641df038e83b2694c2a43afc2e66195df38cb955c97cabf4947be4970da20aabb75b8a8595c31953ac49e2f18381797dcc9b0f9ffa5865cd20e830c0ffc3be0 + version: 1.13.0 + resolution: "@hono/node-server@npm:1.13.0" + peerDependencies: + hono: ^4 + checksum: 10/6e1b44fa156e51c9d97c6f3dfafbb14cb6fc20ed169ff5819d79fd067f764080dcd1357417f023fdb33f22a705c23c4ef2f41fa51b4144467783c1767d749e52 languageName: node linkType: hard @@ -5076,14 +5053,14 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.14": - version: 0.11.14 - resolution: "@humanwhocodes/config-array@npm:0.11.14" +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.2" + "@humanwhocodes/object-schema": "npm:^2.0.3" debug: "npm:^4.3.1" minimatch: "npm:^3.0.5" - checksum: 10/3ffb24ecdfab64014a230e127118d50a1a04d11080cbb748bc21629393d100850496456bbcb4e8c438957fe0934430d731042f1264d6a167b62d32fc2863580a + checksum: 10/524df31e61a85392a2433bf5d03164e03da26c03d009f27852e7dcfdafbc4a23f17f021dacf88e0a7a9fe04ca032017945d19b57a16e2676d9114c22a53a9d11 languageName: node linkType: hard @@ -5094,7 +5071,7 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.2": +"@humanwhocodes/object-schema@npm:^2.0.3": version: 2.0.3 resolution: "@humanwhocodes/object-schema@npm:2.0.3" checksum: 10/05bb99ed06c16408a45a833f03a732f59bf6184795d4efadd33238ff8699190a8c871ad1121241bb6501589a9598dc83bf25b99dcbcf41e155cdf36e35e937a3 @@ -5799,7 +5776,7 @@ __metadata: languageName: node linkType: hard -"@mapbox/jsonlint-lines-primitives@npm:^2.0.2": +"@mapbox/jsonlint-lines-primitives@npm:^2.0.2, @mapbox/jsonlint-lines-primitives@npm:~2.0.2": version: 2.0.2 resolution: "@mapbox/jsonlint-lines-primitives@npm:2.0.2" checksum: 10/6d8e64d34d912ebf29fead0d1917c8d8ad86e96f69b6100a9764af8cba391609474cdce7f7e4a2d579ccea58a142d1454257b795403179e9133a09af13101068 @@ -5815,6 +5792,13 @@ __metadata: languageName: node linkType: hard +"@mapbox/mapbox-gl-supported@npm:^3.0.0": + version: 3.0.0 + resolution: "@mapbox/mapbox-gl-supported@npm:3.0.0" + checksum: 10/e129beda3aa7f26cdb5d6a31ef4bfa95ca557307465d4084906542d2d86bf75e809741b234022993bf19a747d3a78e1cc3dca5de882a763f1df66c571b95b7b5 + languageName: node + linkType: hard + "@mapbox/node-pre-gyp@npm:^1.0.5": version: 1.0.11 resolution: "@mapbox/node-pre-gyp@npm:1.0.11" @@ -5848,6 +5832,13 @@ __metadata: languageName: node linkType: hard +"@mapbox/tiny-sdf@npm:^2.0.6": + version: 2.0.6 + resolution: "@mapbox/tiny-sdf@npm:2.0.6" + checksum: 10/61da9df5fea197137bb76c07cbf12336382d0e6fa84426558b05bffc53f27f6a6465cd09e6af7b50a7b0b7283b7b68f0dcc7f7dd05ef4d88658dc325163f422c + languageName: node + linkType: hard + "@mapbox/unitbezier@npm:^0.0.0": version: 0.0.0 resolution: "@mapbox/unitbezier@npm:0.0.0" @@ -5855,6 +5846,13 @@ __metadata: languageName: node linkType: hard +"@mapbox/unitbezier@npm:^0.0.1": + version: 0.0.1 + resolution: "@mapbox/unitbezier@npm:0.0.1" + checksum: 10/bf104c85dbff37bf47d3217d9457a3abbf23714f78fefadea64e56bdc7c538491b626166809ef28db134f09baccd6ca3df6988a6422df90d8d0c9a23b0686043 + languageName: node + linkType: hard + "@mapbox/vector-tile@npm:^1.3.1": version: 1.3.1 resolution: "@mapbox/vector-tile@npm:1.3.1" @@ -5871,12 +5869,30 @@ __metadata: languageName: node linkType: hard +"@maplibre/maplibre-gl-style-spec@npm:^19.2.1": + version: 19.3.3 + resolution: "@maplibre/maplibre-gl-style-spec@npm:19.3.3" + dependencies: + "@mapbox/jsonlint-lines-primitives": "npm:~2.0.2" + "@mapbox/unitbezier": "npm:^0.0.1" + json-stringify-pretty-compact: "npm:^3.0.0" + minimist: "npm:^1.2.8" + rw: "npm:^1.3.3" + sort-object: "npm:^3.0.3" + bin: + gl-style-format: dist/gl-style-format.mjs + gl-style-migrate: dist/gl-style-migrate.mjs + gl-style-validate: dist/gl-style-validate.mjs + checksum: 10/d320de3ce49c355b5cbed5a3b0a2eedb6d1117b5c530eccbfc03a669b46ab09cb14bd51a006f0a3947c2dbe03df83b88183cab681c19fea6e3466cb159d5aa62 + languageName: node + linkType: hard + "@mongodb-js/saslprep@npm:^1.1.0": - version: 1.1.8 - resolution: "@mongodb-js/saslprep@npm:1.1.8" + version: 1.1.9 + resolution: "@mongodb-js/saslprep@npm:1.1.9" dependencies: sparse-bitfield: "npm:^3.0.3" - checksum: 10/ff3ed794370aab2d941b6d28bd5fb523782221e2e996db56604278b13829ee10d0b6875b1d6e02023277121c71ca53aabdee8f72cf23cf50741cd7ec694a4868 + checksum: 10/6a0d5e9068635fff59815de387d71be0e3b9d683f1d299876b2760ac18bbf0a1d4b26eff6b1ab89ff8802c20ffb15c047ba675b2cc306a51077a013286c2694a languageName: node linkType: hard @@ -5987,6 +6003,175 @@ __metadata: languageName: node linkType: hard +"@napi-rs/nice-android-arm-eabi@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-android-arm-eabi@npm:1.0.1" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@napi-rs/nice-android-arm64@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-android-arm64@npm:1.0.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@napi-rs/nice-darwin-arm64@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-darwin-arm64@npm:1.0.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@napi-rs/nice-darwin-x64@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-darwin-x64@npm:1.0.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@napi-rs/nice-freebsd-x64@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-freebsd-x64@npm:1.0.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@napi-rs/nice-linux-arm-gnueabihf@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-arm-gnueabihf@npm:1.0.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@napi-rs/nice-linux-arm64-gnu@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-arm64-gnu@npm:1.0.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/nice-linux-arm64-musl@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-arm64-musl@npm:1.0.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@napi-rs/nice-linux-ppc64-gnu@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-ppc64-gnu@npm:1.0.1" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/nice-linux-riscv64-gnu@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-riscv64-gnu@npm:1.0.1" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/nice-linux-s390x-gnu@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-s390x-gnu@npm:1.0.1" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/nice-linux-x64-gnu@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-x64-gnu@npm:1.0.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/nice-linux-x64-musl@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-linux-x64-musl@npm:1.0.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@napi-rs/nice-win32-arm64-msvc@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-win32-arm64-msvc@npm:1.0.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@napi-rs/nice-win32-ia32-msvc@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-win32-ia32-msvc@npm:1.0.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@napi-rs/nice-win32-x64-msvc@npm:1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice-win32-x64-msvc@npm:1.0.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@napi-rs/nice@npm:^1.0.1": + version: 1.0.1 + resolution: "@napi-rs/nice@npm:1.0.1" + dependencies: + "@napi-rs/nice-android-arm-eabi": "npm:1.0.1" + "@napi-rs/nice-android-arm64": "npm:1.0.1" + "@napi-rs/nice-darwin-arm64": "npm:1.0.1" + "@napi-rs/nice-darwin-x64": "npm:1.0.1" + "@napi-rs/nice-freebsd-x64": "npm:1.0.1" + "@napi-rs/nice-linux-arm-gnueabihf": "npm:1.0.1" + "@napi-rs/nice-linux-arm64-gnu": "npm:1.0.1" + "@napi-rs/nice-linux-arm64-musl": "npm:1.0.1" + "@napi-rs/nice-linux-ppc64-gnu": "npm:1.0.1" + "@napi-rs/nice-linux-riscv64-gnu": "npm:1.0.1" + "@napi-rs/nice-linux-s390x-gnu": "npm:1.0.1" + "@napi-rs/nice-linux-x64-gnu": "npm:1.0.1" + "@napi-rs/nice-linux-x64-musl": "npm:1.0.1" + "@napi-rs/nice-win32-arm64-msvc": "npm:1.0.1" + "@napi-rs/nice-win32-ia32-msvc": "npm:1.0.1" + "@napi-rs/nice-win32-x64-msvc": "npm:1.0.1" + dependenciesMeta: + "@napi-rs/nice-android-arm-eabi": + optional: true + "@napi-rs/nice-android-arm64": + optional: true + "@napi-rs/nice-darwin-arm64": + optional: true + "@napi-rs/nice-darwin-x64": + optional: true + "@napi-rs/nice-freebsd-x64": + optional: true + "@napi-rs/nice-linux-arm-gnueabihf": + optional: true + "@napi-rs/nice-linux-arm64-gnu": + optional: true + "@napi-rs/nice-linux-arm64-musl": + optional: true + "@napi-rs/nice-linux-ppc64-gnu": + optional: true + "@napi-rs/nice-linux-riscv64-gnu": + optional: true + "@napi-rs/nice-linux-s390x-gnu": + optional: true + "@napi-rs/nice-linux-x64-gnu": + optional: true + "@napi-rs/nice-linux-x64-musl": + optional: true + "@napi-rs/nice-win32-arm64-msvc": + optional: true + "@napi-rs/nice-win32-ia32-msvc": + optional: true + "@napi-rs/nice-win32-x64-msvc": + optional: true + checksum: 10/ae265aa365b325830115c1cda49b05ea05e6f1163944a1485c0643c9552380cd32a2aaf12b326f353538ca6244222963eb2e9767a4713c9432eadecd027f90ea + languageName: node + linkType: hard + "@neon-rs/load@npm:^0.0.4": version: 0.0.4 resolution: "@neon-rs/load@npm:0.0.4" @@ -5994,54 +6179,54 @@ __metadata: languageName: node linkType: hard -"@nestjs/axios@npm:3.0.2": - version: 3.0.2 - resolution: "@nestjs/axios@npm:3.0.2" +"@nestjs/axios@npm:3.0.3": + version: 3.0.3 + resolution: "@nestjs/axios@npm:3.0.3" peerDependencies: "@nestjs/common": ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 axios: ^1.3.1 rxjs: ^6.0.0 || ^7.0.0 - checksum: 10/00866a630596ab6aad4f27dd91aceb600b9db605a5307d359f0898177b020a77764782d8b102a25ed227a0f2d5f0679c5b68967261aec71d445be3f3f028ec84 + checksum: 10/a62c45d2a532df2f0e5a100750d29134e5fcd6d359cae7559ccd97775a27620dc0ec650addfda6f99160f7f52b061754cdeb61de85060cb4526de2c01c31a80b languageName: node linkType: hard -"@nestjs/common@npm:10.3.0": - version: 10.3.0 - resolution: "@nestjs/common@npm:10.3.0" +"@nestjs/common@npm:10.4.3": + version: 10.4.3 + resolution: "@nestjs/common@npm:10.4.3" dependencies: iterare: "npm:1.2.1" - tslib: "npm:2.6.2" + tslib: "npm:2.7.0" uid: "npm:2.0.2" peerDependencies: class-transformer: "*" class-validator: "*" - reflect-metadata: ^0.1.12 + reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: class-transformer: optional: true class-validator: optional: true - checksum: 10/bedb3437e6517df423526409b5a70cc33c52b557d17bd74ca12ab09a37ad5ff4ecdece44db625e3d702e21d308bc49d5419afe1752181af6aafdee3a27c9d394 + checksum: 10/2c109cb14fabff218bfcd8ba663acdf246eb8e47a77e0fb3cd81e8dfb01c94127637e635be3b93310238149999288c2c490c53d15c90e41d89cb106cdfee0245 languageName: node linkType: hard -"@nestjs/core@npm:10.3.0": - version: 10.3.0 - resolution: "@nestjs/core@npm:10.3.0" +"@nestjs/core@npm:10.4.3": + version: 10.4.3 + resolution: "@nestjs/core@npm:10.4.3" dependencies: "@nuxtjs/opencollective": "npm:0.3.2" fast-safe-stringify: "npm:2.1.1" iterare: "npm:1.2.1" - path-to-regexp: "npm:3.2.0" - tslib: "npm:2.6.2" + path-to-regexp: "npm:3.3.0" + tslib: "npm:2.7.0" uid: "npm:2.0.2" peerDependencies: "@nestjs/common": ^10.0.0 "@nestjs/microservices": ^10.0.0 "@nestjs/platform-express": ^10.0.0 "@nestjs/websockets": ^10.0.0 - reflect-metadata: ^0.1.12 + reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: "@nestjs/microservices": @@ -6050,84 +6235,84 @@ __metadata: optional: true "@nestjs/websockets": optional: true - checksum: 10/4bdeed0f203e55b4a1edf0031df55b6bf059c1f9faf6f86ac70e08a6e279c2d494df858ea251cbef915aa0df27b6534d1baace2847a3be7853bf07c1ad3a196f + checksum: 10/a29ce659ad15dca9812ac57871f914008a5ca6740c796ef7ad40b29df2177d7e67a15009bdc5e68ebeafb7c61eb4ea869a72cdbd98b561c414fce0139c7c010e languageName: node linkType: hard -"@next/env@npm:13.5.6": - version: 13.5.6 - resolution: "@next/env@npm:13.5.6" - checksum: 10/c81bd6052db366407da701e4e431becbc80ef36a88bec7883b0266cdfeb45a7da959d37c38e1a816006cd2da287e5ff5b928bdb71025e3d4aa59e07dea3edd59 +"@next/env@npm:13.5.7": + version: 13.5.7 + resolution: "@next/env@npm:13.5.7" + checksum: 10/d6465a2a85fa2f829d9c888b8a22be5649ad0f4bdd260e0a0061d7e88c7add33b702a6afead2d6cc6fde746b6132eb591e3baac7ece13e460c168517bb06205f languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:13.5.6": - version: 13.5.6 - resolution: "@next/swc-darwin-arm64@npm:13.5.6" +"@next/swc-darwin-arm64@npm:13.5.7": + version: 13.5.7 + resolution: "@next/swc-darwin-arm64@npm:13.5.7" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:13.5.6": - version: 13.5.6 - resolution: "@next/swc-darwin-x64@npm:13.5.6" +"@next/swc-darwin-x64@npm:13.5.7": + version: 13.5.7 + resolution: "@next/swc-darwin-x64@npm:13.5.7" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:13.5.6": - version: 13.5.6 - resolution: "@next/swc-linux-arm64-gnu@npm:13.5.6" +"@next/swc-linux-arm64-gnu@npm:13.5.7": + version: 13.5.7 + resolution: "@next/swc-linux-arm64-gnu@npm:13.5.7" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:13.5.6": - version: 13.5.6 - resolution: "@next/swc-linux-arm64-musl@npm:13.5.6" +"@next/swc-linux-arm64-musl@npm:13.5.7": + version: 13.5.7 + resolution: "@next/swc-linux-arm64-musl@npm:13.5.7" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:13.5.6": - version: 13.5.6 - resolution: "@next/swc-linux-x64-gnu@npm:13.5.6" +"@next/swc-linux-x64-gnu@npm:13.5.7": + version: 13.5.7 + resolution: "@next/swc-linux-x64-gnu@npm:13.5.7" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:13.5.6": - version: 13.5.6 - resolution: "@next/swc-linux-x64-musl@npm:13.5.6" +"@next/swc-linux-x64-musl@npm:13.5.7": + version: 13.5.7 + resolution: "@next/swc-linux-x64-musl@npm:13.5.7" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:13.5.6": - version: 13.5.6 - resolution: "@next/swc-win32-arm64-msvc@npm:13.5.6" +"@next/swc-win32-arm64-msvc@npm:13.5.7": + version: 13.5.7 + resolution: "@next/swc-win32-arm64-msvc@npm:13.5.7" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-ia32-msvc@npm:13.5.6": - version: 13.5.6 - resolution: "@next/swc-win32-ia32-msvc@npm:13.5.6" +"@next/swc-win32-ia32-msvc@npm:13.5.7": + version: 13.5.7 + resolution: "@next/swc-win32-ia32-msvc@npm:13.5.7" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:13.5.6": - version: 13.5.6 - resolution: "@next/swc-win32-x64-msvc@npm:13.5.6" +"@next/swc-win32-x64-msvc@npm:13.5.7": + version: 13.5.7 + resolution: "@next/swc-win32-x64-msvc@npm:13.5.7" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@noble/hashes@npm:^1.1.5": - version: 1.4.0 - resolution: "@noble/hashes@npm:1.4.0" - checksum: 10/e156e65794c473794c52fa9d06baf1eb20903d0d96719530f523cc4450f6c721a957c544796e6efd0197b2296e7cd70efeb312f861465e17940a3e3c7e0febc6 + version: 1.5.0 + resolution: "@noble/hashes@npm:1.5.0" + checksum: 10/da7fc7af52af7afcf59810a7eea6155075464ff462ffda2572dc6d57d53e2669b1ea2ec774e814f6273f1697e567f28d36823776c9bf7068cba2a2855140f26e languageName: node linkType: hard @@ -6214,12 +6399,12 @@ __metadata: linkType: hard "@openapitools/openapi-generator-cli@npm:^2.7.0": - version: 2.13.5 - resolution: "@openapitools/openapi-generator-cli@npm:2.13.5" + version: 2.13.7 + resolution: "@openapitools/openapi-generator-cli@npm:2.13.7" dependencies: - "@nestjs/axios": "npm:3.0.2" - "@nestjs/common": "npm:10.3.0" - "@nestjs/core": "npm:10.3.0" + "@nestjs/axios": "npm:3.0.3" + "@nestjs/common": "npm:10.4.3" + "@nestjs/core": "npm:10.4.3" "@nuxtjs/opencollective": "npm:0.3.2" axios: "npm:1.7.4" chalk: "npm:4.1.2" @@ -6237,7 +6422,7 @@ __metadata: tslib: "npm:2.6.2" bin: openapi-generator-cli: main.js - checksum: 10/e51145a0b5e36b30e64d1324710d0ef24eebc1dc8c29af5e41fee6c7435d16961be8bad1daae4e6bdea6e684ad0e4dcf55ef3c6f59fd46b4a7f9e736c36e224b + checksum: 10/8837e6bc58ab8e6c3b4c7fab5f7123e729d4740fd37181570aa9e06f9ccf2aa3e177697b2b59bef1a9df08d33849e027352f9589dfd33f8ff6e1849001b347ec languageName: node linkType: hard @@ -6278,7 +6463,7 @@ __metadata: languageName: unknown linkType: soft -"@packrat/map@npm:*, @packrat/map@workspace:packages/map": +"@packrat/map@workspace:packages/map": version: 0.0.0-use.local resolution: "@packrat/map@workspace:packages/map" dependencies: @@ -6312,14 +6497,6 @@ __metadata: languageName: unknown linkType: soft -"@packrat/shared-types@npm:*, @packrat/shared-types@workspace:packages/shared-types": - version: 0.0.0-use.local - resolution: "@packrat/shared-types@workspace:packages/shared-types" - dependencies: - typescript: "npm:^5.5.3" - languageName: unknown - linkType: soft - "@packrat/ui@npm:*, @packrat/ui@workspace:packages/ui": version: 0.0.0-use.local resolution: "@packrat/ui@workspace:packages/ui" @@ -6378,7 +6555,6 @@ __metadata: version: 0.0.0-use.local resolution: "@packrat/validations@workspace:packages/validations" dependencies: - "@packrat/shared-types": "npm:*" "@types/express": "npm:^4.17.17" "@types/node": "npm:^20.14.2" express: "npm:^4.19.2" @@ -6411,13 +6587,13 @@ __metadata: linkType: hard "@playwright/test@npm:^1.44.1": - version: 1.46.1 - resolution: "@playwright/test@npm:1.46.1" + version: 1.47.1 + resolution: "@playwright/test@npm:1.47.1" dependencies: - playwright: "npm:1.46.1" + playwright: "npm:1.47.1" bin: playwright: cli.js - checksum: 10/09e2c28574402f14e2d6f6843022c5778382dc7f703bae931dd531fc0fc1b725a862d3b52932bd6912cb13cbaed54822af33eb3d70134d93b0f1c10ec3fb0756 + checksum: 10/d26656451cbd4cbb865c6acb25958a25171b3714907e1595301f21655b1be8f521dbd2197eecfa5b34325626c94b8ab535b8571478880633679e63ebfb6775b9 languageName: node linkType: hard @@ -6449,47 +6625,47 @@ __metadata: linkType: hard "@polka/url@npm:^1.0.0-next.24": - version: 1.0.0-next.25 - resolution: "@polka/url@npm:1.0.0-next.25" - checksum: 10/4ab1d7a37163139c0e7bfc9d1e3f6a2a0db91a78b9f0a21f571d6aec2cdaeaacced744d47886c117aa7579aa5694b303fe3e0bd1922bb9cb3ce6bf7c2dc09801 + version: 1.0.0-next.28 + resolution: "@polka/url@npm:1.0.0-next.28" + checksum: 10/7402aaf1de781d0eb0870d50cbcd394f949aee11b38a267a5c3b4e3cfee117e920693e6e93ce24c87ae2d477a59634f39d9edde8e86471cae756839b07c79af7 languageName: node linkType: hard "@prisma/client@npm:^5.7.0": - version: 5.18.0 - resolution: "@prisma/client@npm:5.18.0" + version: 5.19.1 + resolution: "@prisma/client@npm:5.19.1" peerDependencies: prisma: "*" peerDependenciesMeta: prisma: optional: true - checksum: 10/32a8156700f7d2acaf51b8f9343c37cb9fe7be504c95ae3b3dd529fc6636dd51e46b9029c77b7b143217ef1a6944ed9ab571719d20353f1ee19661be0a3562c6 + checksum: 10/c164f60cee8f884fc7dfec747d80d5a2cc96a5dc1d98ca34522e410921fc515854c9b37a17bf7d17e60a8d29ba36796e50703c22821b0b5ccd232db9f407e7bd languageName: node linkType: hard -"@prisma/debug@npm:5.18.0": - version: 5.18.0 - resolution: "@prisma/debug@npm:5.18.0" - checksum: 10/39160cbc581c2f2300ea95ee2ba1ed56e298e8426e25817ddecca789aadc1f416b12d6e19081468881eba40749b1956e589df8d68a0a83a2ac5a0a7b454605f4 +"@prisma/debug@npm:5.19.1": + version: 5.19.1 + resolution: "@prisma/debug@npm:5.19.1" + checksum: 10/1b7334041205fd4b32e486cee52603a4cc485657a4649a0e0e3b4d5bb3eae1473abcd6d47428180cc2b372ebae2978ac81a08ed70fe46666d056953cc0afddc7 languageName: node linkType: hard -"@prisma/engines-version@npm:5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169": - version: 5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169 - resolution: "@prisma/engines-version@npm:5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169" - checksum: 10/170c0e56a6938a61bba41dc28d408b1fedbf798f17f4dbcbd7d3767087e53583e5af75a49adfc3bf0d4013c6964639bb316bdbb65169c52585a5441e684183ac +"@prisma/engines-version@npm:5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3": + version: 5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3 + resolution: "@prisma/engines-version@npm:5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3" + checksum: 10/9e8286eb42b559763057dad42d385f55341a7bfb0035999a3fea1161913feac2de4ba5ee08db417dacb2be01ae05d61174a8db98f92b6ff4c2ed613a956006db languageName: node linkType: hard -"@prisma/engines@npm:5.18.0": - version: 5.18.0 - resolution: "@prisma/engines@npm:5.18.0" +"@prisma/engines@npm:5.19.1": + version: 5.19.1 + resolution: "@prisma/engines@npm:5.19.1" dependencies: - "@prisma/debug": "npm:5.18.0" - "@prisma/engines-version": "npm:5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169" - "@prisma/fetch-engine": "npm:5.18.0" - "@prisma/get-platform": "npm:5.18.0" - checksum: 10/ccfcebb6592b430916d7ecad12b183b06d4b375725565a3788c604ce02679e5d5f309b689aa6bbde037b80721119452cf5d5d40375c0bfb9a517b5ba035f202e + "@prisma/debug": "npm:5.19.1" + "@prisma/engines-version": "npm:5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3" + "@prisma/fetch-engine": "npm:5.19.1" + "@prisma/get-platform": "npm:5.19.1" + checksum: 10/6083db48531ceb50a036647014cbfa7302c6b188132748eb59ea040961320485d5a6925b4dbe145313eaee2d392a4458e2fb1f157ad7f6aa59ee20f3c663aa65 languageName: node linkType: hard @@ -6502,23 +6678,23 @@ __metadata: languageName: node linkType: hard -"@prisma/fetch-engine@npm:5.18.0": - version: 5.18.0 - resolution: "@prisma/fetch-engine@npm:5.18.0" +"@prisma/fetch-engine@npm:5.19.1": + version: 5.19.1 + resolution: "@prisma/fetch-engine@npm:5.19.1" dependencies: - "@prisma/debug": "npm:5.18.0" - "@prisma/engines-version": "npm:5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169" - "@prisma/get-platform": "npm:5.18.0" - checksum: 10/21c33be20d9f2cf87695721164087f1b5a25da9a5383b1674133158d1d006eeef74d34fd0efe69b9636393aea137014ae37608a5dd4f840d9def223e38fd0ebe + "@prisma/debug": "npm:5.19.1" + "@prisma/engines-version": "npm:5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3" + "@prisma/get-platform": "npm:5.19.1" + checksum: 10/fbfaad6e04e832aa7a4aa5ebb1c8835ebeecdf12c640c5def0ef80823cc1dc80bf7292d61d1497c36a36bb91da1802f40a776f1cb6f8c390ede33d80c8cfc1ff languageName: node linkType: hard -"@prisma/get-platform@npm:5.18.0": - version: 5.18.0 - resolution: "@prisma/get-platform@npm:5.18.0" +"@prisma/get-platform@npm:5.19.1": + version: 5.19.1 + resolution: "@prisma/get-platform@npm:5.19.1" dependencies: - "@prisma/debug": "npm:5.18.0" - checksum: 10/a5eee045a84b28c97edb54e27339fcb9b22725bb8f90e3816e18c149aef85707690568073a1108adea4d1d0f7062111d209ac2b3feeab8132059cff9c3e9a2a0 + "@prisma/debug": "npm:5.19.1" + checksum: 10/ae0cdc61b337e2855aa8f0e162c0101b3dcb00e148341a80edf5261d211df5bcb68bdd95314518b2793d2574c8f9e26fd38517aedf92b4e4f042b4ad96853766 languageName: node linkType: hard @@ -7667,15 +7843,15 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-clean@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-clean@npm:14.0.0" +"@react-native-community/cli-clean@npm:14.1.0": + version: 14.1.0 + resolution: "@react-native-community/cli-clean@npm:14.1.0" dependencies: - "@react-native-community/cli-tools": "npm:14.0.0" + "@react-native-community/cli-tools": "npm:14.1.0" chalk: "npm:^4.1.2" execa: "npm:^5.0.0" fast-glob: "npm:^3.3.2" - checksum: 10/b92fc7dea5921f9874a726bab6f4ce3ab5623b083900991bf63097b38891d253cb440919e88e854cb550992b048aaaf4d50812a6d066d61af87f6a0b27a28b74 + checksum: 10/56e3db6f908fa9c3c91fe4fb067d596c91c1035e83c3526ee41a10fa83726ad1944345650d1d9836ff4de50ae06152eae8f4340afa8b3c56522cb42ea0e468ff languageName: node linkType: hard @@ -7693,17 +7869,17 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-config@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-config@npm:14.0.0" +"@react-native-community/cli-config@npm:14.1.0": + version: 14.1.0 + resolution: "@react-native-community/cli-config@npm:14.1.0" dependencies: - "@react-native-community/cli-tools": "npm:14.0.0" + "@react-native-community/cli-tools": "npm:14.1.0" chalk: "npm:^4.1.2" cosmiconfig: "npm:^9.0.0" deepmerge: "npm:^4.3.0" fast-glob: "npm:^3.3.2" joi: "npm:^17.2.1" - checksum: 10/2dfc24b8b771ebff9b622eb320908ed6f568eb21dee268bf8f9da97f45a74001543783a9db5083195162443118ff7418033b60bc6593956b6a78643c5bb5f8f4 + checksum: 10/2f73d96324a813ddc9eb0a96eba26e80afa58d53eb1ab36067e9519818c91eb9255220f1b09a407c95f83f785b9a995700944f0dd3b44a49d3e50cdb76574948 languageName: node linkType: hard @@ -7716,21 +7892,12 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-debugger-ui@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-debugger-ui@npm:14.0.0" - dependencies: - serve-static: "npm:^1.13.1" - checksum: 10/485b2de5e615e27e58ef8f84acf60b18259b3326d7688449392147ec876d970166f20f91ce7dd8718c9e002739b42694589f3271a2117bee98992cfded568754 - languageName: node - linkType: hard - -"@react-native-community/cli-debugger-ui@npm:14.0.0-alpha.11": - version: 14.0.0-alpha.11 - resolution: "@react-native-community/cli-debugger-ui@npm:14.0.0-alpha.11" +"@react-native-community/cli-debugger-ui@npm:14.1.0": + version: 14.1.0 + resolution: "@react-native-community/cli-debugger-ui@npm:14.1.0" dependencies: serve-static: "npm:^1.13.1" - checksum: 10/5b837674aa9993a89bde1ee23e406c11cd0d8b19916ae7621b1ef0880bb3222ecfa222f272c9046c210276af06a6dfdf8b0b9abd2ca5e6bc4223ca4f79b9c2fe + checksum: 10/272f7bfacff55f6b17293960380e2826f01c7d02f9be684eade4c3ad275fb08dbd5bd6ea5abb9da2f76cbdc9b9d3e7f0737ac6cb86b8bfd9d333f1908882b2b0 languageName: node linkType: hard @@ -7758,15 +7925,15 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-doctor@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-doctor@npm:14.0.0" +"@react-native-community/cli-doctor@npm:14.1.0": + version: 14.1.0 + resolution: "@react-native-community/cli-doctor@npm:14.1.0" dependencies: - "@react-native-community/cli-config": "npm:14.0.0" - "@react-native-community/cli-platform-android": "npm:14.0.0" - "@react-native-community/cli-platform-apple": "npm:14.0.0" - "@react-native-community/cli-platform-ios": "npm:14.0.0" - "@react-native-community/cli-tools": "npm:14.0.0" + "@react-native-community/cli-config": "npm:14.1.0" + "@react-native-community/cli-platform-android": "npm:14.1.0" + "@react-native-community/cli-platform-apple": "npm:14.1.0" + "@react-native-community/cli-platform-ios": "npm:14.1.0" + "@react-native-community/cli-tools": "npm:14.1.0" chalk: "npm:^4.1.2" command-exists: "npm:^1.2.8" deepmerge: "npm:^4.3.0" @@ -7778,7 +7945,7 @@ __metadata: strip-ansi: "npm:^5.2.0" wcwidth: "npm:^1.0.1" yaml: "npm:^2.2.1" - checksum: 10/cdad0e5da75e93b08b0fc3109c603fb00f3aa187406f57fa336ac74ad55aba8bc3479f375c0e417d4787cc406db94fde9c3cf8d0602745925cb6e1df31223aa0 + checksum: 10/351588779928775799160e7fd942b1b99336235c882b89909559550a83775f05f4f5abde5bb67538bd92a9709ee69cd73478c384e2197558d3561b40b8cdd73b languageName: node linkType: hard @@ -7808,31 +7975,31 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-platform-android@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-platform-android@npm:14.0.0" +"@react-native-community/cli-platform-android@npm:14.1.0": + version: 14.1.0 + resolution: "@react-native-community/cli-platform-android@npm:14.1.0" dependencies: - "@react-native-community/cli-tools": "npm:14.0.0" + "@react-native-community/cli-tools": "npm:14.1.0" chalk: "npm:^4.1.2" execa: "npm:^5.0.0" fast-glob: "npm:^3.3.2" - fast-xml-parser: "npm:^4.2.4" + fast-xml-parser: "npm:^4.4.1" logkitty: "npm:^0.7.1" - checksum: 10/f8ec2e4a02689a1e151f4ce9f7ccbca4b9f9fd564159efa91ee72678668aeccebf636d39c7a10a5232553a96f00e48a796e50bd1cccaedc7ff08e9a1201e05e9 + checksum: 10/76df3dc834e573ea9b209578af488bfeae2731d5182367055e5d961ebcb15c674c6e7bf79c8362a43a011a271a0a496f9acc0a11e882ca689d3c1fb1d834ead7 languageName: node linkType: hard -"@react-native-community/cli-platform-apple@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-platform-apple@npm:14.0.0" +"@react-native-community/cli-platform-apple@npm:14.1.0": + version: 14.1.0 + resolution: "@react-native-community/cli-platform-apple@npm:14.1.0" dependencies: - "@react-native-community/cli-tools": "npm:14.0.0" + "@react-native-community/cli-tools": "npm:14.1.0" chalk: "npm:^4.1.2" execa: "npm:^5.0.0" fast-glob: "npm:^3.3.2" - fast-xml-parser: "npm:^4.2.4" + fast-xml-parser: "npm:^4.4.1" ora: "npm:^5.4.1" - checksum: 10/b90d8a84ad03a36c26adb7f28a4e0fab4315eec76c0d66ef9685f044e09082070370922efcc881a8a2d12c0b0640204446745aefb00928b44ef5ba68ab742c01 + checksum: 10/10917abc15faedf2309749cc05bf512d7ce47ff7dfdb270f62327571f15ab0b8f54b30dcdd9b1e53fffac8b9921577a2618f9ac9912193af744f4917f0464f1b languageName: node linkType: hard @@ -7850,12 +8017,12 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-platform-ios@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-platform-ios@npm:14.0.0" +"@react-native-community/cli-platform-ios@npm:14.1.0": + version: 14.1.0 + resolution: "@react-native-community/cli-platform-ios@npm:14.1.0" dependencies: - "@react-native-community/cli-platform-apple": "npm:14.0.0" - checksum: 10/e85dc3600c7d6a443502e47e8af2eed98756dcca2aaf418a312bf3b7ec69fb49db7aa8e63318cdf5920219e5fff47cbc819ffa5d9bdc32726bed6b2d280cfe80 + "@react-native-community/cli-platform-apple": "npm:14.1.0" + checksum: 10/85e78f3973d1b088e9bb683d326636e71d936072cd6f6f2c27c610e8b9dcd0e222ea7777c85dcdfdd7ae0bb29909c2b85ff5ab4af3ccbcdf546f37f1f0fe3060 languageName: node linkType: hard @@ -7883,29 +8050,12 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-server-api@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-server-api@npm:14.0.0" - dependencies: - "@react-native-community/cli-debugger-ui": "npm:14.0.0" - "@react-native-community/cli-tools": "npm:14.0.0" - compression: "npm:^1.7.1" - connect: "npm:^3.6.5" - errorhandler: "npm:^1.5.1" - nocache: "npm:^3.0.1" - pretty-format: "npm:^26.6.2" - serve-static: "npm:^1.13.1" - ws: "npm:^6.2.3" - checksum: 10/1f769abb4bba47a4fa8598add1ba75345d5d8664a0d6877543046924abbfa5c2df9c01378ae7a2d65fdc7db3e6d9718db9f93f39a0a9291610467350e5a42359 - languageName: node - linkType: hard - -"@react-native-community/cli-server-api@npm:14.0.0-alpha.11": - version: 14.0.0-alpha.11 - resolution: "@react-native-community/cli-server-api@npm:14.0.0-alpha.11" +"@react-native-community/cli-server-api@npm:14.1.0": + version: 14.1.0 + resolution: "@react-native-community/cli-server-api@npm:14.1.0" dependencies: - "@react-native-community/cli-debugger-ui": "npm:14.0.0-alpha.11" - "@react-native-community/cli-tools": "npm:14.0.0-alpha.11" + "@react-native-community/cli-debugger-ui": "npm:14.1.0" + "@react-native-community/cli-tools": "npm:14.1.0" compression: "npm:^1.7.1" connect: "npm:^3.6.5" errorhandler: "npm:^1.5.1" @@ -7913,7 +8063,7 @@ __metadata: pretty-format: "npm:^26.6.2" serve-static: "npm:^1.13.1" ws: "npm:^6.2.3" - checksum: 10/a689e88022d48e255cb196197cf0976b39bf4422821943e4f918cd2bfcc8952324b54b1983c8fcf42da03ba6b1be810ffa90b0d0e76a34be4f47237a9ae9420e + checksum: 10/11e2a4909a1e7a1cdef86f2ff6c35d23c238ea355e4327bc6a05ad00f40d7cc2c4e6b25583f9d9e9ef1a4d2f2e3c04586b652e06637cd90dc1538f0024336aa0 languageName: node linkType: hard @@ -7935,27 +8085,9 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-tools@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-tools@npm:14.0.0" - dependencies: - appdirsjs: "npm:^1.2.4" - chalk: "npm:^4.1.2" - execa: "npm:^5.0.0" - find-up: "npm:^5.0.0" - mime: "npm:^2.4.1" - open: "npm:^6.2.0" - ora: "npm:^5.4.1" - semver: "npm:^7.5.2" - shell-quote: "npm:^1.7.3" - sudo-prompt: "npm:^9.0.0" - checksum: 10/84219934553287072b284ff524a10c554ccd5e31a0e8237f59999d1e3eb07441baf1083f6be71bd206c76a5c061b936eb1ff8dc2fd32cbda23aa0776358a6000 - languageName: node - linkType: hard - -"@react-native-community/cli-tools@npm:14.0.0-alpha.11": - version: 14.0.0-alpha.11 - resolution: "@react-native-community/cli-tools@npm:14.0.0-alpha.11" +"@react-native-community/cli-tools@npm:14.1.0": + version: 14.1.0 + resolution: "@react-native-community/cli-tools@npm:14.1.0" dependencies: appdirsjs: "npm:^1.2.4" chalk: "npm:^4.1.2" @@ -7967,7 +8099,7 @@ __metadata: semver: "npm:^7.5.2" shell-quote: "npm:^1.7.3" sudo-prompt: "npm:^9.0.0" - checksum: 10/2cbdeda1b189fbd4a61621b9e2c8c47801d8e764d1475305abbb09e27d1d493326e8a216a8d41ab0091ab9615bf01189d4e3c970d864f468f9d41a9195c3a5c0 + checksum: 10/b46247ffcac6a1464955b5b770617dd31f8666997a477481fdf23e87e570e2368e0d0a55393da6f177ad84175e33d6ffa5a3a05cf0f5beccf112242c97903ccc languageName: node linkType: hard @@ -7980,12 +8112,12 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-types@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli-types@npm:14.0.0" +"@react-native-community/cli-types@npm:14.1.0": + version: 14.1.0 + resolution: "@react-native-community/cli-types@npm:14.1.0" dependencies: joi: "npm:^17.2.1" - checksum: 10/a0e4b26da8cc600d133b60f7a74fc1375144f974bf7d453b197091e65af0e69ac0bad42eb957da6c27364c82f1126d4a6bc6b0352ea838366679fac940df9729 + checksum: 10/c721d256a1e90fa3f8353cb0b9d37688aad080e2de44ad6b69516dd591c9f4089d214c43e85b5be0aff0d8b08595af4727a13ddd1c88492f5d3acc57bc22ce8f languageName: node linkType: hard @@ -8017,17 +8149,17 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli@npm:14.0.0": - version: 14.0.0 - resolution: "@react-native-community/cli@npm:14.0.0" - dependencies: - "@react-native-community/cli-clean": "npm:14.0.0" - "@react-native-community/cli-config": "npm:14.0.0" - "@react-native-community/cli-debugger-ui": "npm:14.0.0" - "@react-native-community/cli-doctor": "npm:14.0.0" - "@react-native-community/cli-server-api": "npm:14.0.0" - "@react-native-community/cli-tools": "npm:14.0.0" - "@react-native-community/cli-types": "npm:14.0.0" +"@react-native-community/cli@npm:14.1.0": + version: 14.1.0 + resolution: "@react-native-community/cli@npm:14.1.0" + dependencies: + "@react-native-community/cli-clean": "npm:14.1.0" + "@react-native-community/cli-config": "npm:14.1.0" + "@react-native-community/cli-debugger-ui": "npm:14.1.0" + "@react-native-community/cli-doctor": "npm:14.1.0" + "@react-native-community/cli-server-api": "npm:14.1.0" + "@react-native-community/cli-tools": "npm:14.1.0" + "@react-native-community/cli-types": "npm:14.1.0" chalk: "npm:^4.1.2" commander: "npm:^9.4.1" deepmerge: "npm:^4.3.0" @@ -8039,17 +8171,17 @@ __metadata: semver: "npm:^7.5.2" bin: rnc-cli: build/bin.js - checksum: 10/ae6ec29f015704aaf2ddaa60be822d277644787e4d788a13fb9de0c80e3b39e313d8ac05fac2512761b04c3d89d86b58ffb97f90067764932921288c084f5c22 + checksum: 10/144898574b17c7e01a21d8b156e142f43038f138dbc321e8e7e4c5ee4960ae12f0accae4fc00b0f7f4c25727159cba7e5f664efc70dc90206a62369770c9cbf2 languageName: node linkType: hard "@react-native-community/geolocation@npm:^3.0.6": - version: 3.3.0 - resolution: "@react-native-community/geolocation@npm:3.3.0" + version: 3.4.0 + resolution: "@react-native-community/geolocation@npm:3.4.0" peerDependencies: react: "*" react-native: "*" - checksum: 10/8eefb441015d5bd2c89a70130d54fbdb4a49461e8df66572f48dc8885812c560a8d20b9a63c3b55fee17eb6c8f6eb9f0b0be940323b648df5fadd477d0032523 + checksum: 10/e8f9c487dbea6ae0540185f07d92aca68a1efc823ef572492776b7533be9eebe0234374b9a34f1837899a15e98dbd7673e906380442c19313405bccf7f3e42b1 languageName: node linkType: hard @@ -8102,12 +8234,12 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-plugin-codegen@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/babel-plugin-codegen@npm:0.75.2" +"@react-native/babel-plugin-codegen@npm:0.75.3": + version: 0.75.3 + resolution: "@react-native/babel-plugin-codegen@npm:0.75.3" dependencies: - "@react-native/codegen": "npm:0.75.2" - checksum: 10/1ca1fa22053ee1dcfe051dd64dce990d0ef7369465902feb5523a116ea72abb0683b5a665c578a8b9c8cd6ef449a267788fa2488f2777eec3c48faf0d76271aa + "@react-native/codegen": "npm:0.75.3" + checksum: 10/ab67b1aa082942fe816ef93c42ade03dbd8f2e62ab66ded45b2583cb00137fd9abba9dd29aa7b91c55106093f3f77e7db9059df0019cf85fd1f6a6acdd5adc25 languageName: node linkType: hard @@ -8163,9 +8295,9 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-preset@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/babel-preset@npm:0.75.2" +"@react-native/babel-preset@npm:0.75.3": + version: 0.75.3 + resolution: "@react-native/babel-preset@npm:0.75.3" dependencies: "@babel/core": "npm:^7.20.0" "@babel/plugin-proposal-export-default-from": "npm:^7.0.0" @@ -8209,12 +8341,12 @@ __metadata: "@babel/plugin-transform-typescript": "npm:^7.5.0" "@babel/plugin-transform-unicode-regex": "npm:^7.0.0" "@babel/template": "npm:^7.0.0" - "@react-native/babel-plugin-codegen": "npm:0.75.2" + "@react-native/babel-plugin-codegen": "npm:0.75.3" babel-plugin-transform-flow-enums: "npm:^0.0.2" react-refresh: "npm:^0.14.0" peerDependencies: "@babel/core": "*" - checksum: 10/46de9a9cbd8e7c31c1e725fb9efa2be1f06dd8dd06c3c4595784607da684e5a4ca137833cc7169cc2da7d1703dac2449a3802514fe7ab7346959322fa09757f0 + checksum: 10/3932d2b7dc779e2ca3d9d6ad6d87c66bf7f0fa76ff574c00b152a39b8ea06a4e4f1b2387a0a3e68f976f98e5a8de208ace3f2593fde3e03894b7bbde050b7d8a languageName: node linkType: hard @@ -8235,9 +8367,9 @@ __metadata: languageName: node linkType: hard -"@react-native/codegen@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/codegen@npm:0.75.2" +"@react-native/codegen@npm:0.75.3": + version: 0.75.3 + resolution: "@react-native/codegen@npm:0.75.3" dependencies: "@babel/parser": "npm:^7.20.0" glob: "npm:^7.1.1" @@ -8249,7 +8381,7 @@ __metadata: yargs: "npm:^17.6.2" peerDependencies: "@babel/preset-env": ^7.1.6 - checksum: 10/9970ef151f40160f71cd6d0f1a09e37a4cbb9c892f03a9c1e88ad247772943dc6e4e03ebfe8a10ee6fa7c10aa9f751d104fb08b4c6d166c9cc1fe4753b1ebdab + checksum: 10/a6b23e560bfe0d98594362c8ed602758eb0d00a467b45dc1863b7e585f97f7bab8c93ba711f8e41807b00b26c0776f561be7ed2d38a759bcbde375fe20ceff35 languageName: node linkType: hard @@ -8272,23 +8404,22 @@ __metadata: languageName: node linkType: hard -"@react-native/community-cli-plugin@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/community-cli-plugin@npm:0.75.2" +"@react-native/community-cli-plugin@npm:0.75.3": + version: 0.75.3 + resolution: "@react-native/community-cli-plugin@npm:0.75.3" dependencies: - "@react-native-community/cli-server-api": "npm:14.0.0-alpha.11" - "@react-native-community/cli-tools": "npm:14.0.0-alpha.11" - "@react-native/dev-middleware": "npm:0.75.2" - "@react-native/metro-babel-transformer": "npm:0.75.2" + "@react-native-community/cli-server-api": "npm:14.1.0" + "@react-native-community/cli-tools": "npm:14.1.0" + "@react-native/dev-middleware": "npm:0.75.3" + "@react-native/metro-babel-transformer": "npm:0.75.3" chalk: "npm:^4.0.0" execa: "npm:^5.1.1" metro: "npm:^0.80.3" metro-config: "npm:^0.80.3" metro-core: "npm:^0.80.3" node-fetch: "npm:^2.2.0" - querystring: "npm:^0.2.1" readline: "npm:^1.3.0" - checksum: 10/13ceea24365350b5ee528cd2654cfe764900296c186e8704bc86f4a8bda649fb154f752a32f3c29a5d9b425c44b692e8f754013d1b6db843f686038f80f8799a + checksum: 10/080c2eb5b543f161c0967e6de93015284a3d266df2d01876cfb8dc5ce759e0875ab47e1126cc355caef21ab602751cab31734f19eac09f19e6d964759b5ec790 languageName: node linkType: hard @@ -8299,10 +8430,10 @@ __metadata: languageName: node linkType: hard -"@react-native/debugger-frontend@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/debugger-frontend@npm:0.75.2" - checksum: 10/2026c679fec3fe61f41d2c27cbc7ffb33a60e11578f773252c132e41f4872ab4c271390667f79e646fe6af4b0073ab1fe26528bab6709ddc74f7836654882ab5 +"@react-native/debugger-frontend@npm:0.75.3": + version: 0.75.3 + resolution: "@react-native/debugger-frontend@npm:0.75.3" + checksum: 10/f28265582bcd2e3c8b7dc8a43b8d210c11852bdba327fdce0ae0bf82b9b9cf66b1b77046569e0d2e2e0461508e9736a6a5e0190766d395d34c62e18abe91e12a languageName: node linkType: hard @@ -8325,12 +8456,12 @@ __metadata: languageName: node linkType: hard -"@react-native/dev-middleware@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/dev-middleware@npm:0.75.2" +"@react-native/dev-middleware@npm:0.75.3": + version: 0.75.3 + resolution: "@react-native/dev-middleware@npm:0.75.3" dependencies: "@isaacs/ttlcache": "npm:^1.4.1" - "@react-native/debugger-frontend": "npm:0.75.2" + "@react-native/debugger-frontend": "npm:0.75.3" chrome-launcher: "npm:^0.15.2" chromium-edge-launcher: "npm:^0.2.0" connect: "npm:^3.6.5" @@ -8341,7 +8472,7 @@ __metadata: selfsigned: "npm:^2.4.1" serve-static: "npm:^1.13.1" ws: "npm:^6.2.2" - checksum: 10/326ce1ba04ad99a1e9bcc5d7b2fde23d0162ebe0ecae5bc4bca5f9431e80963ae54949bd868b52d0b8b146b17b79134530602dcbda048895121c683f696c0c6a + checksum: 10/6086c2ccfae3697a20842a6630b0819316f1b3cfb5a90cacdfd80044f58fcec20105f384a328a0fed3014f2ab5ebddfdce5aea5e614c9e3a2642543c53c5d713 languageName: node linkType: hard @@ -8352,10 +8483,10 @@ __metadata: languageName: node linkType: hard -"@react-native/gradle-plugin@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/gradle-plugin@npm:0.75.2" - checksum: 10/0b9ab824959db4da7ac29de9a285402cf3540e1ba1ef38c34f23389119393975d7a5463b65443d6c1e4f6618e3829b600e51ed0f05603b7f4649ce24f0f0b89e +"@react-native/gradle-plugin@npm:0.75.3": + version: 0.75.3 + resolution: "@react-native/gradle-plugin@npm:0.75.3" + checksum: 10/c5369bc0b5513986055468d9cc8b5c5fba95ba85ccaa5ea370268fb4bf2c02a9d335e3622844654004364cc12651c2009709c8d5191d8ab10d39473ed835be45 languageName: node linkType: hard @@ -8366,10 +8497,10 @@ __metadata: languageName: node linkType: hard -"@react-native/js-polyfills@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/js-polyfills@npm:0.75.2" - checksum: 10/de7f2e0e2a52d142d5068a99fb2fd29eb6a6aced3336295ef967e374681e0e36183ef859fbdb5bfa3cba724f1c2f83f42702b1824c27f6876fb999028fe0c919 +"@react-native/js-polyfills@npm:0.75.3": + version: 0.75.3 + resolution: "@react-native/js-polyfills@npm:0.75.3" + checksum: 10/f6e2357bff99755f445f8141317e61cf0d633b565e53c99dd3f9714f667123fbbfae37a91039de671dd15e5e4389b78fb34993ae6e95ad7231a7a7bc19c99b5c languageName: node linkType: hard @@ -8387,17 +8518,17 @@ __metadata: languageName: node linkType: hard -"@react-native/metro-babel-transformer@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/metro-babel-transformer@npm:0.75.2" +"@react-native/metro-babel-transformer@npm:0.75.3": + version: 0.75.3 + resolution: "@react-native/metro-babel-transformer@npm:0.75.3" dependencies: "@babel/core": "npm:^7.20.0" - "@react-native/babel-preset": "npm:0.75.2" + "@react-native/babel-preset": "npm:0.75.3" hermes-parser: "npm:0.22.0" nullthrows: "npm:^1.1.1" peerDependencies: "@babel/core": "*" - checksum: 10/4f5be3a0bd871c1f147afaa06febeb55f6c8e7cb229b2eeb569a9790fe06a335ead99543ff0b72a09cdaa46932729871f78f67d072cecd362158a69fe091285e + checksum: 10/823e31e8348a8357d1f870cc85137e1fc84f326dd0047467c93131a3ea64052c680fb14d121ab920d7035f5f8ff2d25148f3f91ab4268b1d14b2469122318016 languageName: node linkType: hard @@ -8415,10 +8546,10 @@ __metadata: languageName: node linkType: hard -"@react-native/normalize-colors@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/normalize-colors@npm:0.75.2" - checksum: 10/bbf7038e191785eacfb90765c92ebd6007f9fb55b8efb5a67e3438627238f83181b09b293deb1978cca615041f74b2c034a5ad335ac025c4ce663d7d72619ca1 +"@react-native/normalize-colors@npm:0.75.3": + version: 0.75.3 + resolution: "@react-native/normalize-colors@npm:0.75.3" + checksum: 10/a631015d453395d66c093b6bb6690c1fe4331318a846109a700cfd70ac278d271f6fdbce7e12e523bcf2b810f3d800ada387e4eb761e44b430b163bee96c5b99 languageName: node linkType: hard @@ -8441,9 +8572,9 @@ __metadata: languageName: node linkType: hard -"@react-native/virtualized-lists@npm:0.75.2": - version: 0.75.2 - resolution: "@react-native/virtualized-lists@npm:0.75.2" +"@react-native/virtualized-lists@npm:0.75.3": + version: 0.75.3 + resolution: "@react-native/virtualized-lists@npm:0.75.3" dependencies: invariant: "npm:^2.2.4" nullthrows: "npm:^1.1.1" @@ -8454,7 +8585,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/674c3295fe7cc701c1559383f7844825c2142f652ae8fb649bf65819c0477a89ff3fd7434983d08382ff1ee347bd36fc85585ab3b33904a781e78468fe2dba4c + checksum: 10/c1f0ca6c7278c398dd893de3639cf5a5b992161835eee1d155050bcf33ece537fef858c09e75b802206ad35d2eb1ab22e185ee0c7269bd9525c15640c8e7b9a7 languageName: node linkType: hard @@ -9081,11 +9212,11 @@ __metadata: linkType: hard "@rehookify/datepicker@npm:^6.6.1": - version: 6.6.6 - resolution: "@rehookify/datepicker@npm:6.6.6" + version: 6.6.7 + resolution: "@rehookify/datepicker@npm:6.6.7" peerDependencies: react: ^16.8.0 || ^17 || ^18 - checksum: 10/136481c64804d86d2c55218fa2f16eec9b5263b30238e82cf1a5457e74e76b73146dc177892165f5ca77a0a75fb2e7de3ebc2ced018682f4890c65c56297e241 + checksum: 10/3753633301b6a194bb8563ede1ceeeaf0e3b9aeb51764f5ccf593c56630eab720db5347937de43f247f9fdf7c1e5cc1e461f0ca5acfb1f9ec83fa6e05ef56815 languageName: node linkType: hard @@ -9213,9 +9344,9 @@ __metadata: languageName: node linkType: hard -"@rnmapbox/maps@npm:^10.1.29": - version: 10.1.29 - resolution: "@rnmapbox/maps@npm:10.1.29" +"@rnmapbox/maps@npm:*, @rnmapbox/maps@npm:^10.1.29": + version: 10.1.31 + resolution: "@rnmapbox/maps@npm:10.1.31" dependencies: "@turf/along": "npm:6.5.0" "@turf/distance": "npm:6.5.0" @@ -9237,7 +9368,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 10/6f15ceb4a1aeeb9d7c89c03d750de9a34179605eddae4bf48e9cce255a6b86e4bcb26dd7438849dcf2e3f467d78df73f588b0cf7f0d6f7e20dd27dffe2a26817 + checksum: 10/b89478790e509537953d519c55aed3df4160c959c3d042d09c52680f429b4583b65758f9374f89742f7d82e7e95bd9d55baf202f7eec59df8ffaab9ef8acd58d languageName: node linkType: hard @@ -9283,118 +9414,125 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.21.0" +"@rollup/rollup-android-arm-eabi@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.22.2" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-android-arm64@npm:4.21.0" +"@rollup/rollup-android-arm64@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-android-arm64@npm:4.22.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.21.0" +"@rollup/rollup-darwin-arm64@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-darwin-arm64@npm:4.22.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.21.0" +"@rollup/rollup-darwin-x64@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-darwin-x64@npm:4.22.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.21.0" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.22.2" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.21.0" +"@rollup/rollup-linux-arm-musleabihf@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.22.2" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.21.0" +"@rollup/rollup-linux-arm64-gnu@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.22.2" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.21.0" +"@rollup/rollup-linux-arm64-musl@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.22.2" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.0" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.2" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.21.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.22.2" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.21.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.22.2" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.21.0" +"@rollup/rollup-linux-x64-gnu@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.22.2" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.21.0" +"@rollup/rollup-linux-x64-musl@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.22.2" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.21.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.22.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.21.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.22.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.21.0": - version: 4.21.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.21.0" +"@rollup/rollup-win32-x64-msvc@npm:4.22.2": + version: 4.22.2 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.22.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard +"@rtsao/scc@npm:^1.1.0": + version: 1.1.0 + resolution: "@rtsao/scc@npm:1.1.0" + checksum: 10/17d04adf404e04c1e61391ed97bca5117d4c2767a76ae3e879390d6dec7b317fcae68afbf9e98badee075d0b64fa60f287729c4942021b4d19cd01db77385c01 + languageName: node + linkType: hard + "@segment/loosely-validate-event@npm:^2.0.0": version: 2.0.0 resolution: "@segment/loosely-validate-event@npm:2.0.0" @@ -9517,90 +9655,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.7.14": - version: 1.7.14 - resolution: "@swc/core-darwin-arm64@npm:1.7.14" +"@swc/core-darwin-arm64@npm:1.7.26": + version: 1.7.26 + resolution: "@swc/core-darwin-arm64@npm:1.7.26" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.7.14": - version: 1.7.14 - resolution: "@swc/core-darwin-x64@npm:1.7.14" +"@swc/core-darwin-x64@npm:1.7.26": + version: 1.7.26 + resolution: "@swc/core-darwin-x64@npm:1.7.26" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.7.14": - version: 1.7.14 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.7.14" +"@swc/core-linux-arm-gnueabihf@npm:1.7.26": + version: 1.7.26 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.7.26" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.7.14": - version: 1.7.14 - resolution: "@swc/core-linux-arm64-gnu@npm:1.7.14" +"@swc/core-linux-arm64-gnu@npm:1.7.26": + version: 1.7.26 + resolution: "@swc/core-linux-arm64-gnu@npm:1.7.26" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.7.14": - version: 1.7.14 - resolution: "@swc/core-linux-arm64-musl@npm:1.7.14" +"@swc/core-linux-arm64-musl@npm:1.7.26": + version: 1.7.26 + resolution: "@swc/core-linux-arm64-musl@npm:1.7.26" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.7.14": - version: 1.7.14 - resolution: "@swc/core-linux-x64-gnu@npm:1.7.14" +"@swc/core-linux-x64-gnu@npm:1.7.26": + version: 1.7.26 + resolution: "@swc/core-linux-x64-gnu@npm:1.7.26" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.7.14": - version: 1.7.14 - resolution: "@swc/core-linux-x64-musl@npm:1.7.14" +"@swc/core-linux-x64-musl@npm:1.7.26": + version: 1.7.26 + resolution: "@swc/core-linux-x64-musl@npm:1.7.26" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.7.14": - version: 1.7.14 - resolution: "@swc/core-win32-arm64-msvc@npm:1.7.14" +"@swc/core-win32-arm64-msvc@npm:1.7.26": + version: 1.7.26 + resolution: "@swc/core-win32-arm64-msvc@npm:1.7.26" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.7.14": - version: 1.7.14 - resolution: "@swc/core-win32-ia32-msvc@npm:1.7.14" +"@swc/core-win32-ia32-msvc@npm:1.7.26": + version: 1.7.26 + resolution: "@swc/core-win32-ia32-msvc@npm:1.7.26" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.7.14": - version: 1.7.14 - resolution: "@swc/core-win32-x64-msvc@npm:1.7.14" +"@swc/core-win32-x64-msvc@npm:1.7.26": + version: 1.7.26 + resolution: "@swc/core-win32-x64-msvc@npm:1.7.26" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.5.25, @swc/core@npm:^1.5.7": - version: 1.7.14 - resolution: "@swc/core@npm:1.7.14" - dependencies: - "@swc/core-darwin-arm64": "npm:1.7.14" - "@swc/core-darwin-x64": "npm:1.7.14" - "@swc/core-linux-arm-gnueabihf": "npm:1.7.14" - "@swc/core-linux-arm64-gnu": "npm:1.7.14" - "@swc/core-linux-arm64-musl": "npm:1.7.14" - "@swc/core-linux-x64-gnu": "npm:1.7.14" - "@swc/core-linux-x64-musl": "npm:1.7.14" - "@swc/core-win32-arm64-msvc": "npm:1.7.14" - "@swc/core-win32-ia32-msvc": "npm:1.7.14" - "@swc/core-win32-x64-msvc": "npm:1.7.14" + version: 1.7.26 + resolution: "@swc/core@npm:1.7.26" + dependencies: + "@swc/core-darwin-arm64": "npm:1.7.26" + "@swc/core-darwin-x64": "npm:1.7.26" + "@swc/core-linux-arm-gnueabihf": "npm:1.7.26" + "@swc/core-linux-arm64-gnu": "npm:1.7.26" + "@swc/core-linux-arm64-musl": "npm:1.7.26" + "@swc/core-linux-x64-gnu": "npm:1.7.26" + "@swc/core-linux-x64-musl": "npm:1.7.26" + "@swc/core-win32-arm64-msvc": "npm:1.7.26" + "@swc/core-win32-ia32-msvc": "npm:1.7.26" + "@swc/core-win32-x64-msvc": "npm:1.7.26" "@swc/counter": "npm:^0.1.3" "@swc/types": "npm:^0.1.12" peerDependencies: @@ -9629,7 +9767,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10/75cc386a7538da58fd2c8e141503b6efc9d1fddda4fa87c0e54e32422b5e5276eac259fc6a6a83d5f6758480f739d178a5c36d1209127c0459ca006f7075b0a6 + checksum: 10/8fb43420bdd1b774dc054c6629f87f733e76860b97130609c7374f3a48406bc0ae1a2dd0b3e3c10317c692b2eaa64747f1a690b309727a8d1411112e2d2a884e languageName: node linkType: hard @@ -9650,11 +9788,11 @@ __metadata: linkType: hard "@swc/helpers@npm:^0.5.0, @swc/helpers@npm:^0.5.11": - version: 0.5.12 - resolution: "@swc/helpers@npm:0.5.12" + version: 0.5.13 + resolution: "@swc/helpers@npm:0.5.13" dependencies: tslib: "npm:^2.4.0" - checksum: 10/f04a4728c38a6e75a85b077408e175e1abbc1650a76e4b78008d6380ca1422d9f7f4f9fe61b42f8fb889140f05ced6a5a9983037a8d5d8086bf6bc80a0b2118b + checksum: 10/6ba2f7e215d32d71fce139e2cfc426b3ed7eaa709febdeb07b97260a4c9eea4784cf047cc1271be273990b08220b576b94a42b5780947c0b3be84973a847a24d languageName: node linkType: hard @@ -11370,20 +11508,20 @@ __metadata: linkType: hard "@tanstack/eslint-plugin-query@npm:^5.14.6": - version: 5.52.0 - resolution: "@tanstack/eslint-plugin-query@npm:5.52.0" + version: 5.56.1 + resolution: "@tanstack/eslint-plugin-query@npm:5.56.1" dependencies: - "@typescript-eslint/utils": "npm:8.0.0-alpha.30" + "@typescript-eslint/utils": "npm:^8.3.0" peerDependencies: - eslint: ^8 || ^9 - checksum: 10/531763d936db4bdbe9b0a06ce808dd8a4396c69a251c8e33de6c00b5adf4017cd39ec7e1362f9d291c321d72c10ce584ddf2d44e6f4dc19f4ab2050af00cf228 + eslint: ^8.57.0 || ^9.0.0 + checksum: 10/a2995168f89795a9c7f7b8c1be88f3dc81d01d5fa2b8db32ad6bbd8d685702b51c84c78c1296b9f99dd647387c563c6d1c1af6f4cadf655228d8e57d9019a242 languageName: node linkType: hard -"@tanstack/history@npm:1.49.0": - version: 1.49.0 - resolution: "@tanstack/history@npm:1.49.0" - checksum: 10/b07616275916a88d8b5d20eba2a4216346d13d547148aed6d0da9778ba146a4d2b425ae8854db5ae69f649cc2bbd0c48d52f04e59882dc8232c16f34a3bb2e2e +"@tanstack/history@npm:1.57.6": + version: 1.57.6 + resolution: "@tanstack/history@npm:1.57.6" + checksum: 10/a18b5531a3ab8c56c18e43717f5c55946fe2b44f6351dcd8b1cd6b242893b322af272ad4bdd8730f7903262a0d5adac9e7135305c004d9a959cd0687abf74130 languageName: node linkType: hard @@ -11467,17 +11605,21 @@ __metadata: linkType: hard "@tanstack/react-router@npm:^1.16.5": - version: 1.49.2 - resolution: "@tanstack/react-router@npm:1.49.2" + version: 1.58.3 + resolution: "@tanstack/react-router@npm:1.58.3" dependencies: - "@tanstack/history": "npm:1.49.0" + "@tanstack/history": "npm:1.57.6" "@tanstack/react-store": "npm:^0.5.5" tiny-invariant: "npm:^1.3.3" tiny-warning: "npm:^1.0.3" peerDependencies: + "@tanstack/router-generator": 1.58.1 react: ">=18" react-dom: ">=18" - checksum: 10/47f737b1d6ca549ef8e9ae10989daf88192f5b61d9a23ed5fb31c2959a623c47f639feb7fd3b4c8ed231a14f129520f32c0869664b9c240f4823fcb4e2298dca + peerDependenciesMeta: + "@tanstack/router-generator": + optional: true + checksum: 10/42f1770516877b2ea82ee25d375329c7d64155465b3fb9f92d9ba32a8f119fff69209bca728e5a613f21f38554dc5d5228c68b1dc78005fc3e4d9ada2e5f6ab4 languageName: node linkType: hard @@ -11495,14 +11637,14 @@ __metadata: linkType: hard "@tanstack/react-table@npm:^8.11.2": - version: 8.20.1 - resolution: "@tanstack/react-table@npm:8.20.1" + version: 8.20.5 + resolution: "@tanstack/react-table@npm:8.20.5" dependencies: - "@tanstack/table-core": "npm:8.20.1" + "@tanstack/table-core": "npm:8.20.5" peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: 10/45d1e2859bb9e4899eb5b6ffb5622185ae91d89df946738e23d8df475f91fbff421f1e63a336db304e1fc33e568bf5d648c9ac5308739f877e2698ac760d4093 + checksum: 10/df67094795a0b7e4b34f73abe346443c2e806c572fea31b58759aa8ec5274f613e5e6941090eb16f861bda10d3088731bc6e7f15e5f90326db273bc55b9141ce languageName: node linkType: hard @@ -11518,42 +11660,45 @@ __metadata: linkType: hard "@tanstack/router-devtools@npm:^1.16.5": - version: 1.49.2 - resolution: "@tanstack/router-devtools@npm:1.49.2" + version: 1.58.3 + resolution: "@tanstack/router-devtools@npm:1.58.3" dependencies: clsx: "npm:^2.1.1" goober: "npm:^2.1.14" peerDependencies: - "@tanstack/react-router": ^1.49.2 + "@tanstack/react-router": ^1.58.3 react: ">=18" react-dom: ">=18" - checksum: 10/fcb19fc8ab1192625a8f8efa01f5fdfb4e3779c11c30c171392d56a2e15610e51b278f7331c5be03e4bcffaa205d1825efe948f6d90552f5c03882e40db6ac0f + checksum: 10/ccad802ddf2e636083fe1734aef2978fb79d0b04cd5ad00ae3bfa3829b76b56ecef62a230d9e19155ea40c55796e18074c81146e841bda32c5e63294a1c94a4d languageName: node linkType: hard -"@tanstack/router-generator@npm:^1.49.3": - version: 1.49.3 - resolution: "@tanstack/router-generator@npm:1.49.3" +"@tanstack/router-generator@npm:^1.58.1": + version: 1.58.1 + resolution: "@tanstack/router-generator@npm:1.58.1" dependencies: + "@tanstack/virtual-file-routes": "npm:^1.56.0" prettier: "npm:^3.3.3" + tsx: "npm:^4.19.1" zod: "npm:^3.23.8" - checksum: 10/bccf002284b28346eed02ab6a378176b28d6d4df42d35becaede3f88c3645ebad8a1c5e9d68411aca919e50f05146b7a7de70874163ebaac8d2d9c76fe8e317e + checksum: 10/f03fe628fb157c50c1d19a8cdcf41c3c4ea5a54af3b767af3ae4e139f88b1a13656ae3c53148a1d9a3a12181f5f6b603f5d59a8c2ccc02af4d9d467a1408bb32 languageName: node linkType: hard -"@tanstack/router-plugin@npm:^1.49.3": - version: 1.49.3 - resolution: "@tanstack/router-plugin@npm:1.49.3" +"@tanstack/router-plugin@npm:^1.58.4": + version: 1.58.4 + resolution: "@tanstack/router-plugin@npm:1.58.4" dependencies: "@babel/core": "npm:^7.25.2" - "@babel/generator": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.3" + "@babel/generator": "npm:^7.25.6" + "@babel/parser": "npm:^7.25.6" "@babel/plugin-syntax-jsx": "npm:^7.24.7" - "@babel/plugin-syntax-typescript": "npm:^7.24.7" + "@babel/plugin-syntax-typescript": "npm:^7.25.4" "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.3" - "@babel/types": "npm:^7.25.2" - "@tanstack/router-generator": "npm:^1.49.3" + "@babel/traverse": "npm:^7.25.6" + "@babel/types": "npm:^7.25.6" + "@tanstack/router-generator": "npm:^1.58.1" + "@tanstack/virtual-file-routes": "npm:^1.56.0" "@types/babel__core": "npm:^7.20.5" "@types/babel__generator": "npm:^7.6.8" "@types/babel__template": "npm:^7.4.4" @@ -11563,7 +11708,7 @@ __metadata: unplugin: "npm:^1.12.2" zod: "npm:^3.23.8" peerDependencies: - "@rsbuild/core": ">=1.0.0" + "@rsbuild/core": ">=1.0.2" vite: ">=5.0.0" webpack: ">=5.92.0" peerDependenciesMeta: @@ -11573,16 +11718,16 @@ __metadata: optional: true webpack: optional: true - checksum: 10/379185317f6ad176c9db0a81b248d37305b6373c288a5314d028a1253d5ecad340beb66b400137cc64a32e9fa317f03588dfb210d84a12cafe2bc73a8405c266 + checksum: 10/33b891b4a0d1ce9f97247b6be331c0d6ad59a773a560d5b2ab519282baac6d0268cb071e1b280cb744148b921a4a2375a173558dd4387511143e78e2ac5a8614 languageName: node linkType: hard "@tanstack/router-vite-plugin@npm:^1.16.5": - version: 1.49.3 - resolution: "@tanstack/router-vite-plugin@npm:1.49.3" + version: 1.58.4 + resolution: "@tanstack/router-vite-plugin@npm:1.58.4" dependencies: - "@tanstack/router-plugin": "npm:^1.49.3" - checksum: 10/e2367504898134b517368e717c8eb99a97021238dbd45628b0b44697b06807fb79b7c609422d2a0696d3e14035e39a5880349c00ff5309a1556bdd46b4a8812b + "@tanstack/router-plugin": "npm:^1.58.4" + checksum: 10/135fe2fa38cd6d0cadd5519902654c7048fffe13d41a5b43feb56d1a5f171ee1fa4a3cd3136b56e8cb10e2aab6822be600156985a445ef398a753734a2550532 languageName: node linkType: hard @@ -11593,10 +11738,10 @@ __metadata: languageName: node linkType: hard -"@tanstack/table-core@npm:8.20.1": - version: 8.20.1 - resolution: "@tanstack/table-core@npm:8.20.1" - checksum: 10/416197f26923cb29f7aa42f440ad2560887c7397d839223324036a86b53d6dabe8f4a7dac19a18817a851cef18c26d8861075ecdb6e42d613c845bcbbaefc5cc +"@tanstack/table-core@npm:8.20.5": + version: 8.20.5 + resolution: "@tanstack/table-core@npm:8.20.5" + checksum: 10/5408237920d5796951e925278edbbe76f71006627a4e3da248a810970256f75d973538fe7ae75a32155d4a25a95abc4fffaea337b5120f7940d7e664dc9da87f languageName: node linkType: hard @@ -11607,6 +11752,13 @@ __metadata: languageName: node linkType: hard +"@tanstack/virtual-file-routes@npm:^1.56.0": + version: 1.56.0 + resolution: "@tanstack/virtual-file-routes@npm:1.56.0" + checksum: 10/b5d8b4199af500493abe8a5cb5234c55b8e8e1ba09354af4ed6c30b7c40a65b1f2bd8fe5bb1edac2b621ec51d08e567b6c59d1969ca8e8983195940382df9f89 + languageName: node + linkType: hard + "@tauri-apps/api@npm:^1": version: 1.6.0 resolution: "@tauri-apps/api@npm:1.6.0" @@ -11614,90 +11766,90 @@ __metadata: languageName: node linkType: hard -"@tauri-apps/cli-darwin-arm64@npm:1.6.0": - version: 1.6.0 - resolution: "@tauri-apps/cli-darwin-arm64@npm:1.6.0" +"@tauri-apps/cli-darwin-arm64@npm:1.6.2": + version: 1.6.2 + resolution: "@tauri-apps/cli-darwin-arm64@npm:1.6.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@tauri-apps/cli-darwin-x64@npm:1.6.0": - version: 1.6.0 - resolution: "@tauri-apps/cli-darwin-x64@npm:1.6.0" +"@tauri-apps/cli-darwin-x64@npm:1.6.2": + version: 1.6.2 + resolution: "@tauri-apps/cli-darwin-x64@npm:1.6.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@tauri-apps/cli-linux-arm-gnueabihf@npm:1.6.0": - version: 1.6.0 - resolution: "@tauri-apps/cli-linux-arm-gnueabihf@npm:1.6.0" +"@tauri-apps/cli-linux-arm-gnueabihf@npm:1.6.2": + version: 1.6.2 + resolution: "@tauri-apps/cli-linux-arm-gnueabihf@npm:1.6.2" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@tauri-apps/cli-linux-arm64-gnu@npm:1.6.0": - version: 1.6.0 - resolution: "@tauri-apps/cli-linux-arm64-gnu@npm:1.6.0" +"@tauri-apps/cli-linux-arm64-gnu@npm:1.6.2": + version: 1.6.2 + resolution: "@tauri-apps/cli-linux-arm64-gnu@npm:1.6.2" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@tauri-apps/cli-linux-arm64-musl@npm:1.6.0": - version: 1.6.0 - resolution: "@tauri-apps/cli-linux-arm64-musl@npm:1.6.0" +"@tauri-apps/cli-linux-arm64-musl@npm:1.6.2": + version: 1.6.2 + resolution: "@tauri-apps/cli-linux-arm64-musl@npm:1.6.2" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@tauri-apps/cli-linux-x64-gnu@npm:1.6.0": - version: 1.6.0 - resolution: "@tauri-apps/cli-linux-x64-gnu@npm:1.6.0" +"@tauri-apps/cli-linux-x64-gnu@npm:1.6.2": + version: 1.6.2 + resolution: "@tauri-apps/cli-linux-x64-gnu@npm:1.6.2" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@tauri-apps/cli-linux-x64-musl@npm:1.6.0": - version: 1.6.0 - resolution: "@tauri-apps/cli-linux-x64-musl@npm:1.6.0" +"@tauri-apps/cli-linux-x64-musl@npm:1.6.2": + version: 1.6.2 + resolution: "@tauri-apps/cli-linux-x64-musl@npm:1.6.2" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@tauri-apps/cli-win32-arm64-msvc@npm:1.6.0": - version: 1.6.0 - resolution: "@tauri-apps/cli-win32-arm64-msvc@npm:1.6.0" +"@tauri-apps/cli-win32-arm64-msvc@npm:1.6.2": + version: 1.6.2 + resolution: "@tauri-apps/cli-win32-arm64-msvc@npm:1.6.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@tauri-apps/cli-win32-ia32-msvc@npm:1.6.0": - version: 1.6.0 - resolution: "@tauri-apps/cli-win32-ia32-msvc@npm:1.6.0" +"@tauri-apps/cli-win32-ia32-msvc@npm:1.6.2": + version: 1.6.2 + resolution: "@tauri-apps/cli-win32-ia32-msvc@npm:1.6.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@tauri-apps/cli-win32-x64-msvc@npm:1.6.0": - version: 1.6.0 - resolution: "@tauri-apps/cli-win32-x64-msvc@npm:1.6.0" +"@tauri-apps/cli-win32-x64-msvc@npm:1.6.2": + version: 1.6.2 + resolution: "@tauri-apps/cli-win32-x64-msvc@npm:1.6.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@tauri-apps/cli@npm:^1": - version: 1.6.0 - resolution: "@tauri-apps/cli@npm:1.6.0" - dependencies: - "@tauri-apps/cli-darwin-arm64": "npm:1.6.0" - "@tauri-apps/cli-darwin-x64": "npm:1.6.0" - "@tauri-apps/cli-linux-arm-gnueabihf": "npm:1.6.0" - "@tauri-apps/cli-linux-arm64-gnu": "npm:1.6.0" - "@tauri-apps/cli-linux-arm64-musl": "npm:1.6.0" - "@tauri-apps/cli-linux-x64-gnu": "npm:1.6.0" - "@tauri-apps/cli-linux-x64-musl": "npm:1.6.0" - "@tauri-apps/cli-win32-arm64-msvc": "npm:1.6.0" - "@tauri-apps/cli-win32-ia32-msvc": "npm:1.6.0" - "@tauri-apps/cli-win32-x64-msvc": "npm:1.6.0" + version: 1.6.2 + resolution: "@tauri-apps/cli@npm:1.6.2" + dependencies: + "@tauri-apps/cli-darwin-arm64": "npm:1.6.2" + "@tauri-apps/cli-darwin-x64": "npm:1.6.2" + "@tauri-apps/cli-linux-arm-gnueabihf": "npm:1.6.2" + "@tauri-apps/cli-linux-arm64-gnu": "npm:1.6.2" + "@tauri-apps/cli-linux-arm64-musl": "npm:1.6.2" + "@tauri-apps/cli-linux-x64-gnu": "npm:1.6.2" + "@tauri-apps/cli-linux-x64-musl": "npm:1.6.2" + "@tauri-apps/cli-win32-arm64-msvc": "npm:1.6.2" + "@tauri-apps/cli-win32-ia32-msvc": "npm:1.6.2" + "@tauri-apps/cli-win32-x64-msvc": "npm:1.6.2" dependenciesMeta: "@tauri-apps/cli-darwin-arm64": optional: true @@ -11721,7 +11873,7 @@ __metadata: optional: true bin: tauri: tauri.js - checksum: 10/17e4787d19fb0fa5fda404b8698ffaf650e863ae8374997c39b2214cfad61ee82091a60a3dfdf5b40b61ee2b8c83704cec2da570d3fb77e5daef481bc05bf700 + checksum: 10/f9fdd05b5839abef56f2e09dee0ac74ab142b6fbed7a25c2276182606a3a8011e00a82d6c02346dfcc7835497fe7596f0a1af0f7439493988514f9dde0f9917d languageName: node linkType: hard @@ -12155,7 +12307,14 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:1.0.5, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": +"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d + languageName: node + linkType: hard + +"@types/estree@npm:1.0.5": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" checksum: 10/7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 @@ -12213,7 +12372,7 @@ __metadata: languageName: node linkType: hard -"@types/geojson@npm:*, @types/geojson@npm:^7946.0, @types/geojson@npm:^7946.0.10, @types/geojson@npm:^7946.0.7": +"@types/geojson@npm:*, @types/geojson@npm:^7946.0, @types/geojson@npm:^7946.0.10, @types/geojson@npm:^7946.0.14, @types/geojson@npm:^7946.0.7": version: 7946.0.14 resolution: "@types/geojson@npm:7946.0.14" checksum: 10/ae511bee6488ae3bd5a3a3347aedb0371e997b14225b8983679284e22fa4ebd88627c6e3ff8b08bf4cc35068cb29310c89427311ffc9322c255615821a922e71 @@ -12328,12 +12487,12 @@ __metadata: linkType: hard "@types/jest@npm:^29.5.11": - version: 29.5.12 - resolution: "@types/jest@npm:29.5.12" + version: 29.5.13 + resolution: "@types/jest@npm:29.5.13" dependencies: expect: "npm:^29.0.0" pretty-format: "npm:^29.0.0" - checksum: 10/312e8dcf92cdd5a5847d6426f0940829bca6fe6b5a917248f3d7f7ef5d85c9ce78ef05e47d2bbabc40d41a930e0e36db2d443d2610a9e3db9062da2d5c904211 + checksum: 10/7d6e3e4ef4b1cab0f61270d55764709512fdfbcb1bd47c0ef44117d48490529c1f264dacf3440b9188363e99e290b80b79c529eadc3af2184116a90f6856b192 languageName: node linkType: hard @@ -12359,11 +12518,11 @@ __metadata: linkType: hard "@types/jsonwebtoken@npm:^9.0.2": - version: 9.0.6 - resolution: "@types/jsonwebtoken@npm:9.0.6" + version: 9.0.7 + resolution: "@types/jsonwebtoken@npm:9.0.7" dependencies: "@types/node": "npm:*" - checksum: 10/1f2145222f62da1b3dbfc586160c4f9685782a671f4a4f4a72151c773945fe25807fd88ed1c270536b76f49053ed932c5dbf714ea0ed77f785665abb75beef05 + checksum: 10/4c0cffc488ba200765b50004de5e046c55360121a91ad9520d904e303cdd217b3f77b51b6ba8b9cbdd03d73876d546cbd0d9992d6e205d97decba918aee5b395 languageName: node linkType: hard @@ -12397,6 +12556,33 @@ __metadata: languageName: node linkType: hard +"@types/mapbox-gl@npm:>=1.0.0, @types/mapbox-gl@npm:^3.4.0": + version: 3.4.0 + resolution: "@types/mapbox-gl@npm:3.4.0" + dependencies: + "@types/geojson": "npm:*" + checksum: 10/0813c55b81f5b5bf95f18cca1ef56bd9c89cb3370b44115af96fb21b2ba3418e891e63eb2efd09273b4faf3ad72e54fe6d60b810a050fe7f5673d5d10bdc271d + languageName: node + linkType: hard + +"@types/mapbox__point-geometry@npm:*": + version: 0.1.4 + resolution: "@types/mapbox__point-geometry@npm:0.1.4" + checksum: 10/d315f3e396bebd40f1cab682595f3d1c5ac46c5ddb080cf65dfcd0401dc6a3f235a7ac9ada2d28e6c49485fa5f231458f29fee87069e42a137e20e5865801dd1 + languageName: node + linkType: hard + +"@types/mapbox__vector-tile@npm:^1.3.4": + version: 1.3.4 + resolution: "@types/mapbox__vector-tile@npm:1.3.4" + dependencies: + "@types/geojson": "npm:*" + "@types/mapbox__point-geometry": "npm:*" + "@types/pbf": "npm:*" + checksum: 10/5715d9da88a5ecadb63e3ca4d52272ead2c1d63fcf616841932719788e458fc10dd9919ad01aa9c95b15c83e9074dae9ffc7193a7ae4ae7b8436d26630f0e269 + languageName: node + linkType: hard + "@types/markdown-it@npm:^14.1.1": version: 14.1.2 resolution: "@types/markdown-it@npm:14.1.2" @@ -12455,11 +12641,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": - version: 22.5.0 - resolution: "@types/node@npm:22.5.0" + version: 22.5.5 + resolution: "@types/node@npm:22.5.5" dependencies: undici-types: "npm:~6.19.2" - checksum: 10/89af3bd217b1559b645a9ed16d4ae3add75749814cbd8eefddd1b96003d1973afb1c8a2b23d69f3a8cc6c532e3aa185eaf5cc29a6e7c42c311a2aad4c99430ae + checksum: 10/172d02c8e6d921699edcf559c28b3805616bd6481af1b3cb0299f89ad9a6f33b71050434c06ce7b503166054a26275344187c443f99f745d0b12601372452f19 languageName: node linkType: hard @@ -12478,20 +12664,20 @@ __metadata: linkType: hard "@types/node@npm:^18.11.18": - version: 18.19.45 - resolution: "@types/node@npm:18.19.45" + version: 18.19.50 + resolution: "@types/node@npm:18.19.50" dependencies: undici-types: "npm:~5.26.4" - checksum: 10/978fdd68af65c8f8659037ef09456d41ef46a5f688c3b9550cd59266db2c4ac94e65ed7f08d1871ba909e5b7bdf4e8066c5269715a7dd83333aca34dfa6366db + checksum: 10/d238bb877953fcecda830df140f8722b9ba9644ae63e810fe6fa40cab8285c42f9b34c9529f2144a6f8cfeee5b0ff7fefd9425261e41830157d6710d501b829d languageName: node linkType: hard "@types/node@npm:^20.14.2": - version: 20.16.1 - resolution: "@types/node@npm:20.16.1" + version: 20.16.5 + resolution: "@types/node@npm:20.16.5" dependencies: undici-types: "npm:~6.19.2" - checksum: 10/9bae1dffd2094694147a91ebec51dc89a60a607d16d47a0d770320f1a75d3ba58663708fd93c37954a63acb701a4e0fd64245139c57ae810d3ad524e75481d4e + checksum: 10/39a8457149dc17cdea57afc90d4da53182fdb8b958d5bb065a15d123d81d4efa6b51a0de92428d05ead2e63ce07195586f71083401b99cdbcd04662344fbf7a1 languageName: node linkType: hard @@ -12518,17 +12704,24 @@ __metadata: languageName: node linkType: hard +"@types/pbf@npm:*": + version: 3.0.5 + resolution: "@types/pbf@npm:3.0.5" + checksum: 10/9115eb3cc61e535748dd6de98c7a8bd64e02a4052646796013b075fed66fd52a3a2aaae6b75648e9c0361e8ed462a50549ca0af1015e2e48296cd8c31bb54577 + languageName: node + linkType: hard + "@types/prop-types@npm:*": - version: 15.7.12 - resolution: "@types/prop-types@npm:15.7.12" - checksum: 10/ac16cc3d0a84431ffa5cfdf89579ad1e2269549f32ce0c769321fdd078f84db4fbe1b461ed5a1a496caf09e637c0e367d600c541435716a55b1d9713f5035dfe + version: 15.7.13 + resolution: "@types/prop-types@npm:15.7.13" + checksum: 10/8935cad87c683c665d09a055919d617fe951cb3b2d5c00544e3a913f861a2bd8d2145b51c9aa6d2457d19f3107ab40784c40205e757232f6a80cc8b1c815513c languageName: node linkType: hard "@types/qs@npm:*": - version: 6.9.15 - resolution: "@types/qs@npm:6.9.15" - checksum: 10/97d8208c2b82013b618e7a9fc14df6bd40a73e1385ac479b6896bafc7949a46201c15f42afd06e86a05e914f146f495f606b6fb65610cc60cf2e0ff743ec38a2 + version: 6.9.16 + resolution: "@types/qs@npm:6.9.16" + checksum: 10/2e8918150c12735630f7ee16b770c72949274938c30306025f68aaf977227f41fe0c698ed93db1099e04916d582ac5a1faf7e3c7061c8d885d9169f59a184b6c languageName: node linkType: hard @@ -12587,12 +12780,12 @@ __metadata: linkType: hard "@types/react@npm:*": - version: 18.3.4 - resolution: "@types/react@npm:18.3.4" + version: 18.3.8 + resolution: "@types/react@npm:18.3.8" dependencies: "@types/prop-types": "npm:*" csstype: "npm:^3.0.2" - checksum: 10/359973924be42cf9e7366e1d885b28e0b3bd56d31f24458c5351af7a3f2fc070511e90d517b2195fb229146cdcb70342db6318e279c31dd5057beec1105b704e + checksum: 10/75e64e7f481c28e6c8ce6dae12f49ccc3f36c7b10b82da3eb7728ad9c02bec58a2c967105603e38665902e8db9296962c7718bc2062e2cb64a16e92333bd1f4b languageName: node linkType: hard @@ -12748,9 +12941,9 @@ __metadata: linkType: hard "@types/validator@npm:^13.11.1": - version: 13.12.0 - resolution: "@types/validator@npm:13.12.0" - checksum: 10/b3344ef630ff9a3ffab4ce10da268e7be98ca2df9cbd956fb5cac860bd661c7ff6e82e0cdc7b253f037a98cf3b233fff3d04d28330bcd3ca2cafb0c52253976e + version: 13.12.2 + resolution: "@types/validator@npm:13.12.2" + checksum: 10/564f60cfe112b45e1d747245d1f80db999bbc372b2b6a1c5454441b02c3d6bffbfff4365a10c3cd7874197f14ca5779b435794c7600bdcb541da948405a3b21a languageName: node linkType: hard @@ -12867,13 +13060,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.0.0-alpha.30": - version: 8.0.0-alpha.30 - resolution: "@typescript-eslint/scope-manager@npm:8.0.0-alpha.30" +"@typescript-eslint/scope-manager@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/scope-manager@npm:8.6.0" dependencies: - "@typescript-eslint/types": "npm:8.0.0-alpha.30" - "@typescript-eslint/visitor-keys": "npm:8.0.0-alpha.30" - checksum: 10/9ca4c7ef13e3f68b829a8446d8d2bae150d87dd2c2ca3dea44f8bd22056ba6d13c6f69e8d9891712d94410e7e365cef79a4d05fa33bd0665cd96dcfe508c3143 + "@typescript-eslint/types": "npm:8.6.0" + "@typescript-eslint/visitor-keys": "npm:8.6.0" + checksum: 10/4a42020caf1b45f661a2722c60ca3aaec34eb93c39fae71fd7a7d9c7824d2930447ecab1059ed2908e31f9995df37c32e2cb599f0795f01012d6c63847b9e907 languageName: node linkType: hard @@ -12901,10 +13094,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.0.0-alpha.30": - version: 8.0.0-alpha.30 - resolution: "@typescript-eslint/types@npm:8.0.0-alpha.30" - checksum: 10/2cd0ee0258cd0c61aa1475944e4545d7a982e6a6aa7606f1328ff3253fd368ef9799e6dd60a81ec61101214d30f5ee2254abbcdaec2b671352b9cd5908f9cba8 +"@typescript-eslint/types@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/types@npm:8.6.0" + checksum: 10/b89e26ce5aa03be56ad5d261aa28aecf3bab5ba78983ea51630ccaee7c7066489ee7c58fc3f18811c63418c900e69ac2b7d12e206485f45b2331d00d8bdb760f languageName: node linkType: hard @@ -12927,14 +13120,14 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.0.0-alpha.30": - version: 8.0.0-alpha.30 - resolution: "@typescript-eslint/typescript-estree@npm:8.0.0-alpha.30" +"@typescript-eslint/typescript-estree@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.6.0" dependencies: - "@typescript-eslint/types": "npm:8.0.0-alpha.30" - "@typescript-eslint/visitor-keys": "npm:8.0.0-alpha.30" + "@typescript-eslint/types": "npm:8.6.0" + "@typescript-eslint/visitor-keys": "npm:8.6.0" debug: "npm:^4.3.4" - globby: "npm:^11.1.0" + fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" minimatch: "npm:^9.0.4" semver: "npm:^7.6.0" @@ -12942,7 +13135,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/cbd7821fd2500afbb1bcd61afcf39950288c95479112c34dfc4d3d866a261c1816baba22330866873eedc6a37af559e7fcfdac2429438350fd6da1ad11ddba2e + checksum: 10/34b7920e34860d33e38081c3ca9f780890822c6a28e29804ae053a1a618a45d6513c014dcb46480b10a4ba3c3fd2ed4b80ccc6094a50032eb25d68c433b14203 languageName: node linkType: hard @@ -12963,17 +13156,17 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.0.0-alpha.30": - version: 8.0.0-alpha.30 - resolution: "@typescript-eslint/utils@npm:8.0.0-alpha.30" +"@typescript-eslint/utils@npm:^8.3.0": + version: 8.6.0 + resolution: "@typescript-eslint/utils@npm:8.6.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.0.0-alpha.30" - "@typescript-eslint/types": "npm:8.0.0-alpha.30" - "@typescript-eslint/typescript-estree": "npm:8.0.0-alpha.30" + "@typescript-eslint/scope-manager": "npm:8.6.0" + "@typescript-eslint/types": "npm:8.6.0" + "@typescript-eslint/typescript-estree": "npm:8.6.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - checksum: 10/51ad6d641b76aeb14ccb8396eef3e9828413e56b949ab922291f7144c9c019d28ebc11e9b08b9d825abfb45350dedeff4aad501280d4f7508cb8468584048372 + checksum: 10/778caa5767d306d17dea8d648baf158eda4099717fd1067d5362446adb7e51af357d4a9a53430327cc7f0229c69347a3b9b434ab937256fb0b4a0e3458184068 languageName: node linkType: hard @@ -12987,13 +13180,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.0.0-alpha.30": - version: 8.0.0-alpha.30 - resolution: "@typescript-eslint/visitor-keys@npm:8.0.0-alpha.30" +"@typescript-eslint/visitor-keys@npm:8.6.0": + version: 8.6.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.6.0" dependencies: - "@typescript-eslint/types": "npm:8.0.0-alpha.30" + "@typescript-eslint/types": "npm:8.6.0" eslint-visitor-keys: "npm:^3.4.3" - checksum: 10/7700cfd08808b204319a914d6089510626693e12c73ce9a80aa5e10ff459908fad048fb4b3dceedd8fff893817375ed48e69b163cd7beb5fd5edaa34df904077 + checksum: 10/76d94f33d27fd33c324bb5245ec571bede6f5f22e67f0412abccf603402d55df7f46ea05a36b8bdfe6266bb990e3298f5595292c0b8940a149409064605b5ee9 languageName: node linkType: hard @@ -13038,10 +13231,10 @@ __metadata: languageName: node linkType: hard -"@vercel/build-utils@npm:8.3.6": - version: 8.3.6 - resolution: "@vercel/build-utils@npm:8.3.6" - checksum: 10/8f9cc44d447c7b8bcfc6b9ab1ee2db5a221d4c2abde4a2bab4f094c39bf3977f397b973ac8e8795a3425925a89b16bc3769fb9622283a26d1a6d58b408e87449 +"@vercel/build-utils@npm:8.4.2": + version: 8.4.2 + resolution: "@vercel/build-utils@npm:8.4.2" + checksum: 10/a555d873745ac9b34a9ecdb33387551cba15c9eaa4677db93c586639701653c892e3264cec7f5ed5920b7e79ffe5220f2f884f3874190bd30de8e82b7d45aa4e languageName: node linkType: hard @@ -13089,43 +13282,43 @@ __metadata: languageName: node linkType: hard -"@vercel/gatsby-plugin-vercel-builder@npm:2.0.40": - version: 2.0.40 - resolution: "@vercel/gatsby-plugin-vercel-builder@npm:2.0.40" +"@vercel/gatsby-plugin-vercel-builder@npm:2.0.46": + version: 2.0.46 + resolution: "@vercel/gatsby-plugin-vercel-builder@npm:2.0.46" dependencies: "@sinclair/typebox": "npm:0.25.24" - "@vercel/build-utils": "npm:8.3.6" + "@vercel/build-utils": "npm:8.4.2" "@vercel/routing-utils": "npm:3.1.0" esbuild: "npm:0.14.47" etag: "npm:1.8.1" fs-extra: "npm:11.1.0" - checksum: 10/12ba22b1e38a78a2e58961b398f0b2f3028d5c3df12877db3fa8c3352cdca3289b96a24f5252bb89453b03455778ff89a28f2ce56c5b89a657990e7ef87df70f + checksum: 10/1e7e1895484ac960d351a1081d68b463d6d9ea0cb34cc018f8a5abd1cb622fd99f29aef696db3dcaa7fc381b7eef99828cc570b377c6233546d22ba00c65e59f languageName: node linkType: hard -"@vercel/go@npm:3.1.1": - version: 3.1.1 - resolution: "@vercel/go@npm:3.1.1" - checksum: 10/21cd64c4eee186b0a65a3a12e9b2422cd35dc334f55b8f44bd4c6d061b44c4b120a55f020a9318d6355d2708104d140e2992fe2a923bcae8976e35701abe11b7 +"@vercel/go@npm:3.1.3": + version: 3.1.3 + resolution: "@vercel/go@npm:3.1.3" + checksum: 10/fb443f56f43adb0b5eec82daecdacf9607b77607c1d749dc00e79db6a9575b611068efb191d35d42f8cf299d0cb948701507256064700cd84373c9fc0bc0aa15 languageName: node linkType: hard -"@vercel/hydrogen@npm:1.0.4": - version: 1.0.4 - resolution: "@vercel/hydrogen@npm:1.0.4" +"@vercel/hydrogen@npm:1.0.6": + version: 1.0.6 + resolution: "@vercel/hydrogen@npm:1.0.6" dependencies: "@vercel/static-config": "npm:3.0.0" ts-morph: "npm:12.0.0" - checksum: 10/251e3ac085f9578a2ee89d4ee6c60d4d52acf81124ab6dcf4c3da2600d1a30c0db566f1b799057e52e5d871cb4e72d8cbfe6ee21ada8962d283bf013b1c617dc + checksum: 10/5a77a5d624492cf49aa7bdc3b906b746b96358129e17bde218586529e954a4486839ad469537143fa5eb2a54148c124b6ee930a7f79805b32cc2a48fc3b7b637 languageName: node linkType: hard -"@vercel/next@npm:4.3.6": - version: 4.3.6 - resolution: "@vercel/next@npm:4.3.6" +"@vercel/next@npm:4.3.10": + version: 4.3.10 + resolution: "@vercel/next@npm:4.3.10" dependencies: "@vercel/nft": "npm:0.27.3" - checksum: 10/d969255bb02484d82cce5eaee0eb45636b97b83fa3e7c384c73050b09b820a1e0f5e403296211bc8be120f1ac57aafae34911e81ecf66859d249e2e403f42345 + checksum: 10/1902a701298578dc3ee19d35f03a322980c1676c19f22c9d5f735a9a7ae7db09b54a064d9a2f4dd0077a3f673eaf6b9c3155230258eb4f4a9aef4611dcc38912 languageName: node linkType: hard @@ -13151,15 +13344,15 @@ __metadata: languageName: node linkType: hard -"@vercel/node@npm:3.2.8": - version: 3.2.8 - resolution: "@vercel/node@npm:3.2.8" +"@vercel/node@npm:3.2.14": + version: 3.2.14 + resolution: "@vercel/node@npm:3.2.14" dependencies: "@edge-runtime/node-utils": "npm:2.3.0" "@edge-runtime/primitives": "npm:4.1.0" "@edge-runtime/vm": "npm:3.2.0" "@types/node": "npm:16.18.11" - "@vercel/build-utils": "npm:8.3.6" + "@vercel/build-utils": "npm:8.4.2" "@vercel/error-utils": "npm:2.0.2" "@vercel/nft": "npm:0.27.3" "@vercel/static-config": "npm:3.0.0" @@ -13175,7 +13368,7 @@ __metadata: ts-node: "npm:10.9.1" typescript: "npm:4.9.5" undici: "npm:5.28.4" - checksum: 10/164aef23fc6777f766db15f05ca2a2dcc47c414fef6074026faa1b510b6abc2a08d10b093b75a42e333741963c941ad660955e64619745ae64df674a8e7e6267 + checksum: 10/83cdb10306dc080b69bfcb6488fa1ee8b79893ad17a8ecabd0df2532bc89744cfeef5f297d66525fa38abf79ffc6102ee7472ad662bad821e2ecd801f49f9544 languageName: node linkType: hard @@ -13186,28 +13379,28 @@ __metadata: languageName: node linkType: hard -"@vercel/redwood@npm:2.1.3": - version: 2.1.3 - resolution: "@vercel/redwood@npm:2.1.3" +"@vercel/redwood@npm:2.1.5": + version: 2.1.5 + resolution: "@vercel/redwood@npm:2.1.5" dependencies: "@vercel/nft": "npm:0.27.3" "@vercel/routing-utils": "npm:3.1.0" "@vercel/static-config": "npm:3.0.0" semver: "npm:6.3.1" ts-morph: "npm:12.0.0" - checksum: 10/859f3a26170779ee3b212d31f471b5fb737401e2f46f9a3b589d3ae2d4a5170a85b2fd717d092fd5189fe38f73d79949014a18295004d68033102779f8807888 + checksum: 10/2bef7a49afb9a12fc69056f5515ffd74581307783824f88dc2b865ad42a351fe840bdac0c86f5d7036d0bdb0a401cf51ee53a7eef8a994cc949823803d661140 languageName: node linkType: hard -"@vercel/remix-builder@npm:2.2.6": - version: 2.2.6 - resolution: "@vercel/remix-builder@npm:2.2.6" +"@vercel/remix-builder@npm:2.2.9": + version: 2.2.9 + resolution: "@vercel/remix-builder@npm:2.2.9" dependencies: "@vercel/error-utils": "npm:2.0.2" "@vercel/nft": "npm:0.27.3" "@vercel/static-config": "npm:3.0.0" ts-morph: "npm:12.0.0" - checksum: 10/e598ab1c20c6b1833fde087230616d8e7128cfeb0b07434af9f7c5e030f9c484c09650d981965227b32cc13e5a57a798e3d6ea820dc3b4d6aee30e17af2ed634 + checksum: 10/45968e442d6fb0472be61d62a701f8f77887a59ce9aade843f9d6aca6b3ba91f43f52986771179ff93ca7d38a888e1778cb8f9d3e5c024763a7cd5b42f065fe5 languageName: node linkType: hard @@ -13231,15 +13424,15 @@ __metadata: languageName: node linkType: hard -"@vercel/static-build@npm:2.5.18": - version: 2.5.18 - resolution: "@vercel/static-build@npm:2.5.18" +"@vercel/static-build@npm:2.5.24": + version: 2.5.24 + resolution: "@vercel/static-build@npm:2.5.24" dependencies: "@vercel/gatsby-plugin-vercel-analytics": "npm:1.0.11" - "@vercel/gatsby-plugin-vercel-builder": "npm:2.0.40" + "@vercel/gatsby-plugin-vercel-builder": "npm:2.0.46" "@vercel/static-config": "npm:3.0.0" ts-morph: "npm:12.0.0" - checksum: 10/c904978f41c80539bcdf5daf25a97203c8689b013eddadf70483e784764e597382169aa0a561d779ef411d46d0e64db7299ee616e93afe311be623bdb7975ebd + checksum: 10/af5644eeed70417b5245a168ebf63fdadb81e30b1697a5a8ba8400b9246351763d0106eee66071971f5b483aff768fd6d016f8601431093d7467b97869afcca8 languageName: node linkType: hard @@ -13541,14 +13734,14 @@ __metadata: linkType: hard "@whatwg-node/node-fetch@npm:^0.5.23": - version: 0.5.25 - resolution: "@whatwg-node/node-fetch@npm:0.5.25" + version: 0.5.26 + resolution: "@whatwg-node/node-fetch@npm:0.5.26" dependencies: "@kamilkisiela/fast-url-parser": "npm:^1.1.4" busboy: "npm:^1.6.0" fast-querystring: "npm:^1.1.1" tslib: "npm:^2.6.3" - checksum: 10/fd0a8623e7292d0a025c6412bc96388eda598672119abb0f53a0bc183bfefe659e5d4d2576d31202855b3f9e28ad83e7a9f8291fd828e4c22afaff2cd2ee0c1c + checksum: 10/5cc61a1afb71781f5c0755fa3adacb0f71fba981c003cb098bf7d8a948ed687e1f2cd5967c75639429e2082290f23a988cc9ccdf7953b0cead1fb523c9973789 languageName: node linkType: hard @@ -13694,11 +13887,11 @@ __metadata: linkType: hard "acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0, acorn-walk@npm:^8.3.2": - version: 8.3.3 - resolution: "acorn-walk@npm:8.3.3" + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" dependencies: acorn: "npm:^8.11.0" - checksum: 10/59701dcb7070679622ba8e9c7f37577b4935565747ca0fd7c1c3ad30b3f1b1b008276282664e323b5495eb49f77fa12d3816fd06dc68e18f90fbebe759f71450 + checksum: 10/871386764e1451c637bb8ab9f76f4995d408057e9909be6fb5ad68537ae3375d85e6a6f170b98989f44ab3ff6c74ad120bc2779a3d577606e7a0cd2b4efcaf77 languageName: node linkType: hard @@ -13951,9 +14144,9 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 10/1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 10/495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac languageName: node linkType: hard @@ -14035,7 +14228,6 @@ __metadata: "@fortawesome/react-fontawesome": "npm:^0.2.0" "@hookform/resolvers": "npm:^3.3.4" "@packrat/crosspath": "npm:*" - "@packrat/map": "npm:*" "@packrat/ui": "npm:*" "@packrat/validations": "npm:*" "@react-native-async-storage/async-storage": "npm:^1.23.1" @@ -14049,7 +14241,7 @@ __metadata: "@rehookify/datepicker": "npm:^6.6.1" "@rneui/base": "npm:^4.0.0-rc.8" "@rneui/themed": "npm:^4.0.0-rc.8" - "@rnmapbox/maps": "npm:^10.1.29" + "@rnmapbox/maps": "npm:*" "@tamagui/animations-react-native": "npm:1.96.0" "@tamagui/babel-plugin": "npm:1.96.0" "@tamagui/config": "npm:1.96.0" @@ -14076,6 +14268,7 @@ __metadata: "@tsconfig/react-native": "npm:^3.0.2" "@types/jest": "npm:^29.5.11" "@types/lodash": "npm:^4.14.202" + "@types/mapbox-gl": "npm:^3.4.0" "@types/node": "npm:^20.14.2" "@types/papaparse": "npm:^5" "@types/react": "npm:~18.2.55" @@ -14120,11 +14313,12 @@ __metadata: file-saver: "npm:^2.0.5" firebase: "npm:^9.19.1" fuse.js: "npm:^6.6.2" + geojson-bounds: "npm:^1.0.4" immer: "npm:^10.0.3" jotai: "npm:^2.6.4" lodash: "npm:^4.17.21" lucide-react-native: "npm:^0.400.0" - mapbox-gl: "npm:1.13.3" + mapbox-gl: "npm:^3.6.0" moti: "npm:^0.27.2" native-base: "npm:^3.4.28" normalize-css-color: "npm:^1.0.2" @@ -14135,6 +14329,7 @@ __metadata: react-dom: "npm:18.2.0" react-error-boundary: "npm:^4.0.13" react-hook-form: "npm:^7.51.0" + react-map-gl: "npm:^7.1.7" react-native: "npm:0.73.6" react-native-action-button: "npm:^2.8.5" react-native-dotenv: "npm:^3.4.8" @@ -14252,6 +14447,13 @@ __metadata: languageName: node linkType: hard +"arr-union@npm:^3.1.0": + version: 3.1.0 + resolution: "arr-union@npm:3.1.0" + checksum: 10/b5b0408c6eb7591143c394f3be082fee690ddd21f0fdde0a0a01106799e847f67fcae1b7e56b0a0c173290e29c6aca9562e82b300708a268bc8f88f3d6613cb9 + languageName: node + linkType: hard + "array-back@npm:^3.0.1, array-back@npm:^3.1.0": version: 3.1.0 resolution: "array-back@npm:3.1.0" @@ -14283,7 +14485,7 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7, array-includes@npm:^3.1.8": +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": version: 3.1.8 resolution: "array-includes@npm:3.1.8" dependencies: @@ -14341,7 +14543,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.findlastindex@npm:^1.2.3": +"array.prototype.findlastindex@npm:^1.2.5": version: 1.2.5 resolution: "array.prototype.findlastindex@npm:1.2.5" dependencies: @@ -14485,6 +14687,13 @@ __metadata: languageName: node linkType: hard +"assign-symbols@npm:^1.0.0": + version: 1.0.0 + resolution: "assign-symbols@npm:1.0.0" + checksum: 10/c0eb895911d05b6b2d245154f70461c5e42c107457972e5ebba38d48967870dee53bcdf6c7047990586daa80fab8dab3cc6300800fbd47b454247fdedd859a2c + languageName: node + linkType: hard + "ast-types@npm:0.15.2": version: 0.15.2 resolution: "ast-types@npm:0.15.2" @@ -14599,15 +14808,15 @@ __metadata: linkType: hard "awesome-phonenumber@npm:^6.4.0": - version: 6.10.0 - resolution: "awesome-phonenumber@npm:6.10.0" - checksum: 10/f57226177133d3a0f6565de17bb47e902225e12c3bd990766e0f1831b9e52f1a3cfaace6394b1cb55d83575a2b055a0216d3544ed7a7bf2c4d36a5e0199a84cf + version: 6.12.0 + resolution: "awesome-phonenumber@npm:6.12.0" + checksum: 10/b70a433cdc62d5f3cb2a7538d512387a0453f33130f56608a0f6682a528dbb946c7572cde40bd0c3223fbcdcad5576efceeb28b5741b3d3fc4690c3344fe599e languageName: node linkType: hard "aws-sdk@npm:^2.1494.0": - version: 2.1681.0 - resolution: "aws-sdk@npm:2.1681.0" + version: 2.1691.0 + resolution: "aws-sdk@npm:2.1691.0" dependencies: buffer: "npm:4.9.2" events: "npm:1.1.1" @@ -14619,7 +14828,7 @@ __metadata: util: "npm:^0.12.4" uuid: "npm:8.0.0" xml2js: "npm:0.6.2" - checksum: 10/b55aec53468138c7d03adbf1bda2253cb9c0f4230f0e0f642b35b4cf43173723121b23d3d54db65a8f090072802127f9242ffca095a5f18a41322bc644a84712 + checksum: 10/387de8206cc134516aea8d7357a3c9a07317c0976bbc70f346981261fe57130eaecc4b74ca7feddc5c09a588a8cc2bd7d5cf13115c3a9f3ea76ce4c07992cbd8 languageName: node linkType: hard @@ -14631,13 +14840,13 @@ __metadata: linkType: hard "aws4@npm:^1.8.0": - version: 1.13.1 - resolution: "aws4@npm:1.13.1" - checksum: 10/67a501fa36d2d082970b6708663696b406c693042fcf7a177850c92557780674a86fc538a3162db122cc656ae85e8fb895c1d42b399bae53488e6a13839fb65a + version: 1.13.2 + resolution: "aws4@npm:1.13.2" + checksum: 10/290b9f84facbad013747725bfd8b4c42d0b3b04b5620d8418f0219832ef95a7dc597a4af7b1589ae7fce18bacde96f40911c3cda36199dd04d9f8e01f72fa50a languageName: node linkType: hard -"axios@npm:1.7.4, axios@npm:^1.4.0": +"axios@npm:1.7.4": version: 1.7.4 resolution: "axios@npm:1.7.4" dependencies: @@ -14657,6 +14866,17 @@ __metadata: languageName: node linkType: hard +"axios@npm:^1.4.0": + version: 1.7.7 + resolution: "axios@npm:1.7.7" + dependencies: + follow-redirects: "npm:^1.15.6" + form-data: "npm:^4.0.0" + proxy-from-env: "npm:^1.1.0" + checksum: 10/7f875ea13b9298cd7b40fd09985209f7a38d38321f1118c701520939de2f113c4ba137832fe8e3f811f99a38e12c8225481011023209a77b0c0641270e20cde1 + languageName: node + linkType: hard + "babel-code-frame@npm:^6.26.0": version: 6.26.0 resolution: "babel-code-frame@npm:6.26.0" @@ -14834,30 +15054,30 @@ __metadata: linkType: hard "babel-loader@npm:^8.3.0": - version: 8.3.0 - resolution: "babel-loader@npm:8.3.0" + version: 8.4.1 + resolution: "babel-loader@npm:8.4.1" dependencies: find-cache-dir: "npm:^3.3.1" - loader-utils: "npm:^2.0.0" + loader-utils: "npm:^2.0.4" make-dir: "npm:^3.1.0" schema-utils: "npm:^2.6.5" peerDependencies: "@babel/core": ^7.0.0 webpack: ">=2" - checksum: 10/e775e96f605f10d68adc693403ccda2470e856cc52e6017f3621c17dade003d0fc53facfce7b4ada02273a1c0a6a48167f798cc81b73110585d74bf890b39bd5 + checksum: 10/b54ae3796a351e5b5186cd7a8d53a902b679a33a187424c2858e385850142139a4343524c9fddd0eb4356250e51e67e47a9efeef79d01e132976c406212cba1d languageName: node linkType: hard "babel-loader@npm:^9.1.2": - version: 9.1.3 - resolution: "babel-loader@npm:9.1.3" + version: 9.2.1 + resolution: "babel-loader@npm:9.2.1" dependencies: find-cache-dir: "npm:^4.0.0" schema-utils: "npm:^4.0.0" peerDependencies: "@babel/core": ^7.12.0 webpack: ">=5" - checksum: 10/7086e678273b5d1261141dca84ed784caab9f7921c8c24d7278c8ee3088235a9a9fd85caac9f0fa687336cb3c27248ca22dbf431469769b1b995d55aec606992 + checksum: 10/f1f24ae3c22d488630629240b0eba9c935545f82ff843c214e8f8df66e266492b7a3d4cb34ef9c9721fb174ca222e900799951c3fd82199473bc6bac52ec03a3 languageName: node linkType: hard @@ -15690,9 +15910,9 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.2, body-parser@npm:^1.20.2": - version: 1.20.2 - resolution: "body-parser@npm:1.20.2" +"body-parser@npm:1.20.3, body-parser@npm:^1.20.2": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" dependencies: bytes: "npm:3.1.2" content-type: "npm:~1.0.5" @@ -15702,11 +15922,11 @@ __metadata: http-errors: "npm:2.0.0" iconv-lite: "npm:0.4.24" on-finished: "npm:2.4.1" - qs: "npm:6.11.0" + qs: "npm:6.13.0" raw-body: "npm:2.5.2" type-is: "npm:~1.6.18" unpipe: "npm:1.0.0" - checksum: 10/3cf171b82190cf91495c262b073e425fc0d9e25cc2bf4540d43f7e7bbca27d6a9eae65ca367b6ef3993eea261159d9d2ab37ce444e8979323952e12eb3df319a + checksum: 10/8723e3d7a672eb50854327453bed85ac48d045f4958e81e7d470c56bf111f835b97e5b73ae9f6393d0011cc9e252771f46fd281bbabc57d33d3986edf1e6aeca languageName: node linkType: hard @@ -15910,7 +16130,7 @@ __metadata: languageName: node linkType: hard -"bs-logger@npm:0.x": +"bs-logger@npm:^0.2.6": version: 0.2.6 resolution: "bs-logger@npm:0.2.6" dependencies: @@ -16056,8 +16276,8 @@ __metadata: linkType: hard "bull@npm:^4.10.4": - version: 4.16.0 - resolution: "bull@npm:4.16.0" + version: 4.16.3 + resolution: "bull@npm:4.16.3" dependencies: cron-parser: "npm:^4.2.1" get-port: "npm:^5.1.1" @@ -16066,7 +16286,7 @@ __metadata: msgpackr: "npm:^1.10.1" semver: "npm:^7.5.2" uuid: "npm:^8.3.0" - checksum: 10/246b4a639186db3be145dfa7a0b420983946a8b1ac25321e30bf70f8073a0a373028e32c85b00d98cbc307c4f19f231c6487a5c61ae745933e4a2d0546ef8da2 + checksum: 10/04f93aabfe2dbdd21f60cd95d87add04a5e7f60902bbad273127d6845de8711521188f3b36d617334314600b11ad37394cc81665b371b374e539932254f4bdf5 languageName: node linkType: hard @@ -16128,6 +16348,25 @@ __metadata: languageName: node linkType: hard +"bytewise-core@npm:^1.2.2": + version: 1.2.3 + resolution: "bytewise-core@npm:1.2.3" + dependencies: + typewise-core: "npm:^1.2" + checksum: 10/8513f50764abe9430b3b69cabede7bf70f61ca5e6cf61b1deea7344441d4c4666bcfdd2cb52d97f8f7365f20ce4aa5f592c36617ffaaa3a38ec2d3deeefc9423 + languageName: node + linkType: hard + +"bytewise@npm:^1.1.0": + version: 1.1.0 + resolution: "bytewise@npm:1.1.0" + dependencies: + bytewise-core: "npm:^1.2.2" + typewise: "npm:^1.0.3" + checksum: 10/73f09d4257c3cdf1eede4a51ff14c20b3907e639e1e554ecf48e4c5d57f292318b10f520d19f88bae5cce0d5eb01b3dd9129b0e06ff571eacec378e91d6b751d + languageName: node + linkType: hard + "cac@npm:^6.7.14": version: 6.7.14 resolution: "cac@npm:6.7.14" @@ -16310,9 +16549,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001406, caniuse-lite@npm:^1.0.30001646": - version: 1.0.30001651 - resolution: "caniuse-lite@npm:1.0.30001651" - checksum: 10/fe4857b2a91a9cb77993eec9622de68bea0df17c31cb9584ca5c562f64bb3b8fda316d898aa3b1ee3ee9f7d80f6bf13c42acb09d9a56a1a6c64afaf7381472fa + version: 1.0.30001662 + resolution: "caniuse-lite@npm:1.0.30001662" + checksum: 10/275dee3c2365d58c65609e707dfd7454e72195fdae7d3a8fea05f1ddb49581f64dfc65965964ee2cff99cc0af44d08c572437b1effd43e9ddc174d7a1d7f95a3 languageName: node linkType: hard @@ -16437,7 +16676,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.0.1, chalk@npm:^2.1.0, chalk@npm:^2.3.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": +"chalk@npm:^2.0.1, chalk@npm:^2.3.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -16489,6 +16728,13 @@ __metadata: languageName: node linkType: hard +"cheap-ruler@npm:^4.0.0": + version: 4.0.0 + resolution: "cheap-ruler@npm:4.0.0" + checksum: 10/108a66f85322919dcdea10a8cc930416b53e87589a25bd0b81dd79d7f476cb7fafe68ec047f257ad23d299b06d948363dac4d7e8cf08207c3287bd6bc961adc2 + languageName: node + linkType: hard + "check-dependency-version-consistency@npm:^4.1.0": version: 4.1.0 resolution: "check-dependency-version-consistency@npm:4.1.0" @@ -16650,9 +16896,9 @@ __metadata: linkType: hard "cjs-module-lexer@npm:^1.0.0, cjs-module-lexer@npm:^1.2.3": - version: 1.3.1 - resolution: "cjs-module-lexer@npm:1.3.1" - checksum: 10/6629188d5ce74b57e5dce2222db851b5496a8d65b533a05957fb24089a3cec8d769378013c375a954c5a0f7522cde6a36d5a65bfd88f5575cb2de3176046fa8e + version: 1.4.1 + resolution: "cjs-module-lexer@npm:1.4.1" + checksum: 10/6e830a1e00a34d416949bbc1924f3e8da65cef4a6a09e2b7fa35722e2d1c34bf378d3baca987b698d1cbc3eb83e44b044039b4e82755c96f30e0f03d1d227637 languageName: node linkType: hard @@ -17309,13 +17555,6 @@ __metadata: languageName: node linkType: hard -"consola@npm:^3.2.3": - version: 3.2.3 - resolution: "consola@npm:3.2.3" - checksum: 10/02972dcb048c337357a3628438e5976b8e45bcec22fdcfbe9cd17622992953c4d695d5152f141464a02deac769b1d23028e8ac87f56483838df7a6bbf8e0f5a2 - languageName: node - linkType: hard - "console-browserify@npm:^1.1.0": version: 1.2.0 resolution: "console-browserify@npm:1.2.0" @@ -18086,14 +18325,14 @@ __metadata: linkType: hard "debug@npm:4, debug@npm:4.x, debug@npm:^4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5": - version: 4.3.6 - resolution: "debug@npm:4.3.6" + version: 4.3.7 + resolution: "debug@npm:4.3.7" dependencies: - ms: "npm:2.1.2" + ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10/d3adb9af7d57a9e809a68f404490cf776122acca16e6359a2702c0f462e510e91f9765c07f707b8ab0d91e03bad57328f3256f5082631cefb5393d0394d50fb7 + checksum: 10/71168908b9a78227ab29d5d25fe03c5867750e31ce24bf2c44a86efc5af041758bb56569b0a3d48a9b5344c00a24a777e6f4100ed6dfd9534a42c1dde285125a languageName: node linkType: hard @@ -18845,9 +19084,9 @@ __metadata: linkType: hard "dset@npm:^3.1.1, dset@npm:^3.1.2": - version: 3.1.3 - resolution: "dset@npm:3.1.3" - checksum: 10/f3f7096718eeabe1608886364ea02254d5221a4d59d4fb4d2fd2fdf53cccf293d486793a44c894d3a07a916a283d1214e831e423839096d461a38571fc092126 + version: 3.1.4 + resolution: "dset@npm:3.1.4" + checksum: 10/6268c9e2049c8effe6e5a1952f02826e8e32468b5ced781f15f8f3b1c290da37626246fec014fbdd1503413f981dff6abd8a4c718ec9952fd45fccb6ac9de43f languageName: node linkType: hard @@ -18870,6 +19109,13 @@ __metadata: languageName: node linkType: hard +"earcut@npm:^3.0.0": + version: 3.0.0 + resolution: "earcut@npm:3.0.0" + checksum: 10/4f7394a657c9789a1beb1be617d18eccf7fd9e1aa0a37fd4e8927000ece7f715bf126180d1a7ce562be35e2c4812ed7fe852a1bfe8e104ced31dee172173e547 + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -18959,9 +19205,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.5.4": - version: 1.5.13 - resolution: "electron-to-chromium@npm:1.5.13" - checksum: 10/b3de6dbca66e399eacd4f7e2b7603394c8949c9e724d838a45e092725005ff435aabfbf00f738e45451eb23147684f7f9251a5ed75619a539642b2bccea20b45 + version: 1.5.26 + resolution: "electron-to-chromium@npm:1.5.26" + checksum: 10/cae8c6cab2be652e2bedff6d46c06b47c689014fa29fecea4beabc68ef6bd6a60f18a35c13d8001fdca1c4a824bdc4d80e07db202a0e7435aa6bcccc83d54b46 languageName: node linkType: hard @@ -19040,6 +19286,13 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10/abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe + languageName: node + linkType: hard + "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -19139,11 +19392,11 @@ __metadata: linkType: hard "envinfo@npm:^7.10.0, envinfo@npm:^7.13.0": - version: 7.13.0 - resolution: "envinfo@npm:7.13.0" + version: 7.14.0 + resolution: "envinfo@npm:7.14.0" bin: envinfo: dist/cli.js - checksum: 10/450c962053880f46852119cf89f4412cabd6d465ff5b74cf64e74e9da3a27ebd9e901944a5c4b0bf62950ad25025552282cbde6c00a5a9af0980dd001720fcbb + checksum: 10/0d9d711f2b6ae02dec89dd768a3390acbcb99ac50d07f20e635a8d2db68447703476db535483592d1ed4656c3d36eee4883032d71a5118c917b4973e2d4fa027 languageName: node linkType: hard @@ -20554,9 +20807,9 @@ __metadata: linkType: hard "escalade@npm:^3.1.1, escalade@npm:^3.1.2": - version: 3.1.2 - resolution: "escalade@npm:3.1.2" - checksum: 10/a1e07fea2f15663c30e40b9193d658397846ffe28ce0a3e4da0d8e485fedfeca228ab846aee101a05015829adf39f9934ff45b2a3fca47bed37a29646bd05cd3 + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10/9d7169e3965b2f9ae46971afa392f6e5a25545ea30f2e2dd99c9b0a95a3f52b5653681a84f5b2911a413ddad2d7a93d3514165072f349b5ffc59c75a899970d6 languageName: node linkType: hard @@ -20669,15 +20922,15 @@ __metadata: languageName: node linkType: hard -"eslint-module-utils@npm:^2.8.0": - version: 2.8.1 - resolution: "eslint-module-utils@npm:2.8.1" +"eslint-module-utils@npm:^2.9.0": + version: 2.11.0 + resolution: "eslint-module-utils@npm:2.11.0" dependencies: debug: "npm:^3.2.7" peerDependenciesMeta: eslint: optional: true - checksum: 10/3e7892c0a984c963632da56b30ccf8254c29b535467138f91086c2ecdb2ebd10e2be61b54e553f30e5abf1d14d47a7baa0dac890e3a658fd3cd07dca63afbe6d + checksum: 10/1ba42cf48c5f9ec3b76dfa42c16f1c24c10508313689425c05ccb1d0eaa34bdc5c5b9c0c033cd402e9c429666bd3eb8c6d0c66565b0c00949fae743ad3643c95 languageName: node linkType: hard @@ -20704,29 +20957,30 @@ __metadata: linkType: hard "eslint-plugin-import@npm:^2.28.1": - version: 2.29.1 - resolution: "eslint-plugin-import@npm:2.29.1" + version: 2.30.0 + resolution: "eslint-plugin-import@npm:2.30.0" dependencies: - array-includes: "npm:^3.1.7" - array.prototype.findlastindex: "npm:^1.2.3" + "@rtsao/scc": "npm:^1.1.0" + array-includes: "npm:^3.1.8" + array.prototype.findlastindex: "npm:^1.2.5" array.prototype.flat: "npm:^1.3.2" array.prototype.flatmap: "npm:^1.3.2" debug: "npm:^3.2.7" doctrine: "npm:^2.1.0" eslint-import-resolver-node: "npm:^0.3.9" - eslint-module-utils: "npm:^2.8.0" - hasown: "npm:^2.0.0" - is-core-module: "npm:^2.13.1" + eslint-module-utils: "npm:^2.9.0" + hasown: "npm:^2.0.2" + is-core-module: "npm:^2.15.1" is-glob: "npm:^4.0.3" minimatch: "npm:^3.1.2" - object.fromentries: "npm:^2.0.7" - object.groupby: "npm:^1.0.1" - object.values: "npm:^1.1.7" + object.fromentries: "npm:^2.0.8" + object.groupby: "npm:^1.0.3" + object.values: "npm:^1.2.0" semver: "npm:^6.3.1" tsconfig-paths: "npm:^3.15.0" peerDependencies: eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 10/5865f05c38552145423c535326ec9a7113ab2305c7614c8b896ff905cfabc859c8805cac21e979c9f6f742afa333e6f62f812eabf891a7e8f5f0b853a32593c1 + checksum: 10/a5f85dfe76e27286c28a01d137769726ce3f758bcc03aa6b6f9e18700a40a08f57239f82e07efcab763c4b03a02d425edcc29fbecf40aad0124286978c6bc63c languageName: node linkType: hard @@ -20820,17 +21074,17 @@ __metadata: linkType: hard "eslint-plugin-react-refresh@npm:^0.4.5": - version: 0.4.11 - resolution: "eslint-plugin-react-refresh@npm:0.4.11" + version: 0.4.12 + resolution: "eslint-plugin-react-refresh@npm:0.4.12" peerDependencies: eslint: ">=7" - checksum: 10/876c1b972d962748a5c6f79ec2ed5add3a17d769c319eb5e67a98aa810fafe7591cf9767e155cd16cd5a5f9ba454ec06c52b6d216d9e469378da165eacf025be + checksum: 10/448d0a387ca4d7913534ac7bee3e7b8708236a6cef4cccf9a50e739d6d3c8d236cdbd7e360ea643c7767092a93acf30a8e5fac91f05b175c45d20ce138947bcc languageName: node linkType: hard "eslint-plugin-react@npm:^7.33.2": - version: 7.35.0 - resolution: "eslint-plugin-react@npm:7.35.0" + version: 7.36.1 + resolution: "eslint-plugin-react@npm:7.36.1" dependencies: array-includes: "npm:^3.1.8" array.prototype.findlast: "npm:^1.2.5" @@ -20852,7 +21106,7 @@ __metadata: string.prototype.repeat: "npm:^1.0.0" peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - checksum: 10/fa0a54f9ea249cf89d92bb5983bf7df741da3709a0ebd6a885a67d05413ed302fd8b64c9dc819b33df8efa6d8b06f5e56b1f6965a9be7cc3e79054da4dbae5ed + checksum: 10/bca154b446c35af4859a92fd043dcfe5c74851eb27652234020548570bb81d37cc9f1eb1795b3c9e7514de6c9b48f42fcc00153062eca879dab45ab84e49d0b1 languageName: node linkType: hard @@ -20884,14 +21138,14 @@ __metadata: linkType: hard "eslint@npm:^8.56.0": - version: 8.57.0 - resolution: "eslint@npm:8.57.0" + version: 8.57.1 + resolution: "eslint@npm:8.57.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.6.1" "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.0" - "@humanwhocodes/config-array": "npm:^0.11.14" + "@eslint/js": "npm:8.57.1" + "@humanwhocodes/config-array": "npm:^0.13.0" "@humanwhocodes/module-importer": "npm:^1.0.1" "@nodelib/fs.walk": "npm:^1.2.8" "@ungap/structured-clone": "npm:^1.2.0" @@ -20927,7 +21181,7 @@ __metadata: text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: 10/00496e218b23747a7a9817bf58b522276d0dc1f2e546dceb4eea49f9871574088f72f1f069a6b560ef537efa3a75261b8ef70e51ef19033da1cc4c86a755ef15 + checksum: 10/5504fa24879afdd9f9929b2fbfc2ee9b9441a3d464efd9790fbda5f05738858530182029f13323add68d19fec749d3ab4a70320ded091ca4432b1e9cc4ed104c languageName: node linkType: hard @@ -21686,12 +21940,12 @@ __metadata: languageName: node linkType: hard -"expo-modules-core@npm:1.11.13": - version: 1.11.13 - resolution: "expo-modules-core@npm:1.11.13" +"expo-modules-core@npm:1.11.14": + version: 1.11.14 + resolution: "expo-modules-core@npm:1.11.14" dependencies: invariant: "npm:^2.2.4" - checksum: 10/47bb33281d0a5025ab25ecdfdfda1ae8c8daa159fd90b2a6ef8505a8fd361ec6b0d68d576320e20bd2abb715eb3541b36e1f31fcfe2182091b30f1ee800895c7 + checksum: 10/526356959265e4854f44744f537db4ef5581f28eb036ed9ccd8c7ab784ea9e780c0581e1aafd93f9cdf7aef42af55de8b5f2a5e3c9002ca67905b473b5b1223e languageName: node linkType: hard @@ -21828,8 +22082,8 @@ __metadata: linkType: hard "expo@npm:^50.0.14": - version: 50.0.20 - resolution: "expo@npm:50.0.20" + version: 50.0.21 + resolution: "expo@npm:50.0.21" dependencies: "@babel/runtime": "npm:^7.20.0" "@expo/cli": "npm:0.17.13" @@ -21843,12 +22097,12 @@ __metadata: expo-font: "npm:~11.10.3" expo-keep-awake: "npm:~12.8.2" expo-modules-autolinking: "npm:1.10.3" - expo-modules-core: "npm:1.11.13" + expo-modules-core: "npm:1.11.14" fbemitter: "npm:^3.0.0" whatwg-url-without-unicode: "npm:8.0.0-3" bin: expo: bin/cli - checksum: 10/4572b0b4a16c3451b21a5f5fed0a509a7411fad85624dec04965a0f67868b2bb0d6ef62575d8459a6d71510c91a4b3935a985b02ceb0a16c22715a0dbc1ef866 + checksum: 10/baab92fd9b2b20c0dec795030f8ee51f3d6cb225709d4bfa20fb583bd1cea38e02d9601dbc520e711fb439e420b567517ac121bb8fb8e79c539df6311561af79 languageName: node linkType: hard @@ -21876,41 +22130,41 @@ __metadata: linkType: hard "express@npm:^4.17.3, express@npm:^4.18.2, express@npm:^4.19.2": - version: 4.19.2 - resolution: "express@npm:4.19.2" + version: 4.21.0 + resolution: "express@npm:4.21.0" dependencies: accepts: "npm:~1.3.8" array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.2" + body-parser: "npm:1.20.3" content-disposition: "npm:0.5.4" content-type: "npm:~1.0.4" cookie: "npm:0.6.0" cookie-signature: "npm:1.0.6" debug: "npm:2.6.9" depd: "npm:2.0.0" - encodeurl: "npm:~1.0.2" + encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" etag: "npm:~1.8.1" - finalhandler: "npm:1.2.0" + finalhandler: "npm:1.3.1" fresh: "npm:0.5.2" http-errors: "npm:2.0.0" - merge-descriptors: "npm:1.0.1" + merge-descriptors: "npm:1.0.3" methods: "npm:~1.1.2" on-finished: "npm:2.4.1" parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.7" + path-to-regexp: "npm:0.1.10" proxy-addr: "npm:~2.0.7" - qs: "npm:6.11.0" + qs: "npm:6.13.0" range-parser: "npm:~1.2.1" safe-buffer: "npm:5.2.1" - send: "npm:0.18.0" - serve-static: "npm:1.15.0" + send: "npm:0.19.0" + serve-static: "npm:1.16.2" setprototypeof: "npm:1.2.0" statuses: "npm:2.0.1" type-is: "npm:~1.6.18" utils-merge: "npm:1.0.1" vary: "npm:~1.1.2" - checksum: 10/3fcd792536f802c059789ef48db3851b87e78fba103423e524144d79af37da7952a2b8d4e1a007f423329c7377d686d9476ac42e7d9ea413b80345d495e30a3a + checksum: 10/3b1ee5bc5b1bd996f688702519cebc9b63a24e506965f6e1773268238cfa2c24ffdb38cc3fcb4fde66f77de1c0bebd9ee058dad06bb9c6f084b525f3c09164d3 languageName: node linkType: hard @@ -21923,6 +22177,25 @@ __metadata: languageName: node linkType: hard +"extend-shallow@npm:^2.0.1": + version: 2.0.1 + resolution: "extend-shallow@npm:2.0.1" + dependencies: + is-extendable: "npm:^0.1.0" + checksum: 10/8fb58d9d7a511f4baf78d383e637bd7d2e80843bd9cd0853649108ea835208fb614da502a553acc30208e1325240bb7cc4a68473021612496bb89725483656d8 + languageName: node + linkType: hard + +"extend-shallow@npm:^3.0.0": + version: 3.0.2 + resolution: "extend-shallow@npm:3.0.2" + dependencies: + assign-symbols: "npm:^1.0.0" + is-extendable: "npm:^1.0.1" + checksum: 10/a920b0cd5838a9995ace31dfd11ab5e79bf6e295aa566910ce53dff19f4b1c0fda2ef21f26b28586c7a2450ca2b42d97bd8c0f5cec9351a819222bf861e02461 + languageName: node + linkType: hard + "extend@npm:^3.0.2, extend@npm:~3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" @@ -22077,14 +22350,14 @@ __metadata: languageName: node linkType: hard -"fast-xml-parser@npm:^4.0.12, fast-xml-parser@npm:^4.2.2, fast-xml-parser@npm:^4.2.4": - version: 4.4.1 - resolution: "fast-xml-parser@npm:4.4.1" +"fast-xml-parser@npm:^4.0.12, fast-xml-parser@npm:^4.2.2, fast-xml-parser@npm:^4.2.4, fast-xml-parser@npm:^4.4.1": + version: 4.5.0 + resolution: "fast-xml-parser@npm:4.5.0" dependencies: strnum: "npm:^1.0.5" bin: fxparser: src/cli/cli.js - checksum: 10/0c05ab8703630d8c857fafadbd78d0020d3a8e54310c3842179cd4a0d9d97e96d209ce885e91241f4aa9dd8dfc2fd924a682741a423d65153cad34da2032ec44 + checksum: 10/dc9571c10e7b57b5be54bcd2d92f50c446eb42ea5df347d253e94dd14eb99b5300a6d172e840f151e0721933ca2406165a8d9b316a6d777bf0596dc4fe1df756 languageName: node linkType: hard @@ -22272,28 +22545,27 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:1.2.0": - version: 1.2.0 - resolution: "finalhandler@npm:1.2.0" +"finalhandler@npm:1.3.1": + version: 1.3.1 + resolution: "finalhandler@npm:1.3.1" dependencies: debug: "npm:2.6.9" - encodeurl: "npm:~1.0.2" + encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" on-finished: "npm:2.4.1" parseurl: "npm:~1.3.3" statuses: "npm:2.0.1" unpipe: "npm:~1.0.0" - checksum: 10/635718cb203c6d18e6b48dfbb6c54ccb08ea470e4f474ddcef38c47edcf3227feec316f886dd701235997d8af35240cae49856721ce18f539ad038665ebbf163 + checksum: 10/4babe72969b7373b5842bc9f75c3a641a4d0f8eb53af6b89fa714d4460ce03fb92b28de751d12ba415e96e7e02870c436d67412120555e2b382640535697305b languageName: node linkType: hard "find-babel-config@npm:^2.1.1": - version: 2.1.1 - resolution: "find-babel-config@npm:2.1.1" + version: 2.1.2 + resolution: "find-babel-config@npm:2.1.2" dependencies: json5: "npm:^2.2.3" - path-exists: "npm:^4.0.0" - checksum: 10/a3e632a93ba2286b01f1273b90a1ef36e8d53351489817cbec500aa43169cc795122e788f4059c9876e5111dc587be65e46f3a2c9fed9161f21e754821b222d3 + checksum: 10/f0fae1a9125a379cf660fc1b5ca7c1fc1edac5f47e521a89e4c2b92865c8e57101a9152ee503eef9f33e16f196182f2cff03d7768b7caf5eef81c80f1c124a2f languageName: node linkType: hard @@ -22398,16 +22670,6 @@ __metadata: languageName: node linkType: hard -"find-yarn-workspace-root2@npm:1.2.16": - version: 1.2.16 - resolution: "find-yarn-workspace-root2@npm:1.2.16" - dependencies: - micromatch: "npm:^4.0.2" - pkg-dir: "npm:^4.2.0" - checksum: 10/398aa473ac245d9c9e9af5a75806b5a6828bd9a759f138faf4666f00c5fcb78af679d43f5cfbe73fe667cf6ec3ef6c9e157b09400181e5b9edc3adc47080e9bb - languageName: node - linkType: hard - "find-yarn-workspace-root@npm:^2.0.0, find-yarn-workspace-root@npm:~2.0.0": version: 2.0.0 resolution: "find-yarn-workspace-root@npm:2.0.0" @@ -22516,9 +22778,9 @@ __metadata: linkType: hard "flow-parser@npm:0.*": - version: 0.244.0 - resolution: "flow-parser@npm:0.244.0" - checksum: 10/77b4b38f461c561c43cee2c7c81b6adc5a21c42a6da6e071ab566d8b68d8ff8f2e958217e73e005aa30ae28bffa9c268e386f6c7a7a568b6ff0f6e06f416e6d9 + version: 0.246.0 + resolution: "flow-parser@npm:0.246.0" + checksum: 10/db5c6c268478debf66e6f52cb565728c28c05acf56548e5300705bdc8884a0eaede374a6ee89b5d5346282c8be148ce283a91e4009f1f4d09e2d17c4558a2ad6 languageName: node linkType: hard @@ -22530,8 +22792,8 @@ __metadata: linkType: hard "flow-remove-types@npm:^2.137.0": - version: 2.244.0 - resolution: "flow-remove-types@npm:2.244.0" + version: 2.246.0 + resolution: "flow-remove-types@npm:2.246.0" dependencies: hermes-parser: "npm:0.23.1" pirates: "npm:^3.0.2" @@ -22539,7 +22801,7 @@ __metadata: bin: flow-node: flow-node flow-remove-types: flow-remove-types - checksum: 10/72a4358926b9e8972ed7c247018779a29d4926ba0a4b5677512fa9ea89c311da56f6e1393a5b0bed88bb25a6ed265e1e6c916a705f89c9b7266c2ce00047ee55 + checksum: 10/35e846f02d68ed7750c8cdd249a4bada714a2e6ca6d9d084e792369859b2c974bd5661000e78049358b3e7340fba1b9c10b8053653293fdc6747bb0f320b68eb languageName: node linkType: hard @@ -22551,12 +22813,12 @@ __metadata: linkType: hard "follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" peerDependenciesMeta: debug: optional: true - checksum: 10/70c7612c4cab18e546e36b991bbf8009a1a41cf85354afe04b113d1117569abf760269409cb3eb842d9f7b03d62826687086b081c566ea7b1e6613cf29030bf7 + checksum: 10/e3ab42d1097e90d28b913903841e6779eb969b62a64706a3eb983e894a5db000fbd89296f45f08885a0e54cd558ef62e81be1165da9be25a6c44920da10f424c languageName: node linkType: hard @@ -22678,8 +22940,8 @@ __metadata: linkType: hard "foxact@npm:^0.2.33": - version: 0.2.37 - resolution: "foxact@npm:0.2.37" + version: 0.2.38 + resolution: "foxact@npm:0.2.38" dependencies: client-only: "npm:^0.0.1" server-only: "npm:^0.0.1" @@ -22688,7 +22950,7 @@ __metadata: peerDependenciesMeta: react: optional: true - checksum: 10/69e22b12dce93f41d239f98bd174b1ddfba6e442c55a6cc4d42a2186b6ecedc821e62caee74fa07e3647f3f6d18b3ee9efd2b8cdcac1acd23b2c167b12adeef2 + checksum: 10/3a904ff5feca46d0ead899e3454f334bfc9603ac0cd652241f489fd60b7fde130230b8086a9677b031293029499917bfbb5cc363df72106ce7111b78c0bf2588 languageName: node linkType: hard @@ -22866,7 +23128,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": +"fsevents@npm:2.3.3, fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -22895,7 +23157,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": +"fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin, fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -23013,6 +23275,15 @@ __metadata: languageName: node linkType: hard +"geojson-bounds@npm:^1.0.4": + version: 1.0.4 + resolution: "geojson-bounds@npm:1.0.4" + dependencies: + "@types/geojson": "npm:^7946.0.7" + checksum: 10/3d77eba033c34b3697db7ca58a16b3a7a7cfc733a7d7b3de7fed3dffab0402349b59805c3eb818cb23702e326345c668936a75ec9ce251ae12c52798d8db13fb + languageName: node + linkType: hard + "geojson-numeric@npm:0.2.1": version: 0.2.1 resolution: "geojson-numeric@npm:0.2.1" @@ -23045,6 +23316,13 @@ __metadata: languageName: node linkType: hard +"geojson-vt@npm:^4.0.2": + version: 4.0.2 + resolution: "geojson-vt@npm:4.0.2" + checksum: 10/2a9e1894321184c48612221b4649d8cc5afa972962ee21b91c09b9d85d9076777164cce6f1d438d0bfb0c7d6b4713f518cf0501de210127f9a601e316197eb91 + languageName: node + linkType: hard + "get-caller-file@npm:^1.0.1": version: 1.0.3 resolution: "get-caller-file@npm:1.0.3" @@ -23175,11 +23453,18 @@ __metadata: linkType: hard "get-tsconfig@npm:^4.5.0, get-tsconfig@npm:^4.6.2, get-tsconfig@npm:^4.7.0, get-tsconfig@npm:^4.7.5": - version: 4.7.6 - resolution: "get-tsconfig@npm:4.7.6" + version: 4.8.1 + resolution: "get-tsconfig@npm:4.8.1" dependencies: resolve-pkg-maps: "npm:^1.0.0" - checksum: 10/32da95a89f3ddbabd2a2e36f2a4add51a5e3c2b28f32e3c81494fcdbd43b7d9b42baea77784e62d10f87bb564c5ee908416aabf4c5ca9cdbb2950aa3c247f124 + checksum: 10/3fb5a8ad57b9633eaea085d81661e9e5c9f78b35d8f8689eaf8b8b45a2a3ebf3b3422266d4d7df765e308cc1e6231648d114803ab3d018332e29916f2c1de036 + languageName: node + linkType: hard + +"get-value@npm:^2.0.2, get-value@npm:^2.0.6": + version: 2.0.6 + resolution: "get-value@npm:2.0.6" + checksum: 10/5c3b99cb5398ea8016bf46ff17afc5d1d286874d2ad38ca5edb6e87d75c0965b0094cb9a9dddef2c59c23d250702323539a7fbdd870620db38c7e7d7ec87c1eb languageName: node linkType: hard @@ -23199,7 +23484,7 @@ __metadata: languageName: node linkType: hard -"gl-matrix@npm:^3.2.1": +"gl-matrix@npm:^3.2.1, gl-matrix@npm:^3.4.3": version: 3.4.3 resolution: "gl-matrix@npm:3.4.3" checksum: 10/25ca2f7c762b7547cf462614ac7e0b98cffb131899f014e60a7e50395f4e9304efbb31dc73921e5af2a355cff663bee984d2710765f6730853e90d1c54d5d8e3 @@ -23827,13 +24112,6 @@ __metadata: languageName: node linkType: hard -"hermes-estree@npm:0.23.0": - version: 0.23.0 - resolution: "hermes-estree@npm:0.23.0" - checksum: 10/b9d20564b620b888596d2c2f6306766b081e77c1a8fbe1cec9d67bf706e606e6197dc5049a1130822f7e1951a5fee78464fb4831c42626708aa0a3eb504860c9 - languageName: node - linkType: hard - "hermes-estree@npm:0.23.1": version: 0.23.1 resolution: "hermes-estree@npm:0.23.1" @@ -23868,15 +24146,6 @@ __metadata: languageName: node linkType: hard -"hermes-parser@npm:0.23.0": - version: 0.23.0 - resolution: "hermes-parser@npm:0.23.0" - dependencies: - hermes-estree: "npm:0.23.0" - checksum: 10/733616f0b13485254886a661bef7e8cb85fabd4a9d9d2e68858c5a6a4cc92c61c14de698a30860b1c57257ee784041dbc6eb0ec244b1764e47c9cafdec230926 - languageName: node - linkType: hard - "hermes-parser@npm:0.23.1": version: 0.23.1 resolution: "hermes-parser@npm:0.23.1" @@ -23923,9 +24192,9 @@ __metadata: linkType: hard "hono@npm:^4.1.4, hono@npm:^4.2.7": - version: 4.5.8 - resolution: "hono@npm:4.5.8" - checksum: 10/1d071a827fb9562a008955dd24bdde8cd6575890120b8cf7276cdda2a58735487666807927a99f57d0e43304202c2c493daefb5eaf4683fcb3eed9d4190a0ccc + version: 4.6.2 + resolution: "hono@npm:4.6.2" + checksum: 10/adc1622f0e66c8795bbd8bdc1033f75bd094ab73d205d6c9e0644c62c0e11538718d5bacc36dbd4f285baf95901bbb9a2b8226c3e39b7237d043376d6ff71e30 languageName: node linkType: hard @@ -24717,7 +24986,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.12.1, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1": +"is-core-module@npm:^2.12.1, is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1": version: 2.15.1 resolution: "is-core-module@npm:2.15.1" dependencies: @@ -24760,6 +25029,22 @@ __metadata: languageName: node linkType: hard +"is-extendable@npm:^0.1.0, is-extendable@npm:^0.1.1": + version: 0.1.1 + resolution: "is-extendable@npm:0.1.1" + checksum: 10/3875571d20a7563772ecc7a5f36cb03167e9be31ad259041b4a8f73f33f885441f778cee1f1fe0085eb4bc71679b9d8c923690003a36a6a5fdf8023e6e3f0672 + languageName: node + linkType: hard + +"is-extendable@npm:^1.0.1": + version: 1.0.1 + resolution: "is-extendable@npm:1.0.1" + dependencies: + is-plain-object: "npm:^2.0.4" + checksum: 10/db07bc1e9de6170de70eff7001943691f05b9d1547730b11be01c0ebfe67362912ba743cf4be6fd20a5e03b4180c685dad80b7c509fe717037e3eee30ad8e84f + languageName: node + linkType: hard + "is-extglob@npm:^1.0.0": version: 1.0.0 resolution: "is-extglob@npm:1.0.0" @@ -24963,7 +25248,7 @@ __metadata: languageName: node linkType: hard -"is-plain-object@npm:^2.0.4": +"is-plain-object@npm:^2.0.3, is-plain-object@npm:^2.0.4": version: 2.0.4 resolution: "is-plain-object@npm:2.0.4" dependencies: @@ -25843,8 +26128,8 @@ __metadata: linkType: hard "jotai@npm:^2.6.4": - version: 2.9.3 - resolution: "jotai@npm:2.9.3" + version: 2.10.0 + resolution: "jotai@npm:2.10.0" peerDependencies: "@types/react": ">=17.0.0" react: ">=17.0.0" @@ -25853,7 +26138,7 @@ __metadata: optional: true react: optional: true - checksum: 10/4366a50be8edd39f1430ac655677e559cfbb253101e4f2e750bca8ebd81e75ea09ea3828bce727482b15305ffe924dda75bd9a055e903e0cc804b6600478dc36 + checksum: 10/a79e374ef0e748a6f6fea8f9199f754128c13c8c78beae5d2d2466d521dcbcfe3df3272da93c87a0157f6b77283d3cc0e9bf876d2e8d83270bf1b5f44b81730f languageName: node linkType: hard @@ -25894,7 +26179,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^3.13.0, js-yaml@npm:^3.13.1, js-yaml@npm:^3.6.1": +"js-yaml@npm:^3.13.1, js-yaml@npm:^3.6.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" dependencies: @@ -26144,6 +26429,13 @@ __metadata: languageName: node linkType: hard +"json-stringify-pretty-compact@npm:^3.0.0": + version: 3.0.0 + resolution: "json-stringify-pretty-compact@npm:3.0.0" + checksum: 10/bf2cfb77e5eedb38c2a3c5ff2b8680e05a6073209bd54176640e90c2bc49c9eb798c8c6a3267216981291f8e3a6b82c996bfae71c155cbfd51eb3f998eeea482 + languageName: node + linkType: hard + "json-stringify-safe@npm:^5.0.1, json-stringify-safe@npm:~5.0.1": version: 5.0.1 resolution: "json-stringify-safe@npm:5.0.1" @@ -26355,6 +26647,13 @@ __metadata: languageName: node linkType: hard +"kdbush@npm:^4.0.2": + version: 4.0.2 + resolution: "kdbush@npm:4.0.2" + checksum: 10/ca1f7a106c129056044ab19851909efcc33680d568066872de996d3bc4d41f81d2a6423e577f20436d1a8b96a6f3c514af8cb94cc54a4d784d9df976b43066f8 + languageName: node + linkType: hard + "keyv@npm:^4.5.3": version: 4.5.4 resolution: "keyv@npm:4.5.4" @@ -26769,12 +27068,12 @@ __metadata: linkType: hard "launch-editor@npm:^2.6.0": - version: 2.8.1 - resolution: "launch-editor@npm:2.8.1" + version: 2.9.1 + resolution: "launch-editor@npm:2.9.1" dependencies: picocolors: "npm:^1.0.0" shell-quote: "npm:^1.8.1" - checksum: 10/69adfc913c066b0bcd685103907525789db6af3585cdc5f8c1172f0fcebe2c4ea1cff1108f76e9c591c00134329a5fb29e5911e9c0c347618a5300978b6bb767 + checksum: 10/69eb1e69db4f0fcd34a42bd47e9adbad27cb5413408fcc746eb7b016128ce19d71a30629534b17aa5886488936aaa959bf7dab17307ad5ed6c7247a0d145be18 languageName: node linkType: hard @@ -27034,18 +27333,6 @@ __metadata: languageName: node linkType: hard -"load-yaml-file@npm:^0.2.0": - version: 0.2.0 - resolution: "load-yaml-file@npm:0.2.0" - dependencies: - graceful-fs: "npm:^4.1.5" - js-yaml: "npm:^3.13.0" - pify: "npm:^4.0.1" - strip-bom: "npm:^3.0.0" - checksum: 10/b1bfa7e80114933e43ccc1cf3772582b7e13c8a71dc8d560de2aeecdabf545014daf8a5afabe634c1e9f71c75f6f8528bbd944c9cbbbdf2ab8c927118bd48fd2 - languageName: node - linkType: hard - "loader-runner@npm:^4.1.0, loader-runner@npm:^4.2.0": version: 4.3.0 resolution: "loader-runner@npm:4.3.0" @@ -27230,7 +27517,7 @@ __metadata: languageName: node linkType: hard -"lodash.memoize@npm:4.x, lodash.memoize@npm:^4.1.2": +"lodash.memoize@npm:^4.1.2": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" checksum: 10/192b2168f310c86f303580b53acf81ab029761b9bd9caa9506a019ffea5f3363ea98d7e39e7e11e6b9917066c9d36a09a11f6fe16f812326390d8f3a54a1a6da @@ -27534,7 +27821,7 @@ __metadata: languageName: node linkType: hard -"make-error@npm:1.x, make-error@npm:^1.1.1": +"make-error@npm:^1.1.1, make-error@npm:^1.3.6": version: 1.3.6 resolution: "make-error@npm:1.3.6" checksum: 10/b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 @@ -27623,6 +27910,41 @@ __metadata: languageName: node linkType: hard +"mapbox-gl@npm:^3.6.0": + version: 3.6.0 + resolution: "mapbox-gl@npm:3.6.0" + dependencies: + "@mapbox/jsonlint-lines-primitives": "npm:^2.0.2" + "@mapbox/mapbox-gl-supported": "npm:^3.0.0" + "@mapbox/point-geometry": "npm:^0.1.0" + "@mapbox/tiny-sdf": "npm:^2.0.6" + "@mapbox/unitbezier": "npm:^0.0.1" + "@mapbox/vector-tile": "npm:^1.3.1" + "@mapbox/whoots-js": "npm:^3.1.0" + "@types/geojson": "npm:^7946.0.14" + "@types/mapbox__vector-tile": "npm:^1.3.4" + cheap-ruler: "npm:^4.0.0" + csscolorparser: "npm:~1.0.3" + earcut: "npm:^3.0.0" + fflate: "npm:^0.8.1" + geojson-vt: "npm:^4.0.2" + gl-matrix: "npm:^3.4.3" + grid-index: "npm:^1.1.0" + kdbush: "npm:^4.0.2" + murmurhash-js: "npm:^1.0.0" + pbf: "npm:^3.2.1" + potpack: "npm:^2.0.0" + quickselect: "npm:^3.0.0" + rw: "npm:^1.3.3" + serialize-to-js: "npm:^3.1.2" + supercluster: "npm:^8.0.1" + tinyqueue: "npm:^3.0.0" + tweakpane: "npm:^4.0.4" + vt-pbf: "npm:^3.1.3" + checksum: 10/7b4796f253a2251544ffc76f5a8d2e938ff44ecf5f9af512941accbb2e60e513079d2157564f7a341deb023960c17a2921accc4f6af593773937f91c3df6ab63 + languageName: node + linkType: hard + "markdown-it-anchor@npm:^8.6.7": version: 8.6.7 resolution: "markdown-it-anchor@npm:8.6.7" @@ -27868,10 +28190,10 @@ __metadata: languageName: node linkType: hard -"merge-descriptors@npm:1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: 10/5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 10/52117adbe0313d5defa771c9993fe081e2d2df9b840597e966aadafde04ae8d0e3da46bac7ca4efc37d4d2b839436582659cd49c6a43eacb3fe3050896a105d1 languageName: node linkType: hard @@ -27905,68 +28227,68 @@ __metadata: languageName: node linkType: hard -"metro-babel-transformer@npm:0.80.10": - version: 0.80.10 - resolution: "metro-babel-transformer@npm:0.80.10" +"metro-babel-transformer@npm:0.80.12": + version: 0.80.12 + resolution: "metro-babel-transformer@npm:0.80.12" dependencies: "@babel/core": "npm:^7.20.0" flow-enums-runtime: "npm:^0.0.6" - hermes-parser: "npm:0.23.0" + hermes-parser: "npm:0.23.1" nullthrows: "npm:^1.1.1" - checksum: 10/084b01c04ef6b33e69c80b31229dfb13f92393457d874bb9957364e7d23d633009c73af42984223c49630f5eb387a8d7c8ae7129738f46702284069a334ac3f6 + checksum: 10/3912367e269df3ac697d67541d56fed86ab6fc40ce1aa107b8f332402c7a84a3d0991e536897d4877bab2b1986dd21ec7fad0c76704a27c1c2edce0bcf9037a9 languageName: node linkType: hard -"metro-cache-key@npm:0.80.10": - version: 0.80.10 - resolution: "metro-cache-key@npm:0.80.10" +"metro-cache-key@npm:0.80.12": + version: 0.80.12 + resolution: "metro-cache-key@npm:0.80.12" dependencies: flow-enums-runtime: "npm:^0.0.6" - checksum: 10/2ec891ae0817b2bfde69a936c488432c93352c0aba0ea23e51111e5812130f0a6be870beca50ee221ba48b4f04c5e2479f86b55fd8fef056344c9a4f8b3a5453 + checksum: 10/7a06601180604361339d19eb833d61b79cc188a4e6ebe73188cc10fbf3a33e711d74c81d1d19a14b6581bd9dfeebe1b253684360682d033ab55909c9995b6a18 languageName: node linkType: hard -"metro-cache@npm:0.80.10": - version: 0.80.10 - resolution: "metro-cache@npm:0.80.10" +"metro-cache@npm:0.80.12": + version: 0.80.12 + resolution: "metro-cache@npm:0.80.12" dependencies: exponential-backoff: "npm:^3.1.1" flow-enums-runtime: "npm:^0.0.6" - metro-core: "npm:0.80.10" - checksum: 10/66f76c3dfbd1fb6fbf692524076c889dba4e73af79bff83433239e664e106d0a228b4c6fa4d981d11a64a8cc155275ded3281b972ef40e10df8c4db25ef0b5fe + metro-core: "npm:0.80.12" + checksum: 10/914b599ad4f8a2538e6f4788b3da722aa855688affef3002fe374a0a1cb7dd36ad9224d1ef83f7c17610ebb290cea3cb545bfd67100a216b7bbb3f26f8982c93 languageName: node linkType: hard -"metro-config@npm:0.80.10, metro-config@npm:^0.80.3": - version: 0.80.10 - resolution: "metro-config@npm:0.80.10" +"metro-config@npm:0.80.12, metro-config@npm:^0.80.3": + version: 0.80.12 + resolution: "metro-config@npm:0.80.12" dependencies: connect: "npm:^3.6.5" cosmiconfig: "npm:^5.0.5" flow-enums-runtime: "npm:^0.0.6" jest-validate: "npm:^29.6.3" - metro: "npm:0.80.10" - metro-cache: "npm:0.80.10" - metro-core: "npm:0.80.10" - metro-runtime: "npm:0.80.10" - checksum: 10/b1b647126411a5bf6c104b4735821c1b2c36d46bcb45f9c29551afa09bcb178fa6eb27f872475e9e2a021c3b791fbe963463d4884332c3b6e9597eed68ea3297 + metro: "npm:0.80.12" + metro-cache: "npm:0.80.12" + metro-core: "npm:0.80.12" + metro-runtime: "npm:0.80.12" + checksum: 10/2d11745d32e8992b78159c275dc54b08bf258871f274634f9824540f1ec80a9b1a9d7eb5493b52078a5a68cccd4fd688cd846dd0802aea2f065b5588e98eb146 languageName: node linkType: hard -"metro-core@npm:0.80.10, metro-core@npm:^0.80.3": - version: 0.80.10 - resolution: "metro-core@npm:0.80.10" +"metro-core@npm:0.80.12, metro-core@npm:^0.80.3": + version: 0.80.12 + resolution: "metro-core@npm:0.80.12" dependencies: flow-enums-runtime: "npm:^0.0.6" lodash.throttle: "npm:^4.1.1" - metro-resolver: "npm:0.80.10" - checksum: 10/cbc55269050cb21bb90a07a9ac020162000090f5750681ab3961051c200c7bebe2d747747f790e16b31b56e91b4bb706dff8ee4913e62b383e8a931a566adc97 + metro-resolver: "npm:0.80.12" + checksum: 10/d29ab20df4d19c1d8c5178f7b182e050c659f022ab2adc669504c7ef7fd5d76cdde02936d1599e6d6137e353cbf4fef6b3cfa6aaf217bca954fc23cbf1b61f18 languageName: node linkType: hard -"metro-file-map@npm:0.80.10": - version: 0.80.10 - resolution: "metro-file-map@npm:0.80.10" +"metro-file-map@npm:0.80.12": + version: 0.80.12 + resolution: "metro-file-map@npm:0.80.12" dependencies: anymatch: "npm:^3.0.3" debug: "npm:^2.2.0" @@ -27983,17 +28305,17 @@ __metadata: dependenciesMeta: fsevents: optional: true - checksum: 10/9bb2ee7d878174d2b5898f14bcb2e5efea01f6252017b37cff9d4f344efbbacbd3e9b4ef7852699849891e5a2de90540742eee512594deeb0876653e66506a75 + checksum: 10/a0c06da7c89bfbbe17adadb46470274e2e1ffee43126a08f665db230d7831c6195410ea7165f94182e18a27359e140fc8272d2271c04bf0286a1ea95106a3758 languageName: node linkType: hard -"metro-minify-terser@npm:0.80.10": - version: 0.80.10 - resolution: "metro-minify-terser@npm:0.80.10" +"metro-minify-terser@npm:0.80.12": + version: 0.80.12 + resolution: "metro-minify-terser@npm:0.80.12" dependencies: flow-enums-runtime: "npm:^0.0.6" terser: "npm:^5.15.0" - checksum: 10/c9cc5bb0f84eade735428bd27ca225424c74cf91ed898baf7b173c74f08c898fd599f450e09bfc92fff4a5da6f52ef48ad62eeeb7bc9bef24ea1bcb25c0ab937 + checksum: 10/ff527b3f04c5814db139e55ceb7689aaaf0af5c7fbb0eb5d4a6f22044932dfb10bd385d388fa7b352acd03a2d078edaf43a6b5cd11cbc87a7c5502a34fc12735 languageName: node linkType: hard @@ -28061,62 +28383,62 @@ __metadata: languageName: node linkType: hard -"metro-resolver@npm:0.80.10": - version: 0.80.10 - resolution: "metro-resolver@npm:0.80.10" +"metro-resolver@npm:0.80.12": + version: 0.80.12 + resolution: "metro-resolver@npm:0.80.12" dependencies: flow-enums-runtime: "npm:^0.0.6" - checksum: 10/30de0cd5c92890e46e5269a389e62e02c06737526ce165dfc27cd38c1b8ae6d68a1af1e940cd4579e01f93bee9001aad51a133b6091930f29861f041d965c547 + checksum: 10/e8609f1b93f1bbe7a9f97dd3fa2a6669c0a51f8360fea9a73e528fc25615f7ef61bd8ad9feb9a52fdbf4405a4065195f053183626f3ab56f54225ebefee574ac languageName: node linkType: hard -"metro-runtime@npm:0.80.10, metro-runtime@npm:^0.80.3": - version: 0.80.10 - resolution: "metro-runtime@npm:0.80.10" +"metro-runtime@npm:0.80.12, metro-runtime@npm:^0.80.3": + version: 0.80.12 + resolution: "metro-runtime@npm:0.80.12" dependencies: - "@babel/runtime": "npm:^7.0.0" + "@babel/runtime": "npm:^7.25.0" flow-enums-runtime: "npm:^0.0.6" - checksum: 10/67e39385d011a31ace27637b925e43a6facf7a59bb5a17053fb4d4328030c11fbc7a76b4e9e6e903b5544dd4ebe810c7a53c65e290993a6d2274af0578ee04ae + checksum: 10/8a09e7001bd54331c50145d02e6a2b67589da4dd0da3ff1cdb83e6ce161b9079e2a52a4722db8f222b46f666e3dbfe1fc59ee7c277325763a162e3d27ba81d38 languageName: node linkType: hard -"metro-source-map@npm:0.80.10, metro-source-map@npm:^0.80.3": - version: 0.80.10 - resolution: "metro-source-map@npm:0.80.10" +"metro-source-map@npm:0.80.12, metro-source-map@npm:^0.80.3": + version: 0.80.12 + resolution: "metro-source-map@npm:0.80.12" dependencies: "@babel/traverse": "npm:^7.20.0" "@babel/types": "npm:^7.20.0" flow-enums-runtime: "npm:^0.0.6" invariant: "npm:^2.2.4" - metro-symbolicate: "npm:0.80.10" + metro-symbolicate: "npm:0.80.12" nullthrows: "npm:^1.1.1" - ob1: "npm:0.80.10" + ob1: "npm:0.80.12" source-map: "npm:^0.5.6" vlq: "npm:^1.0.0" - checksum: 10/296c30a740b369f05a44a9a6f40f76d9712ae8fdabcf2a414a68af2268907c8d688bec71779fa18752a8a62398787b21941defebf0829128ff23004d4dca00da + checksum: 10/ad6e0cf7f4d2727ecb45a082b4ab92915df8c574de0a905023a53e501a32f619aaeb0f94645aca048ae322176600867f5f21119349261427a2de27cb27ef0ef1 languageName: node linkType: hard -"metro-symbolicate@npm:0.80.10": - version: 0.80.10 - resolution: "metro-symbolicate@npm:0.80.10" +"metro-symbolicate@npm:0.80.12": + version: 0.80.12 + resolution: "metro-symbolicate@npm:0.80.12" dependencies: flow-enums-runtime: "npm:^0.0.6" invariant: "npm:^2.2.4" - metro-source-map: "npm:0.80.10" + metro-source-map: "npm:0.80.12" nullthrows: "npm:^1.1.1" source-map: "npm:^0.5.6" through2: "npm:^2.0.1" vlq: "npm:^1.0.0" bin: metro-symbolicate: src/index.js - checksum: 10/727f070f3bef692fd8f71ba7bc5a5e4618dd0247032e7fb24ce682195da3a8f9626ed48b90eed6a04a2e41a32964d87a39c9522cc132980b5e2bd70f57176ce6 + checksum: 10/0c1dd055691bd670fb73a146f7e2fa3235a5afa3135996e681384676a439e10c9efe398d5b07d588907adbfbf65228829ceb57dab2c19a61eb79dde60bb7dc31 languageName: node linkType: hard -"metro-transform-plugins@npm:0.80.10": - version: 0.80.10 - resolution: "metro-transform-plugins@npm:0.80.10" +"metro-transform-plugins@npm:0.80.12": + version: 0.80.12 + resolution: "metro-transform-plugins@npm:0.80.12" dependencies: "@babel/core": "npm:^7.20.0" "@babel/generator": "npm:^7.20.0" @@ -28124,34 +28446,34 @@ __metadata: "@babel/traverse": "npm:^7.20.0" flow-enums-runtime: "npm:^0.0.6" nullthrows: "npm:^1.1.1" - checksum: 10/ad343ec8a7f718ac9dc271601ff4de88d81c1fbec62b8bd6414ffa79e3f4fdc799b8d69e19dff3f25f009ff6fb5fcf42e1cc04711473d76d55c4d83c7d1a1c48 + checksum: 10/801510bde9cb70ba47572c3d5d42f98fc2ee173a48ca39893cbdeb689de54d5a1fea5383ba4fe388f334af06ecb651e5634b5e7611223e217668c98f8666c913 languageName: node linkType: hard -"metro-transform-worker@npm:0.80.10": - version: 0.80.10 - resolution: "metro-transform-worker@npm:0.80.10" +"metro-transform-worker@npm:0.80.12": + version: 0.80.12 + resolution: "metro-transform-worker@npm:0.80.12" dependencies: "@babel/core": "npm:^7.20.0" "@babel/generator": "npm:^7.20.0" "@babel/parser": "npm:^7.20.0" "@babel/types": "npm:^7.20.0" flow-enums-runtime: "npm:^0.0.6" - metro: "npm:0.80.10" - metro-babel-transformer: "npm:0.80.10" - metro-cache: "npm:0.80.10" - metro-cache-key: "npm:0.80.10" - metro-minify-terser: "npm:0.80.10" - metro-source-map: "npm:0.80.10" - metro-transform-plugins: "npm:0.80.10" + metro: "npm:0.80.12" + metro-babel-transformer: "npm:0.80.12" + metro-cache: "npm:0.80.12" + metro-cache-key: "npm:0.80.12" + metro-minify-terser: "npm:0.80.12" + metro-source-map: "npm:0.80.12" + metro-transform-plugins: "npm:0.80.12" nullthrows: "npm:^1.1.1" - checksum: 10/bdeed9c4629247dd17201431c627364804feff12cd9d69382ee84f67f9c160ef2a06e2b4bb90b0ccd012086531568b0fe1f26b5bdf661d7fb05f4335b6724642 + checksum: 10/a0802ebbc308a3bd6c81f9a1c640c62a8918f4d4e73da2184d24be10014ce6bc1cef53c0ef6a59568ecc0d0d44d43e38ec595d4abda043f93072613261074371 languageName: node linkType: hard -"metro@npm:0.80.10, metro@npm:^0.80.3": - version: 0.80.10 - resolution: "metro@npm:0.80.10" +"metro@npm:0.80.12, metro@npm:^0.80.3": + version: 0.80.12 + resolution: "metro@npm:0.80.12" dependencies: "@babel/code-frame": "npm:^7.0.0" "@babel/core": "npm:^7.20.0" @@ -28169,26 +28491,25 @@ __metadata: error-stack-parser: "npm:^2.0.6" flow-enums-runtime: "npm:^0.0.6" graceful-fs: "npm:^4.2.4" - hermes-parser: "npm:0.23.0" + hermes-parser: "npm:0.23.1" image-size: "npm:^1.0.2" invariant: "npm:^2.2.4" jest-worker: "npm:^29.6.3" jsc-safe-url: "npm:^0.2.2" lodash.throttle: "npm:^4.1.1" - metro-babel-transformer: "npm:0.80.10" - metro-cache: "npm:0.80.10" - metro-cache-key: "npm:0.80.10" - metro-config: "npm:0.80.10" - metro-core: "npm:0.80.10" - metro-file-map: "npm:0.80.10" - metro-resolver: "npm:0.80.10" - metro-runtime: "npm:0.80.10" - metro-source-map: "npm:0.80.10" - metro-symbolicate: "npm:0.80.10" - metro-transform-plugins: "npm:0.80.10" - metro-transform-worker: "npm:0.80.10" + metro-babel-transformer: "npm:0.80.12" + metro-cache: "npm:0.80.12" + metro-cache-key: "npm:0.80.12" + metro-config: "npm:0.80.12" + metro-core: "npm:0.80.12" + metro-file-map: "npm:0.80.12" + metro-resolver: "npm:0.80.12" + metro-runtime: "npm:0.80.12" + metro-source-map: "npm:0.80.12" + metro-symbolicate: "npm:0.80.12" + metro-transform-plugins: "npm:0.80.12" + metro-transform-worker: "npm:0.80.12" mime-types: "npm:^2.1.27" - node-fetch: "npm:^2.2.0" nullthrows: "npm:^1.1.1" serialize-error: "npm:^2.1.0" source-map: "npm:^0.5.6" @@ -28198,7 +28519,7 @@ __metadata: yargs: "npm:^17.6.2" bin: metro: src/cli.js - checksum: 10/e3e5d3b10d03b807a64e0ea223d6c400b99387af16db00b17c41707ed8a9d37c75d7e63f5504b66bf78d906c78fbee2a9c30bc045646766fa78bca34d4b85bc6 + checksum: 10/b44280b16d3671be97d11327a9fe0bb2db014a6dcedaab9e88d58696a8133246ef7f8290e9fac0841534872132bbc0d7132745b02f3584339c0999d9e7a58c10 languageName: node linkType: hard @@ -28226,12 +28547,12 @@ __metadata: linkType: hard "micromatch@npm:^4.0.2, micromatch@npm:^4.0.4": - version: 4.0.7 - resolution: "micromatch@npm:4.0.7" + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" dependencies: braces: "npm:^3.0.3" picomatch: "npm:^2.3.1" - checksum: 10/a11ed1cb67dcbbe9a5fc02c4062cf8bb0157d73bf86956003af8dcfdf9b287f9e15ec0f6d6925ff6b8b5b496202335e497b01de4d95ef6cf06411bc5e5c474a0 + checksum: 10/6bf2a01672e7965eb9941d1f02044fad2bd12486b5553dc1116ff24c09a8723157601dc992e74c911d896175918448762df3b3fd0a6b61037dd1a9766ddfbf58 languageName: node linkType: hard @@ -28435,31 +28756,9 @@ __metadata: languageName: node linkType: hard -"miniflare@npm:3.20240821.0, miniflare@npm:^3.20231218.1": - version: 3.20240821.0 - resolution: "miniflare@npm:3.20240821.0" - dependencies: - "@cspotcode/source-map-support": "npm:0.8.1" - acorn: "npm:^8.8.0" - acorn-walk: "npm:^8.2.0" - capnp-ts: "npm:^0.7.0" - exit-hook: "npm:^2.2.1" - glob-to-regexp: "npm:^0.4.1" - stoppable: "npm:^1.1.0" - undici: "npm:^5.28.4" - workerd: "npm:1.20240821.1" - ws: "npm:^8.17.1" - youch: "npm:^3.2.2" - zod: "npm:^3.22.3" - bin: - miniflare: bootstrap.js - checksum: 10/2238fcadcad427b7bdf6e7e05f43983bfc3598ce4946cb880082e60ed8a1fe5a724b94e6ebc6d9ef4846ef9f14ac65f65c9d2d63396e463755b35d2967dbad98 - languageName: node - linkType: hard - -"miniflare@npm:3.20240821.1": - version: 3.20240821.1 - resolution: "miniflare@npm:3.20240821.1" +"miniflare@npm:3.20240909.4, miniflare@npm:^3.20231218.1": + version: 3.20240909.4 + resolution: "miniflare@npm:3.20240909.4" dependencies: "@cspotcode/source-map-support": "npm:0.8.1" acorn: "npm:^8.8.0" @@ -28469,13 +28768,13 @@ __metadata: glob-to-regexp: "npm:^0.4.1" stoppable: "npm:^1.1.0" undici: "npm:^5.28.4" - workerd: "npm:1.20240821.1" + workerd: "npm:1.20240909.0" ws: "npm:^8.17.1" youch: "npm:^3.2.2" zod: "npm:^3.22.3" bin: miniflare: bootstrap.js - checksum: 10/ed6945094d714474fb88a157597148d447440c3dd581e08395da8046c9d2958c402976a017b2172981af517c5dd74b635103682a50e971ce4e565f73b89535b0 + checksum: 10/befa30ddfa5d08aa171b298d8b43bb6aa10570c847bc082d54b857fa2caf625e1daad9b255ff75aaa8658482b9d8993d51584c10de17d0e78d61ae9dd0d22282 languageName: node linkType: hard @@ -28558,7 +28857,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0, minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10/908491b6cc15a6c440ba5b22780a0ba89b9810e1aea684e253e43c4e3b8d56ec1dcdd7ea96dde119c29df59c936cde16062159eae4225c691e19c70b432b6e6f @@ -29221,19 +29520,19 @@ __metadata: linkType: hard "next@npm:^13.5.2": - version: 13.5.6 - resolution: "next@npm:13.5.6" - dependencies: - "@next/env": "npm:13.5.6" - "@next/swc-darwin-arm64": "npm:13.5.6" - "@next/swc-darwin-x64": "npm:13.5.6" - "@next/swc-linux-arm64-gnu": "npm:13.5.6" - "@next/swc-linux-arm64-musl": "npm:13.5.6" - "@next/swc-linux-x64-gnu": "npm:13.5.6" - "@next/swc-linux-x64-musl": "npm:13.5.6" - "@next/swc-win32-arm64-msvc": "npm:13.5.6" - "@next/swc-win32-ia32-msvc": "npm:13.5.6" - "@next/swc-win32-x64-msvc": "npm:13.5.6" + version: 13.5.7 + resolution: "next@npm:13.5.7" + dependencies: + "@next/env": "npm:13.5.7" + "@next/swc-darwin-arm64": "npm:13.5.7" + "@next/swc-darwin-x64": "npm:13.5.7" + "@next/swc-linux-arm64-gnu": "npm:13.5.7" + "@next/swc-linux-arm64-musl": "npm:13.5.7" + "@next/swc-linux-x64-gnu": "npm:13.5.7" + "@next/swc-linux-x64-musl": "npm:13.5.7" + "@next/swc-win32-arm64-msvc": "npm:13.5.7" + "@next/swc-win32-ia32-msvc": "npm:13.5.7" + "@next/swc-win32-x64-msvc": "npm:13.5.7" "@swc/helpers": "npm:0.5.2" busboy: "npm:1.6.0" caniuse-lite: "npm:^1.0.30001406" @@ -29271,18 +29570,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10/ec6defc7958b575d93306a2dcb05b7b14e27474e226ec350f412d03832407a5ae7139c21f7c7437b93cca2c8a79d7197c468308d82a903b2a86d579f84ccac9f - languageName: node - linkType: hard - -"nice-napi@npm:^1.0.2": - version: 1.0.2 - resolution: "nice-napi@npm:1.0.2" - dependencies: - node-addon-api: "npm:^3.0.0" - node-gyp: "npm:latest" - node-gyp-build: "npm:^4.2.2" - conditions: "!os=win32" + checksum: 10/c50b1f475b51e1e9cfd400be5af4b17342042e057e4d000e4a46ed1f5c58f7a27548d50955e72d62398ddbf5e58a21457712308940a236186c8726e14f90b0a5 languageName: node linkType: hard @@ -29328,15 +29616,6 @@ __metadata: languageName: node linkType: hard -"node-addon-api@npm:^3.0.0": - version: 3.2.1 - resolution: "node-addon-api@npm:3.2.1" - dependencies: - node-gyp: "npm:latest" - checksum: 10/681b52dfa3e15b0a8e5cf283cc0d8cd5fd2a57c559ae670fcfd20544cbb32f75de7648674110defcd17ab2c76ebef630aa7d2d2f930bc7a8cc439b20fe233518 - languageName: node - linkType: hard - "node-dir@npm:^0.1.17": version: 0.1.17 resolution: "node-dir@npm:0.1.17" @@ -29371,13 +29650,6 @@ __metadata: languageName: node linkType: hard -"node-fetch-native@npm:^1.6.4": - version: 1.6.4 - resolution: "node-fetch-native@npm:1.6.4" - checksum: 10/39c4c6d0c2a4bed1444943e1647ad0d79eb6638cf159bc37dffeafd22cffcf6a998e006aa1f3dd1d9d2258db7d78dee96b44bee4ba0bbaf0440ed348794f2543 - languageName: node - linkType: hard - "node-fetch@npm:2.6.7": version: 2.6.7 resolution: "node-fetch@npm:2.6.7" @@ -29452,13 +29724,13 @@ __metadata: linkType: hard "node-gyp-build@npm:^4.2.2": - version: 4.8.1 - resolution: "node-gyp-build@npm:4.8.1" + version: 4.8.2 + resolution: "node-gyp-build@npm:4.8.2" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: 10/b9297770f96a92e5f2b854f3fd5e4bd418df81d7785a81ab60cec5cf2e5e72dc2c3319808978adc572cfa3885e6b12338cb5f4034bed2cab35f0d76a4b75ccdf + checksum: 10/e3a365eed7a2d950864a1daa34527588c16fe43ae189d0aeb8fd1dfec91ba42a0e1b499322bff86c2832029fec4f5901bf26e32005e1e17a781dcd5177b6a657 languageName: node linkType: hard @@ -29523,8 +29795,8 @@ __metadata: linkType: hard "node-stdlib-browser@npm:^1.2.0": - version: 1.2.0 - resolution: "node-stdlib-browser@npm:1.2.0" + version: 1.2.1 + resolution: "node-stdlib-browser@npm:1.2.1" dependencies: assert: "npm:^2.0.0" browser-resolve: "npm:^2.0.0" @@ -29550,10 +29822,10 @@ __metadata: string_decoder: "npm:^1.0.0" timers-browserify: "npm:^2.0.4" tty-browserify: "npm:0.0.1" - url: "npm:^0.11.0" + url: "npm:^0.11.4" util: "npm:^0.12.4" vm-browserify: "npm:^1.0.1" - checksum: 10/3872da5954722fc8e8267bb58af0dbe36a85b2003e55e63e191f7cc38baf2cbff530bea42c809dfeaa0ad70c0977d0b862b4a515ad90902c1db39ff2179f9b71 + checksum: 10/0990a187ef469b60b757ef63295dc12c5825225c1ff3ac62ccea242dd653fe971b5b754cbbc157cad90779c4139e56b28e5cae0eccd45cee309863f8053203d1 languageName: node linkType: hard @@ -29599,15 +29871,15 @@ __metadata: linkType: hard "nodemailer@npm:^6.9.1": - version: 6.9.14 - resolution: "nodemailer@npm:6.9.14" - checksum: 10/749d1a3ef440d6147c37ad850f5be065d55d87cd46a4470372d4e443593838a5ddd78c69623817a804ddede3212fa28ac069b5b8266e892b27e1dcff75103def + version: 6.9.15 + resolution: "nodemailer@npm:6.9.15" + checksum: 10/16079406fe603f6e4debb8ac34bdb919688ad169ddf61e7b10e56abef85b537762eb3a19a15ce32bb9446d68e2f93a1ba4e24836ba86c7363fc42145aa36a291 languageName: node linkType: hard "nodemon@npm:^3.0.1": - version: 3.1.4 - resolution: "nodemon@npm:3.1.4" + version: 3.1.6 + resolution: "nodemon@npm:3.1.6" dependencies: chokidar: "npm:^3.5.2" debug: "npm:^4" @@ -29621,7 +29893,7 @@ __metadata: undefsafe: "npm:^2.0.5" bin: nodemon: bin/nodemon.js - checksum: 10/2e54d3d7b8522d46b27c2537361c57a1b29ae01d1b67e558d316d284c5fc319b5267a0dcaa10821a6533a4b6ff604ac66d37e192ed4a89e794cb441b7d5a2fe1 + checksum: 10/83a28596531741413f468d32339f054b105f7f960566427ba583a6d37f193af49cedeaa2587ee154d7c20c174129c77f65b515a9ad3d0a26ffb77b94a2c5a177 languageName: node linkType: hard @@ -29892,12 +30164,12 @@ __metadata: languageName: node linkType: hard -"ob1@npm:0.80.10": - version: 0.80.10 - resolution: "ob1@npm:0.80.10" +"ob1@npm:0.80.12": + version: 0.80.12 + resolution: "ob1@npm:0.80.12" dependencies: flow-enums-runtime: "npm:^0.0.6" - checksum: 10/1f07c817681f312a32ccffbf758482f70605d0d386c894284476923fb8153f2bae474482ff796eef04855dad0678eabfda0808613270605ffeef290621b37a7b + checksum: 10/c78af51d6ecf47ba5198bc7eb27d0456a287589533f1445e6d595e2d067f6f8038da02a98e5faa4a6c3d0c04f77c570bc9b29c652fec55518884c40c73212f17 languageName: node linkType: hard @@ -29962,7 +30234,7 @@ __metadata: languageName: node linkType: hard -"object.fromentries@npm:^2.0.7, object.fromentries@npm:^2.0.8": +"object.fromentries@npm:^2.0.8": version: 2.0.8 resolution: "object.fromentries@npm:2.0.8" dependencies: @@ -29974,7 +30246,7 @@ __metadata: languageName: node linkType: hard -"object.groupby@npm:^1.0.1": +"object.groupby@npm:^1.0.3": version: 1.0.3 resolution: "object.groupby@npm:1.0.3" dependencies: @@ -29985,7 +30257,7 @@ __metadata: languageName: node linkType: hard -"object.values@npm:^1.1.6, object.values@npm:^1.1.7, object.values@npm:^1.2.0": +"object.values@npm:^1.1.6, object.values@npm:^1.2.0": version: 1.2.0 resolution: "object.values@npm:1.2.0" dependencies: @@ -30011,9 +30283,9 @@ __metadata: linkType: hard "ohash@npm:^1.1.3": - version: 1.1.3 - resolution: "ohash@npm:1.1.3" - checksum: 10/80a3528285f61588600c8c4f091a67f55fbc141f4eec4b3c30182468053042eef5a9684780e963f98a71ec068f3de56d42920c6417bf8f79ab14aeb75ac0bb39 + version: 1.1.4 + resolution: "ohash@npm:1.1.4" + checksum: 10/b11445234e59c9c2b00f357f8f00b6ba00e14c84fc0a232cdc14eb1d80066479b09d27af0201631e84b7a15ba7c4a1939f4cc47f2030e9bf83c9e8afc3ff7dfd languageName: node linkType: hard @@ -30137,8 +30409,8 @@ __metadata: linkType: hard "openai@npm:^4.19.0": - version: 4.56.0 - resolution: "openai@npm:4.56.0" + version: 4.62.1 + resolution: "openai@npm:4.62.1" dependencies: "@types/node": "npm:^18.11.18" "@types/node-fetch": "npm:^2.6.4" @@ -30154,7 +30426,7 @@ __metadata: optional: true bin: openai: bin/cli - checksum: 10/aa56629db58a94e2c27e09a0de72e511f207e4cae5aa15b65eaf9c905105fee8356a631bae88e7737c655b19f2e5bb3ad37ca1c1b33fe3f6932ff961f26b46ca + checksum: 10/806bed30a935f54cc992cd8306fa47b674c7682c419fe5d423cb8cc00983fe8c046df3cfff8337b3ba9a6c55ff5cc4f390fc5e8f91874f7385bcbee9cd9abeb8 languageName: node linkType: hard @@ -30582,6 +30854,13 @@ __metadata: languageName: node linkType: hard +"package-manager-detector@npm:^0.2.0": + version: 0.2.0 + resolution: "package-manager-detector@npm:0.2.0" + checksum: 10/5a361717e7de78ca055de0ae99c368c338631ef9f52867ab7788b81862aeb016916abb0a0d37e7c0117d62b0ad954ec942ab228790eaa8d30cace4edb2819763 + languageName: node + linkType: hard + "package-manager-manager@npm:^0.2.0": version: 0.2.0 resolution: "package-manager-manager@npm:0.2.0" @@ -30910,10 +31189,10 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:0.1.7": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 10/701c99e1f08e3400bea4d701cf6f03517474bb1b608da71c78b1eb261415b645c5670dfae49808c89e12cea2dccd113b069f040a80de012da0400191c6dbd1c8 +"path-to-regexp@npm:0.1.10": + version: 0.1.10 + resolution: "path-to-regexp@npm:0.1.10" + checksum: 10/894e31f1b20e592732a87db61fff5b95c892a3fe430f9ab18455ebe69ee88ef86f8eb49912e261f9926fc53da9f93b46521523e33aefd9cb0a7b0d85d7096006 languageName: node linkType: hard @@ -30924,10 +31203,10 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:3.2.0": - version: 3.2.0 - resolution: "path-to-regexp@npm:3.2.0" - checksum: 10/3c86811e0d69719e20908ed6457b6f51d0d66ffc526e04d259cddea5fd777c7b967adb60907658b7e1a98cb7bf1bbbbad3523337a676c98513fd76a7b513075e +"path-to-regexp@npm:3.3.0": + version: 3.3.0 + resolution: "path-to-regexp@npm:3.3.0" + checksum: 10/8d256383af8db66233ee9027cfcbf8f5a68155efbb4f55e784279d3ab206dcaee554ddb72ff0dae97dd2882af9f7fa802634bb7cffa2e796927977e31b829259 languageName: node linkType: hard @@ -30946,18 +31225,18 @@ __metadata: linkType: hard "path-to-regexp@npm:^1.0.0": - version: 1.8.0 - resolution: "path-to-regexp@npm:1.8.0" + version: 1.9.0 + resolution: "path-to-regexp@npm:1.9.0" dependencies: isarray: "npm:0.0.1" - checksum: 10/45a01690f72919163cf89714e31a285937b14ad54c53734c826363fcf7beba9d9d0f2de802b4986b1264374562d6a3398a2e5289753a764e3a256494f1e52add + checksum: 10/67f0f4823f7aab356523d93a83f9f8222bdd119fa0b27a8f8b587e8e6c9825294bb4ccd16ae619def111ff3fe5d15ff8f658cdd3b0d58b9c882de6fd15bc1b76 languageName: node linkType: hard -"path-to-regexp@npm:^6.2.0": - version: 6.2.2 - resolution: "path-to-regexp@npm:6.2.2" - checksum: 10/f7d11c1a9e02576ce0294f4efdc523c11b73894947afdf7b23a0d0f7c6465d7a7772166e770ddf1495a8017cc0ee99e3e8a15ed7302b6b948b89a6dd4eea895e +"path-to-regexp@npm:^6.2.0, path-to-regexp@npm:^6.3.0": + version: 6.3.0 + resolution: "path-to-regexp@npm:6.3.0" + checksum: 10/6822f686f01556d99538b350722ef761541ec0ce95ca40ce4c29e20a5b492fe8361961f57993c71b2418de12e604478dcf7c430de34b2c31a688363a7a944d9c languageName: node linkType: hard @@ -31068,10 +31347,10 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": - version: 1.0.1 - resolution: "picocolors@npm:1.0.1" - checksum: 10/fa68166d1f56009fc02a34cdfd112b0dd3cf1ef57667ac57281f714065558c01828cdf4f18600ad6851cbe0093952ed0660b1e0156bddf2184b6aaf5817553a5 +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0": + version: 1.1.0 + resolution: "picocolors@npm:1.1.0" + checksum: 10/a2ad60d94d185c30f2a140b19c512547713fb89b920d32cc6cf658fa786d63a37ba7b8451872c3d9fc34883971fb6e5878e07a20b60506e0bb2554dce9169ccb languageName: node linkType: hard @@ -31186,14 +31465,14 @@ __metadata: linkType: hard "piscina@npm:^4.0.0": - version: 4.6.1 - resolution: "piscina@npm:4.6.1" + version: 4.7.0 + resolution: "piscina@npm:4.7.0" dependencies: - nice-napi: "npm:^1.0.2" + "@napi-rs/nice": "npm:^1.0.1" dependenciesMeta: - nice-napi: + "@napi-rs/nice": optional: true - checksum: 10/2fa88a92c030667a85c793253b57faf17ef043f0a1fa14011a80c5784bd8773876f0b12da11fd41da8f9974fe3bc84987c2f016c406c58c92fcb6164b63ad971 + checksum: 10/d4a7dc3d9ae849248d1432be87ce8d5823ef0682f01b43f0255a87a03d660bb46d3ae8c5fbe86306ded8baedbb57fe01ba888c9638f83883742423a718085e23 languageName: node linkType: hard @@ -31253,27 +31532,27 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.46.1": - version: 1.46.1 - resolution: "playwright-core@npm:1.46.1" +"playwright-core@npm:1.47.1": + version: 1.47.1 + resolution: "playwright-core@npm:1.47.1" bin: playwright-core: cli.js - checksum: 10/950aa935bba0b67ed289e07f31a52104c2b2ff9e39c46cda70b83f0b327e8114bcbcdeb4e8f94333ec941f9cd49cfac3af4cad91e247206ce927283482f24d91 + checksum: 10/b5ee08e1a934237fca0f0f52a677e5d49e45578e14b48a886927428bdf453f355a120548ae2f3f97e28a9d5e23a213120f6d8f10e18ee3f9112b10716888dac4 languageName: node linkType: hard -"playwright@npm:1.46.1": - version: 1.46.1 - resolution: "playwright@npm:1.46.1" +"playwright@npm:1.47.1": + version: 1.47.1 + resolution: "playwright@npm:1.47.1" dependencies: fsevents: "npm:2.3.2" - playwright-core: "npm:1.46.1" + playwright-core: "npm:1.47.1" dependenciesMeta: fsevents: optional: true bin: playwright: cli.js - checksum: 10/17b0e7495a663dccbda4baf4953823a133af0b7cd4a5978bd2f40768a23e1a92d3659d7b48289a5160c9fa6269d8b9bbf5e2040aa4a63a3dd5f29475343ad3f2 + checksum: 10/f4340f28485bd83a856a365a03af2013b3203c8134a075d05f1a834665e1204b98141c335d5c5c1600720c9e07db702db3dbff5ef138fc1c31d5feec3ac0057f languageName: node linkType: hard @@ -31691,14 +31970,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.3.5, postcss@npm:^8.4.27, postcss@npm:^8.4.33, postcss@npm:^8.4.41, postcss@npm:~8.4.32": - version: 8.4.41 - resolution: "postcss@npm:8.4.41" +"postcss@npm:^8.3.5, postcss@npm:^8.4.27, postcss@npm:^8.4.33, postcss@npm:^8.4.43, postcss@npm:~8.4.32": + version: 8.4.47 + resolution: "postcss@npm:8.4.47" dependencies: nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.1" - source-map-js: "npm:^1.2.0" - checksum: 10/6e6176c2407eff60493ca60a706c6b7def20a722c3adda94ea1ece38345eb99964191336fd62b62652279cec6938e79e0b1e1d477142c8d3516e7a725a74ee37 + picocolors: "npm:^1.1.0" + source-map-js: "npm:^1.2.1" + checksum: 10/f2b50ba9b6fcb795232b6bb20de7cdc538c0025989a8ed9c4438d1960196ba3b7eaff41fdb1a5c701b3504651ea87aeb685577707f0ae4d6ce6f3eae5df79a81 languageName: node linkType: hard @@ -31716,15 +31995,10 @@ __metadata: languageName: node linkType: hard -"preferred-pm@npm:^3.0.0": - version: 3.1.4 - resolution: "preferred-pm@npm:3.1.4" - dependencies: - find-up: "npm:^5.0.0" - find-yarn-workspace-root2: "npm:1.2.16" - path-exists: "npm:^4.0.0" - which-pm: "npm:^2.2.0" - checksum: 10/bde91a492cc2662a5229cdc7a0fe35584674d4200227cf2db4ea9fc726874d2ec469f83ac27f0fb13cf215a6ac0eeabd5d6ac0f6995ea29af4e63ae5fb71b65c +"potpack@npm:^2.0.0": + version: 2.0.0 + resolution: "potpack@npm:2.0.0" + checksum: 10/6dd41692349936b436c29c28cf9ff1268c03ed6ec96c4384b2d9eb95e58e422fab75d428648f475507dd167934984d1002df2010b83e5747b5c358bea371e8f7 languageName: node linkType: hard @@ -31833,13 +32107,17 @@ __metadata: linkType: hard "prisma@npm:^5.7.0": - version: 5.18.0 - resolution: "prisma@npm:5.18.0" + version: 5.19.1 + resolution: "prisma@npm:5.19.1" dependencies: - "@prisma/engines": "npm:5.18.0" + "@prisma/engines": "npm:5.19.1" + fsevents: "npm:2.3.3" + dependenciesMeta: + fsevents: + optional: true bin: prisma: build/index.js - checksum: 10/df8c2b0bdec6bc849b1517a06c7827dfff9a2dcef70e048c3bb9c2d4c12fab6723d9cae37818332a741ab8349b87791a3509f924f922fc39becda582768bc278 + checksum: 10/4ac0ad314306cd9ec72af5473a10e008ce546eaf8ab4be02f442c7e632ecece2408db0dba6335aed128b28c449e67c39d799d20d27300f7ca299a7877680c40b languageName: node linkType: hard @@ -32121,12 +32399,12 @@ __metadata: linkType: hard "pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" + version: 3.0.2 + resolution: "pump@npm:3.0.2" dependencies: end-of-stream: "npm:^1.1.0" once: "npm:^1.3.1" - checksum: 10/e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 + checksum: 10/e0c4216874b96bd25ddf31a0b61a5613e26cc7afa32379217cf39d3915b0509def3565f5f6968fafdad2894c8bbdbd67d340e84f3634b2a29b950cffb6442d9f languageName: node linkType: hard @@ -32174,16 +32452,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.11.0": - version: 6.11.0 - resolution: "qs@npm:6.11.0" - dependencies: - side-channel: "npm:^1.0.4" - checksum: 10/5a3bfea3e2f359ede1bfa5d2f0dbe54001aa55e40e27dc3e60fab814362d83a9b30758db057c2011b6f53a2d4e4e5150194b5bac45372652aecb3e3c0d4b256e - languageName: node - linkType: hard - -"qs@npm:^6.12.3, qs@npm:^6.7.0": +"qs@npm:6.13.0, qs@npm:^6.12.3, qs@npm:^6.7.0": version: 6.13.0 resolution: "qs@npm:6.13.0" dependencies: @@ -32296,6 +32565,13 @@ __metadata: languageName: node linkType: hard +"quickselect@npm:^3.0.0": + version: 3.0.0 + resolution: "quickselect@npm:3.0.0" + checksum: 10/8f72bedb8bb14bce5c3767c55f567bc296fa3ca9d98ba385e3867e434463bc633feee1eddf3dfec17914b7e88feeb08c7b313cf47114a8ff11bf964f77f51cfc + languageName: node + linkType: hard + "r-json@npm:^1.2.10": version: 1.3.0 resolution: "r-json@npm:1.3.0" @@ -32517,11 +32793,11 @@ __metadata: linkType: hard "react-hook-form@npm:^7.43.9, react-hook-form@npm:^7.51.0": - version: 7.52.2 - resolution: "react-hook-form@npm:7.52.2" + version: 7.53.0 + resolution: "react-hook-form@npm:7.53.0" peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - checksum: 10/91a738881d9463fb73794374a5aec17b3fac41aac92ddf64ccfa205fd2ebc211376a6a41a8c579fd256cda4aae4d64b0c1f3e872e361b9673edef5e2f0b75c35 + checksum: 10/b7d73696b7c10e042f6ea6fcec01f951091146bfbc89d1378327a970bcd724b968e93fae1657bddada75caf648cfaf8693c5ba03c25e96816b755079d29f65da languageName: node linkType: hard @@ -32559,6 +32835,26 @@ __metadata: languageName: node linkType: hard +"react-map-gl@npm:^7.1.7": + version: 7.1.7 + resolution: "react-map-gl@npm:7.1.7" + dependencies: + "@maplibre/maplibre-gl-style-spec": "npm:^19.2.1" + "@types/mapbox-gl": "npm:>=1.0.0" + peerDependencies: + mapbox-gl: ">=1.13.0" + maplibre-gl: ">=1.13.0" + react: ">=16.3.0" + react-dom: ">=16.3.0" + peerDependenciesMeta: + mapbox-gl: + optional: true + maplibre-gl: + optional: true + checksum: 10/a65493dd259dedadc31307979ccda6003c607ebc55e800d43453f287fa943b4ae13c7beac1327f2913fb327461d7690eeaccc2a43353f52887f29673fe50f005 + languageName: node + linkType: hard + "react-native-action-button@npm:^2.8.5": version: 2.8.5 resolution: "react-native-action-button@npm:2.8.5" @@ -32571,8 +32867,8 @@ __metadata: linkType: hard "react-native-calendars@npm:^1.1305.0": - version: 1.1306.0 - resolution: "react-native-calendars@npm:1.1306.0" + version: 1.1307.0 + resolution: "react-native-calendars@npm:1.1307.0" dependencies: hoist-non-react-statics: "npm:^3.3.1" lodash: "npm:^4.17.15" @@ -32585,7 +32881,7 @@ __metadata: dependenciesMeta: moment: optional: true - checksum: 10/35d3ed4c78f57fc265e51789f3b166808e9f481bb363cd6ac24f32f7b0cb74ae62874164592a779309f750ab4ae4f3a68c87ea65762985320fe00636530ce034 + checksum: 10/4e468c8b1d8cc10b6f532b884df86183c34f6a7dff151297c222f70a7b347dc9900aad3b950441acb15e30fa97eb8c9b7fc495633bc6caad07188fed1aafec9e languageName: node linkType: hard @@ -32701,11 +32997,11 @@ __metadata: linkType: hard "react-native-iphone-screen-helper@npm:^2.0.2": - version: 2.1.1 - resolution: "react-native-iphone-screen-helper@npm:2.1.1" + version: 2.1.2 + resolution: "react-native-iphone-screen-helper@npm:2.1.2" peerDependencies: react-native: ">=0.42.0" - checksum: 10/1acbff415fcade41b0f191ea644bc1ef84c7b10b617ca8e82db586f2f3a371a867cca81f39f1971db7b582a42ffbbf804d6b132424635b03d28eeecf4698e84d + checksum: 10/20a59d0596d836b2a98eaedbf83662cbb318998c4de0d378c9a39d2ea33184c578e8aba0731acbc98b47d362b6ef7323b61c664715b011c7c6e39b926557ada7 languageName: node linkType: hard @@ -32871,8 +33167,8 @@ __metadata: linkType: hard "react-native-vector-icons@npm:^10.0.3": - version: 10.1.0 - resolution: "react-native-vector-icons@npm:10.1.0" + version: 10.2.0 + resolution: "react-native-vector-icons@npm:10.2.0" dependencies: prop-types: "npm:^15.7.2" yargs: "npm:^16.1.1" @@ -32881,7 +33177,7 @@ __metadata: fa5-upgrade: bin/fa5-upgrade.sh fa6-upgrade: bin/fa6-upgrade.sh generate-icon: bin/generate-icon.js - checksum: 10/99877f36aeb61435d2f3dc18adaa08af9be9e88e4770efe47d733bd164b2c02ae332babecdcfcee9e3c7b1d80b5b107034e245733091638295eb3050f389f798 + checksum: 10/ac3b05bb353807d0ed94256bd6de4291e8261afb320ce69c06270fba3be2ed3c7b3a81ecbda29191cfe906e89bf853d4b4f016465b6b56a428315c7b6630eff1 languageName: node linkType: hard @@ -32947,25 +33243,26 @@ __metadata: linkType: hard "react-native@npm:*": - version: 0.75.2 - resolution: "react-native@npm:0.75.2" + version: 0.75.3 + resolution: "react-native@npm:0.75.3" dependencies: "@jest/create-cache-key-function": "npm:^29.6.3" - "@react-native-community/cli": "npm:14.0.0" - "@react-native-community/cli-platform-android": "npm:14.0.0" - "@react-native-community/cli-platform-ios": "npm:14.0.0" - "@react-native/assets-registry": "npm:0.75.2" - "@react-native/codegen": "npm:0.75.2" - "@react-native/community-cli-plugin": "npm:0.75.2" - "@react-native/gradle-plugin": "npm:0.75.2" - "@react-native/js-polyfills": "npm:0.75.2" - "@react-native/normalize-colors": "npm:0.75.2" - "@react-native/virtualized-lists": "npm:0.75.2" + "@react-native-community/cli": "npm:14.1.0" + "@react-native-community/cli-platform-android": "npm:14.1.0" + "@react-native-community/cli-platform-ios": "npm:14.1.0" + "@react-native/assets-registry": "npm:0.75.3" + "@react-native/codegen": "npm:0.75.3" + "@react-native/community-cli-plugin": "npm:0.75.3" + "@react-native/gradle-plugin": "npm:0.75.3" + "@react-native/js-polyfills": "npm:0.75.3" + "@react-native/normalize-colors": "npm:0.75.3" + "@react-native/virtualized-lists": "npm:0.75.3" abort-controller: "npm:^3.0.0" anser: "npm:^1.4.9" ansi-regex: "npm:^5.0.0" base64-js: "npm:^1.5.1" chalk: "npm:^4.0.0" + commander: "npm:^9.4.1" event-target-shim: "npm:^5.0.1" flow-enums-runtime: "npm:^0.0.6" glob: "npm:^7.1.1" @@ -32996,7 +33293,7 @@ __metadata: optional: true bin: react-native: cli.js - checksum: 10/9b0c315c20708e3ebcf8e6d0534e7a8811bf79930f3f2630e73b60a0e8d13d8bda2db69432d46ff2a612b27a6be851c0334b7099c44c51999324d1979243341c + checksum: 10/8a5b6c1b3e40b82ac01b2e59a4622b9cae5367b84a6aba61d6e0c5e558bc152e884f26db2adb0dfdd200a4299a59721bebfea6cf94a69a2f69dc8c269a7a5b2d languageName: node linkType: hard @@ -33471,11 +33768,11 @@ __metadata: linkType: hard "regenerate-unicode-properties@npm:^10.1.0": - version: 10.1.1 - resolution: "regenerate-unicode-properties@npm:10.1.1" + version: 10.2.0 + resolution: "regenerate-unicode-properties@npm:10.2.0" dependencies: regenerate: "npm:^1.4.2" - checksum: 10/b855152efdcca0ecc37ceb0cb6647a544344555fc293af3b57191b918e1bc9c95ee404a9a64a1d692bf66d45850942c29d93f2740c0d1980d3a8ea2ca63b184e + checksum: 10/9150eae6fe04a8c4f2ff06077396a86a98e224c8afad8344b1b656448e89e84edcd527e4b03aa5476774129eb6ad328ed684f9c1459794a935ec0cc17ce14329 languageName: node linkType: hard @@ -34067,25 +34364,25 @@ __metadata: linkType: hard "rollup@npm:^4.20.0": - version: 4.21.0 - resolution: "rollup@npm:4.21.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.21.0" - "@rollup/rollup-android-arm64": "npm:4.21.0" - "@rollup/rollup-darwin-arm64": "npm:4.21.0" - "@rollup/rollup-darwin-x64": "npm:4.21.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.21.0" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.21.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.21.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.21.0" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.21.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.21.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.21.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.21.0" - "@rollup/rollup-linux-x64-musl": "npm:4.21.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.21.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.21.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.21.0" + version: 4.22.2 + resolution: "rollup@npm:4.22.2" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.22.2" + "@rollup/rollup-android-arm64": "npm:4.22.2" + "@rollup/rollup-darwin-arm64": "npm:4.22.2" + "@rollup/rollup-darwin-x64": "npm:4.22.2" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.22.2" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.22.2" + "@rollup/rollup-linux-arm64-gnu": "npm:4.22.2" + "@rollup/rollup-linux-arm64-musl": "npm:4.22.2" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.22.2" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.22.2" + "@rollup/rollup-linux-s390x-gnu": "npm:4.22.2" + "@rollup/rollup-linux-x64-gnu": "npm:4.22.2" + "@rollup/rollup-linux-x64-musl": "npm:4.22.2" + "@rollup/rollup-win32-arm64-msvc": "npm:4.22.2" + "@rollup/rollup-win32-ia32-msvc": "npm:4.22.2" + "@rollup/rollup-win32-x64-msvc": "npm:4.22.2" "@types/estree": "npm:1.0.5" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -34125,7 +34422,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10/27ac47d5049719249d2a44982e31f01423158a3625cabff2f2362219aee64bdc14c32572b669169c22c324c3a965044ce8f06e27eee00fd8802861cd13697f87 + checksum: 10/06eb448c5b4f7763342da98217208f0c8f342907ce3bd5f2362acf9d664035b186bb00bf5156514e87fe4f272f6f1e79c064c1f4e9e45467ec0d15772d0349be languageName: node linkType: hard @@ -34208,9 +34505,9 @@ __metadata: linkType: hard "safe-stable-stringify@npm:^2.4.3": - version: 2.4.3 - resolution: "safe-stable-stringify@npm:2.4.3" - checksum: 10/a6c192bbefe47770a11072b51b500ed29be7b1c15095371c1ee1dc13e45ce48ee3c80330214c56764d006c485b88bd0b24940d868948170dddc16eed312582d8 + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: 10/2697fa186c17c38c3ca5309637b4ac6de2f1c3d282da27cd5e1e3c88eca0fb1f9aea568a6aabdf284111592c8782b94ee07176f17126031be72ab1313ed46c5c languageName: node linkType: hard @@ -34286,7 +34583,7 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^4.0.0, schema-utils@npm:^4.0.1": +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.0.1, schema-utils@npm:^4.2.0": version: 4.2.0 resolution: "schema-utils@npm:4.2.0" dependencies: @@ -34374,7 +34671,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.1, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": +"semver@npm:^7.0.0, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.1, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -34394,7 +34691,28 @@ __metadata: languageName: node linkType: hard -"send@npm:0.18.0, send@npm:^0.18.0": +"send@npm:0.19.0": + version: 0.19.0 + resolution: "send@npm:0.19.0" + dependencies: + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:2.0.1" + checksum: 10/1f6064dea0ae4cbe4878437aedc9270c33f2a6650a77b56a16b62d057527f2766d96ee282997dd53ec0339082f2aad935bc7d989b46b48c82fc610800dc3a1d0 + languageName: node + linkType: hard + +"send@npm:^0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" dependencies: @@ -34442,6 +34760,13 @@ __metadata: languageName: node linkType: hard +"serialize-to-js@npm:^3.1.2": + version: 3.1.2 + resolution: "serialize-to-js@npm:3.1.2" + checksum: 10/9d657ce68753eede892da8ef9d89121a6c184441a9a7f6d1292a28814ad1858aeb3ca5c473d2cd3ec1ee206ce5d46094807182af1ff3b3bd81bc10e887a209e3 + languageName: node + linkType: hard + "serve-handler@npm:6.1.5": version: 6.1.5 resolution: "serve-handler@npm:6.1.5" @@ -34473,15 +34798,15 @@ __metadata: languageName: node linkType: hard -"serve-static@npm:1.15.0, serve-static@npm:^1.13.1": - version: 1.15.0 - resolution: "serve-static@npm:1.15.0" +"serve-static@npm:1.16.2, serve-static@npm:^1.13.1": + version: 1.16.2 + resolution: "serve-static@npm:1.16.2" dependencies: - encodeurl: "npm:~1.0.2" + encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" parseurl: "npm:~1.3.3" - send: "npm:0.18.0" - checksum: 10/699b2d4c29807a51d9b5e0f24955346911437aebb0178b3c4833ad30d3eca93385ff9927254f5c16da345903cad39d9cd4a532198c95a5129cc4ed43911b15a4 + send: "npm:0.19.0" + checksum: 10/7fa9d9c68090f6289976b34fc13c50ac8cd7f16ae6bce08d16459300f7fc61fbc2d7ebfa02884c073ec9d6ab9e7e704c89561882bbe338e99fcacb2912fde737 languageName: node linkType: hard @@ -34528,7 +34853,6 @@ __metadata: "@instructor-ai/instructor": "npm:^1.3.0" "@libsql/client": "npm:^0.4.0-pre.5" "@openapitools/openapi-generator-cli": "npm:^2.7.0" - "@packrat/shared-types": "npm:*" "@packrat/validations": "npm:*" "@paralleldrive/cuid2": "npm:^2.2.2" "@prisma/client": "npm:^5.7.0" @@ -34671,6 +34995,18 @@ __metadata: languageName: node linkType: hard +"set-value@npm:^2.0.1": + version: 2.0.1 + resolution: "set-value@npm:2.0.1" + dependencies: + extend-shallow: "npm:^2.0.1" + is-extendable: "npm:^0.1.1" + is-plain-object: "npm:^2.0.3" + split-string: "npm:^3.0.1" + checksum: 10/4f1ccac2e9ad4d1b0851761d41df4bbd3780ed69805f24a80ab237a56d9629760b7b98551cd370931620defe5da329645834e1e9a18574cecad09ce7b2b83296 + languageName: node + linkType: hard + "set-value@npm:^4.1.0": version: 4.1.0 resolution: "set-value@npm:4.1.0" @@ -35101,6 +35437,20 @@ __metadata: languageName: node linkType: hard +"sort-asc@npm:^0.2.0": + version: 0.2.0 + resolution: "sort-asc@npm:0.2.0" + checksum: 10/b3610ab695dc8b2cba1c3e6ead06ce97a41f013ed0a002ff7a0d2a39ca297fd2f58c92d3de67dda3a9313ecb1073de4eacc30da3a740ff8d57eb668c9bb151bd + languageName: node + linkType: hard + +"sort-desc@npm:^0.2.0": + version: 0.2.0 + resolution: "sort-desc@npm:0.2.0" + checksum: 10/fb2c02ea38815c79c0127d014f18926a473a1988c01f4c00de467584b99fc7e9f6e4f61c8386f4c2ac3501c60842931c5a499330b3086be6d8cff4d0b8602bed + languageName: node + linkType: hard + "sort-keys@npm:^2.0.0": version: 2.0.0 resolution: "sort-keys@npm:2.0.0" @@ -35110,6 +35460,20 @@ __metadata: languageName: node linkType: hard +"sort-object@npm:^3.0.3": + version: 3.0.3 + resolution: "sort-object@npm:3.0.3" + dependencies: + bytewise: "npm:^1.1.0" + get-value: "npm:^2.0.2" + is-extendable: "npm:^0.1.1" + sort-asc: "npm:^0.2.0" + sort-desc: "npm:^0.2.0" + union-value: "npm:^1.0.1" + checksum: 10/381a6b6fe2309d400bd6ae3a8d0188b2b3b3855345d16d953b4bb5875d28fd5512501c85bd4eb951543056cd3095ff8e197ab3efc11389dcfa0e3334bf4a23a5 + languageName: node + linkType: hard + "source-list-map@npm:^2.0.0, source-list-map@npm:^2.0.1": version: 2.0.1 resolution: "source-list-map@npm:2.0.1" @@ -35117,10 +35481,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.0": - version: 1.2.0 - resolution: "source-map-js@npm:1.2.0" - checksum: 10/74f331cfd2d121c50790c8dd6d3c9de6be21926de80583b23b37029b0f37aefc3e019fa91f9a10a5e120c08135297e1ecf312d561459c45908cb1e0e365f49e5 +"source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10/ff9d8c8bf096d534a5b7707e0382ef827b4dd360a577d3f34d2b9f48e12c9d230b5747974ee7c607f0df65113732711bb701fe9ece3c7edbd43cb2294d707df3 languageName: node linkType: hard @@ -35279,6 +35643,15 @@ __metadata: languageName: node linkType: hard +"split-string@npm:^3.0.1": + version: 3.1.0 + resolution: "split-string@npm:3.1.0" + dependencies: + extend-shallow: "npm:^3.0.0" + checksum: 10/f31f4709d2b14fe4ff46b4fb88b2fb68a1c59b59e573c5417907c182397ddb2cb67903232bdc3a8b9dd3bb660c6f533ff11b5d624aff7b1fe0a213e3e4c75f20 + languageName: node + linkType: hard + "split2@npm:^2.2.0": version: 2.2.0 resolution: "split2@npm:2.2.0" @@ -35946,6 +36319,15 @@ __metadata: languageName: node linkType: hard +"supercluster@npm:^8.0.1": + version: 8.0.1 + resolution: "supercluster@npm:8.0.1" + dependencies: + kdbush: "npm:^4.0.2" + checksum: 10/3e517e54087fe24efa274013a5c116b0083d140d3cd855c5004fef61b64dde83510d2a65cd6565349b693751936aede2305f76d84778e6107ae1b3ffa18a5bae + languageName: node + linkType: hard + "superjson@npm:^1.10.0, superjson@npm:^1.9.1": version: 1.13.3 resolution: "superjson@npm:1.13.3" @@ -36408,8 +36790,8 @@ __metadata: linkType: hard "terser@npm:^5.10.0, terser@npm:^5.15.0, terser@npm:^5.26.0": - version: 5.31.6 - resolution: "terser@npm:5.31.6" + version: 5.33.0 + resolution: "terser@npm:5.33.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -36417,7 +36799,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10/78057c58025151c9bdad82a050f0b51175f9fe3117d8ee369ca7effe038cdd540da2fd5985a4f8ee08dba5616e7911e1392d40670698ff42a49fec338d369e80 + checksum: 10/01423825474969c81c3f063e5c7ce12f82bbd9448b565220e7418174b3b5cac47d563bf6983fcd5c7e1bac20df6d8f9e94f7cf15383714e1576fcb1cf8a3a71b languageName: node linkType: hard @@ -36465,16 +36847,16 @@ __metadata: linkType: hard "thread-loader@npm:^4.0.1": - version: 4.0.2 - resolution: "thread-loader@npm:4.0.2" + version: 4.0.4 + resolution: "thread-loader@npm:4.0.4" dependencies: json-parse-better-errors: "npm:^1.0.2" loader-runner: "npm:^4.1.0" neo-async: "npm:^2.6.2" - schema-utils: "npm:^4.0.1" + schema-utils: "npm:^4.2.0" peerDependencies: webpack: ^5.0.0 - checksum: 10/d0f775fc502803dbe236459761115f33c60eaaf01aacc259ac89b51448407f2861c6d808f9cf6d6b9d7e1441b35cd2a39547db4a79aa3663f829db9d1429447b + checksum: 10/268fdc2aa836a414f0af2213c5dd743efe8b3fae6a60942a086505937648c4e8c26ec88c27538e42afc629b1b5f9d0a622fc1b09b8633b288841a9ce3921ccec languageName: node linkType: hard @@ -36603,6 +36985,13 @@ __metadata: languageName: node linkType: hard +"tinyqueue@npm:^3.0.0": + version: 3.0.0 + resolution: "tinyqueue@npm:3.0.0" + checksum: 10/44195ae628e98f4de49acefac1fafa63a7f2b5d8a5c23ace6f49917109db3435db8ec9854f87c0d50f8a8c6a73f1526f3941921618a071e4ee1d246afacf69bb + languageName: node + linkType: hard + "tinyspy@npm:^2.2.0": version: 2.2.1 resolution: "tinyspy@npm:2.2.1" @@ -36734,13 +37123,13 @@ __metadata: linkType: hard "traverse@npm:~0.6.6": - version: 0.6.9 - resolution: "traverse@npm:0.6.9" + version: 0.6.10 + resolution: "traverse@npm:0.6.10" dependencies: gopd: "npm:^1.0.1" typedarray.prototype.slice: "npm:^1.0.3" which-typed-array: "npm:^1.1.15" - checksum: 10/7f42c2fa3451a8b51e3bfb5b6f884684f4f8142c5eb2ee8a0c413e805d532fcc470cd4700d3bfd00271c0221f8c6132263cf559e60ea35df05aebc9551977a2f + checksum: 10/557fed11f180b6de22b8e33bd8e799627776fc8ecbd906849302aecc44f1a60ff1f9621000392ecce847400bef1f3408683a62e77fd66b1c84802be6aab4587e languageName: node linkType: hard @@ -36832,18 +37221,18 @@ __metadata: linkType: hard "ts-jest@npm:^29.1.1": - version: 29.2.4 - resolution: "ts-jest@npm:29.2.4" + version: 29.2.5 + resolution: "ts-jest@npm:29.2.5" dependencies: - bs-logger: "npm:0.x" + bs-logger: "npm:^0.2.6" ejs: "npm:^3.1.10" - fast-json-stable-stringify: "npm:2.x" + fast-json-stable-stringify: "npm:^2.1.0" jest-util: "npm:^29.0.0" json5: "npm:^2.2.3" - lodash.memoize: "npm:4.x" - make-error: "npm:1.x" - semver: "npm:^7.5.3" - yargs-parser: "npm:^21.0.1" + lodash.memoize: "npm:^4.1.2" + make-error: "npm:^1.3.6" + semver: "npm:^7.6.3" + yargs-parser: "npm:^21.1.1" peerDependencies: "@babel/core": ">=7.0.0-beta.0 <8" "@jest/transform": ^29.0.0 @@ -36864,7 +37253,7 @@ __metadata: optional: true bin: ts-jest: cli.js - checksum: 10/69db25e06b93f4ea4e454a54afc4e49c59b71f7efdef94fe728f4d62b8c475364d0fed7253212c5394669dcd143516ab6f630f4b139b2f9c37119245cf5a963c + checksum: 10/f89e562816861ec4510840a6b439be6145f688b999679328de8080dc8e66481325fc5879519b662163e33b7578f35243071c38beb761af34e5fe58e3e326a958 languageName: node linkType: hard @@ -36996,8 +37385,8 @@ __metadata: linkType: hard "tsconfck@npm:^3.0.3": - version: 3.1.1 - resolution: "tsconfck@npm:3.1.1" + version: 3.1.3 + resolution: "tsconfck@npm:3.1.3" peerDependencies: typescript: ^5.0.0 peerDependenciesMeta: @@ -37005,7 +37394,7 @@ __metadata: optional: true bin: tsconfck: bin/tsconfck.js - checksum: 10/a4456577f540212516d7eb530005893739aadd6da00787914a8ed9aa19c3f2f306b8912920aa440b9b8978f10c9dadbd062b8c2a2f0ff1f6c2d4272b5be2ef34 + checksum: 10/bf9b9b72de5b83f833f5dea8b276e77bab08e85751589f36dd23854fa3d5f7955194086fb8424df388bf232f2fc9a067d7913bfa674cb1217be0bba648ec71f2 languageName: node linkType: hard @@ -37028,13 +37417,20 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2.6.3, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.5.2, tslib@npm:^2.6.2, tslib@npm:^2.6.3": +"tslib@npm:2.6.3": version: 2.6.3 resolution: "tslib@npm:2.6.3" checksum: 10/52109bb681f8133a2e58142f11a50e05476de4f075ca906d13b596ae5f7f12d30c482feb0bff167ae01cfc84c5803e575a307d47938999246f5a49d174fc558c languageName: node linkType: hard +"tslib@npm:2.7.0, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.5.2, tslib@npm:^2.6.2, tslib@npm:^2.6.3": + version: 2.7.0 + resolution: "tslib@npm:2.7.0" + checksum: 10/9a5b47ddac65874fa011c20ff76db69f97cf90c78cff5934799ab8894a5342db2d17b4e7613a087046bc1d133d21547ddff87ac558abeec31ffa929c88b7fce6 + languageName: node + linkType: hard + "tslib@npm:^1.9.0, tslib@npm:^1.9.3": version: 1.14.1 resolution: "tslib@npm:1.14.1" @@ -37049,9 +37445,9 @@ __metadata: languageName: node linkType: hard -"tsx@npm:^4.7.0": - version: 4.17.0 - resolution: "tsx@npm:4.17.0" +"tsx@npm:^4.19.1, tsx@npm:^4.7.0": + version: 4.19.1 + resolution: "tsx@npm:4.19.1" dependencies: esbuild: "npm:~0.23.0" fsevents: "npm:~2.3.3" @@ -37061,7 +37457,7 @@ __metadata: optional: true bin: tsx: dist/cli.mjs - checksum: 10/192dda2794c1e28b8e57cd5296953f49b2a4bca143a6ac427f30a244f9d2fb0aca6ea8f1d7c8d50ddf87cecc78d482ac68fc2d3f21bbcaaa0e84ef1f2dce0c79 + checksum: 10/1f5f0b7c4107fc18f523e94c79204b043641aa328f721324795cc961826879035652a1f19fe29ba420465d9f4bacb0f47e08f0bd4b934684ab45727eca110311 languageName: node linkType: hard @@ -37081,6 +37477,13 @@ __metadata: languageName: node linkType: hard +"tweakpane@npm:^4.0.4": + version: 4.0.4 + resolution: "tweakpane@npm:4.0.4" + checksum: 10/e264cb907cd628f3dd2a2452306d8ec1b5f9e41ce4a91e7633a9e93513128d91e96a5ab79d724b7f0080e6a8a664e8fc03234fb1a2499bb44c6ac4f7b356116a + languageName: node + linkType: hard + "tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": version: 0.14.5 resolution: "tweetnacl@npm:0.14.5" @@ -37298,12 +37701,12 @@ __metadata: linkType: hard "typescript@npm:^5.0.4, typescript@npm:^5.3.3, typescript@npm:^5.5.3": - version: 5.5.4 - resolution: "typescript@npm:5.5.4" + version: 5.6.2 + resolution: "typescript@npm:5.6.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/1689ccafef894825481fc3d856b4834ba3cc185a9c2878f3c76a9a1ef81af04194849840f3c69e7961e2312771471bb3b460ca92561e1d87599b26c37d0ffb6f + checksum: 10/f95365d4898f357823e93d334ecda9fcade54f009b397c7d05b7621cd9e865981033cf89ccde0f3e3a7b73b1fdbae18e92bc77db237b43e912f053fef0f9a53b languageName: node linkType: hard @@ -37328,12 +37731,12 @@ __metadata: linkType: hard "typescript@patch:typescript@npm%3A^5.0.4#optional!builtin, typescript@patch:typescript@npm%3A^5.3.3#optional!builtin, typescript@patch:typescript@npm%3A^5.5.3#optional!builtin": - version: 5.5.4 - resolution: "typescript@patch:typescript@npm%3A5.5.4#optional!builtin::version=5.5.4&hash=5adc0c" + version: 5.6.2 + resolution: "typescript@patch:typescript@npm%3A5.6.2#optional!builtin::version=5.6.2&hash=5adc0c" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/2c065f0ef81855eac25c9b658a3c9da65ffc005260c12854c2286f40f3667e1b1ecf8bdbdd37b59aa0397920378ce7900bff8cb32e0f1c7af6fd86efc676718c + checksum: 10/060a7349adf698477b411be4ace470aee6c2c1bd99917fdf5d33697c17ec55c64fe724eb10399387530b50e9913b41528dd8bfcca0a5fc8f8bac63fbb4580a2e languageName: node linkType: hard @@ -37347,6 +37750,22 @@ __metadata: languageName: node linkType: hard +"typewise-core@npm:^1.2, typewise-core@npm:^1.2.0": + version: 1.2.0 + resolution: "typewise-core@npm:1.2.0" + checksum: 10/08d787595a4214620a1a255904b3472e339dbdf99883bda12ebc29753c70b55f414e46e1a64d05395db3d0f2bc273c2b3547dbefb9dd77cc8c7d622c33b72d07 + languageName: node + linkType: hard + +"typewise@npm:^1.0.3": + version: 1.0.3 + resolution: "typewise@npm:1.0.3" + dependencies: + typewise-core: "npm:^1.2.0" + checksum: 10/4def6bef2efee1a0ac9a47721ff51b31effc38cbb5cc1319133171704c823946d4fa08b55e2f00c8c5c172406a25f16e150fb816b37eba60864782fc1ae1763e + languageName: node + linkType: hard + "typical@npm:^4.0.0": version: 4.0.0 resolution: "typical@npm:4.0.0" @@ -37362,16 +37781,20 @@ __metadata: linkType: hard "ua-parser-js@npm:^0.7.33": - version: 0.7.38 - resolution: "ua-parser-js@npm:0.7.38" - checksum: 10/011609d0176952abc60b7a20e0af266a899b34f4c49a6f5097d6af763da27eacaa3752b710ae4d930d7b99508bb8c0b34ebe8042e1d9fdc4056d051b209b0842 + version: 0.7.39 + resolution: "ua-parser-js@npm:0.7.39" + bin: + ua-parser-js: script/cli.js + checksum: 10/5f564d32d13a1636d7a4efdaca1adfd2af08303f52cbe2480836efacd9bb071099b8961ed18e2665b0d45968aa19b6bf58edbbbd81fdffabaf5a9c888b393cf7 languageName: node linkType: hard "ua-parser-js@npm:^1.0.35": - version: 1.0.38 - resolution: "ua-parser-js@npm:1.0.38" - checksum: 10/f2345e9bd0f9c5f85bcaa434535fae88f4bb891538e568106f0225b2c2937fbfbeb5782bd22320d07b6b3d68b350b8861574c1d7af072ff9b2362fb72d326fd9 + version: 1.0.39 + resolution: "ua-parser-js@npm:1.0.39" + bin: + ua-parser-js: script/cli.js + checksum: 10/dd4026b6ece8a34a0d39b6de5542154c4506077d8def8647a300a29e1b3ffa0e23f5c8eeeb8101df6162b7b3eb3597d0b4adb031ae6104cbdb730d6ebc07f3c0 languageName: node linkType: hard @@ -37390,11 +37813,11 @@ __metadata: linkType: hard "uglify-js@npm:^3.7.7": - version: 3.19.2 - resolution: "uglify-js@npm:3.19.2" + version: 3.19.3 + resolution: "uglify-js@npm:3.19.3" bin: uglifyjs: bin/uglifyjs - checksum: 10/8b0af1fa5260e7f8bc3e9a1e08ae05023b7c96eeb8965e27f29724597389d4e703d4aa6f66e6cd87a14a84e431df73a358ee58c0afce6b615b40cc95fcbf4ec6 + checksum: 10/6b9639c1985d24580b01bb0ab68e78de310d38eeba7db45bec7850ab4093d8ee464d80ccfaceda9c68d1c366efbee28573b52f95e69ac792354c145acd380b11 languageName: node linkType: hard @@ -37493,36 +37916,22 @@ __metadata: languageName: node linkType: hard -"unenv@npm:unenv-nightly@1.10.0-1717606461.a117952": - version: 1.10.0-1717606461.a117952 - resolution: "unenv-nightly@npm:1.10.0-1717606461.a117952" - dependencies: - consola: "npm:^3.2.3" - defu: "npm:^6.1.4" - mime: "npm:^3.0.0" - node-fetch-native: "npm:^1.6.4" - pathe: "npm:^1.1.2" - ufo: "npm:^1.5.3" - checksum: 10/6799faa50bc396828b3968a583d9e414771113a0bbfbce33e86c6e9ead4835825d97c9ea54681eec6d68d89ef1f88b05b8c41960538d10d0b614696b7e6be377 - languageName: node - linkType: hard - -"unenv@npm:unenv-nightly@2.0.0-1724863496.70db6f1": - version: 2.0.0-1724863496.70db6f1 - resolution: "unenv-nightly@npm:2.0.0-1724863496.70db6f1" +"unenv@npm:unenv-nightly@2.0.0-1726478054.1e87097": + version: 2.0.0-1726478054.1e87097 + resolution: "unenv-nightly@npm:2.0.0-1726478054.1e87097" dependencies: defu: "npm:^6.1.4" ohash: "npm:^1.1.3" pathe: "npm:^1.1.2" ufo: "npm:^1.5.4" - checksum: 10/1133947cc084eedc2d256025f81d0c3716600415efe6f49950091084b0ece18b02d676f07537e5de17237621f5499d3ed754c8f35cd13109252ed1b204b38c55 + checksum: 10/1ddef8f25a689b31235498df9f56567183ad082976f15167342228636a7dbb82bb12c677610f25ec317abc645420b500330d41dc68dab7512ef90a3a97cadc59 languageName: node linkType: hard "unicode-canonical-property-names-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" - checksum: 10/39be078afd014c14dcd957a7a46a60061bc37c4508ba146517f85f60361acf4c7539552645ece25de840e17e293baa5556268d091ca6762747fdd0c705001a45 + version: 2.0.1 + resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.1" + checksum: 10/3c3dabdb1d22aef4904399f9e810d0b71c0b12b3815169d96fac97e56d5642840c6071cf709adcace2252bc6bb80242396c2ec74b37224eb015c5f7aca40bad7 languageName: node linkType: hard @@ -37537,9 +37946,9 @@ __metadata: linkType: hard "unicode-match-property-value-ecmascript@npm:^2.1.0": - version: 2.1.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.1.0" - checksum: 10/06661bc8aba2a60c7733a7044f3e13085808939ad17924ffd4f5222a650f88009eb7c09481dc9c15cfc593d4ad99bd1cde8d54042733b335672591a81c52601c + version: 2.2.0 + resolution: "unicode-match-property-value-ecmascript@npm:2.2.0" + checksum: 10/9fd53c657aefe5d3cb8208931b4c34fbdb30bb5aa9a6c6bf744e2f3036f00b8889eeaf30cb55a873b76b6ee8b5801ea770e1c49b3352141309f58f0ebb3011d8 languageName: node linkType: hard @@ -37550,6 +37959,18 @@ __metadata: languageName: node linkType: hard +"union-value@npm:^1.0.1": + version: 1.0.1 + resolution: "union-value@npm:1.0.1" + dependencies: + arr-union: "npm:^3.1.0" + get-value: "npm:^2.0.6" + is-extendable: "npm:^0.1.1" + set-value: "npm:^2.0.1" + checksum: 10/a3464097d3f27f6aa90cf103ed9387541bccfc006517559381a10e0dffa62f465a9d9a09c9b9c3d26d0f4cbe61d4d010e2fbd710fd4bf1267a768ba8a774b0ba + languageName: node + linkType: hard + "unique-filename@npm:^1.1.1": version: 1.1.1 resolution: "unique-filename@npm:1.1.1" @@ -37633,14 +38054,17 @@ __metadata: linkType: hard "unplugin@npm:^1.12.2, unplugin@npm:^1.3.1": - version: 1.12.2 - resolution: "unplugin@npm:1.12.2" + version: 1.14.1 + resolution: "unplugin@npm:1.14.1" dependencies: acorn: "npm:^8.12.1" - chokidar: "npm:^3.6.0" - webpack-sources: "npm:^3.2.3" webpack-virtual-modules: "npm:^0.6.2" - checksum: 10/52c6e1e8e3daf2362cff8ca1786363c76c2795eb5bc97dce0b54314a82bbac681de3da0e58c6d3057d5eec8b66defb2a28eeb322dae5545baf2b35299b3f240d + peerDependencies: + webpack-sources: ^3 + peerDependenciesMeta: + webpack-sources: + optional: true + checksum: 10/ad82ec5b8de5ae4fb7d24f8ed7d71071e15855d335365d7ab6f2e074d5d666589dd52e9f2a16017da19d7c43f60e50e09bc529420bf9f29ac7c90cc3cf13ef28 languageName: node linkType: hard @@ -37746,7 +38170,7 @@ __metadata: languageName: node linkType: hard -"url@npm:^0.11.0": +"url@npm:^0.11.0, url@npm:^0.11.4": version: 0.11.4 resolution: "url@npm:0.11.4" dependencies: @@ -38005,25 +38429,25 @@ __metadata: linkType: hard "vercel@npm:latest": - version: 37.1.0 - resolution: "vercel@npm:37.1.0" + version: 37.5.2 + resolution: "vercel@npm:37.5.2" dependencies: - "@vercel/build-utils": "npm:8.3.6" + "@vercel/build-utils": "npm:8.4.2" "@vercel/fun": "npm:1.1.0" - "@vercel/go": "npm:3.1.1" - "@vercel/hydrogen": "npm:1.0.4" - "@vercel/next": "npm:4.3.6" - "@vercel/node": "npm:3.2.8" + "@vercel/go": "npm:3.1.3" + "@vercel/hydrogen": "npm:1.0.6" + "@vercel/next": "npm:4.3.10" + "@vercel/node": "npm:3.2.14" "@vercel/python": "npm:4.3.1" - "@vercel/redwood": "npm:2.1.3" - "@vercel/remix-builder": "npm:2.2.6" + "@vercel/redwood": "npm:2.1.5" + "@vercel/remix-builder": "npm:2.2.9" "@vercel/ruby": "npm:2.1.0" - "@vercel/static-build": "npm:2.5.18" + "@vercel/static-build": "npm:2.5.24" chokidar: "npm:3.3.1" bin: vc: dist/index.js vercel: dist/index.js - checksum: 10/960c36fcaa455b5ef784a8329caf46dbe6af33b790f55c76b192d97249f207a1d3f0b2dcc9df27f8d28a383a27ed18b587f116858c73e861bd319f45f3b1d554 + checksum: 10/f84bd190abf4d1e877be311597fae42789225530f9e2aa7fbabb3e0aa53cda56ceb6650d1d9562d3375d2a2fa557d54905f0f0b0c8945cbf3b156ad25ea73608 languageName: node linkType: hard @@ -38131,8 +38555,8 @@ __metadata: linkType: hard "vite@npm:^4.0.1": - version: 4.5.3 - resolution: "vite@npm:4.5.3" + version: 4.5.5 + resolution: "vite@npm:4.5.5" dependencies: esbuild: "npm:^0.18.10" fsevents: "npm:~2.3.2" @@ -38166,17 +38590,17 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10/82efe1bc6d6848f8c97b71f1dc5b2fba2c3f30b2207ef2451c8df1a0ed5903c55714d7cd8ecb75879b488661d97f6e01a4ad758b5ef6a50a14338f916233bfa4 + checksum: 10/2e8b39e004f2b2e72506b816700b3aafaf3f85bdcb9dd9392075bb234ce7333f859a0d2078a85ce5d0039f0f659ca564a7366af587848e5166f14b136cb0ad37 languageName: node linkType: hard "vite@npm:^5.0.0, vite@npm:^5.2.6, vite@npm:^5.3.1": - version: 5.4.2 - resolution: "vite@npm:5.4.2" + version: 5.4.6 + resolution: "vite@npm:5.4.6" dependencies: esbuild: "npm:^0.21.3" fsevents: "npm:~2.3.3" - postcss: "npm:^8.4.41" + postcss: "npm:^8.4.43" rollup: "npm:^4.20.0" peerDependencies: "@types/node": ^18.0.0 || >=20.0.0 @@ -38209,7 +38633,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10/c449f9295060fa88c9b5cc1bd17c2de198deae596b7da1250db9662fb15e7b21e0dbe9a40a9106fb7438b1231494b169457e809ecbb65e732648d87dd284ab23 + checksum: 10/8489fa55c48675fc12b64bf7af58b5e2f8a11b2aebc63cb177861bd53dc196d7c496d6918f5a8c48828f51b6fe498166a1a2350334bbfaae10d015a0c71f1c77 languageName: node linkType: hard @@ -38284,7 +38708,7 @@ __metadata: languageName: node linkType: hard -"vt-pbf@npm:^3.1.1": +"vt-pbf@npm:^3.1.1, vt-pbf@npm:^3.1.3": version: 3.1.3 resolution: "vt-pbf@npm:3.1.3" dependencies: @@ -38663,16 +39087,6 @@ __metadata: languageName: node linkType: hard -"which-pm@npm:^2.2.0": - version: 2.2.0 - resolution: "which-pm@npm:2.2.0" - dependencies: - load-yaml-file: "npm:^0.2.0" - path-exists: "npm:^4.0.0" - checksum: 10/f6fe0ad163ba5385c7b8f3465cd29492ab1af6e5c2d5eb0c320008ac458c1614241ebe8d7d7d76d79021aa866a66e2454e181ac681f525cf259ec27abab9468c - languageName: node - linkType: hard - "which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.2": version: 1.1.15 resolution: "which-typed-array@npm:1.1.15" @@ -38820,15 +39234,15 @@ __metadata: languageName: node linkType: hard -"workerd@npm:1.20240821.1": - version: 1.20240821.1 - resolution: "workerd@npm:1.20240821.1" +"workerd@npm:1.20240909.0": + version: 1.20240909.0 + resolution: "workerd@npm:1.20240909.0" dependencies: - "@cloudflare/workerd-darwin-64": "npm:1.20240821.1" - "@cloudflare/workerd-darwin-arm64": "npm:1.20240821.1" - "@cloudflare/workerd-linux-64": "npm:1.20240821.1" - "@cloudflare/workerd-linux-arm64": "npm:1.20240821.1" - "@cloudflare/workerd-windows-64": "npm:1.20240821.1" + "@cloudflare/workerd-darwin-64": "npm:1.20240909.0" + "@cloudflare/workerd-darwin-arm64": "npm:1.20240909.0" + "@cloudflare/workerd-linux-64": "npm:1.20240909.0" + "@cloudflare/workerd-linux-arm64": "npm:1.20240909.0" + "@cloudflare/workerd-windows-64": "npm:1.20240909.0" dependenciesMeta: "@cloudflare/workerd-darwin-64": optional: true @@ -38842,7 +39256,7 @@ __metadata: optional: true bin: workerd: bin/workerd - checksum: 10/4784019f2cd638efd505bd895766c76bf21f56333e93f4f1665c97e8c8877f9ef46ef2ce1682127706aa607902e8ea4dcfec852427858e78454a0d6181de38ce + checksum: 10/dc572f005d0628a4b16fba5ae02230e1998da0f187c9e680f60ba677046859f89cc6f3ea5fbb3e23dfcd22be7f2bf242d1dbe46570c38abe7bb5a9171afa4109 languageName: node linkType: hard @@ -38888,12 +39302,12 @@ __metadata: languageName: node linkType: hard -"wrangler@npm:^3.51.2": - version: 3.72.2 - resolution: "wrangler@npm:3.72.2" +"wrangler@npm:^3.51.2, wrangler@npm:^3.75.0": + version: 3.78.6 + resolution: "wrangler@npm:3.78.6" dependencies: "@cloudflare/kv-asset-handler": "npm:0.3.4" - "@cloudflare/workers-shared": "npm:0.3.0" + "@cloudflare/workers-shared": "npm:0.5.3" "@esbuild-plugins/node-globals-polyfill": "npm:^0.2.3" "@esbuild-plugins/node-modules-polyfill": "npm:^0.2.2" blake3-wasm: "npm:^2.1.5" @@ -38901,18 +39315,18 @@ __metadata: date-fns: "npm:^3.6.0" esbuild: "npm:0.17.19" fsevents: "npm:~2.3.2" - miniflare: "npm:3.20240821.0" + miniflare: "npm:3.20240909.4" nanoid: "npm:^3.3.3" - path-to-regexp: "npm:^6.2.0" + path-to-regexp: "npm:^6.3.0" resolve: "npm:^1.22.8" resolve.exports: "npm:^2.0.2" selfsigned: "npm:^2.0.1" source-map: "npm:^0.6.1" - unenv: "npm:unenv-nightly@1.10.0-1717606461.a117952" - workerd: "npm:1.20240821.1" + unenv: "npm:unenv-nightly@2.0.0-1726478054.1e87097" + workerd: "npm:1.20240909.0" xxhash-wasm: "npm:^1.0.1" peerDependencies: - "@cloudflare/workers-types": ^4.20240821.1 + "@cloudflare/workers-types": ^4.20240909.0 dependenciesMeta: fsevents: optional: true @@ -38922,45 +39336,7 @@ __metadata: bin: wrangler: bin/wrangler.js wrangler2: bin/wrangler.js - checksum: 10/7aa4f35d4e8061c21bad2355ca6e92760b8f2630fbc12665e95141177634af870d5cc25261f6eee7505954570a0bad176dcad46d0db2c3217dfe4a684fec491c - languageName: node - linkType: hard - -"wrangler@npm:^3.75.0": - version: 3.75.0 - resolution: "wrangler@npm:3.75.0" - dependencies: - "@cloudflare/kv-asset-handler": "npm:0.3.4" - "@cloudflare/workers-shared": "npm:0.4.1" - "@esbuild-plugins/node-globals-polyfill": "npm:^0.2.3" - "@esbuild-plugins/node-modules-polyfill": "npm:^0.2.2" - blake3-wasm: "npm:^2.1.5" - chokidar: "npm:^3.5.3" - date-fns: "npm:^3.6.0" - esbuild: "npm:0.17.19" - fsevents: "npm:~2.3.2" - miniflare: "npm:3.20240821.1" - nanoid: "npm:^3.3.3" - path-to-regexp: "npm:^6.2.0" - resolve: "npm:^1.22.8" - resolve.exports: "npm:^2.0.2" - selfsigned: "npm:^2.0.1" - source-map: "npm:^0.6.1" - unenv: "npm:unenv-nightly@2.0.0-1724863496.70db6f1" - workerd: "npm:1.20240821.1" - xxhash-wasm: "npm:^1.0.1" - peerDependencies: - "@cloudflare/workers-types": ^4.20240821.1 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@cloudflare/workers-types": - optional: true - bin: - wrangler: bin/wrangler.js - wrangler2: bin/wrangler.js - checksum: 10/b12aaca168354abedb49eecc3c399f8059da3d37436d3747cbfb64b51c2b5deb12309992168d6dbc98573fbadc682481707a7a14748a9ce75311839515044c8c + checksum: 10/c66ecae996cf54b8472b640af26a87960dc51922b14a25b1992ddd214f5b2bb6cb245c92140e13177eef4f73b9bf5c0f1a46bb6407d3ae9d80e21846428c2858 languageName: node linkType: hard @@ -39254,11 +39630,11 @@ __metadata: linkType: hard "yaml@npm:^2.2.1, yaml@npm:^2.2.2": - version: 2.5.0 - resolution: "yaml@npm:2.5.0" + version: 2.5.1 + resolution: "yaml@npm:2.5.1" bin: yaml: bin.mjs - checksum: 10/72e903fdbe3742058885205db4a6c9ff38e5f497f4e05e631264f7756083c05e7d10dfb5e4ce9d7a95de95338f9b20d19dd0b91c60c65f7d7608b6b3929820ad + checksum: 10/0eecb679db75ea6a989ad97715a9fa5d946972945aa6aa7d2175bca66c213b5564502ccb1cdd04b1bf816ee38b5c43e4e2fda3ff6f5e09da24dabb51ae92c57d languageName: node linkType: hard @@ -39289,7 +39665,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": +"yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" checksum: 10/9dc2c217ea3bf8d858041252d43e074f7166b53f3d010a8c711275e09cd3d62a002969a39858b92bbda2a6a63a585c7127014534a560b9c69ed2d923d113406e @@ -39494,11 +39870,11 @@ __metadata: linkType: hard "zod-to-json-schema@npm:^3.20.0, zod-to-json-schema@npm:^3.22.3": - version: 3.23.2 - resolution: "zod-to-json-schema@npm:3.23.2" + version: 3.23.3 + resolution: "zod-to-json-schema@npm:3.23.3" peerDependencies: zod: ^3.23.3 - checksum: 10/316fc539013fdbfbafa50dd26ad9c25a2375ca9e9ac7c340b3e5d6c041549210dce339d17a293649b8e31c83b1d34e93dd44827740f19799752de3ba0414158d + checksum: 10/09f783a2325606b88ecd17f8753f47d945e9e1290a0d81a68484f677ff16151c126b07419ee61720ddec4f10ad0c08688569d265feefb709d60c2164f055b87d languageName: node linkType: hard