diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..a406fb7 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ + +**/node_modules +**/dist +apps/users-ui/app +apps/users-ui/src +apps/admin-ui/app +apps/users-ui/src +**/package-lock.json +test/ diff --git a/.gitignore b/.gitignore index d7e612e..78e85bc 100644 --- a/.gitignore +++ b/.gitignore @@ -7,10 +7,14 @@ yarn-debug.log* yarn-error.log* lerna-debug.log* .pnpm-debug.log* +*.apk +**/appBinaries # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json +test/appBinaries + # Runtime data pids *.pid diff --git a/APIS_TO_REMOVE.md b/APIS_TO_REMOVE.md new file mode 100644 index 0000000..b0a1f25 --- /dev/null +++ b/APIS_TO_REMOVE.md @@ -0,0 +1,4 @@ +- trpc.user.tags.getTagsByStore — apps/backend/src/trpc/apis/user-apis/apis/tags.ts +- trpc.common.product.getAllProductsSummary — apps/backend/src/trpc/apis/common-apis/common.ts +- remove slots from products cache +- remove redundant product details like name, description etc from the slots api diff --git a/Dockerfile b/Dockerfile index 6fe5cf1..b54d938 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,32 +1,36 @@ # Optimized Dockerfile for backend and fallback-ui services (project root) -# 1. ---- Base Node image -FROM node:20-slim AS base +# 1. ---- Base Bun image +FROM oven/bun:1.3.10 AS base WORKDIR /app # 2. ---- Pruner ---- FROM base AS pruner WORKDIR /app # Copy config files first for better caching -COPY package.json package-lock.json turbo.json ./ +COPY package.json turbo.json ./ COPY apps/backend/package.json ./apps/backend/ COPY apps/fallback-ui/package.json ./apps/fallback-ui/ +COPY packages/shared/ ./packages/shared COPY packages/ui/package.json ./packages/ui/ -RUN npm install -g turbo +RUN bun install -g turbo COPY . . -RUN turbo prune --scope=backend --scope=fallback-ui --scope=common-ui --docker +RUN turbo prune --scope=backend --scope=fallback-ui --scope=@packages/shared --docker +# RUN find . -path "./node_modules" -prune -o -print # 3. ---- Builder ---- FROM base AS builder WORKDIR /app -# Copy package files first to cache npm install +# Copy package files first to cache bun install COPY --from=pruner /app/out/json/ . -COPY --from=pruner /app/out/package-lock.json ./package-lock.json +#COPY --from=pruner /app/out/bun.lock ./bun.lock +#RUN cat ./bun.lock COPY --from=pruner /app/turbo.json . -RUN npm ci +RUN bun install # Copy source code after dependencies are installed COPY --from=pruner /app/out/full/ . -RUN npx turbo run build --filter=fallback-ui... --filter=backend... +RUN bunx turbo run build --filter=fallback-ui... --filter=backend... +RUN find . -path "./node_modules" -prune -o -print # 4. ---- Runner ---- FROM base AS runner @@ -34,12 +38,15 @@ WORKDIR /app ENV NODE_ENV=production # Copy package files and install production deps COPY --from=pruner /app/out/json/ . -COPY --from=pruner /app/out/package-lock.json ./package-lock.json -RUN npm ci --production --omit=dev +#COPY --from=pruner /app/out/bun.lock ./bun.lock +RUN bun install --production # Copy built applications COPY --from=builder /app/apps/backend/dist ./apps/backend/dist COPY --from=builder /app/apps/fallback-ui/dist ./apps/fallback-ui/dist +COPY --from=builder /app/packages/shared ./packages/shared + +# RUN ls -R +RUN find . -path "./node_modules" -prune -o -print + EXPOSE 4000 -RUN npm i -g bun -CMD ["bun", "apps/backend/dist/index.js"] -# CMD ["node", "apps/backend/dist/index.js"] \ No newline at end of file +CMD ["bun", "apps/backend/dist/apps/backend/index.js"] diff --git a/apps/admin-ui/.expo/types/router.d.ts b/apps/admin-ui/.expo/types/router.d.ts index 767f20b..0a42212 100644 --- a/apps/admin-ui/.expo/types/router.d.ts +++ b/apps/admin-ui/.expo/types/router.d.ts @@ -6,9 +6,15 @@ export * from 'expo-router'; declare module 'expo-router' { export namespace ExpoRouter { export interface __routes { - hrefInputParams: { pathname: Router.RelativePathString, params?: Router.UnknownInputParams } | { pathname: Router.ExternalPathString, params?: Router.UnknownInputParams } | { pathname: `/`; params?: Router.UnknownInputParams; } | { pathname: `/login`; params?: Router.UnknownInputParams; } | { pathname: `/_sitemap`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/address-management` | `/address-management`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/complaints` | `/complaints`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons/create` | `/coupons/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons` | `/coupons`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons/reserved-coupons` | `/coupons/reserved-coupons`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app/all-items-order` | `/customize-app/all-items-order`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app` | `/customize-app`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app/popular-items` | `/customize-app/popular-items`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard` | `/dashboard`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners/create` | `/dashboard-banners/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners` | `/dashboard-banners`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders` | `/manage-orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders/delivery-sequences` | `/manage-orders/delivery-sequences`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders/orders` | `/manage-orders/orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/prices-overview` | `/prices-overview`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-groupings/create` | `/product-groupings/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-groupings` | `/product-groupings`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags/add` | `/product-tags/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags` | `/product-tags`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags/edit` | `/product-tags/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products/add` | `/products/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products/edit` | `/products/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products` | `/products`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/rebalance-orders` | `/rebalance-orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/send-notifications` | `/send-notifications`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots/add` | `/slots/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots` | `/slots`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots/slot-details` | `/slots/slot-details`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores/add` | `/stores/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores/edit` | `/stores/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores` | `/stores`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/user-management` | `/user-management`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/users` | `/users`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/vendor-snippets` | `/vendor-snippets`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons/edit/[id]` | `/coupons/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/dashboard-banners/edit/[id]` | `/dashboard-banners/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/manage-orders/order-details/[id]` | `/manage-orders/order-details/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/product-groupings/edit/[id]` | `/product-groupings/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/products/detail/[id]` | `/products/detail/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/slots/edit/[id]` | `/slots/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/user-management/[id]` | `/user-management/[id]`, params: Router.UnknownInputParams & { id: string | number; } }; - hrefOutputParams: { pathname: Router.RelativePathString, params?: Router.UnknownOutputParams } | { pathname: Router.ExternalPathString, params?: Router.UnknownOutputParams } | { pathname: `/`; params?: Router.UnknownOutputParams; } | { pathname: `/login`; params?: Router.UnknownOutputParams; } | { pathname: `/_sitemap`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/address-management` | `/address-management`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/complaints` | `/complaints`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/coupons/create` | `/coupons/create`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/coupons` | `/coupons`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/coupons/reserved-coupons` | `/coupons/reserved-coupons`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/customize-app/all-items-order` | `/customize-app/all-items-order`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/customize-app` | `/customize-app`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/customize-app/popular-items` | `/customize-app/popular-items`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/dashboard` | `/dashboard`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners/create` | `/dashboard-banners/create`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners` | `/dashboard-banners`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/manage-orders` | `/manage-orders`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/manage-orders/delivery-sequences` | `/manage-orders/delivery-sequences`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/manage-orders/orders` | `/manage-orders/orders`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/prices-overview` | `/prices-overview`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/product-groupings/create` | `/product-groupings/create`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/product-groupings` | `/product-groupings`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/product-tags/add` | `/product-tags/add`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/product-tags` | `/product-tags`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/product-tags/edit` | `/product-tags/edit`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/products/add` | `/products/add`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/products/edit` | `/products/edit`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/products` | `/products`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/rebalance-orders` | `/rebalance-orders`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/send-notifications` | `/send-notifications`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/slots/add` | `/slots/add`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/slots` | `/slots`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/slots/slot-details` | `/slots/slot-details`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/stores/add` | `/stores/add`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/stores/edit` | `/stores/edit`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/stores` | `/stores`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/user-management` | `/user-management`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/users` | `/users`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/vendor-snippets` | `/vendor-snippets`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/coupons/edit/[id]` | `/coupons/edit/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/dashboard-banners/edit/[id]` | `/dashboard-banners/edit/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/manage-orders/order-details/[id]` | `/manage-orders/order-details/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/product-groupings/edit/[id]` | `/product-groupings/edit/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/products/detail/[id]` | `/products/detail/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/slots/edit/[id]` | `/slots/edit/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/user-management/[id]` | `/user-management/[id]`, params: Router.UnknownOutputParams & { id: string; } }; - href: Router.RelativePathString | Router.ExternalPathString | `/${`?${string}` | `#${string}` | ''}` | `/login${`?${string}` | `#${string}` | ''}` | `/_sitemap${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/address-management${`?${string}` | `#${string}` | ''}` | `/address-management${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/complaints${`?${string}` | `#${string}` | ''}` | `/complaints${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/coupons/create${`?${string}` | `#${string}` | ''}` | `/coupons/create${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/coupons${`?${string}` | `#${string}` | ''}` | `/coupons${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/coupons/reserved-coupons${`?${string}` | `#${string}` | ''}` | `/coupons/reserved-coupons${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/customize-app/all-items-order${`?${string}` | `#${string}` | ''}` | `/customize-app/all-items-order${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/customize-app${`?${string}` | `#${string}` | ''}` | `/customize-app${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/customize-app/popular-items${`?${string}` | `#${string}` | ''}` | `/customize-app/popular-items${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/dashboard${`?${string}` | `#${string}` | ''}` | `/dashboard${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/dashboard-banners/create${`?${string}` | `#${string}` | ''}` | `/dashboard-banners/create${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/dashboard-banners${`?${string}` | `#${string}` | ''}` | `/dashboard-banners${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/manage-orders${`?${string}` | `#${string}` | ''}` | `/manage-orders${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/manage-orders/delivery-sequences${`?${string}` | `#${string}` | ''}` | `/manage-orders/delivery-sequences${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/manage-orders/orders${`?${string}` | `#${string}` | ''}` | `/manage-orders/orders${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/prices-overview${`?${string}` | `#${string}` | ''}` | `/prices-overview${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-groupings/create${`?${string}` | `#${string}` | ''}` | `/product-groupings/create${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-groupings${`?${string}` | `#${string}` | ''}` | `/product-groupings${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-tags/add${`?${string}` | `#${string}` | ''}` | `/product-tags/add${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-tags${`?${string}` | `#${string}` | ''}` | `/product-tags${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-tags/edit${`?${string}` | `#${string}` | ''}` | `/product-tags/edit${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/products/add${`?${string}` | `#${string}` | ''}` | `/products/add${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/products/edit${`?${string}` | `#${string}` | ''}` | `/products/edit${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/products${`?${string}` | `#${string}` | ''}` | `/products${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/rebalance-orders${`?${string}` | `#${string}` | ''}` | `/rebalance-orders${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/send-notifications${`?${string}` | `#${string}` | ''}` | `/send-notifications${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/slots/add${`?${string}` | `#${string}` | ''}` | `/slots/add${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/slots${`?${string}` | `#${string}` | ''}` | `/slots${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/slots/slot-details${`?${string}` | `#${string}` | ''}` | `/slots/slot-details${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/stores/add${`?${string}` | `#${string}` | ''}` | `/stores/add${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/stores/edit${`?${string}` | `#${string}` | ''}` | `/stores/edit${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/stores${`?${string}` | `#${string}` | ''}` | `/stores${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/user-management${`?${string}` | `#${string}` | ''}` | `/user-management${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/users${`?${string}` | `#${string}` | ''}` | `/users${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/vendor-snippets${`?${string}` | `#${string}` | ''}` | `/vendor-snippets${`?${string}` | `#${string}` | ''}` | { pathname: Router.RelativePathString, params?: Router.UnknownInputParams } | { pathname: Router.ExternalPathString, params?: Router.UnknownInputParams } | { pathname: `/`; params?: Router.UnknownInputParams; } | { pathname: `/login`; params?: Router.UnknownInputParams; } | { pathname: `/_sitemap`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/address-management` | `/address-management`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/complaints` | `/complaints`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons/create` | `/coupons/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons` | `/coupons`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons/reserved-coupons` | `/coupons/reserved-coupons`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app/all-items-order` | `/customize-app/all-items-order`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app` | `/customize-app`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app/popular-items` | `/customize-app/popular-items`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard` | `/dashboard`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners/create` | `/dashboard-banners/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners` | `/dashboard-banners`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders` | `/manage-orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders/delivery-sequences` | `/manage-orders/delivery-sequences`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders/orders` | `/manage-orders/orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/prices-overview` | `/prices-overview`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-groupings/create` | `/product-groupings/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-groupings` | `/product-groupings`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags/add` | `/product-tags/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags` | `/product-tags`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags/edit` | `/product-tags/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products/add` | `/products/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products/edit` | `/products/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products` | `/products`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/rebalance-orders` | `/rebalance-orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/send-notifications` | `/send-notifications`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots/add` | `/slots/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots` | `/slots`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots/slot-details` | `/slots/slot-details`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores/add` | `/stores/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores/edit` | `/stores/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores` | `/stores`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/user-management` | `/user-management`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/users` | `/users`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/vendor-snippets` | `/vendor-snippets`; params?: Router.UnknownInputParams; } | `${'/(drawer)'}/coupons/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/coupons/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/dashboard-banners/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/dashboard-banners/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/manage-orders/order-details/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/manage-orders/order-details/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-groupings/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/product-groupings/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/products/detail/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/products/detail/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/slots/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/slots/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/user-management/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/user-management/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | { pathname: `${'/(drawer)'}/coupons/edit/[id]` | `/coupons/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/dashboard-banners/edit/[id]` | `/dashboard-banners/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/manage-orders/order-details/[id]` | `/manage-orders/order-details/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/product-groupings/edit/[id]` | `/product-groupings/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/products/detail/[id]` | `/products/detail/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/slots/edit/[id]` | `/slots/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/user-management/[id]` | `/user-management/[id]`, params: Router.UnknownInputParams & { id: string | number; } }; +<<<<<<< HEAD + hrefInputParams: { pathname: Router.RelativePathString, params?: Router.UnknownInputParams } | { pathname: Router.ExternalPathString, params?: Router.UnknownInputParams } | { pathname: `/`; params?: Router.UnknownInputParams; } | { pathname: `/login`; params?: Router.UnknownInputParams; } | { pathname: `/_sitemap`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/complaints` | `/complaints`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons/create` | `/coupons/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons` | `/coupons`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons/reserved-coupons` | `/coupons/reserved-coupons`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app/all-items-order` | `/customize-app/all-items-order`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app` | `/customize-app`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app/popular-items` | `/customize-app/popular-items`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard` | `/dashboard`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners/create` | `/dashboard-banners/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners` | `/dashboard-banners`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders` | `/manage-orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders/delivery-sequences` | `/manage-orders/delivery-sequences`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders/orders` | `/manage-orders/orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/prices-overview` | `/prices-overview`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-groupings/create` | `/product-groupings/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-groupings` | `/product-groupings`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags/add` | `/product-tags/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags` | `/product-tags`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags/edit` | `/product-tags/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products/add` | `/products/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products/edit` | `/products/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products` | `/products`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/rebalance-orders` | `/rebalance-orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/send-notifications` | `/send-notifications`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots/add` | `/slots/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots` | `/slots`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots/slot-details` | `/slots/slot-details`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores/add` | `/stores/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores/edit` | `/stores/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores` | `/stores`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/user-management` | `/user-management`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/users` | `/users`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/vendor-snippets` | `/vendor-snippets`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stocking-schedules` | `/stocking-schedules`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons/edit/[id]` | `/coupons/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/dashboard-banners/edit/[id]` | `/dashboard-banners/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/manage-orders/order-details/[id]` | `/manage-orders/order-details/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/product-groupings/edit/[id]` | `/product-groupings/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/products/detail/[id]` | `/products/detail/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/slots/edit/[id]` | `/slots/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/user-management/[id]` | `/user-management/[id]`, params: Router.UnknownInputParams & { id: string | number; } }; + hrefOutputParams: { pathname: Router.RelativePathString, params?: Router.UnknownOutputParams } | { pathname: Router.ExternalPathString, params?: Router.UnknownOutputParams } | { pathname: `/`; params?: Router.UnknownOutputParams; } | { pathname: `/login`; params?: Router.UnknownOutputParams; } | { pathname: `/_sitemap`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/complaints` | `/complaints`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/coupons/create` | `/coupons/create`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/coupons` | `/coupons`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/coupons/reserved-coupons` | `/coupons/reserved-coupons`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/customize-app/all-items-order` | `/customize-app/all-items-order`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/customize-app` | `/customize-app`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/customize-app/popular-items` | `/customize-app/popular-items`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/dashboard` | `/dashboard`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners/create` | `/dashboard-banners/create`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners` | `/dashboard-banners`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/manage-orders` | `/manage-orders`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/manage-orders/delivery-sequences` | `/manage-orders/delivery-sequences`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/manage-orders/orders` | `/manage-orders/orders`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/prices-overview` | `/prices-overview`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/product-groupings/create` | `/product-groupings/create`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/product-groupings` | `/product-groupings`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/product-tags/add` | `/product-tags/add`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/product-tags` | `/product-tags`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/product-tags/edit` | `/product-tags/edit`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/products/add` | `/products/add`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/products/edit` | `/products/edit`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/products` | `/products`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/rebalance-orders` | `/rebalance-orders`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/send-notifications` | `/send-notifications`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/slots/add` | `/slots/add`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/slots` | `/slots`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/slots/slot-details` | `/slots/slot-details`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/stores/add` | `/stores/add`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/stores/edit` | `/stores/edit`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/stores` | `/stores`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/user-management` | `/user-management`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/users` | `/users`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/vendor-snippets` | `/vendor-snippets`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/stocking-schedules` | `/stocking-schedules`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/coupons/edit/[id]` | `/coupons/edit/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/dashboard-banners/edit/[id]` | `/dashboard-banners/edit/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/manage-orders/order-details/[id]` | `/manage-orders/order-details/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/product-groupings/edit/[id]` | `/product-groupings/edit/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/products/detail/[id]` | `/products/detail/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/slots/edit/[id]` | `/slots/edit/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/user-management/[id]` | `/user-management/[id]`, params: Router.UnknownOutputParams & { id: string; } }; + href: Router.RelativePathString | Router.ExternalPathString | `/${`?${string}` | `#${string}` | ''}` | `/login${`?${string}` | `#${string}` | ''}` | `/_sitemap${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/complaints${`?${string}` | `#${string}` | ''}` | `/complaints${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/coupons/create${`?${string}` | `#${string}` | ''}` | `/coupons/create${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/coupons${`?${string}` | `#${string}` | ''}` | `/coupons${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/coupons/reserved-coupons${`?${string}` | `#${string}` | ''}` | `/coupons/reserved-coupons${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/customize-app/all-items-order${`?${string}` | `#${string}` | ''}` | `/customize-app/all-items-order${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/customize-app${`?${string}` | `#${string}` | ''}` | `/customize-app${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/customize-app/popular-items${`?${string}` | `#${string}` | ''}` | `/customize-app/popular-items${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/dashboard${`?${string}` | `#${string}` | ''}` | `/dashboard${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/dashboard-banners/create${`?${string}` | `#${string}` | ''}` | `/dashboard-banners/create${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/dashboard-banners${`?${string}` | `#${string}` | ''}` | `/dashboard-banners${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/manage-orders${`?${string}` | `#${string}` | ''}` | `/manage-orders${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/manage-orders/delivery-sequences${`?${string}` | `#${string}` | ''}` | `/manage-orders/delivery-sequences${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/manage-orders/orders${`?${string}` | `#${string}` | ''}` | `/manage-orders/orders${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/prices-overview${`?${string}` | `#${string}` | ''}` | `/prices-overview${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-groupings/create${`?${string}` | `#${string}` | ''}` | `/product-groupings/create${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-groupings${`?${string}` | `#${string}` | ''}` | `/product-groupings${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-tags/add${`?${string}` | `#${string}` | ''}` | `/product-tags/add${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-tags${`?${string}` | `#${string}` | ''}` | `/product-tags${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-tags/edit${`?${string}` | `#${string}` | ''}` | `/product-tags/edit${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/products/add${`?${string}` | `#${string}` | ''}` | `/products/add${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/products/edit${`?${string}` | `#${string}` | ''}` | `/products/edit${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/products${`?${string}` | `#${string}` | ''}` | `/products${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/rebalance-orders${`?${string}` | `#${string}` | ''}` | `/rebalance-orders${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/send-notifications${`?${string}` | `#${string}` | ''}` | `/send-notifications${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/slots/add${`?${string}` | `#${string}` | ''}` | `/slots/add${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/slots${`?${string}` | `#${string}` | ''}` | `/slots${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/slots/slot-details${`?${string}` | `#${string}` | ''}` | `/slots/slot-details${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/stores/add${`?${string}` | `#${string}` | ''}` | `/stores/add${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/stores/edit${`?${string}` | `#${string}` | ''}` | `/stores/edit${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/stores${`?${string}` | `#${string}` | ''}` | `/stores${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/user-management${`?${string}` | `#${string}` | ''}` | `/user-management${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/users${`?${string}` | `#${string}` | ''}` | `/users${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/vendor-snippets${`?${string}` | `#${string}` | ''}` | `/vendor-snippets${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/stocking-schedules${`?${string}` | `#${string}` | ''}` | `/stocking-schedules${`?${string}` | `#${string}` | ''}` | { pathname: Router.RelativePathString, params?: Router.UnknownInputParams } | { pathname: Router.ExternalPathString, params?: Router.UnknownInputParams } | { pathname: `/`; params?: Router.UnknownInputParams; } | { pathname: `/login`; params?: Router.UnknownInputParams; } | { pathname: `/_sitemap`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/complaints` | `/complaints`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons/create` | `/coupons/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons` | `/coupons`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons/reserved-coupons` | `/coupons/reserved-coupons`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app/all-items-order` | `/customize-app/all-items-order`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app` | `/customize-app`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app/popular-items` | `/customize-app/popular-items`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard` | `/dashboard`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners/create` | `/dashboard-banners/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners` | `/dashboard-banners`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders` | `/manage-orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders/delivery-sequences` | `/manage-orders/delivery-sequences`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders/orders` | `/manage-orders/orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/prices-overview` | `/prices-overview`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-groupings/create` | `/product-groupings/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-groupings` | `/product-groupings`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags/add` | `/product-tags/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags` | `/product-tags`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags/edit` | `/product-tags/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products/add` | `/products/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products/edit` | `/products/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products` | `/products`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/rebalance-orders` | `/rebalance-orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/send-notifications` | `/send-notifications`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots/add` | `/slots/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots` | `/slots`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots/slot-details` | `/slots/slot-details`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores/add` | `/stores/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores/edit` | `/stores/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores` | `/stores`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/user-management` | `/user-management`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/users` | `/users`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/vendor-snippets` | `/vendor-snippets`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stocking-schedules` | `/stocking-schedules`; params?: Router.UnknownInputParams; } | `${'/(drawer)'}/coupons/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/coupons/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/dashboard-banners/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/dashboard-banners/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/manage-orders/order-details/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/manage-orders/order-details/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-groupings/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/product-groupings/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/products/detail/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/products/detail/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/slots/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/slots/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/user-management/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/user-management/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | { pathname: `${'/(drawer)'}/coupons/edit/[id]` | `/coupons/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/dashboard-banners/edit/[id]` | `/dashboard-banners/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/manage-orders/order-details/[id]` | `/manage-orders/order-details/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/product-groupings/edit/[id]` | `/product-groupings/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/products/detail/[id]` | `/products/detail/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/slots/edit/[id]` | `/slots/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/user-management/[id]` | `/user-management/[id]`, params: Router.UnknownInputParams & { id: string | number; } }; +======= + hrefInputParams: { pathname: Router.RelativePathString, params?: Router.UnknownInputParams } | { pathname: Router.ExternalPathString, params?: Router.UnknownInputParams } | { pathname: `/`; params?: Router.UnknownInputParams; } | { pathname: `/login`; params?: Router.UnknownInputParams; } | { pathname: `/_sitemap`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/complaints` | `/complaints`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons/create` | `/coupons/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons` | `/coupons`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons/reserved-coupons` | `/coupons/reserved-coupons`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app/all-items-order` | `/customize-app/all-items-order`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app` | `/customize-app`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app/popular-items` | `/customize-app/popular-items`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard` | `/dashboard`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners/create` | `/dashboard-banners/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners` | `/dashboard-banners`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders` | `/manage-orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders/delivery-sequences` | `/manage-orders/delivery-sequences`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders/orders` | `/manage-orders/orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/prices-overview` | `/prices-overview`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-groupings/create` | `/product-groupings/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-groupings` | `/product-groupings`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags/add` | `/product-tags/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags` | `/product-tags`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags/edit` | `/product-tags/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products/add` | `/products/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products/edit` | `/products/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products` | `/products`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/rebalance-orders` | `/rebalance-orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/send-notifications` | `/send-notifications`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots/add` | `/slots/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots` | `/slots`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots/slot-details` | `/slots/slot-details`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores/add` | `/stores/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores/edit` | `/stores/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores` | `/stores`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/user-management` | `/user-management`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/users` | `/users`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/vendor-snippets` | `/vendor-snippets`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/address-management` | `/address-management`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons/edit/[id]` | `/coupons/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/dashboard-banners/edit/[id]` | `/dashboard-banners/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/manage-orders/order-details/[id]` | `/manage-orders/order-details/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/product-groupings/edit/[id]` | `/product-groupings/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/products/detail/[id]` | `/products/detail/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/slots/edit/[id]` | `/slots/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/user-management/[id]` | `/user-management/[id]`, params: Router.UnknownInputParams & { id: string | number; } }; + hrefOutputParams: { pathname: Router.RelativePathString, params?: Router.UnknownOutputParams } | { pathname: Router.ExternalPathString, params?: Router.UnknownOutputParams } | { pathname: `/`; params?: Router.UnknownOutputParams; } | { pathname: `/login`; params?: Router.UnknownOutputParams; } | { pathname: `/_sitemap`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/complaints` | `/complaints`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/coupons/create` | `/coupons/create`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/coupons` | `/coupons`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/coupons/reserved-coupons` | `/coupons/reserved-coupons`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/customize-app/all-items-order` | `/customize-app/all-items-order`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/customize-app` | `/customize-app`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/customize-app/popular-items` | `/customize-app/popular-items`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/dashboard` | `/dashboard`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners/create` | `/dashboard-banners/create`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners` | `/dashboard-banners`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/manage-orders` | `/manage-orders`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/manage-orders/delivery-sequences` | `/manage-orders/delivery-sequences`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/manage-orders/orders` | `/manage-orders/orders`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/prices-overview` | `/prices-overview`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/product-groupings/create` | `/product-groupings/create`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/product-groupings` | `/product-groupings`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/product-tags/add` | `/product-tags/add`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/product-tags` | `/product-tags`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/product-tags/edit` | `/product-tags/edit`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/products/add` | `/products/add`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/products/edit` | `/products/edit`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/products` | `/products`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/rebalance-orders` | `/rebalance-orders`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/send-notifications` | `/send-notifications`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/slots/add` | `/slots/add`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/slots` | `/slots`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/slots/slot-details` | `/slots/slot-details`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/stores/add` | `/stores/add`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/stores/edit` | `/stores/edit`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/stores` | `/stores`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/user-management` | `/user-management`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/users` | `/users`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/vendor-snippets` | `/vendor-snippets`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/address-management` | `/address-management`; params?: Router.UnknownOutputParams; } | { pathname: `${'/(drawer)'}/coupons/edit/[id]` | `/coupons/edit/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/dashboard-banners/edit/[id]` | `/dashboard-banners/edit/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/manage-orders/order-details/[id]` | `/manage-orders/order-details/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/product-groupings/edit/[id]` | `/product-groupings/edit/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/products/detail/[id]` | `/products/detail/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/slots/edit/[id]` | `/slots/edit/[id]`, params: Router.UnknownOutputParams & { id: string; } } | { pathname: `${'/(drawer)'}/user-management/[id]` | `/user-management/[id]`, params: Router.UnknownOutputParams & { id: string; } }; + href: Router.RelativePathString | Router.ExternalPathString | `/${`?${string}` | `#${string}` | ''}` | `/login${`?${string}` | `#${string}` | ''}` | `/_sitemap${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/complaints${`?${string}` | `#${string}` | ''}` | `/complaints${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/coupons/create${`?${string}` | `#${string}` | ''}` | `/coupons/create${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/coupons${`?${string}` | `#${string}` | ''}` | `/coupons${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/coupons/reserved-coupons${`?${string}` | `#${string}` | ''}` | `/coupons/reserved-coupons${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/customize-app/all-items-order${`?${string}` | `#${string}` | ''}` | `/customize-app/all-items-order${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/customize-app${`?${string}` | `#${string}` | ''}` | `/customize-app${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/customize-app/popular-items${`?${string}` | `#${string}` | ''}` | `/customize-app/popular-items${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/dashboard${`?${string}` | `#${string}` | ''}` | `/dashboard${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/dashboard-banners/create${`?${string}` | `#${string}` | ''}` | `/dashboard-banners/create${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/dashboard-banners${`?${string}` | `#${string}` | ''}` | `/dashboard-banners${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/manage-orders${`?${string}` | `#${string}` | ''}` | `/manage-orders${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/manage-orders/delivery-sequences${`?${string}` | `#${string}` | ''}` | `/manage-orders/delivery-sequences${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/manage-orders/orders${`?${string}` | `#${string}` | ''}` | `/manage-orders/orders${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/prices-overview${`?${string}` | `#${string}` | ''}` | `/prices-overview${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-groupings/create${`?${string}` | `#${string}` | ''}` | `/product-groupings/create${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-groupings${`?${string}` | `#${string}` | ''}` | `/product-groupings${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-tags/add${`?${string}` | `#${string}` | ''}` | `/product-tags/add${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-tags${`?${string}` | `#${string}` | ''}` | `/product-tags${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-tags/edit${`?${string}` | `#${string}` | ''}` | `/product-tags/edit${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/products/add${`?${string}` | `#${string}` | ''}` | `/products/add${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/products/edit${`?${string}` | `#${string}` | ''}` | `/products/edit${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/products${`?${string}` | `#${string}` | ''}` | `/products${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/rebalance-orders${`?${string}` | `#${string}` | ''}` | `/rebalance-orders${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/send-notifications${`?${string}` | `#${string}` | ''}` | `/send-notifications${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/slots/add${`?${string}` | `#${string}` | ''}` | `/slots/add${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/slots${`?${string}` | `#${string}` | ''}` | `/slots${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/slots/slot-details${`?${string}` | `#${string}` | ''}` | `/slots/slot-details${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/stores/add${`?${string}` | `#${string}` | ''}` | `/stores/add${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/stores/edit${`?${string}` | `#${string}` | ''}` | `/stores/edit${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/stores${`?${string}` | `#${string}` | ''}` | `/stores${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/user-management${`?${string}` | `#${string}` | ''}` | `/user-management${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/users${`?${string}` | `#${string}` | ''}` | `/users${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/vendor-snippets${`?${string}` | `#${string}` | ''}` | `/vendor-snippets${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/address-management${`?${string}` | `#${string}` | ''}` | `/address-management${`?${string}` | `#${string}` | ''}` | { pathname: Router.RelativePathString, params?: Router.UnknownInputParams } | { pathname: Router.ExternalPathString, params?: Router.UnknownInputParams } | { pathname: `/`; params?: Router.UnknownInputParams; } | { pathname: `/login`; params?: Router.UnknownInputParams; } | { pathname: `/_sitemap`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/complaints` | `/complaints`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons/create` | `/coupons/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons` | `/coupons`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/coupons/reserved-coupons` | `/coupons/reserved-coupons`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app/all-items-order` | `/customize-app/all-items-order`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app` | `/customize-app`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/customize-app/popular-items` | `/customize-app/popular-items`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard` | `/dashboard`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners/create` | `/dashboard-banners/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/dashboard-banners` | `/dashboard-banners`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders` | `/manage-orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders/delivery-sequences` | `/manage-orders/delivery-sequences`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/manage-orders/orders` | `/manage-orders/orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/prices-overview` | `/prices-overview`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-groupings/create` | `/product-groupings/create`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-groupings` | `/product-groupings`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags/add` | `/product-tags/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags` | `/product-tags`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/product-tags/edit` | `/product-tags/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products/add` | `/products/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products/edit` | `/products/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/products` | `/products`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/rebalance-orders` | `/rebalance-orders`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/send-notifications` | `/send-notifications`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots/add` | `/slots/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots` | `/slots`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/slots/slot-details` | `/slots/slot-details`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores/add` | `/stores/add`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores/edit` | `/stores/edit`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/stores` | `/stores`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/user-management` | `/user-management`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/users` | `/users`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/vendor-snippets` | `/vendor-snippets`; params?: Router.UnknownInputParams; } | { pathname: `${'/(drawer)'}/address-management` | `/address-management`; params?: Router.UnknownInputParams; } | `${'/(drawer)'}/coupons/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/coupons/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/dashboard-banners/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/dashboard-banners/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/manage-orders/order-details/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/manage-orders/order-details/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/product-groupings/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/product-groupings/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/products/detail/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/products/detail/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/slots/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/slots/edit/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `${'/(drawer)'}/user-management/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | `/user-management/${Router.SingleRoutePart}${`?${string}` | `#${string}` | ''}` | { pathname: `${'/(drawer)'}/coupons/edit/[id]` | `/coupons/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/dashboard-banners/edit/[id]` | `/dashboard-banners/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/manage-orders/order-details/[id]` | `/manage-orders/order-details/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/product-groupings/edit/[id]` | `/product-groupings/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/products/detail/[id]` | `/products/detail/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/slots/edit/[id]` | `/slots/edit/[id]`, params: Router.UnknownInputParams & { id: string | number; } } | { pathname: `${'/(drawer)'}/user-management/[id]` | `/user-management/[id]`, params: Router.UnknownInputParams & { id: string | number; } }; +>>>>>>> main } } } diff --git a/apps/admin-ui/app/(drawer)/_layout.tsx b/apps/admin-ui/app/(drawer)/_layout.tsx index 5be957c..d2644d0 100644 --- a/apps/admin-ui/app/(drawer)/_layout.tsx +++ b/apps/admin-ui/app/(drawer)/_layout.tsx @@ -227,8 +227,7 @@ export default function Layout() { - - + diff --git a/apps/admin-ui/app/(drawer)/address-management/index.tsx b/apps/admin-ui/app/(drawer)/address-management/index.tsx deleted file mode 100644 index 69745b8..0000000 --- a/apps/admin-ui/app/(drawer)/address-management/index.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import React, { useState } from 'react' -import { View, Text, TouchableOpacity, ScrollView } from 'react-native' -import { BottomDialog , tw } from 'common-ui' -import { trpc } from '@/src/trpc-client' -import AddressZoneForm from '@/components/AddressZoneForm' -import AddressPlaceForm from '@/components/AddressPlaceForm' -import MaterialIcons from '@expo/vector-icons/MaterialIcons' - -const AddressManagement: React.FC = () => { - const [dialogOpen, setDialogOpen] = useState(false) - const [dialogType, setDialogType] = useState<'zone' | 'place' | null>(null) - const [expandedZones, setExpandedZones] = useState>(new Set()) - - const { data: zones, refetch: refetchZones } = trpc.admin.address.getZones.useQuery() - const { data: areas, refetch: refetchAreas } = trpc.admin.address.getAreas.useQuery() - - const createZone = trpc.admin.address.createZone.useMutation({ - onSuccess: () => { - refetchZones() - setDialogOpen(false) - }, - }) - - const createArea = trpc.admin.address.createArea.useMutation({ - onSuccess: () => { - refetchAreas() - setDialogOpen(false) - }, - }) - - const handleAddZone = () => { - setDialogType('zone') - setDialogOpen(true) - } - - const handleAddPlace = () => { - setDialogType('place') - setDialogOpen(true) - } - - const toggleZone = (zoneId: number) => { - setExpandedZones(prev => { - const newSet = new Set(prev) - if (newSet.has(zoneId)) { - newSet.delete(zoneId) - } else { - newSet.add(zoneId) - } - return newSet - }) - } - - const groupedAreas = areas?.reduce((acc, area) => { - if (area.zoneId) { - if (!acc[area.zoneId]) acc[area.zoneId] = [] - acc[area.zoneId].push(area) - } - return acc - }, {} as Record) || {} - - const unzonedAreas = areas?.filter(a => !a.zoneId) || [] - - return ( - - - - Add Zone - - - Add Place - - - - - {zones?.map(zone => ( - - toggleZone(zone.id)}> - {zone.zoneName} - - - {expandedZones.has(zone.id) && ( - - {groupedAreas[zone.id]?.map(area => ( - - {area.placeName} - )) || No places in this zone} - - )} - - ))} - - - Unzoned Places - {unzonedAreas.map(area => ( - - {area.placeName} - ))} - {unzonedAreas.length === 0 && No unzoned places} - - - - setDialogOpen(false)}> - {dialogType === 'zone' && setDialogOpen(false)} />} - {dialogType === 'place' && setDialogOpen(false)} />} - - - ) -} - -export default AddressManagement \ No newline at end of file diff --git a/apps/admin-ui/app/(drawer)/dashboard/index.tsx b/apps/admin-ui/app/(drawer)/dashboard/index.tsx index d2598ab..f84e940 100644 --- a/apps/admin-ui/app/(drawer)/dashboard/index.tsx +++ b/apps/admin-ui/app/(drawer)/dashboard/index.tsx @@ -74,7 +74,7 @@ export default function Dashboard() { const menuItems: MenuItem[] = [ { - title: 'Manage Orders', + title: 'Manage Orderss', icon: 'shopping-bag', description: 'View and manage customer orders', route: '/(drawer)/manage-orders', @@ -158,6 +158,15 @@ export default function Dashboard() { iconColor: '#8B5CF6', iconBg: '#F3E8FF', }, + { + title: 'Stocking Schedules', + icon: 'schedule', + description: 'Manage product stocking schedules', + route: '/(drawer)/stocking-schedules', + category: 'products', + iconColor: '#0EA5E9', + iconBg: '#E0F2FE', + }, { title: 'Stores', icon: 'store', @@ -176,15 +185,6 @@ export default function Dashboard() { iconColor: '#F97316', iconBg: '#FFEDD5', }, - { - title: 'Address Management', - icon: 'location-on', - description: 'Manage service areas', - route: '/(drawer)/address-management', - category: 'settings', - iconColor: '#EAB308', - iconBg: '#FEF9C3', - }, { title: 'App Constants', icon: 'settings-applications', @@ -294,4 +294,4 @@ export default function Dashboard() { ); -} \ No newline at end of file +} diff --git a/apps/admin-ui/app/(drawer)/product-tags/add.tsx b/apps/admin-ui/app/(drawer)/product-tags/add.tsx index c362b4e..36d2821 100644 --- a/apps/admin-ui/app/(drawer)/product-tags/add.tsx +++ b/apps/admin-ui/app/(drawer)/product-tags/add.tsx @@ -3,7 +3,6 @@ import { View, Alert } from 'react-native'; import { useRouter } from 'expo-router'; import { AppContainer, MyText, tw } from 'common-ui'; import TagForm from '@/src/components/TagForm'; -import { useCreateTag } from '@/src/api-hooks/tag.api'; import { trpc } from '@/src/trpc-client'; interface TagFormData { @@ -15,36 +14,17 @@ interface TagFormData { export default function AddTag() { const router = useRouter(); - const { mutate: createTag, isPending: isCreating } = useCreateTag(); + const createTag = trpc.admin.tag.createTag.useMutation(); const { data: storesData } = trpc.admin.store.getStores.useQuery(); - const handleSubmit = (values: TagFormData, image?: { uri?: string }) => { - const formData = new FormData(); - - // Add text fields - formData.append('tagName', values.tagName); - if (values.tagDescription) { - formData.append('tagDescription', values.tagDescription); - } - formData.append('isDashboardTag', values.isDashboardTag.toString()); - - // Add related stores - formData.append('relatedStores', JSON.stringify(values.relatedStores)); - - // Add image if uploaded - if (image?.uri) { - const filename = image.uri.split('/').pop() || 'image.jpg'; - const match = /\.(\w+)$/.exec(filename); - const type = match ? `image/${match[1]}` : 'image/jpeg'; - - formData.append('image', { - uri: image.uri, - name: filename, - type, - } as any); - } - - createTag(formData, { + const handleSubmit = (values: TagFormData, imageKey?: string, deleteExistingImage?: boolean) => { + createTag.mutate({ + tagName: values.tagName, + tagDescription: values.tagDescription, + isDashboardTag: values.isDashboardTag, + relatedStores: values.relatedStores, + imageKey: imageKey, + }, { onSuccess: (data) => { Alert.alert('Success', 'Tag created successfully', [ { @@ -76,10 +56,10 @@ export default function AddTag() { mode="create" initialValues={initialValues} onSubmit={handleSubmit} - isLoading={isCreating} + isLoading={createTag.isPending} stores={storesData?.stores.map(store => ({ id: store.id, name: store.name })) || []} /> ); -} \ No newline at end of file +} diff --git a/apps/admin-ui/app/(drawer)/product-tags/edit/index.tsx b/apps/admin-ui/app/(drawer)/product-tags/edit/index.tsx index 9c91b46..f43224b 100644 --- a/apps/admin-ui/app/(drawer)/product-tags/edit/index.tsx +++ b/apps/admin-ui/app/(drawer)/product-tags/edit/index.tsx @@ -3,7 +3,6 @@ import { View, Alert } from 'react-native'; import { useRouter, useLocalSearchParams } from 'expo-router'; import { AppContainer, MyText, tw } from 'common-ui'; import TagForm from '@/src/components/TagForm'; -import { useGetTag, useUpdateTag } from '@/src/api-hooks/tag.api'; import { trpc } from '@/src/trpc-client'; interface TagFormData { @@ -11,7 +10,6 @@ interface TagFormData { tagDescription: string; isDashboardTag: boolean; relatedStores: number[]; - existingImageUrl?: string; } export default function EditTag() { @@ -19,39 +17,25 @@ export default function EditTag() { const { tagId } = useLocalSearchParams<{ tagId: string }>(); const tagIdNum = tagId ? parseInt(tagId) : null; - const { data: tagData, isLoading: isLoadingTag, error: tagError } = useGetTag(tagIdNum!); - const { mutate: updateTag, isPending: isUpdating } = useUpdateTag(); + const { data: tagData, isLoading: isLoadingTag, error: tagError } = trpc.admin.tag.getTagById.useQuery( + { id: tagIdNum! }, + { enabled: !!tagIdNum } + ); + const updateTag = trpc.admin.tag.updateTag.useMutation(); const { data: storesData } = trpc.admin.store.getStores.useQuery(); - const handleSubmit = (values: TagFormData, image?: { uri?: string }) => { + const handleSubmit = (values: TagFormData, imageKey?: string, deleteExistingImage?: boolean) => { if (!tagIdNum) return; - const formData = new FormData(); - - // Add text fields - formData.append('tagName', values.tagName); - if (values.tagDescription) { - formData.append('tagDescription', values.tagDescription); - } - formData.append('isDashboardTag', values.isDashboardTag.toString()); - - // Add related stores - formData.append('relatedStores', JSON.stringify(values.relatedStores)); - - // Add image if uploaded - if (image?.uri) { - const filename = image.uri.split('/').pop() || 'image.jpg'; - const match = /\.(\w+)$/.exec(filename); - const type = match ? `image/${match[1]}` : 'image/jpeg'; - - formData.append('image', { - uri: image.uri, - name: filename, - type, - } as any); - } - - updateTag({ id: tagIdNum, formData }, { + updateTag.mutate({ + id: tagIdNum, + tagName: values.tagName, + tagDescription: values.tagDescription, + isDashboardTag: values.isDashboardTag, + relatedStores: values.relatedStores, + imageKey: imageKey, + deleteExistingImage: deleteExistingImage, + }, { onSuccess: (data) => { Alert.alert('Success', 'Tag updated successfully', [ { @@ -92,8 +76,7 @@ export default function EditTag() { tagName: tag.tagName, tagDescription: tag.tagDescription || '', isDashboardTag: tag.isDashboardTag, - relatedStores: tag.relatedStores || [], - existingImageUrl: tag.imageUrl || undefined, + relatedStores: Array.isArray(tag.relatedStores) ? tag.relatedStores : [], }; return ( @@ -106,10 +89,10 @@ export default function EditTag() { initialValues={initialValues} existingImageUrl={tag.imageUrl || undefined} onSubmit={handleSubmit} - isLoading={isUpdating} + isLoading={updateTag.isPending} stores={storesData?.stores.map(store => ({ id: store.id, name: store.name })) || []} /> ); -} \ No newline at end of file +} diff --git a/apps/admin-ui/app/(drawer)/product-tags/index.tsx b/apps/admin-ui/app/(drawer)/product-tags/index.tsx index 27b74ce..e3de5f0 100644 --- a/apps/admin-ui/app/(drawer)/product-tags/index.tsx +++ b/apps/admin-ui/app/(drawer)/product-tags/index.tsx @@ -5,7 +5,17 @@ import { useRouter } from 'expo-router'; import { MaterialIcons } from '@expo/vector-icons'; import { tw, MyText, useManualRefresh, useMarkDataFetchers, MyFlatList } from 'common-ui'; import { TagMenu } from '@/src/components/TagMenu'; -import { useGetTags, Tag } from '@/src/api-hooks/tag.api'; +import { trpc } from '@/src/trpc-client'; + +interface Tag { + id: number; + tagName: string; + tagDescription: string | null; + imageUrl: string | null; + isDashboardTag: boolean; + relatedStores?: any; + createdAt?: string; +} interface TagItemProps { item: Tag; @@ -60,7 +70,7 @@ const TagHeader: React.FC = ({ onAddNewTag }) => ( export default function ProductTags() { const router = useRouter(); - const { data: tagsData, isLoading, error, refetch } = useGetTags(); + const { data: tagsData, isLoading, error, refetch } = trpc.admin.tag.getTags.useQuery(); const [refreshing, setRefreshing] = useState(false); const tags = tagsData?.tags || []; diff --git a/apps/admin-ui/app/(drawer)/products/add.tsx b/apps/admin-ui/app/(drawer)/products/add.tsx index e49930c..1a5578f 100644 --- a/apps/admin-ui/app/(drawer)/products/add.tsx +++ b/apps/admin-ui/app/(drawer)/products/add.tsx @@ -2,53 +2,28 @@ import React from 'react'; import { Alert } from 'react-native'; import { AppContainer } from 'common-ui'; import ProductForm from '@/src/components/ProductForm'; -import { useCreateProduct, CreateProductPayload } from '@/src/api-hooks/product.api'; +import { trpc } from '@/src/trpc-client'; export default function AddProduct() { - const { mutate: createProduct, isPending: isCreating } = useCreateProduct(); + const createProduct = trpc.admin.product.createProduct.useMutation(); - const handleSubmit = (values: any, images?: { uri?: string, mimeType?: string }[]) => { - const payload: CreateProductPayload = { - name: values.name, - shortDescription: values.shortDescription, - longDescription: values.longDescription, - unitId: parseInt(values.unitId), - storeId: parseInt(values.storeId), - price: parseFloat(values.price), - marketPrice: values.marketPrice ? parseFloat(values.marketPrice) : undefined, - incrementStep: 1, - productQuantity: values.productQuantity || 1, - }; - - const formData = new FormData(); - Object.entries(payload).forEach(([key, value]) => { - if (value !== undefined && value !== null) { - formData.append(key, value as string); - } - }); - - // Append tag IDs - if (values.tagIds && values.tagIds.length > 0) { - values.tagIds.forEach((tagId: number) => { - formData.append('tagIds', tagId.toString()); - }); - } - - // Append images - if (images) { - images.forEach((image, index) => { - if (image.uri) { - formData.append('images', { - uri: image.uri, - name: `image-${index}.jpg`, - // type: 'image/jpeg', - type: image.mimeType as any, - } as any); - } - }); - } - - createProduct(formData, { + const handleSubmit = (values: any, imageKeys?: string[]) => { + createProduct.mutate({ + name: values.name, + shortDescription: values.shortDescription, + longDescription: values.longDescription, + unitId: parseInt(values.unitId), + storeId: parseInt(values.storeId), + price: parseFloat(values.price), + marketPrice: values.marketPrice ? parseFloat(values.marketPrice) : undefined, + incrementStep: 1, + productQuantity: values.productQuantity || 1, + isSuspended: values.isSuspended || false, + isFlashAvailable: values.isFlashAvailable || false, + flashPrice: values.flashPrice ? parseFloat(values.flashPrice) : undefined, + tagIds: values.tagIds || [], + imageKeys: imageKeys || [], + }, { onSuccess: (data) => { Alert.alert('Success', 'Product created successfully!'); // Reset form or navigate @@ -73,7 +48,7 @@ export default function AddProduct() { isFlashAvailable: false, flashPrice: '', productQuantity: 1, - }; + }; return ( @@ -81,9 +56,9 @@ export default function AddProduct() { mode="create" initialValues={initialValues} onSubmit={handleSubmit} - isLoading={isCreating} + isLoading={createProduct.isPending} existingImages={[]} /> ); -} \ No newline at end of file +} diff --git a/apps/admin-ui/app/(drawer)/products/detail/[id].tsx b/apps/admin-ui/app/(drawer)/products/detail/[id].tsx index 90543df..4cbb134 100644 --- a/apps/admin-ui/app/(drawer)/products/detail/[id].tsx +++ b/apps/admin-ui/app/(drawer)/products/detail/[id].tsx @@ -6,6 +6,7 @@ import { tw, AppContainer, MyText, useMarkDataFetchers, BottomDialog, ImageUploa import { MaterialIcons, FontAwesome5, Ionicons, Feather, MaterialCommunityIcons } from '@expo/vector-icons'; import { trpc } from '@/src/trpc-client'; import usePickImage from 'common-ui/src/components/use-pick-image'; +import { useUploadToObjectStorage } from '../../../../hooks/useUploadToObjectStorage'; import { Formik } from 'formik'; import { LinearGradient } from 'expo-linear-gradient'; import { BlurView } from 'expo-blur'; @@ -26,7 +27,7 @@ const ReviewResponseForm: React.FC = ({ reviewId, onClo const [uploadUrls, setUploadUrls] = useState([]); const respondToReview = trpc.admin.product.respondToReview.useMutation(); - const generateUploadUrls = trpc.user.fileUpload.generateUploadUrls.useMutation(); + const { upload, isUploading } = useUploadToObjectStorage(); const handleImagePick = usePickImage({ setFile: async (assets: any) => { @@ -62,30 +63,16 @@ const ReviewResponseForm: React.FC = ({ reviewId, onClo const handleSubmit = async (adminResponse: string) => { try { - const mimeTypes = selectedImages.map(s => s.mimeType); - const { uploadUrls: generatedUrls } = await generateUploadUrls.mutateAsync({ - contextString: 'review', - mimeTypes, - }); - const keys = generatedUrls.map(url => { - const u = new URL(url); - const rawKey = u.pathname.replace(/^\/+/, ""); - const decodedKey = decodeURIComponent(rawKey); - const parts = decodedKey.split('/'); - parts.shift(); - return parts.join('/'); - }); - setUploadUrls(generatedUrls); + let keys: string[] = []; + let generatedUrls: string[] = []; - for (let i = 0; i < generatedUrls.length; i++) { - const uploadUrl = generatedUrls[i]; - const { blob, mimeType } = selectedImages[i]; - const uploadResponse = await fetch(uploadUrl, { - method: 'PUT', - body: blob, - headers: { 'Content-Type': mimeType }, + if (selectedImages.length > 0) { + const result = await upload({ + images: selectedImages.map(img => ({ blob: img.blob, mimeType: img.mimeType })), + contextString: 'review', }); - if (!uploadResponse.ok) throw new Error(`Upload failed with status ${uploadResponse.status}`); + keys = result.keys; + generatedUrls = result.presignedUrls; } await respondToReview.mutateAsync({ @@ -101,8 +88,7 @@ const ReviewResponseForm: React.FC = ({ reviewId, onClo setSelectedImages([]); setDisplayImages([]); setUploadUrls([]); - } catch (error:any) { - + } catch (error: any) { Alert.alert('Error', error.message || 'Failed to submit response.'); } }; @@ -137,7 +123,7 @@ const ReviewResponseForm: React.FC = ({ reviewId, onClo formikSubmit()} activeOpacity={0.8} - disabled={respondToReview.isPending} + disabled={respondToReview.isPending || isUploading} > = ({ reviewId, onClo end={{ x: 1, y: 0 }} style={tw`py-4 rounded-2xl items-center shadow-lg`} > - {respondToReview.isPending ? ( + {isUploading ? ( + + ) : respondToReview.isPending ? ( ) : ( Submit Response diff --git a/apps/admin-ui/app/(drawer)/products/edit.tsx b/apps/admin-ui/app/(drawer)/products/edit.tsx index e0bea74..e4cbe7a 100644 --- a/apps/admin-ui/app/(drawer)/products/edit.tsx +++ b/apps/admin-ui/app/(drawer)/products/edit.tsx @@ -3,7 +3,6 @@ import { View, Text, Alert } from 'react-native'; import { useLocalSearchParams } from 'expo-router'; import { AppContainer, useManualRefresh, MyText, tw } from 'common-ui'; import ProductForm, { ProductFormRef } from '@/src/components/ProductForm'; -import { useUpdateProduct } from '@/src/api-hooks/product.api'; import { trpc } from '@/src/trpc-client'; export default function EditProduct() { @@ -11,85 +10,52 @@ export default function EditProduct() { const productId = Number(id); const productFormRef = useRef(null); - // const { data: product, isLoading: isFetching, refetch } = useGetProduct(productId); const { data: product, isLoading: isFetching, refetch } = trpc.admin.product.getProductById.useQuery( { id: productId }, { enabled: !!productId } ); - // - const { mutate: updateProduct, isPending: isUpdating } = useUpdateProduct(); + + const updateProduct = trpc.admin.product.updateProduct.useMutation(); useManualRefresh(() => refetch()); - const handleSubmit = (values: any, newImages?: { uri?: string }[], imagesToDelete?: string[]) => { - const payload = { - name: values.name, - shortDescription: values.shortDescription, - longDescription: values.longDescription, - unitId: parseInt(values.unitId), - storeId: parseInt(values.storeId), - price: parseFloat(values.price), - marketPrice: values.marketPrice ? parseFloat(values.marketPrice) : undefined, - incrementStep: 1, - productQuantity: values.productQuantity || 1, - deals: values.deals?.filter((deal: any) => + const handleSubmit = (values: any, newImageKeys?: string[], imagesToDelete?: string[]) => { + updateProduct.mutate({ + id: productId, + name: values.name, + shortDescription: values.shortDescription, + longDescription: values.longDescription, + unitId: parseInt(values.unitId), + storeId: parseInt(values.storeId), + price: parseFloat(values.price), + marketPrice: values.marketPrice ? parseFloat(values.marketPrice) : undefined, + incrementStep: 1, + productQuantity: values.productQuantity || 1, + isSuspended: values.isSuspended, + isFlashAvailable: values.isFlashAvailable, + flashPrice: values.flashPrice ? parseFloat(values.flashPrice) : undefined, + deals: values.deals?.filter((deal: any) => deal.quantity && deal.price && deal.validTill ).map((deal: any) => ({ quantity: parseInt(deal.quantity), price: parseFloat(deal.price), validTill: deal.validTill instanceof Date ? deal.validTill.toISOString().split('T')[0] - : deal.validTill, // Convert Date to YYYY-MM-DD string + : deal.validTill, })), tagIds: values.tagIds, - }; - - - const formData = new FormData(); - Object.entries(payload).forEach(([key, value]) => { - if (key === 'deals' && Array.isArray(value)) { - formData.append(key, JSON.stringify(value)); - } else if (key === 'tagIds' && Array.isArray(value)) { - value.forEach(tagId => { - formData.append('tagIds', tagId.toString()); - }); - } else if (value !== undefined && value !== null) { - formData.append(key, value as string); - } + newImageKeys: newImageKeys || [], + imagesToDelete: imagesToDelete || [], + }, { + onSuccess: (data) => { + Alert.alert('Success', 'Product updated successfully!'); + // Clear newly added images after successful update + productFormRef.current?.clearImages(); + }, + onError: (error: any) => { + Alert.alert('Error', error.message || 'Failed to update product'); + }, }); - - // Add new images - if (newImages && newImages.length > 0) { - newImages.forEach((image, index) => { - if (image.uri) { - const fileName = image.uri.split('/').pop() || `image_${index}.jpg`; - formData.append('images', { - uri: image.uri, - name: fileName, - type: 'image/jpeg', - } as any); - } - }); - } - - // Add images to delete - if (imagesToDelete && imagesToDelete.length > 0) { - formData.append('imagesToDelete', JSON.stringify(imagesToDelete)); - } - - updateProduct( - { id: productId, formData }, - { - onSuccess: (data) => { - Alert.alert('Success', 'Product updated successfully!'); - // Clear newly added images after successful update - productFormRef.current?.clearImages(); - }, - onError: (error: any) => { - Alert.alert('Error', error.message || 'Failed to update product'); - }, - } - ); }; if (isFetching) { @@ -125,7 +91,7 @@ export default function EditProduct() { deals: productData.deals?.map(deal => ({ quantity: deal.quantity, price: deal.price, - validTill: deal.validTill ? new Date(deal.validTill) : null, // Convert to Date object + validTill: deal.validTill ? new Date(deal.validTill) : null, })) || [{ quantity: '', price: '', validTill: null }], tagIds: productData.tags?.map((tag: any) => tag.id) || [], isSuspended: productData.isSuspended || false, @@ -141,9 +107,9 @@ export default function EditProduct() { mode="edit" initialValues={initialValues} onSubmit={handleSubmit} - isLoading={isUpdating} + isLoading={updateProduct.isPending} existingImages={productData.images || []} /> ); -} \ No newline at end of file +} diff --git a/apps/admin-ui/app/(drawer)/send-notifications/index.tsx b/apps/admin-ui/app/(drawer)/send-notifications/index.tsx index e4673c0..6d866f6 100644 --- a/apps/admin-ui/app/(drawer)/send-notifications/index.tsx +++ b/apps/admin-ui/app/(drawer)/send-notifications/index.tsx @@ -18,6 +18,7 @@ import { } from 'common-ui'; import { trpc } from '@/src/trpc-client'; import usePickImage from 'common-ui/src/components/use-pick-image'; +import { useUploadToObjectStorage } from '../../../hooks/useUploadToObjectStorage'; interface User { id: number; @@ -26,12 +27,6 @@ interface User { isEligibleForNotif: boolean; } -const extractKeyFromUrl = (url: string): string => { - const u = new URL(url); - const rawKey = u.pathname.replace(/^\/+/, ''); - return decodeURIComponent(rawKey); -}; - export default function SendNotifications() { const router = useRouter(); const [selectedUserIds, setSelectedUserIds] = useState([]); @@ -46,8 +41,7 @@ export default function SendNotifications() { search: searchQuery, }); - // Generate upload URLs mutation - const generateUploadUrls = trpc.user.fileUpload.generateUploadUrls.useMutation(); + const { uploadSingle, isUploading } = useUploadToObjectStorage(); // Send notification mutation const sendNotification = trpc.admin.user.sendNotification.useMutation({ @@ -127,28 +121,8 @@ export default function SendNotifications() { // Upload image if selected if (selectedImage) { - const { uploadUrls } = await generateUploadUrls.mutateAsync({ - contextString: 'notification', - mimeTypes: [selectedImage.mimeType], - }); - - if (uploadUrls.length > 0) { - const uploadUrl = uploadUrls[0]; - imageUrl = extractKeyFromUrl(uploadUrl); - - // Upload image - const uploadResponse = await fetch(uploadUrl, { - method: 'PUT', - body: selectedImage.blob, - headers: { - 'Content-Type': selectedImage.mimeType, - }, - }); - - if (!uploadResponse.ok) { - throw new Error(`Upload failed with status ${uploadResponse.status}`); - } - } + const { key } = await uploadSingle(selectedImage.blob, selectedImage.mimeType, 'notification'); + imageUrl = key; } // Send notification @@ -256,15 +230,15 @@ export default function SendNotifications() { {/* Submit Button */} - {sendNotification.isPending ? 'Sending...' : selectedUserIds.length === 0 ? 'Send to All Users' : 'Send Notification'} + {isUploading ? 'Uploading...' : sendNotification.isPending ? 'Sending...' : selectedUserIds.length === 0 ? 'Send to All Users' : 'Send Notification'} diff --git a/apps/admin-ui/app/(drawer)/stocking-schedules/index.tsx b/apps/admin-ui/app/(drawer)/stocking-schedules/index.tsx new file mode 100644 index 0000000..f78de2a --- /dev/null +++ b/apps/admin-ui/app/(drawer)/stocking-schedules/index.tsx @@ -0,0 +1,443 @@ +import React, { useState } from 'react'; +import { View, ScrollView, Alert, FlatList, TouchableOpacity } from 'react-native'; +import { + theme, + AppContainer, + MyText, + tw, + useManualRefresh, + useMarkDataFetchers, + MyTouchableOpacity, + RawBottomDialog, + BottomDialog, +} from 'common-ui'; +import { trpc } from '../../../src/trpc-client'; +import MaterialIcons from '@expo/vector-icons/MaterialIcons'; +import { Ionicons, Entypo } from '@expo/vector-icons'; +import { LinearGradient } from 'expo-linear-gradient'; + +import AvailabilityScheduleForm from '../../../components/AvailabilityScheduleForm'; + +interface Schedule { + id: number; + scheduleName: string; + time: string; + action: 'in' | 'out'; + createdAt: string; + lastUpdated: string; + productIds: number[]; + groupIds: number[]; + productCount: number; + groupCount: number; +} + +const ScheduleItem = ({ + schedule, + onDelete, + index, + onViewProducts, + onViewGroups, + onReplicate, +}: { + schedule: Schedule; + onDelete: (id: number) => void; + index: number; + onViewProducts: (productIds: number[]) => void; + onViewGroups: (groupIds: number[]) => void; + onReplicate: (schedule: Schedule) => void; +}) => { + const isIn = schedule.action === 'in'; + const [menuOpen, setMenuOpen] = useState(false); + + return ( + + + {/* Top Header: Name & Action Badge */} + + + + + + + + Schedule Name + + + {schedule.scheduleName} + + + + + + + + + {isIn ? 'In Stock' : 'Out of Stock'} + + + setMenuOpen(true)} + style={tw`p-1`} + hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }} + > + + + + + + {/* Menu Dialog */} + setMenuOpen(false)}> + + {schedule.scheduleName} + + { + setMenuOpen(false); + onReplicate(schedule); + }} + style={tw`py-4 border-b border-gray-200`} + > + + + Replicate items + + + + { + setMenuOpen(false); + Alert.alert('Coming Soon', 'Edit functionality will be available soon'); + }} + style={tw`py-4 border-b border-gray-200`} + > + + + Edit + + + + { + setMenuOpen(false); + onDelete(schedule.id); + }} + style={tw`py-4 border-b border-gray-200`} + > + + + Delete + + + + setMenuOpen(false)} + style={tw`py-4 mt-2`} + > + + + Cancel + + + + + + {/* Middle: Time Banner */} + + + + + + + {schedule.time} + + + Daily at this time + + + + + {/* Stats & Actions */} + + + onViewProducts(schedule.productIds)} + style={tw`flex-row items-center mr-4`} + > + + + {schedule.productCount} Products + + + {schedule.groupCount > 0 && ( + onViewGroups(schedule.groupIds)} + style={tw`flex-row items-center`} + > + + + {schedule.groupCount} Groups + + + )} + + + + + ); +}; + +export default function StockingSchedules() { + const { + data: schedules, + isLoading, + error, + refetch, + } = trpc.admin.productAvailabilitySchedules.getAll.useQuery(); + + const { data: productsData } = trpc.common.product.getAllProductsSummary.useQuery({}); + const { data: groupsData } = trpc.admin.product.getGroups.useQuery(); + + const deleteSchedule = trpc.admin.productAvailabilitySchedules.delete.useMutation(); + + const [showCreateForm, setShowCreateForm] = useState(false); + + // Dialog state + const [dialogOpen, setDialogOpen] = useState(false); + const [dialogType, setDialogType] = useState<'products' | 'groups'>('products'); + const [selectedIds, setSelectedIds] = useState([]); + + // Replication state + const [replicatingSchedule, setReplicatingSchedule] = useState(null); + + useManualRefresh(refetch); + + useMarkDataFetchers(() => { + refetch(); + }); + + const handleCreate = () => { + setShowCreateForm(true); + }; + + const handleDelete = (id: number) => { + Alert.alert( + 'Delete Schedule', + 'Are you sure you want to delete this schedule? This action cannot be undone.', + [ + { text: 'Cancel', style: 'cancel' }, + { + text: 'Delete', + style: 'destructive', + onPress: () => { + deleteSchedule.mutate( + { id }, + { + onSuccess: () => { + refetch(); + }, + onError: (error: any) => { + Alert.alert('Error', error.message || 'Failed to delete schedule'); + }, + }, + ); + }, + }, + ], + ); + }; + + const handleViewProducts = (productIds: number[]) => { + setDialogType('products'); + setSelectedIds(productIds); + setDialogOpen(true); + }; + + const handleViewGroups = (groupIds: number[]) => { + setDialogType('groups'); + setSelectedIds(groupIds); + setDialogOpen(true); + }; + + const handleReplicate = (schedule: Schedule) => { + setReplicatingSchedule(schedule); + setShowCreateForm(true); + }; + + const handleCloseForm = () => { + setShowCreateForm(false); + setReplicatingSchedule(null); + }; + + // Get product/group names from IDs + const getProductNames = () => { + const allProducts = productsData?.products || []; + return selectedIds.map(id => { + const product = allProducts.find(p => p.id === id); + return product?.name || `Product #${id}`; + }); + }; + + const getGroupNames = () => { + const allGroups = groupsData?.groups || []; + return selectedIds.map(id => { + const group = allGroups.find(g => g.id === id); + return group?.groupName || `Group #${id}`; + }); + }; + + if (showCreateForm) { + return ( + { + refetch(); + handleCloseForm(); + }} + initialProductIds={replicatingSchedule?.productIds} + initialGroupIds={replicatingSchedule?.groupIds} + /> + ); + } + + if (isLoading) { + return ( + + + Loading schedules... + + + ); + } + + if (error) { + return ( + + + Error loading schedules + + + ); + } + + return ( + <> + + + + {schedules && schedules.length === 0 ? ( + + + + + + No Schedules Yet + + + Start by creating your first availability schedule using the + button below. + + + ) : ( + schedules?.map((schedule, index) => ( + + + {index < schedules.length - 1 && ( + + )} + + )) + )} + + + + + + + + + + {/* Products/Groups Dialog */} + setDialogOpen(false)}> + + + {dialogType === 'products' ? 'Products' : 'Groups'} + + index.toString()} + renderItem={({ item }) => ( + + {item} + + )} + showsVerticalScrollIndicator={false} + style={tw`max-h-80`} + ListEmptyComponent={ + + + No {dialogType} found + + + } + /> + + + + ); +} diff --git a/apps/admin-ui/components/AddressPlaceForm.tsx b/apps/admin-ui/components/AddressPlaceForm.tsx deleted file mode 100644 index 89ea40f..0000000 --- a/apps/admin-ui/components/AddressPlaceForm.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import React from 'react' -import { Formik } from 'formik' -import * as Yup from 'yup' -import { View, Text, TouchableOpacity } from 'react-native' -import { MyTextInput, BottomDropdown, tw } from 'common-ui' -import { trpc } from '@/src/trpc-client' - -interface AddressPlaceFormProps { - onSubmit: (values: { placeName: string; zoneId: number | null }) => void - onClose: () => void -} - -const AddressPlaceForm: React.FC = ({ onSubmit, onClose }) => { - const { data: zones } = trpc.admin.address.getZones.useQuery() - - const validationSchema = Yup.object({ - placeName: Yup.string().required('Place name is required'), - zoneId: Yup.number().optional(), - }) - - const zoneOptions = zones?.map(z => ({ label: z.zoneName, value: z.id })) || [] - - return ( - - Add Place - { - onSubmit(values) - onClose() - }} - > - {({ handleChange, setFieldValue, handleSubmit, values, errors, touched }) => ( - - - setFieldValue('zoneId', value as number | undefined)} - placeholder="Select Zone" - /> - - - Cancel - - handleSubmit()}> - Create - - - - )} - - - ) -} - -export default AddressPlaceForm \ No newline at end of file diff --git a/apps/admin-ui/components/AddressZoneForm.tsx b/apps/admin-ui/components/AddressZoneForm.tsx deleted file mode 100644 index db00ecd..0000000 --- a/apps/admin-ui/components/AddressZoneForm.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import React from 'react' -import { Formik } from 'formik' -import * as Yup from 'yup' -import { View, Text, TouchableOpacity } from 'react-native' -import { MyTextInput, tw } from 'common-ui' - -interface AddressZoneFormProps { - onSubmit: (values: { zoneName: string }) => void - onClose: () => void -} - -const AddressZoneForm: React.FC = ({ onSubmit, onClose }) => { - const validationSchema = Yup.object({ - zoneName: Yup.string().required('Zone name is required'), - }) - - return ( - - Add Zone - { - onSubmit(values) - onClose() - }} - > - {({ handleChange, handleSubmit, values, errors, touched }) => ( - - - - - Cancel - - handleSubmit()}> - Create - - - - )} - - - ) -} - -export default AddressZoneForm \ No newline at end of file diff --git a/apps/admin-ui/components/AvailabilityScheduleForm.tsx b/apps/admin-ui/components/AvailabilityScheduleForm.tsx new file mode 100644 index 0000000..8e34822 --- /dev/null +++ b/apps/admin-ui/components/AvailabilityScheduleForm.tsx @@ -0,0 +1,237 @@ +import React, { useState } from 'react'; +import { View, TouchableOpacity, Alert, ScrollView } from 'react-native'; +import { useFormik } from 'formik'; +import { MyText, tw, MyTextInput, MyTouchableOpacity, DateTimePickerMod } from 'common-ui'; +import MaterialIcons from '@expo/vector-icons/MaterialIcons'; +import ProductsSelector from './ProductsSelector'; +import { trpc } from '../src/trpc-client'; + +interface AvailabilityScheduleFormProps { + onClose: () => void; + onSuccess: () => void; + initialProductIds?: number[]; + initialGroupIds?: number[]; +} + +const AvailabilityScheduleForm: React.FC = ({ + onClose, + onSuccess, + initialProductIds, + initialGroupIds, +}) => { + const createSchedule = trpc.admin.productAvailabilitySchedules.create.useMutation(); + const { data: groupsData } = trpc.admin.product.getGroups.useQuery(); + + // Map groups data to match ProductsSelector types (convert price from string to number) + const groups = (groupsData?.groups || []).map(group => ({ + ...group, + products: group.products.map(product => ({ + ...product, + price: parseFloat(product.price as unknown as string) || 0, + })), + })); + + const formik = useFormik({ + initialValues: { + scheduleName: '', + timeDate: null as Date | null, + action: 'in' as 'in' | 'out', + productIds: initialProductIds || ([] as number[]), + groupIds: initialGroupIds || ([] as number[]), + }, + validate: (values) => { + const errors: {[key: string]: string} = {}; + + if (!values.scheduleName.trim()) { + errors.scheduleName = 'Schedule name is required'; + } + + if (!values.timeDate) { + errors.timeDate = 'Time is required'; + } + + if (!values.action) { + errors.action = 'Action is required'; + } + + if (values.productIds.length === 0) { + errors.productIds = 'At least one product must be selected'; + } + + return errors; + }, + onSubmit: async (values) => { + try { + // Convert Date to HH:MM string + const hours = values.timeDate!.getHours().toString().padStart(2, '0'); + const minutes = values.timeDate!.getMinutes().toString().padStart(2, '0'); + const timeString = `${hours}:${minutes}`; + + await createSchedule.mutateAsync({ + scheduleName: values.scheduleName, + time: timeString, + action: values.action, + productIds: values.productIds, + groupIds: values.groupIds, + }); + + Alert.alert('Success', 'Schedule created successfully'); + onSuccess(); + onClose(); + } catch (error: any) { + Alert.alert('Error', error.message || 'Failed to create schedule'); + } + }, + }); + + const actionOptions = [ + { label: 'In Stock', value: 'in' }, + { label: 'Out of Stock', value: 'out' }, + ]; + + return ( + + {/* Header */} + + + Create Availability Schedule + + + + + + + + {/* Schedule Name */} + + + Schedule Name + + + {formik.touched.scheduleName && formik.errors.scheduleName && ( + + {formik.errors.scheduleName} + + )} + + + {/* Time */} + + + Time + + formik.setFieldValue('timeDate', date)} + timeOnly={true} + showLabels={false} + /> + {formik.touched.timeDate && formik.errors.timeDate && ( + + {formik.errors.timeDate} + + )} + + + {/* Action */} + + + Action + + + {actionOptions.map((option) => ( + formik.setFieldValue('action', option.value)} + style={tw`flex-1 flex-row items-center p-4 rounded-lg border ${ + formik.values.action === option.value + ? 'bg-blue-50 border-blue-500' + : 'bg-white border-gray-300' + }`} + > + + {formik.values.action === option.value && ( + + )} + + + {option.label} + + + ))} + + + + {/* Products and Groups */} + + + Products & Groups + + formik.setFieldValue('productIds', value)} + groups={groups} + selectedGroupIds={formik.values.groupIds} + onGroupChange={(groupIds) => formik.setFieldValue('groupIds', groupIds)} + showGroups={true} + label="Select Products" + placeholder="Select products for this schedule" + /> + {formik.touched.productIds && formik.errors.productIds && ( + + {formik.errors.productIds} + + )} + + + {/* Spacer for bottom padding */} + + + + {/* Footer Buttons */} + + + Cancel + + formik.handleSubmit()} + disabled={formik.isSubmitting} + style={tw`flex-1 py-3 px-4 rounded-lg bg-blue-600 items-center ${ + formik.isSubmitting ? 'opacity-50' : '' + }`} + > + + {formik.isSubmitting ? 'Creating...' : 'Create Schedule'} + + + + + ); +}; + +export default AvailabilityScheduleForm; diff --git a/apps/admin-ui/components/BannerForm.tsx b/apps/admin-ui/components/BannerForm.tsx index 544f008..986429e 100644 --- a/apps/admin-ui/components/BannerForm.tsx +++ b/apps/admin-ui/components/BannerForm.tsx @@ -8,6 +8,7 @@ import ProductsSelector from './ProductsSelector'; import { trpc } from '../src/trpc-client'; import usePickImage from 'common-ui/src/components/use-pick-image'; import MaterialIcons from '@expo/vector-icons/MaterialIcons'; +import { useUploadToObjectStorage } from '../hooks/useUploadToObjectStorage'; export interface BannerFormData { name: string; @@ -52,14 +53,7 @@ export default function BannerForm({ const [selectedImages, setSelectedImages] = useState<{ blob: Blob; mimeType: string }[]>([]); const [displayImages, setDisplayImages] = useState<{ uri?: string }[]>([]); - const generateUploadUrls = trpc.common.generateUploadUrls.useMutation(); - - // Fetch products for dropdown - const { data: productsData } = trpc.common.product.getAllProductsSummary.useQuery({}); - const products = productsData?.products || []; - - - + const { uploadSingle, isUploading } = useUploadToObjectStorage(); const handleImagePick = usePickImage({ setFile: async (assets: any) => { @@ -97,37 +91,15 @@ export default function BannerForm({ let imageUrl: string | undefined; if (selectedImages.length > 0) { - // Generate upload URLs - const mimeTypes = selectedImages.map(s => s.mimeType); - const { uploadUrls } = await generateUploadUrls.mutateAsync({ - contextString: 'store', // Using 'store' for now - mimeTypes, - }); - - // Upload image - const uploadUrl = uploadUrls[0]; const { blob, mimeType } = selectedImages[0]; - - const uploadResponse = await fetch(uploadUrl, { - method: 'PUT', - body: blob, - headers: { - 'Content-Type': mimeType, - }, - }); - - if (!uploadResponse.ok) { - throw new Error(`Upload failed with status ${uploadResponse.status}`); - } - - imageUrl = uploadUrl; + const { key, presignedUrl } = await uploadSingle(blob, mimeType, 'store'); + imageUrl = presignedUrl; } - // Call onSubmit with form values and imageUrl await onSubmit(values, imageUrl); } catch (error) { console.error('Upload error:', error); - Alert.alert('Error', 'Failed to upload image'); + Alert.alert('Error', error instanceof Error ? error.message : 'Failed to upload image'); } }; @@ -239,15 +211,15 @@ export default function BannerForm({ handleSubmit()} - disabled={isSubmitting || !isValid || !dirty} + disabled={isSubmitting || isUploading || !isValid || !dirty} style={tw`flex-1 rounded-lg py-4 items-center ${ - isSubmitting || !isValid || !dirty + isSubmitting || isUploading || !isValid || !dirty ? 'bg-blue-400' : 'bg-blue-600' }`} > - {isSubmitting ? 'Saving...' : submitButtonText} + {isUploading ? 'Uploading...' : isSubmitting ? 'Saving...' : submitButtonText} @@ -256,4 +228,4 @@ export default function BannerForm({ )} ); -} \ No newline at end of file +} diff --git a/apps/admin-ui/components/StoreForm.tsx b/apps/admin-ui/components/StoreForm.tsx index aaad4e0..e57fa08 100644 --- a/apps/admin-ui/components/StoreForm.tsx +++ b/apps/admin-ui/components/StoreForm.tsx @@ -2,10 +2,11 @@ import React, { forwardRef, useState, useEffect, useMemo } from 'react'; import { View, TouchableOpacity, Alert } from 'react-native'; import { Formik } from 'formik'; import * as Yup from 'yup'; -import { MyTextInput, BottomDropdown, MyText, tw, ImageUploader } from 'common-ui'; +import { MyTextInput, BottomDropdown, MyText, tw, ImageUploaderNeo } from 'common-ui'; import ProductsSelector from './ProductsSelector'; import { trpc } from '../src/trpc-client'; import usePickImage from 'common-ui/src/components/use-pick-image'; +import { useUploadToObjectStorage } from '../hooks/useUploadToObjectStorage'; export interface StoreFormData { name: string; @@ -15,6 +16,12 @@ export interface StoreFormData { products: number[]; } +interface StoreImage { + uri: string; + mimeType: string; + isExisting: boolean; +} + export interface StoreFormRef { // Add methods if needed } @@ -27,6 +34,11 @@ interface StoreFormProps { storeId?: number; } +// Extend Formik values with images array +interface FormikStoreValues extends StoreFormData { + images: StoreImage[]; +} + const validationSchema = Yup.object().shape({ name: Yup.string().required('Name is required'), description: Yup.string(), @@ -40,9 +52,23 @@ const StoreForm = forwardRef((props, ref) => { const { data: staffData } = trpc.admin.staffUser.getStaff.useQuery(); const { data: productsData } = trpc.admin.product.getProducts.useQuery(); - const [formInitialValues, setFormInitialValues] = useState(initialValues); - const [selectedImages, setSelectedImages] = useState<{ blob: Blob; mimeType: string }[]>([]); - const [displayImages, setDisplayImages] = useState<{ uri?: string }[]>([]); + // Build initial form values with images array + const buildInitialValues = (): FormikStoreValues => { + const images: StoreImage[] = []; + if (initialValues.imageUrl) { + images.push({ + uri: initialValues.imageUrl, + mimeType: 'image/jpeg', + isExisting: true, + }); + } + return { + ...initialValues, + images, + }; + }; + + const [formInitialValues, setFormInitialValues] = useState(buildInitialValues()); // For edit mode, pre-select products belonging to this store const initialSelectedProducts = useMemo(() => { @@ -54,7 +80,7 @@ const StoreForm = forwardRef((props, ref) => { useEffect(() => { setFormInitialValues({ - ...initialValues, + ...buildInitialValues(), products: initialSelectedProducts, }); }, [initialValues, initialSelectedProducts]); @@ -64,42 +90,8 @@ const StoreForm = forwardRef((props, ref) => { value: staff.id, })) || []; + const { uploadSingle, isUploading } = useUploadToObjectStorage(); - - const generateUploadUrls = trpc.common.generateUploadUrls.useMutation(); - - const handleImagePick = usePickImage({ - setFile: async (assets: any) => { - if (!assets || (Array.isArray(assets) && assets.length === 0)) { - setSelectedImages([]); - setDisplayImages([]); - return; - } - - const files = Array.isArray(assets) ? assets : [assets]; - const blobPromises = files.map(async (asset) => { - const response = await fetch(asset.uri); - const blob = await response.blob(); - return { blob, mimeType: asset.mimeType || 'image/jpeg' }; - }); - - const blobArray = await Promise.all(blobPromises); - setSelectedImages(blobArray); - setDisplayImages(files.map(asset => ({ uri: asset.uri }))); - }, - multiple: false, // Single image for stores - }); - - const handleRemoveImage = (uri: string) => { - const index = displayImages.findIndex(img => img.uri === uri); - if (index !== -1) { - const newDisplay = displayImages.filter((_, i) => i !== index); - const newFiles = selectedImages.filter((_, i) => i !== index); - setDisplayImages(newDisplay); - setSelectedImages(newFiles); - } - }; - return ( ((props, ref) => { enableReinitialize > {({ handleChange, handleSubmit, values, setFieldValue, errors, touched }) => { + // Image picker that adds to Formik field + const handleImagePick = usePickImage({ + setFile: async (assets: any) => { + if (!assets || (Array.isArray(assets) && assets.length === 0)) { + return; + } + + const files = Array.isArray(assets) ? assets : [assets]; + const newImages: StoreImage[] = files.map((asset) => ({ + uri: asset.uri, + mimeType: asset.mimeType || 'image/jpeg', + isExisting: false, + })); + + // Add to Formik images field + const currentImages = values.images || []; + setFieldValue('images', [...currentImages, ...newImages]); + }, + multiple: false, + }); + + // Remove image - works for both existing and new + const handleRemoveImage = (image: { uri: string; mimeType: string }) => { + const currentImages = values.images || []; + const removedImage = currentImages.find(img => img.uri === image.uri); + const newImages = currentImages.filter(img => img.uri !== image.uri); + + setFieldValue('images', newImages); + + // If we removed an existing image, also clear the imageUrl + if (removedImage?.isExisting) { + setFieldValue('imageUrl', undefined); + } + }; + const submit = async () => { try { let imageUrl: string | undefined; - if (selectedImages.length > 0) { - // Generate upload URLs - const mimeTypes = selectedImages.map(s => s.mimeType); - const { uploadUrls } = await generateUploadUrls.mutateAsync({ - contextString: 'store', - mimeTypes, - }); + // Get new images that need to be uploaded + const newImages = values.images.filter(img => !img.isExisting); - // Upload images - for (let i = 0; i < uploadUrls.length; i++) { - const uploadUrl = uploadUrls[i]; - const { blob, mimeType } = selectedImages[i]; - - const uploadResponse = await fetch(uploadUrl, { - method: 'PUT', - body: blob, - headers: { - 'Content-Type': mimeType, - }, - }); - - if (!uploadResponse.ok) { - throw new Error(`Upload failed with status ${uploadResponse.status}`); - } + if (newImages.length > 0) { + // Upload the first new image (single image for stores) + const image = newImages[0]; + const response = await fetch(image.uri); + const imageBlob = await response.blob(); + const { key } = await uploadSingle(imageBlob, image.mimeType, 'store'); + imageUrl = key; + } else { + // Check if there's an existing image remaining + const existingImage = values.images.find(img => img.isExisting); + if (existingImage) { + imageUrl = existingImage.uri; } - - // Extract key from first upload URL - // const u = new URL(uploadUrls[0]); - // const rawKey = u.pathname.replace(/^\/+/, ""); - // imageUrl = decodeURIComponent(rawKey); - imageUrl = uploadUrls[0]; } - // Submit form with imageUrl - onSubmit({ ...values, imageUrl }); + // Submit form with imageUrl (without images array) + const { images, ...submitValues } = values; + onSubmit({ ...submitValues, imageUrl }); } catch (error) { console.error('Upload error:', error); - Alert.alert('Error', 'Failed to upload image'); + Alert.alert('Error', error instanceof Error ? error.message : 'Failed to upload image'); } }; + // Prepare images for ImageUploaderNeo (convert to expected format) + const imagesForUploader = (values.images || []).map(img => ({ + uri: img.uri, + mimeType: img.mimeType, + })); + return ( ((props, ref) => { /> Store Image - setFormInitialValues({ ...formInitialValues, imageUrl: undefined })} allowMultiple={false} /> - {generateUploadUrls.isPending ? 'Uploading...' : isLoading ? (mode === 'create' ? 'Creating...' : 'Updating...') : (mode === 'create' ? 'Create Store' : 'Update Store')} + {isUploading ? 'Uploading...' : isLoading ? (mode === 'create' ? 'Creating...' : 'Updating...') : (mode === 'create' ? 'Create Store' : 'Update Store')} @@ -220,4 +238,4 @@ const StoreForm = forwardRef((props, ref) => { StoreForm.displayName = 'StoreForm'; -export default StoreForm; \ No newline at end of file +export default StoreForm; diff --git a/apps/admin-ui/eas.json b/apps/admin-ui/eas.json index ec2e587..cc3cee0 100755 --- a/apps/admin-ui/eas.json +++ b/apps/admin-ui/eas.json @@ -5,8 +5,8 @@ }, "build": { "development": { - "developmentClient": true, - "distribution": "internal" + "distribution": "internal", + "autoIncrement": true }, "preview": { "distribution": "internal", diff --git a/apps/admin-ui/hooks/useUploadToObjectStorage.ts b/apps/admin-ui/hooks/useUploadToObjectStorage.ts new file mode 100644 index 0000000..abd7d2c --- /dev/null +++ b/apps/admin-ui/hooks/useUploadToObjectStorage.ts @@ -0,0 +1,118 @@ +import { useState } from 'react'; +import { trpc } from '../src/trpc-client'; + +type ContextString = 'review' | 'product_info' | 'notification' | 'store'; + +interface UploadInput { + blob: Blob; + mimeType: string; +} + +interface UploadBatchInput { + images: UploadInput[]; + contextString: ContextString; +} + +interface UploadResult { + keys: string[]; + presignedUrls: string[]; +} + +export function useUploadToObjectStorage() { + const [isUploading, setIsUploading] = useState(false); + const [error, setError] = useState(null); + const [progress, setProgress] = useState<{ completed: number; total: number } | null>(null); + + const generateUploadUrls = trpc.common.generateUploadUrls.useMutation(); + + const upload = async (input: UploadBatchInput): Promise => { + setIsUploading(true); + setError(null); + setProgress({ completed: 0, total: input.images.length }); + + try { + const { images, contextString } = input; + + if (images.length === 0) { + return { keys: [], presignedUrls: [] }; + } + + // 1. Get presigned URLs from backend (one call for all images) + const mimeTypes = images.map(img => img.mimeType); + const { uploadUrls } = await generateUploadUrls.mutateAsync({ + contextString, + mimeTypes, + }); + + if (uploadUrls.length !== images.length) { + throw new Error(`Expected ${images.length} URLs, got ${uploadUrls.length}`); + } + + // 2. Upload all images in parallel + const uploadPromises = images.map(async (image, index) => { + const presignedUrl = uploadUrls[index]; + const { blob, mimeType } = image; + + const response = await fetch(presignedUrl, { + method: 'PUT', + body: blob, + headers: { 'Content-Type': mimeType }, + }); + + if (!response.ok) { + throw new Error(`Upload ${index + 1} failed with status ${response.status}`); + } + + // Update progress + setProgress(prev => prev ? { ...prev, completed: prev.completed + 1 } : null); + + return { + key: extractKeyFromPresignedUrl(presignedUrl), + presignedUrl, + }; + }); + + // Use Promise.all - if any fails, entire batch fails + const results = await Promise.all(uploadPromises); + + return { + keys: results.map(r => r.key), + presignedUrls: results.map(r => r.presignedUrl), + }; + } catch (err) { + const uploadError = err instanceof Error ? err : new Error('Upload failed'); + setError(uploadError); + throw uploadError; + } finally { + setIsUploading(false); + setProgress(null); + } + }; + + const uploadSingle = async (blob: Blob, mimeType: string, contextString: ContextString): Promise<{ key: string; presignedUrl: string }> => { + const result = await upload({ + images: [{ blob, mimeType }], + contextString, + }); + return { + key: result.keys[0], + presignedUrl: result.presignedUrls[0], + }; + }; + + return { + upload, + uploadSingle, + isUploading, + error, + progress, + isPending: generateUploadUrls.isPending + }; +} + +function extractKeyFromPresignedUrl(url: string): string { + const u = new URL(url); + let rawKey = u.pathname.replace(/^\/+/, ''); + rawKey = rawKey.split('/').slice(1).join('/'); // make meatfarmer/product-images/asdf as product-images/asdf + return decodeURIComponent(rawKey); +} diff --git a/apps/admin-ui/src/api-hooks/product.api.ts b/apps/admin-ui/src/api-hooks/product.api.ts deleted file mode 100644 index bdb42ed..0000000 --- a/apps/admin-ui/src/api-hooks/product.api.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { useMutation, useQueryClient } from "@tanstack/react-query"; -import axios from '../../services/axios-admin-ui'; - -// Types -export interface CreateProductPayload { - name: string; - shortDescription?: string; - longDescription?: string; - unitId: number; - storeId: number; - price: number; - marketPrice?: number; - incrementStep?: number; - productQuantity?: number; - isOutOfStock?: boolean; - deals?: { - quantity: number; - price: number; - validTill: string; - }[]; -} - -export interface UpdateProductPayload { - name: string; - shortDescription?: string; - longDescription?: string; - unitId: number; - storeId: number; - price: number; - marketPrice?: number; - incrementStep?: number; - productQuantity?: number; - isOutOfStock?: boolean; - deals?: { - quantity: number; - price: number; - validTill: string; - }[]; -} - -export interface Product { - id: number; - name: string; - shortDescription?: string | null; - longDescription?: string; - unitId: number; - storeId: number; - price: number; - marketPrice?: number; - productQuantity?: number; - isOutOfStock?: boolean; - images?: string[]; - createdAt: string; - unit?: { - id: number; - shortNotation: string; - fullName: string; - }; - deals?: { - id: number; - quantity: string; - price: string; - validTill: string; - }[]; -} - -export interface CreateProductResponse { - product: Product; - deals?: any[]; - message: string; -} - -// API functions -const createProductApi = async (formData: FormData): Promise => { - const response = await axios.post('/av/products', formData, { - headers: { - 'Content-Type': 'multipart/form-data', - }, - }); - return response.data; -}; - -const updateProductApi = async ({ id, formData }: { id: number; formData: FormData }): Promise => { - const response = await axios.put(`/av/products/${id}`, formData, { - headers: { - 'Content-Type': 'multipart/form-data', - }, - }); - return response.data; -}; - -// Hooks -export const useCreateProduct = () => { - const queryClient = useQueryClient(); - return useMutation({ - mutationFn: createProductApi, - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['products'] }); - }, - }); -}; - -export const useUpdateProduct = () => { - const queryClient = useQueryClient(); - return useMutation({ - mutationFn: updateProductApi, - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['products'] }); - }, - }); -}; diff --git a/apps/admin-ui/src/api-hooks/tag.api.ts b/apps/admin-ui/src/api-hooks/tag.api.ts deleted file mode 100644 index cd84dc9..0000000 --- a/apps/admin-ui/src/api-hooks/tag.api.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import axios from '../../services/axios-admin-ui'; - -// Types -export interface CreateTagPayload { - tagName: string; - tagDescription?: string; - imageUrl?: string; - isDashboardTag: boolean; - relatedStores?: number[]; -} - -export interface UpdateTagPayload { - tagName: string; - tagDescription?: string; - imageUrl?: string; - isDashboardTag: boolean; - relatedStores?: number[]; -} - -export interface Tag { - id: number; - tagName: string; - tagDescription: string | null; - imageUrl: string | null; - isDashboardTag: boolean; - relatedStores: number[]; - createdAt?: string; -} - -export interface CreateTagResponse { - tag: Tag; - message: string; -} - -export interface GetTagsResponse { - tags: Tag[]; - message: string; -} - -// API functions -const createTagApi = async (formData: FormData): Promise => { - const response = await axios.post('/av/product-tags', formData, { - headers: { - 'Content-Type': 'multipart/form-data', - }, - }); - return response.data; -}; - -const updateTagApi = async ({ id, formData }: { id: number; formData: FormData }): Promise => { - const response = await axios.put(`/av/product-tags/${id}`, formData, { - headers: { - 'Content-Type': 'multipart/form-data', - }, - }); - return response.data; -}; - -const deleteTagApi = async (id: number): Promise<{ message: string }> => { - const response = await axios.delete(`/av/product-tags/${id}`); - return response.data; -}; - -const getTagsApi = async (): Promise => { - const response = await axios.get('/av/product-tags'); - return response.data; -}; - -const getTagApi = async (id: number): Promise<{ tag: Tag }> => { - const response = await axios.get(`/av/product-tags/${id}`); - return response.data; -}; - -// Hooks -export const useCreateTag = () => { - const queryClient = useQueryClient(); - return useMutation({ - mutationFn: createTagApi, - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['tags'] }); - }, - }); -}; - -export const useUpdateTag = () => { - const queryClient = useQueryClient(); - return useMutation({ - mutationFn: updateTagApi, - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['tags'] }); - }, - }); -}; - -export const useDeleteTag = () => { - const queryClient = useQueryClient(); - return useMutation({ - mutationFn: deleteTagApi, - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['tags'] }); - }, - }); -}; - -export const useGetTags = () => { - return useQuery({ - queryKey: ['tags'], - queryFn: getTagsApi, - }); -}; - -export const useGetTag = (id: number) => { - return useQuery({ - queryKey: ['tags', id], - queryFn: () => getTagApi(id), - enabled: !!id, - }); -}; \ No newline at end of file diff --git a/apps/admin-ui/src/components/ProductForm.tsx b/apps/admin-ui/src/components/ProductForm.tsx index 1502214..1ba85b9 100644 --- a/apps/admin-ui/src/components/ProductForm.tsx +++ b/apps/admin-ui/src/components/ProductForm.tsx @@ -1,5 +1,5 @@ import React, { useState, useEffect, useCallback, forwardRef, useImperativeHandle } from 'react'; -import { View, TouchableOpacity } from 'react-native'; +import { View, TouchableOpacity, Alert } from 'react-native'; import { Image } from 'expo-image'; import { Formik, FieldArray } from 'formik'; import * as Yup from 'yup'; @@ -7,7 +7,7 @@ import { MyTextInput, BottomDropdown, MyText, ImageUploader, ImageGalleryWithDel import usePickImage from 'common-ui/src/components/use-pick-image'; import MaterialIcons from '@expo/vector-icons/MaterialIcons'; import { trpc } from '../trpc-client'; -import { useGetTags } from '../api-hooks/tag.api'; +import { useUploadToObjectStorage } from '../../hooks/useUploadToObjectStorage'; interface ProductFormData { name: string; @@ -38,7 +38,7 @@ export interface ProductFormRef { interface ProductFormProps { mode: 'create' | 'edit'; initialValues: ProductFormData; - onSubmit: (values: ProductFormData, images?: { uri?: string }[], imagesToDelete?: string[]) => void; + onSubmit: (values: ProductFormData, imageKeys?: string[], imagesToDelete?: string[]) => void; isLoading: boolean; existingImages?: string[]; } @@ -60,8 +60,9 @@ const ProductForm = forwardRef(({ existingImages = [] }, ref) => { const { theme } = useTheme(); - const [images, setImages] = useState<{ uri?: string }[]>([]); + const [newImages, setNewImages] = useState<{ blob: Blob; mimeType: string; uri: string }[]>([]); const [existingImagesState, setExistingImagesState] = useState(existingImages); + const { upload, isUploading } = useUploadToObjectStorage(); const { data: storesData } = trpc.common.getStoresSummary.useQuery(); const storeOptions = storesData?.stores.map(store => ({ @@ -69,8 +70,8 @@ const ProductForm = forwardRef(({ value: store.id, })) || []; - const { data: tagsData } = useGetTags(); - const tagOptions = tagsData?.tags.map(tag => ({ + const { data: tagsData } = trpc.admin.tag.getTags.useQuery(); + const tagOptions = tagsData?.tags.map((tag: { tagName: string; id: number }) => ({ label: tag.tagName, value: tag.id.toString(), })) || []; @@ -83,23 +84,62 @@ const ProductForm = forwardRef(({ }, [existingImages]); const pickImage = usePickImage({ - setFile: (files) => setImages(prev => [...prev, ...files]), + setFile: async (assets: any) => { + if (!assets || (Array.isArray(assets) && assets.length === 0)) { + return; + } + + const files = Array.isArray(assets) ? assets : [assets]; + const imageData = await Promise.all( + files.map(async (asset) => { + const response = await fetch(asset.uri); + const blob = await response.blob(); + return { + blob, + mimeType: asset.mimeType || 'image/jpeg', + uri: asset.uri + }; + }) + ); + + setNewImages(prev => [...prev, ...imageData]); + }, multiple: true, }); // Calculate which existing images were deleted const deletedImages = existingImages.filter(img => !existingImagesState.includes(img)); + // Display images for ImageUploader component + const displayImages = newImages.map(img => ({ uri: img.uri })); + return ( onSubmit(values, images, deletedImages)} + onSubmit={async (values) => { + try { + let imageKeys: string[] = []; + + // Upload new images if any + if (newImages.length > 0) { + const result = await upload({ + images: newImages.map(img => ({ blob: img.blob, mimeType: img.mimeType })), + contextString: 'product_info', + }); + imageKeys = result.keys; + } + + onSubmit(values, imageKeys, deletedImages); + } catch (error) { + Alert.alert('Error', error instanceof Error ? error.message : 'Failed to upload images'); + } + }} enableReinitialize > {({ handleChange, handleSubmit, values, setFieldValue, resetForm }) => { // Clear form when screen comes into focus const clearForm = useCallback(() => { - setImages([]); + setNewImages([]); setExistingImagesState([]); resetForm(); }, [resetForm]); @@ -143,9 +183,9 @@ const ProductForm = forwardRef(({ {mode === 'create' && ( setImages(prev => prev.filter(img => img.uri !== uri))} + onRemoveImage={(uri) => setNewImages(prev => prev.filter(img => img.uri !== uri))} /> )} @@ -166,9 +206,9 @@ const ProductForm = forwardRef(({ Add New Images setImages(prev => prev.filter(img => img.uri !== uri))} + onRemoveImage={(uri) => setNewImages(prev => prev.filter(img => img.uri !== uri))} /> )} @@ -355,11 +395,11 @@ const ProductForm = forwardRef(({ - {isLoading ? (mode === 'create' ? 'Creating...' : 'Updating...') : (mode === 'create' ? 'Create Product' : 'Update Product')} + {isUploading ? 'Uploading Images...' : isLoading ? (mode === 'create' ? 'Creating...' : 'Updating...') : (mode === 'create' ? 'Create Product' : 'Update Product')} @@ -371,4 +411,4 @@ const ProductForm = forwardRef(({ ProductForm.displayName = 'ProductForm'; -export default ProductForm; \ No newline at end of file +export default ProductForm; diff --git a/apps/admin-ui/src/components/TagForm.tsx b/apps/admin-ui/src/components/TagForm.tsx index 8045cd7..a4d0879 100644 --- a/apps/admin-ui/src/components/TagForm.tsx +++ b/apps/admin-ui/src/components/TagForm.tsx @@ -1,11 +1,12 @@ import React, { useState, useEffect, forwardRef, useCallback } from 'react'; -import { View, TouchableOpacity } from 'react-native'; +import { View, TouchableOpacity, Alert } from 'react-native'; import { Image } from 'expo-image'; import { Formik } from 'formik'; import * as Yup from 'yup'; import { MyTextInput, MyText, Checkbox, ImageUploader, tw, useFocusCallback, BottomDropdown } from 'common-ui'; import usePickImage from 'common-ui/src/components/use-pick-image'; import MaterialIcons from '@expo/vector-icons/MaterialIcons'; +import { useUploadToObjectStorage } from '../../hooks/useUploadToObjectStorage'; interface StoreOption { id: number; @@ -23,7 +24,7 @@ interface TagFormProps { mode: 'create' | 'edit'; initialValues: TagFormData; existingImageUrl?: string; - onSubmit: (values: TagFormData, image?: { uri?: string }) => void; + onSubmit: (values: TagFormData, imageKey?: string, deleteExistingImage?: boolean) => void; isLoading: boolean; stores?: StoreOption[]; } @@ -36,23 +37,34 @@ const TagForm = forwardRef(({ isLoading, stores = [], }, ref) => { - const [image, setImage] = useState<{ uri?: string } | null>(null); + const [newImage, setNewImage] = useState<{ blob: Blob; mimeType: string; uri: string } | null>(null); const [isDashboardTagChecked, setIsDashboardTagChecked] = useState(Boolean(initialValues.isDashboardTag)); + const { uploadSingle, isUploading } = useUploadToObjectStorage(); // Update checkbox when initial values change useEffect(() => { setIsDashboardTagChecked(Boolean(initialValues.isDashboardTag)); - existingImageUrl && setImage({uri:existingImageUrl}) }, [initialValues.isDashboardTag]); const pickImage = usePickImage({ - setFile: (files) => { + setFile: async (assets: any) => { + if (!assets || (Array.isArray(assets) && assets.length === 0)) { + setNewImage(null); + return; + } + + const asset = Array.isArray(assets) ? assets[0] : assets; + const response = await fetch(asset.uri); + const blob = await response.blob(); - setImage(files || null) + setNewImage({ + blob, + mimeType: asset.mimeType || 'image/jpeg', + uri: asset.uri + }); }, multiple: false, }); - const validationSchema = Yup.object().shape({ tagName: Yup.string() @@ -63,18 +75,44 @@ const TagForm = forwardRef(({ .max(500, 'Description must be less than 500 characters'), }); + // Display images for ImageUploader + const displayImages = newImage ? [{ uri: newImage.uri }] : []; + const existingImages = existingImageUrl ? [existingImageUrl] : []; + return ( onSubmit(values, image || undefined)} + onSubmit={async (values) => { + try { + let imageKey: string | undefined; + let deleteExistingImage = false; + + // Handle image upload + if (newImage) { + const result = await uploadSingle(newImage.blob, newImage.mimeType, 'product_info'); + imageKey = result.key; + // If we're uploading a new image and there's an existing one, mark it for deletion + if (existingImageUrl) { + deleteExistingImage = true; + } + } else if (mode === 'edit' && !newImage && existingImageUrl) { + // In edit mode, if no new image and existing was removed + // This would need UI to explicitly remove image + // For now, we don't support explicit deletion without replacement + } + + onSubmit(values, imageKey, deleteExistingImage); + } catch (error) { + Alert.alert('Error', error instanceof Error ? error.message : 'Failed to upload image'); + } + }} enableReinitialize > - {({ handleChange, handleSubmit, values, setFieldValue, errors, touched, setFieldValue: formikSetFieldValue, resetForm }) => { + {({ handleChange, handleSubmit, values, setFieldValue, errors, touched, resetForm }) => { // Clear form when screen comes into focus const clearForm = useCallback(() => { - setImage(null); - + setNewImage(null); setIsDashboardTagChecked(false); resetForm(); }, [resetForm]); @@ -107,11 +145,15 @@ const TagForm = forwardRef(({ Tag Image {mode === 'edit' ? '(Upload new to replace)' : '(Optional)'} - setImage(null)} + onRemoveImage={() => setNewImage(null)} + onRemoveExistingImage={mode === 'edit' ? () => { + // In edit mode, this would trigger deletion of existing image + // But we need to implement this logic in the parent + } : undefined} /> @@ -122,7 +164,7 @@ const TagForm = forwardRef(({ onPress={() => { const newValue = !isDashboardTagChecked; setIsDashboardTagChecked(newValue); - formikSetFieldValue('isDashboardTag', newValue); + setFieldValue('isDashboardTag', newValue); }} /> Mark as Dashboard Tag @@ -143,7 +185,7 @@ const TagForm = forwardRef(({ }))} onValueChange={(selectedValues) => { const numericValues = (selectedValues as string[]).map(v => parseInt(v)); - formikSetFieldValue('relatedStores', numericValues); + setFieldValue('relatedStores', numericValues); }} multiple={true} /> @@ -151,11 +193,11 @@ const TagForm = forwardRef(({ handleSubmit()} - disabled={isLoading} - style={tw`px-4 py-3 rounded-lg shadow-lg items-center ${isLoading ? 'bg-gray-400' : 'bg-blue-500'}`} + disabled={isLoading || isUploading} + style={tw`px-4 py-3 rounded-lg shadow-lg items-center ${isLoading || isUploading ? 'bg-gray-400' : 'bg-blue-500'}`} > - {isLoading ? (mode === 'create' ? 'Creating...' : 'Updating...') : (mode === 'create' ? 'Create Tag' : 'Update Tag')} + {isUploading ? 'Uploading Image...' : isLoading ? (mode === 'create' ? 'Creating...' : 'Updating...') : (mode === 'create' ? 'Create Tag' : 'Update Tag')} @@ -167,4 +209,4 @@ const TagForm = forwardRef(({ TagForm.displayName = 'TagForm'; -export default TagForm; \ No newline at end of file +export default TagForm; diff --git a/apps/admin-ui/src/components/TagMenu.tsx b/apps/admin-ui/src/components/TagMenu.tsx index 2bd9d8a..53a088f 100644 --- a/apps/admin-ui/src/components/TagMenu.tsx +++ b/apps/admin-ui/src/components/TagMenu.tsx @@ -3,7 +3,7 @@ import { View, TouchableOpacity, Alert } from 'react-native'; import { Entypo } from '@expo/vector-icons'; import { MyText, tw, BottomDialog } from 'common-ui'; import { useRouter } from 'expo-router'; -import { useDeleteTag } from '../api-hooks/tag.api'; +import { trpc } from '../trpc-client'; export interface TagMenuProps { tagId: number; @@ -22,7 +22,7 @@ export const TagMenu: React.FC = ({ }) => { const [isOpen, setIsOpen] = useState(false); const router = useRouter(); - const { mutate: deleteTag, isPending: isDeleting } = useDeleteTag(); + const deleteTag = trpc.admin.tag.deleteTag.useMutation(); const handleOpenMenu = () => { setIsOpen(true); @@ -54,7 +54,7 @@ export const TagMenu: React.FC = ({ }; const performDelete = () => { - deleteTag(tagId, { + deleteTag.mutate({ id: tagId }, { onSuccess: () => { Alert.alert('Success', 'Tag deleted successfully'); onDeleteSuccess?.(); diff --git a/apps/backend/.env b/apps/backend/.env index 1606965..7a02db2 100755 --- a/apps/backend/.env +++ b/apps/backend/.env @@ -1,7 +1,10 @@ ENV_MODE=PROD # DATABASE_URL=postgresql://postgres:meatfarmer_master_password@57.128.212.174:7447/meatfarmer #technocracy -DATABASE_URL=postgres://postgres:meatfarmer_master_password@5.223.55.14:7447/meatfarmer #hetzner +# DATABASE_URL=postgres://postgres:meatfarmer_master_password@5.223.55.14:7447/meatfarmer #hetzner +SQLITE_DB_PATH='./sqlite.db' +DB_DIALECT='sqlite' PHONE_PE_BASE_URL=https://api-preprod.phonepe.com/ + PHONE_PE_CLIENT_ID=TEST-M23F2IGP34ZAR_25090 PHONE_PE_CLIENT_VERSION=1 PHONE_PE_CLIENT_SECRET=MTU1MmIzOTgtM2Q0Mi00N2M5LTkyMWUtNzBiMjdmYzVmZWUy @@ -17,10 +20,14 @@ S3_REGION=apac S3_ACCESS_KEY_ID=8fab47503efb9547b50e4fb317e35cc7 S3_SECRET_ACCESS_KEY=47c2eb5636843cf568dda7ad0959a3e42071303f26dbdff94bd45a3c33dcd950 S3_URL=https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com -S3_BUCKET_NAME=meatfarmer +S3_BUCKET_NAME=meatfarmer-dev EXPO_ACCESS_TOKEN=Asvpy8cByRh6T4ksnWScO6PLcio2n35-BwES5zK- JWT_SECRET=my_meatfarmer_jwt_secret_key -ASSETS_DOMAIN=https://assets.freshyo.in/ +ASSETS_DOMAIN=https://assets2.freshyo.in/ +API_CACHE_KEY=api-cache-dev +# CLOUDFLARE_API_TOKEN=I8Vp4E9TX58E8qEDeH0nTFDS2d2zXNYiXvbs4Ckj +CLOUDFLARE_API_TOKEN=N7jAg5X-RUj_fVfMW6zbfJ8qIYc81TSIKKlbZ6oh +CLOUDFLARE_ZONE_ID=edefbf750bfc3ff26ccd11e8e28dc8d7 # REDIS_URL=redis://default:redis_shafi_password@5.223.55.14:6379 REDIS_URL=redis://default:redis_shafi_password@57.128.212.174:6379 APP_URL=http://localhost:4000 diff --git a/apps/backend/assets/signed-url-cache.json b/apps/backend/assets/signed-url-cache.json index a64a31f..a0d0fe8 100644 --- a/apps/backend/assets/signed-url-cache.json +++ b/apps/backend/assets/signed-url-cache.json @@ -1 +1 @@ -{"originalToSigned":{"tags/1763835253683-c9c3e293-0bef-4c58-a976-dd49c050cd36.jpeg":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1763835253683-c9c3e293-0bef-4c58-a976-dd49c050cd36.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260307%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260307T105258Z&X-Amz-Expires=259200&X-Amz-Signature=a4e4226aa30b5f0fde27efca0f139c00df5d3e13d08b104c4aee12afda1f7498&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1773139918864},"tags/1763835293899-43b3fbe1-9b5b-441c-b4d4-d1691c3f02f3.webp":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1763835293899-43b3fbe1-9b5b-441c-b4d4-d1691c3f02f3.webp?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260307%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260307T105259Z&X-Amz-Expires=259200&X-Amz-Signature=bf52ada07a10aef2f03249480efc7c918389e8711c31dec38c7bae4b922ddfd6&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1773139919079},"tags/1768709725124-ebf421c5-ad52-49a9-b65c-1de008110b8a.png":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1768709725124-ebf421c5-ad52-49a9-b65c-1de008110b8a.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260307%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260307T105259Z&X-Amz-Expires=259200&X-Amz-Signature=3e175d60bbaba792d9dd5d60d4ebad6ad395e9f5f7a00f469e6d74dccec68d59&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1773139919523},"tags/1770321659633-1763869265110-e22b6d94-dac9-499f-babb-1e944d90b01a.jpeg%3FX-Amz-Algorithm%3DAWS4-HMAC-SHA256%26X-Amz-Content-Sha256%3DUNSIGNED-PAYLOAD%26X-Amz-Credential%3D8fab47503efb9547b50e4fb317e35cc7%252F20260205%252Fapac%252Fs3%252Faws4_request%26X-Amz-Date%3D20260205T195535Z%26X-Amz-Expires%3D259200%26X-Amz-Signature%3D917db15bcc60cab7ac5cd5e49d85d13a960fe77b4a5e327dd449048870494cf9%26X-Amz-SignedHeaders%3Dhost%26x-amz-checksum-mode%3DENABLED%26x-id%3DGetObject":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1770321659633-1763869265110-e22b6d94-dac9-499f-babb-1e944d90b01a.jpeg%253FX-Amz-Algorithm%253DAWS4-HMAC-SHA256%2526X-Amz-Content-Sha256%253DUNSIGNED-PAYLOAD%2526X-Amz-Credential%253D8fab47503efb9547b50e4fb317e35cc7%25252F20260205%25252Fapac%25252Fs3%25252Faws4_request%2526X-Amz-Date%253D20260205T195535Z%2526X-Amz-Expires%253D259200%2526X-Amz-Signature%253D917db15bcc60cab7ac5cd5e49d85d13a960fe77b4a5e327dd449048870494cf9%2526X-Amz-SignedHeaders%253Dhost%2526x-amz-checksum-mode%253DENABLED%2526x-id%253DGetObject?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260307%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260307T105259Z&X-Amz-Expires=259200&X-Amz-Signature=5cbc2e1c88c8df749d97c59dfec911cbacc58502fd38e97723ee3627e8934d6e&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1773139919790},"tags/1770323410499-1763869436182-bf82f7b4-a1f3-4113-985b-96311b7a910e.jpeg%3FX-Amz-Algorithm%3DAWS4-HMAC-SHA256%26X-Amz-Content-Sha256%3DUNSIGNED-PAYLOAD%26X-Amz-Credential%3D8fab47503efb9547b50e4fb317e35cc7%252F20260205%252Fapac%252Fs3%252Faws4_request%26X-Amz-Date%3D20260205T202804Z%26X-Amz-Expires%3D259200%26X-Amz-Signature%3Dea436390b277935d843cae6b5cfa62aeed5799cb4a962ab31a0be4b132ca4b30%26X-Amz-SignedHeaders%3Dhost%26x-amz-checksum-mode%3DENABLED%26x-id%3DGetObject":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1770323410499-1763869436182-bf82f7b4-a1f3-4113-985b-96311b7a910e.jpeg%253FX-Amz-Algorithm%253DAWS4-HMAC-SHA256%2526X-Amz-Content-Sha256%253DUNSIGNED-PAYLOAD%2526X-Amz-Credential%253D8fab47503efb9547b50e4fb317e35cc7%25252F20260205%25252Fapac%25252Fs3%25252Faws4_request%2526X-Amz-Date%253D20260205T202804Z%2526X-Amz-Expires%253D259200%2526X-Amz-Signature%253Dea436390b277935d843cae6b5cfa62aeed5799cb4a962ab31a0be4b132ca4b30%2526X-Amz-SignedHeaders%253Dhost%2526x-amz-checksum-mode%253DENABLED%2526x-id%253DGetObject?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260307%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260307T105300Z&X-Amz-Expires=259200&X-Amz-Signature=aa8adbc434acc3f5c2b8f7a43d300a56df641e21ebefe30510b7e5edbac3e36f&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1773139920026},"tags/1770323560823-fd0ec463-bed0-474e-aa14-dc6480ce36af.jpeg":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1770323560823-fd0ec463-bed0-474e-aa14-dc6480ce36af.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260307%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260307T105300Z&X-Amz-Expires=259200&X-Amz-Signature=5064525b43e9119a4ec0c19ca134b84697a814c54121f4bca6d2b28582c2fe01&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1773139920248}},"signedToOriginal":{"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1763835253683-c9c3e293-0bef-4c58-a976-dd49c050cd36.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260307%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260307T105258Z&X-Amz-Expires=259200&X-Amz-Signature=a4e4226aa30b5f0fde27efca0f139c00df5d3e13d08b104c4aee12afda1f7498&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"tags/1763835253683-c9c3e293-0bef-4c58-a976-dd49c050cd36.jpeg","expiresAt":1773139918864},"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1763835293899-43b3fbe1-9b5b-441c-b4d4-d1691c3f02f3.webp?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260307%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260307T105259Z&X-Amz-Expires=259200&X-Amz-Signature=bf52ada07a10aef2f03249480efc7c918389e8711c31dec38c7bae4b922ddfd6&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"tags/1763835293899-43b3fbe1-9b5b-441c-b4d4-d1691c3f02f3.webp","expiresAt":1773139919079},"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1768709725124-ebf421c5-ad52-49a9-b65c-1de008110b8a.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260307%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260307T105259Z&X-Amz-Expires=259200&X-Amz-Signature=3e175d60bbaba792d9dd5d60d4ebad6ad395e9f5f7a00f469e6d74dccec68d59&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"tags/1768709725124-ebf421c5-ad52-49a9-b65c-1de008110b8a.png","expiresAt":1773139919523},"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1770321659633-1763869265110-e22b6d94-dac9-499f-babb-1e944d90b01a.jpeg%253FX-Amz-Algorithm%253DAWS4-HMAC-SHA256%2526X-Amz-Content-Sha256%253DUNSIGNED-PAYLOAD%2526X-Amz-Credential%253D8fab47503efb9547b50e4fb317e35cc7%25252F20260205%25252Fapac%25252Fs3%25252Faws4_request%2526X-Amz-Date%253D20260205T195535Z%2526X-Amz-Expires%253D259200%2526X-Amz-Signature%253D917db15bcc60cab7ac5cd5e49d85d13a960fe77b4a5e327dd449048870494cf9%2526X-Amz-SignedHeaders%253Dhost%2526x-amz-checksum-mode%253DENABLED%2526x-id%253DGetObject?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260307%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260307T105259Z&X-Amz-Expires=259200&X-Amz-Signature=5cbc2e1c88c8df749d97c59dfec911cbacc58502fd38e97723ee3627e8934d6e&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"tags/1770321659633-1763869265110-e22b6d94-dac9-499f-babb-1e944d90b01a.jpeg%3FX-Amz-Algorithm%3DAWS4-HMAC-SHA256%26X-Amz-Content-Sha256%3DUNSIGNED-PAYLOAD%26X-Amz-Credential%3D8fab47503efb9547b50e4fb317e35cc7%252F20260205%252Fapac%252Fs3%252Faws4_request%26X-Amz-Date%3D20260205T195535Z%26X-Amz-Expires%3D259200%26X-Amz-Signature%3D917db15bcc60cab7ac5cd5e49d85d13a960fe77b4a5e327dd449048870494cf9%26X-Amz-SignedHeaders%3Dhost%26x-amz-checksum-mode%3DENABLED%26x-id%3DGetObject","expiresAt":1773139919790},"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1770323410499-1763869436182-bf82f7b4-a1f3-4113-985b-96311b7a910e.jpeg%253FX-Amz-Algorithm%253DAWS4-HMAC-SHA256%2526X-Amz-Content-Sha256%253DUNSIGNED-PAYLOAD%2526X-Amz-Credential%253D8fab47503efb9547b50e4fb317e35cc7%25252F20260205%25252Fapac%25252Fs3%25252Faws4_request%2526X-Amz-Date%253D20260205T202804Z%2526X-Amz-Expires%253D259200%2526X-Amz-Signature%253Dea436390b277935d843cae6b5cfa62aeed5799cb4a962ab31a0be4b132ca4b30%2526X-Amz-SignedHeaders%253Dhost%2526x-amz-checksum-mode%253DENABLED%2526x-id%253DGetObject?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260307%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260307T105300Z&X-Amz-Expires=259200&X-Amz-Signature=aa8adbc434acc3f5c2b8f7a43d300a56df641e21ebefe30510b7e5edbac3e36f&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"tags/1770323410499-1763869436182-bf82f7b4-a1f3-4113-985b-96311b7a910e.jpeg%3FX-Amz-Algorithm%3DAWS4-HMAC-SHA256%26X-Amz-Content-Sha256%3DUNSIGNED-PAYLOAD%26X-Amz-Credential%3D8fab47503efb9547b50e4fb317e35cc7%252F20260205%252Fapac%252Fs3%252Faws4_request%26X-Amz-Date%3D20260205T202804Z%26X-Amz-Expires%3D259200%26X-Amz-Signature%3Dea436390b277935d843cae6b5cfa62aeed5799cb4a962ab31a0be4b132ca4b30%26X-Amz-SignedHeaders%3Dhost%26x-amz-checksum-mode%3DENABLED%26x-id%3DGetObject","expiresAt":1773139920026},"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1770323560823-fd0ec463-bed0-474e-aa14-dc6480ce36af.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260307%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260307T105300Z&X-Amz-Expires=259200&X-Amz-Signature=5064525b43e9119a4ec0c19ca134b84697a814c54121f4bca6d2b28582c2fe01&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"tags/1770323560823-fd0ec463-bed0-474e-aa14-dc6480ce36af.jpeg","expiresAt":1773139920248}}} \ No newline at end of file +{"originalToSigned":{"tags/1763835253683-c9c3e293-0bef-4c58-a976-dd49c050cd36.jpeg":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1763835253683-c9c3e293-0bef-4c58-a976-dd49c050cd36.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T142833Z&X-Amz-Expires=259200&X-Amz-Signature=d598f1720e46f57433ba316d631824948a1a9641cac52d3bc40f74a7fc46a6a4&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1774276053527},"tags/1763835293899-43b3fbe1-9b5b-441c-b4d4-d1691c3f02f3.webp":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1763835293899-43b3fbe1-9b5b-441c-b4d4-d1691c3f02f3.webp?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T142833Z&X-Amz-Expires=259200&X-Amz-Signature=4d2ea6b5dcf2139fe298f1a99af4c6a74c651324693e3638579dacef8db00ac8&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1774276053743},"tags/1768709725124-ebf421c5-ad52-49a9-b65c-1de008110b8a.png":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1768709725124-ebf421c5-ad52-49a9-b65c-1de008110b8a.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T142833Z&X-Amz-Expires=259200&X-Amz-Signature=cb4097321dee3a761d99e57033324ad4fb50b37b948df3ae6813f3c06e904320&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1774276053957},"tags/1770321659633-1763869265110-e22b6d94-dac9-499f-babb-1e944d90b01a.jpeg%3FX-Amz-Algorithm%3DAWS4-HMAC-SHA256%26X-Amz-Content-Sha256%3DUNSIGNED-PAYLOAD%26X-Amz-Credential%3D8fab47503efb9547b50e4fb317e35cc7%252F20260205%252Fapac%252Fs3%252Faws4_request%26X-Amz-Date%3D20260205T195535Z%26X-Amz-Expires%3D259200%26X-Amz-Signature%3D917db15bcc60cab7ac5cd5e49d85d13a960fe77b4a5e327dd449048870494cf9%26X-Amz-SignedHeaders%3Dhost%26x-amz-checksum-mode%3DENABLED%26x-id%3DGetObject":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1770321659633-1763869265110-e22b6d94-dac9-499f-babb-1e944d90b01a.jpeg%253FX-Amz-Algorithm%253DAWS4-HMAC-SHA256%2526X-Amz-Content-Sha256%253DUNSIGNED-PAYLOAD%2526X-Amz-Credential%253D8fab47503efb9547b50e4fb317e35cc7%25252F20260205%25252Fapac%25252Fs3%25252Faws4_request%2526X-Amz-Date%253D20260205T195535Z%2526X-Amz-Expires%253D259200%2526X-Amz-Signature%253D917db15bcc60cab7ac5cd5e49d85d13a960fe77b4a5e327dd449048870494cf9%2526X-Amz-SignedHeaders%253Dhost%2526x-amz-checksum-mode%253DENABLED%2526x-id%253DGetObject?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T142834Z&X-Amz-Expires=259200&X-Amz-Signature=e858646d56956d900ca5f77e90f3b02a1608b35b71b44473d42deaf62a2b923b&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1774276054173},"tags/1770323410499-1763869436182-bf82f7b4-a1f3-4113-985b-96311b7a910e.jpeg%3FX-Amz-Algorithm%3DAWS4-HMAC-SHA256%26X-Amz-Content-Sha256%3DUNSIGNED-PAYLOAD%26X-Amz-Credential%3D8fab47503efb9547b50e4fb317e35cc7%252F20260205%252Fapac%252Fs3%252Faws4_request%26X-Amz-Date%3D20260205T202804Z%26X-Amz-Expires%3D259200%26X-Amz-Signature%3Dea436390b277935d843cae6b5cfa62aeed5799cb4a962ab31a0be4b132ca4b30%26X-Amz-SignedHeaders%3Dhost%26x-amz-checksum-mode%3DENABLED%26x-id%3DGetObject":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1770323410499-1763869436182-bf82f7b4-a1f3-4113-985b-96311b7a910e.jpeg%253FX-Amz-Algorithm%253DAWS4-HMAC-SHA256%2526X-Amz-Content-Sha256%253DUNSIGNED-PAYLOAD%2526X-Amz-Credential%253D8fab47503efb9547b50e4fb317e35cc7%25252F20260205%25252Fapac%25252Fs3%25252Faws4_request%2526X-Amz-Date%253D20260205T202804Z%2526X-Amz-Expires%253D259200%2526X-Amz-Signature%253Dea436390b277935d843cae6b5cfa62aeed5799cb4a962ab31a0be4b132ca4b30%2526X-Amz-SignedHeaders%253Dhost%2526x-amz-checksum-mode%253DENABLED%2526x-id%253DGetObject?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T142834Z&X-Amz-Expires=259200&X-Amz-Signature=48e40e485516a8511cfa7b3e01c3ac1f3fd90a1f7dfc78452aeaca6134e54664&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1774276054467},"tags/1770323560823-fd0ec463-bed0-474e-aa14-dc6480ce36af.jpeg":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1770323560823-fd0ec463-bed0-474e-aa14-dc6480ce36af.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T142834Z&X-Amz-Expires=259200&X-Amz-Signature=f1f52a9e8837aa0ee27d70451713d875d7e988380fdc292edd77b55a14d0ca16&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1774276054680},"store-images/1770429593455.jpg":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/store-images/1770429593455.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T144551Z&X-Amz-Expires=259200&X-Amz-Signature=fc800a140ad29be1a01c98adb94d9bd5829cb87fcafd2e13416e94e4d552c703&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1774277091446},"store-images/1770281046297.jpg":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/store-images/1770281046297.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T144551Z&X-Amz-Expires=259200&X-Amz-Signature=ca09755e86928fcccd7978e956172ae5a0e8bc6c9b59422fe0a768870ab30347&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1774277091446},"store-images/1770281045021.jpg":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/store-images/1770281045021.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T144551Z&X-Amz-Expires=259200&X-Amz-Signature=a9ed065f8f51e1657752e21204779e1399092a564c85785d2002c9f8632caedb&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1774277091446},"product-images/1774116266063.jpg":{"value":"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/product-images/1774116266063.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260322%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260322T044828Z&X-Amz-Expires=259200&X-Amz-Signature=6e3aaab8be89b356d2ec53fa0f788404507388e63249c0bf802ee26c0b4b02b4&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject","expiresAt":1774414048776}},"signedToOriginal":{"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1763835253683-c9c3e293-0bef-4c58-a976-dd49c050cd36.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T142833Z&X-Amz-Expires=259200&X-Amz-Signature=d598f1720e46f57433ba316d631824948a1a9641cac52d3bc40f74a7fc46a6a4&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"tags/1763835253683-c9c3e293-0bef-4c58-a976-dd49c050cd36.jpeg","expiresAt":1774276053527},"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1763835293899-43b3fbe1-9b5b-441c-b4d4-d1691c3f02f3.webp?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T142833Z&X-Amz-Expires=259200&X-Amz-Signature=4d2ea6b5dcf2139fe298f1a99af4c6a74c651324693e3638579dacef8db00ac8&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"tags/1763835293899-43b3fbe1-9b5b-441c-b4d4-d1691c3f02f3.webp","expiresAt":1774276053743},"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1768709725124-ebf421c5-ad52-49a9-b65c-1de008110b8a.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T142833Z&X-Amz-Expires=259200&X-Amz-Signature=cb4097321dee3a761d99e57033324ad4fb50b37b948df3ae6813f3c06e904320&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"tags/1768709725124-ebf421c5-ad52-49a9-b65c-1de008110b8a.png","expiresAt":1774276053957},"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1770321659633-1763869265110-e22b6d94-dac9-499f-babb-1e944d90b01a.jpeg%253FX-Amz-Algorithm%253DAWS4-HMAC-SHA256%2526X-Amz-Content-Sha256%253DUNSIGNED-PAYLOAD%2526X-Amz-Credential%253D8fab47503efb9547b50e4fb317e35cc7%25252F20260205%25252Fapac%25252Fs3%25252Faws4_request%2526X-Amz-Date%253D20260205T195535Z%2526X-Amz-Expires%253D259200%2526X-Amz-Signature%253D917db15bcc60cab7ac5cd5e49d85d13a960fe77b4a5e327dd449048870494cf9%2526X-Amz-SignedHeaders%253Dhost%2526x-amz-checksum-mode%253DENABLED%2526x-id%253DGetObject?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T142834Z&X-Amz-Expires=259200&X-Amz-Signature=e858646d56956d900ca5f77e90f3b02a1608b35b71b44473d42deaf62a2b923b&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"tags/1770321659633-1763869265110-e22b6d94-dac9-499f-babb-1e944d90b01a.jpeg%3FX-Amz-Algorithm%3DAWS4-HMAC-SHA256%26X-Amz-Content-Sha256%3DUNSIGNED-PAYLOAD%26X-Amz-Credential%3D8fab47503efb9547b50e4fb317e35cc7%252F20260205%252Fapac%252Fs3%252Faws4_request%26X-Amz-Date%3D20260205T195535Z%26X-Amz-Expires%3D259200%26X-Amz-Signature%3D917db15bcc60cab7ac5cd5e49d85d13a960fe77b4a5e327dd449048870494cf9%26X-Amz-SignedHeaders%3Dhost%26x-amz-checksum-mode%3DENABLED%26x-id%3DGetObject","expiresAt":1774276054173},"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1770323410499-1763869436182-bf82f7b4-a1f3-4113-985b-96311b7a910e.jpeg%253FX-Amz-Algorithm%253DAWS4-HMAC-SHA256%2526X-Amz-Content-Sha256%253DUNSIGNED-PAYLOAD%2526X-Amz-Credential%253D8fab47503efb9547b50e4fb317e35cc7%25252F20260205%25252Fapac%25252Fs3%25252Faws4_request%2526X-Amz-Date%253D20260205T202804Z%2526X-Amz-Expires%253D259200%2526X-Amz-Signature%253Dea436390b277935d843cae6b5cfa62aeed5799cb4a962ab31a0be4b132ca4b30%2526X-Amz-SignedHeaders%253Dhost%2526x-amz-checksum-mode%253DENABLED%2526x-id%253DGetObject?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T142834Z&X-Amz-Expires=259200&X-Amz-Signature=48e40e485516a8511cfa7b3e01c3ac1f3fd90a1f7dfc78452aeaca6134e54664&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"tags/1770323410499-1763869436182-bf82f7b4-a1f3-4113-985b-96311b7a910e.jpeg%3FX-Amz-Algorithm%3DAWS4-HMAC-SHA256%26X-Amz-Content-Sha256%3DUNSIGNED-PAYLOAD%26X-Amz-Credential%3D8fab47503efb9547b50e4fb317e35cc7%252F20260205%252Fapac%252Fs3%252Faws4_request%26X-Amz-Date%3D20260205T202804Z%26X-Amz-Expires%3D259200%26X-Amz-Signature%3Dea436390b277935d843cae6b5cfa62aeed5799cb4a962ab31a0be4b132ca4b30%26X-Amz-SignedHeaders%3Dhost%26x-amz-checksum-mode%3DENABLED%26x-id%3DGetObject","expiresAt":1774276054467},"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/tags/1770323560823-fd0ec463-bed0-474e-aa14-dc6480ce36af.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T142834Z&X-Amz-Expires=259200&X-Amz-Signature=f1f52a9e8837aa0ee27d70451713d875d7e988380fdc292edd77b55a14d0ca16&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"tags/1770323560823-fd0ec463-bed0-474e-aa14-dc6480ce36af.jpeg","expiresAt":1774276054680},"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/store-images/1770429593455.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T144551Z&X-Amz-Expires=259200&X-Amz-Signature=fc800a140ad29be1a01c98adb94d9bd5829cb87fcafd2e13416e94e4d552c703&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"store-images/1770429593455.jpg","expiresAt":1774277091446},"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/store-images/1770281046297.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T144551Z&X-Amz-Expires=259200&X-Amz-Signature=ca09755e86928fcccd7978e956172ae5a0e8bc6c9b59422fe0a768870ab30347&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"store-images/1770281046297.jpg","expiresAt":1774277091446},"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/store-images/1770281045021.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260320%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260320T144551Z&X-Amz-Expires=259200&X-Amz-Signature=a9ed065f8f51e1657752e21204779e1399092a564c85785d2002c9f8632caedb&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"store-images/1770281045021.jpg","expiresAt":1774277091446},"https://da9b1aa7c1951c23e2c0c3246ba68a58.r2.cloudflarestorage.com/meatfarmer/product-images/1774116266063.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8fab47503efb9547b50e4fb317e35cc7%2F20260322%2Fapac%2Fs3%2Faws4_request&X-Amz-Date=20260322T044828Z&X-Amz-Expires=259200&X-Amz-Signature=6e3aaab8be89b356d2ec53fa0f788404507388e63249c0bf802ee26c0b4b02b4&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject":{"value":"product-images/1774116266063.jpg","expiresAt":1774414048776}}} \ No newline at end of file diff --git a/apps/backend/drizzle.config.ts b/apps/backend/drizzle.config.ts index 0b5c1c9..0dea3b8 100755 --- a/apps/backend/drizzle.config.ts +++ b/apps/backend/drizzle.config.ts @@ -1,11 +1,6 @@ -import 'dotenv/config'; -import { defineConfig } from 'drizzle-kit'; +import postgresConfig from '../db-helper-postgres/drizzle.config' +import sqliteConfig from '../db-helper-sqlite/drizzle.config' -export default defineConfig({ - out: './drizzle', - schema: './src/db/schema.ts', - dialect: 'postgresql', - dbCredentials: { - url: process.env.DATABASE_URL!, - }, -}); +export default process.env.DB_DIALECT === 'sqlite' + ? sqliteConfig + : postgresConfig diff --git a/apps/backend/drizzle/0077_wakeful_norrin_radd.sql b/apps/backend/drizzle/0077_wakeful_norrin_radd.sql new file mode 100644 index 0000000..2ed380d --- /dev/null +++ b/apps/backend/drizzle/0077_wakeful_norrin_radd.sql @@ -0,0 +1,14 @@ +CREATE TYPE "public"."product_availability_action" AS ENUM('in', 'out');--> statement-breakpoint +CREATE TABLE "mf"."product_availability_schedules" ( + "id" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "mf"."product_availability_schedules_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1), + "time" varchar(10) NOT NULL, + "schedule_name" varchar(255) NOT NULL, + "action" "product_availability_action" NOT NULL, + "product_ids" integer[] DEFAULT '{}' NOT NULL, + "group_ids" integer[] DEFAULT '{}' NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "last_updated" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "product_availability_schedules_schedule_name_unique" UNIQUE("schedule_name") +); +--> statement-breakpoint +ALTER TABLE "mf"."product_info" ADD COLUMN "scheduled_availability" boolean DEFAULT true NOT NULL; \ No newline at end of file diff --git a/apps/backend/drizzle/meta/0077_snapshot.json b/apps/backend/drizzle/meta/0077_snapshot.json new file mode 100644 index 0000000..35539a0 --- /dev/null +++ b/apps/backend/drizzle/meta/0077_snapshot.json @@ -0,0 +1,3965 @@ +{ + "id": "d40825e6-92c9-42f0-be80-9be2a70cae2d", + "prevId": "26c2b560-e848-451d-b8f4-0cbd68e3ea4e", + "version": "7", + "dialect": "postgresql", + "tables": { + "mf.address_areas": { + "name": "address_areas", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "address_areas_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "place_name": { + "name": "place_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "zone_id": { + "name": "zone_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "address_areas_zone_id_address_zones_id_fk": { + "name": "address_areas_zone_id_address_zones_id_fk", + "tableFrom": "address_areas", + "tableTo": "address_zones", + "schemaTo": "mf", + "columnsFrom": [ + "zone_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.address_zones": { + "name": "address_zones", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "address_zones_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "zone_name": { + "name": "zone_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "added_at": { + "name": "added_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.addresses": { + "name": "addresses", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "addresses_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "phone": { + "name": "phone", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true + }, + "address_line1": { + "name": "address_line1", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "address_line2": { + "name": "address_line2", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "city": { + "name": "city", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true + }, + "state": { + "name": "state", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true + }, + "pincode": { + "name": "pincode", + "type": "varchar(10)", + "primaryKey": false, + "notNull": true + }, + "is_default": { + "name": "is_default", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "latitude": { + "name": "latitude", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "longitude": { + "name": "longitude", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "google_maps_url": { + "name": "google_maps_url", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + }, + "admin_latitude": { + "name": "admin_latitude", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "admin_longitude": { + "name": "admin_longitude", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "zone_id": { + "name": "zone_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "addresses_user_id_users_id_fk": { + "name": "addresses_user_id_users_id_fk", + "tableFrom": "addresses", + "tableTo": "users", + "schemaTo": "mf", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "addresses_zone_id_address_zones_id_fk": { + "name": "addresses_zone_id_address_zones_id_fk", + "tableFrom": "addresses", + "tableTo": "address_zones", + "schemaTo": "mf", + "columnsFrom": [ + "zone_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.cart_items": { + "name": "cart_items", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "cart_items_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "quantity": { + "name": "quantity", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true + }, + "added_at": { + "name": "added_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "cart_items_user_id_users_id_fk": { + "name": "cart_items_user_id_users_id_fk", + "tableFrom": "cart_items", + "tableTo": "users", + "schemaTo": "mf", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "cart_items_product_id_product_info_id_fk": { + "name": "cart_items_product_id_product_info_id_fk", + "tableFrom": "cart_items", + "tableTo": "product_info", + "schemaTo": "mf", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_user_product": { + "name": "unique_user_product", + "nullsNotDistinct": false, + "columns": [ + "user_id", + "product_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.complaints": { + "name": "complaints", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "complaints_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "order_id": { + "name": "order_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "complaint_body": { + "name": "complaint_body", + "type": "varchar(1000)", + "primaryKey": false, + "notNull": true + }, + "images": { + "name": "images", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "response": { + "name": "response", + "type": "varchar(1000)", + "primaryKey": false, + "notNull": false + }, + "is_resolved": { + "name": "is_resolved", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "complaints_user_id_users_id_fk": { + "name": "complaints_user_id_users_id_fk", + "tableFrom": "complaints", + "tableTo": "users", + "schemaTo": "mf", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "complaints_order_id_orders_id_fk": { + "name": "complaints_order_id_orders_id_fk", + "tableFrom": "complaints", + "tableTo": "orders", + "schemaTo": "mf", + "columnsFrom": [ + "order_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.coupon_applicable_products": { + "name": "coupon_applicable_products", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "coupon_applicable_products_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "coupon_id": { + "name": "coupon_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "coupon_applicable_products_coupon_id_coupons_id_fk": { + "name": "coupon_applicable_products_coupon_id_coupons_id_fk", + "tableFrom": "coupon_applicable_products", + "tableTo": "coupons", + "schemaTo": "mf", + "columnsFrom": [ + "coupon_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "coupon_applicable_products_product_id_product_info_id_fk": { + "name": "coupon_applicable_products_product_id_product_info_id_fk", + "tableFrom": "coupon_applicable_products", + "tableTo": "product_info", + "schemaTo": "mf", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_coupon_product": { + "name": "unique_coupon_product", + "nullsNotDistinct": false, + "columns": [ + "coupon_id", + "product_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.coupon_applicable_users": { + "name": "coupon_applicable_users", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "coupon_applicable_users_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "coupon_id": { + "name": "coupon_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "coupon_applicable_users_coupon_id_coupons_id_fk": { + "name": "coupon_applicable_users_coupon_id_coupons_id_fk", + "tableFrom": "coupon_applicable_users", + "tableTo": "coupons", + "schemaTo": "mf", + "columnsFrom": [ + "coupon_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "coupon_applicable_users_user_id_users_id_fk": { + "name": "coupon_applicable_users_user_id_users_id_fk", + "tableFrom": "coupon_applicable_users", + "tableTo": "users", + "schemaTo": "mf", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_coupon_user": { + "name": "unique_coupon_user", + "nullsNotDistinct": false, + "columns": [ + "coupon_id", + "user_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.coupon_usage": { + "name": "coupon_usage", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "coupon_usage_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "coupon_id": { + "name": "coupon_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "order_id": { + "name": "order_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "order_item_id": { + "name": "order_item_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "used_at": { + "name": "used_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "coupon_usage_user_id_users_id_fk": { + "name": "coupon_usage_user_id_users_id_fk", + "tableFrom": "coupon_usage", + "tableTo": "users", + "schemaTo": "mf", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "coupon_usage_coupon_id_coupons_id_fk": { + "name": "coupon_usage_coupon_id_coupons_id_fk", + "tableFrom": "coupon_usage", + "tableTo": "coupons", + "schemaTo": "mf", + "columnsFrom": [ + "coupon_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "coupon_usage_order_id_orders_id_fk": { + "name": "coupon_usage_order_id_orders_id_fk", + "tableFrom": "coupon_usage", + "tableTo": "orders", + "schemaTo": "mf", + "columnsFrom": [ + "order_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "coupon_usage_order_item_id_order_items_id_fk": { + "name": "coupon_usage_order_item_id_order_items_id_fk", + "tableFrom": "coupon_usage", + "tableTo": "order_items", + "schemaTo": "mf", + "columnsFrom": [ + "order_item_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.coupons": { + "name": "coupons", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "coupons_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "coupon_code": { + "name": "coupon_code", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "is_user_based": { + "name": "is_user_based", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "discount_percent": { + "name": "discount_percent", + "type": "numeric(5, 2)", + "primaryKey": false, + "notNull": false + }, + "flat_discount": { + "name": "flat_discount", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "min_order": { + "name": "min_order", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "product_ids": { + "name": "product_ids", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_by": { + "name": "created_by", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_value": { + "name": "max_value", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "is_apply_for_all": { + "name": "is_apply_for_all", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "valid_till": { + "name": "valid_till", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "max_limit_for_user": { + "name": "max_limit_for_user", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "is_invalidated": { + "name": "is_invalidated", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "exclusive_apply": { + "name": "exclusive_apply", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "coupons_created_by_staff_users_id_fk": { + "name": "coupons_created_by_staff_users_id_fk", + "tableFrom": "coupons", + "tableTo": "staff_users", + "schemaTo": "mf", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_coupon_code": { + "name": "unique_coupon_code", + "nullsNotDistinct": false, + "columns": [ + "coupon_code" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.delivery_slot_info": { + "name": "delivery_slot_info", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "delivery_slot_info_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "delivery_time": { + "name": "delivery_time", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "freeze_time": { + "name": "freeze_time", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "is_flash": { + "name": "is_flash", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_capacity_full": { + "name": "is_capacity_full", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "delivery_sequence": { + "name": "delivery_sequence", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "group_ids": { + "name": "group_ids", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.home_banners": { + "name": "home_banners", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "home_banners_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "image_url": { + "name": "image_url", + "type": "varchar(500)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + }, + "product_ids": { + "name": "product_ids", + "type": "integer[]", + "primaryKey": false, + "notNull": false + }, + "redirect_url": { + "name": "redirect_url", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + }, + "serial_num": { + "name": "serial_num", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "last_updated": { + "name": "last_updated", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.key_val_store": { + "name": "key_val_store", + "schema": "mf", + "columns": { + "key": { + "name": "key", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "value": { + "name": "value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.notif_creds": { + "name": "notif_creds", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "notif_creds_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "token": { + "name": "token", + "type": "varchar(500)", + "primaryKey": false, + "notNull": true + }, + "added_at": { + "name": "added_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "last_verified": { + "name": "last_verified", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "notif_creds_user_id_users_id_fk": { + "name": "notif_creds_user_id_users_id_fk", + "tableFrom": "notif_creds", + "tableTo": "users", + "schemaTo": "mf", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "notif_creds_token_unique": { + "name": "notif_creds_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.notifications": { + "name": "notifications", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "notifications_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "body": { + "name": "body", + "type": "varchar(512)", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false + }, + "is_read": { + "name": "is_read", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "notifications_user_id_users_id_fk": { + "name": "notifications_user_id_users_id_fk", + "tableFrom": "notifications", + "tableTo": "users", + "schemaTo": "mf", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.order_items": { + "name": "order_items", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "order_items_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "order_id": { + "name": "order_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "quantity": { + "name": "quantity", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "price": { + "name": "price", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true + }, + "discounted_price": { + "name": "discounted_price", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "is_packaged": { + "name": "is_packaged", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_package_verified": { + "name": "is_package_verified", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "order_items_order_id_orders_id_fk": { + "name": "order_items_order_id_orders_id_fk", + "tableFrom": "order_items", + "tableTo": "orders", + "schemaTo": "mf", + "columnsFrom": [ + "order_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "order_items_product_id_product_info_id_fk": { + "name": "order_items_product_id_product_info_id_fk", + "tableFrom": "order_items", + "tableTo": "product_info", + "schemaTo": "mf", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.order_status": { + "name": "order_status", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "order_status_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "order_time": { + "name": "order_time", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "order_id": { + "name": "order_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "is_packaged": { + "name": "is_packaged", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_delivered": { + "name": "is_delivered", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_cancelled": { + "name": "is_cancelled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cancel_reason": { + "name": "cancel_reason", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "is_cancelled_by_admin": { + "name": "is_cancelled_by_admin", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "payment_state": { + "name": "payment_state", + "type": "payment_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "cancellation_user_notes": { + "name": "cancellation_user_notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cancellation_admin_notes": { + "name": "cancellation_admin_notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cancellation_reviewed": { + "name": "cancellation_reviewed", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cancellation_reviewed_at": { + "name": "cancellation_reviewed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "refund_coupon_id": { + "name": "refund_coupon_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "order_status_user_id_users_id_fk": { + "name": "order_status_user_id_users_id_fk", + "tableFrom": "order_status", + "tableTo": "users", + "schemaTo": "mf", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "order_status_order_id_orders_id_fk": { + "name": "order_status_order_id_orders_id_fk", + "tableFrom": "order_status", + "tableTo": "orders", + "schemaTo": "mf", + "columnsFrom": [ + "order_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "order_status_refund_coupon_id_coupons_id_fk": { + "name": "order_status_refund_coupon_id_coupons_id_fk", + "tableFrom": "order_status", + "tableTo": "coupons", + "schemaTo": "mf", + "columnsFrom": [ + "refund_coupon_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.orders": { + "name": "orders", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "orders_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "address_id": { + "name": "address_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "slot_id": { + "name": "slot_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "is_cod": { + "name": "is_cod", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_online_payment": { + "name": "is_online_payment", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "payment_info_id": { + "name": "payment_info_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "total_amount": { + "name": "total_amount", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true + }, + "delivery_charge": { + "name": "delivery_charge", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "readable_id": { + "name": "readable_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "admin_notes": { + "name": "admin_notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_notes": { + "name": "user_notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "order_group_id": { + "name": "order_group_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "order_group_proportion": { + "name": "order_group_proportion", + "type": "numeric(10, 4)", + "primaryKey": false, + "notNull": false + }, + "is_flash_delivery": { + "name": "is_flash_delivery", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "orders_user_id_users_id_fk": { + "name": "orders_user_id_users_id_fk", + "tableFrom": "orders", + "tableTo": "users", + "schemaTo": "mf", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "orders_address_id_addresses_id_fk": { + "name": "orders_address_id_addresses_id_fk", + "tableFrom": "orders", + "tableTo": "addresses", + "schemaTo": "mf", + "columnsFrom": [ + "address_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "orders_slot_id_delivery_slot_info_id_fk": { + "name": "orders_slot_id_delivery_slot_info_id_fk", + "tableFrom": "orders", + "tableTo": "delivery_slot_info", + "schemaTo": "mf", + "columnsFrom": [ + "slot_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "orders_payment_info_id_payment_info_id_fk": { + "name": "orders_payment_info_id_payment_info_id_fk", + "tableFrom": "orders", + "tableTo": "payment_info", + "schemaTo": "mf", + "columnsFrom": [ + "payment_info_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.payment_info": { + "name": "payment_info", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "payment_info_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "status": { + "name": "status", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "gateway": { + "name": "gateway", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "order_id": { + "name": "order_id", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + }, + "token": { + "name": "token", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + }, + "merchant_order_id": { + "name": "merchant_order_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "payload": { + "name": "payload", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "payment_info_merchant_order_id_unique": { + "name": "payment_info_merchant_order_id_unique", + "nullsNotDistinct": false, + "columns": [ + "merchant_order_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.payments": { + "name": "payments", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "payments_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "status": { + "name": "status", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "gateway": { + "name": "gateway", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "order_id": { + "name": "order_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + }, + "merchant_order_id": { + "name": "merchant_order_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "payload": { + "name": "payload", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "payments_order_id_orders_id_fk": { + "name": "payments_order_id_orders_id_fk", + "tableFrom": "payments", + "tableTo": "orders", + "schemaTo": "mf", + "columnsFrom": [ + "order_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "payments_merchant_order_id_unique": { + "name": "payments_merchant_order_id_unique", + "nullsNotDistinct": false, + "columns": [ + "merchant_order_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.product_availability_schedules": { + "name": "product_availability_schedules", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "product_availability_schedules_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "time": { + "name": "time", + "type": "varchar(10)", + "primaryKey": false, + "notNull": true + }, + "schedule_name": { + "name": "schedule_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "action": { + "name": "action", + "type": "product_availability_action", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "product_ids": { + "name": "product_ids", + "type": "integer[]", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "group_ids": { + "name": "group_ids", + "type": "integer[]", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "last_updated": { + "name": "last_updated", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "product_availability_schedules_schedule_name_unique": { + "name": "product_availability_schedules_schedule_name_unique", + "nullsNotDistinct": false, + "columns": [ + "schedule_name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.product_categories": { + "name": "product_categories", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "product_categories_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.product_group_info": { + "name": "product_group_info", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "product_group_info_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "group_name": { + "name": "group_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.product_group_membership": { + "name": "product_group_membership", + "schema": "mf", + "columns": { + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "group_id": { + "name": "group_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "added_at": { + "name": "added_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "product_group_membership_product_id_product_info_id_fk": { + "name": "product_group_membership_product_id_product_info_id_fk", + "tableFrom": "product_group_membership", + "tableTo": "product_info", + "schemaTo": "mf", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "product_group_membership_group_id_product_group_info_id_fk": { + "name": "product_group_membership_group_id_product_group_info_id_fk", + "tableFrom": "product_group_membership", + "tableTo": "product_group_info", + "schemaTo": "mf", + "columnsFrom": [ + "group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "product_group_membership_pk": { + "name": "product_group_membership_pk", + "nullsNotDistinct": false, + "columns": [ + "product_id", + "group_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.product_info": { + "name": "product_info", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "product_info_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "short_description": { + "name": "short_description", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + }, + "long_description": { + "name": "long_description", + "type": "varchar(1000)", + "primaryKey": false, + "notNull": false + }, + "unit_id": { + "name": "unit_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "price": { + "name": "price", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true + }, + "market_price": { + "name": "market_price", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "images": { + "name": "images", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "is_out_of_stock": { + "name": "is_out_of_stock", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_suspended": { + "name": "is_suspended", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_flash_available": { + "name": "is_flash_available", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "flash_price": { + "name": "flash_price", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "increment_step": { + "name": "increment_step", + "type": "real", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "product_quantity": { + "name": "product_quantity", + "type": "real", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "store_id": { + "name": "store_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "scheduled_availability": { + "name": "scheduled_availability", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + } + }, + "indexes": {}, + "foreignKeys": { + "product_info_unit_id_units_id_fk": { + "name": "product_info_unit_id_units_id_fk", + "tableFrom": "product_info", + "tableTo": "units", + "schemaTo": "mf", + "columnsFrom": [ + "unit_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "product_info_store_id_store_info_id_fk": { + "name": "product_info_store_id_store_info_id_fk", + "tableFrom": "product_info", + "tableTo": "store_info", + "schemaTo": "mf", + "columnsFrom": [ + "store_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.product_reviews": { + "name": "product_reviews", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "product_reviews_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "review_body": { + "name": "review_body", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "image_urls": { + "name": "image_urls", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "review_time": { + "name": "review_time", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "ratings": { + "name": "ratings", + "type": "real", + "primaryKey": false, + "notNull": true + }, + "admin_response": { + "name": "admin_response", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "admin_response_images": { + "name": "admin_response_images", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "product_reviews_user_id_users_id_fk": { + "name": "product_reviews_user_id_users_id_fk", + "tableFrom": "product_reviews", + "tableTo": "users", + "schemaTo": "mf", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "product_reviews_product_id_product_info_id_fk": { + "name": "product_reviews_product_id_product_info_id_fk", + "tableFrom": "product_reviews", + "tableTo": "product_info", + "schemaTo": "mf", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "rating_check": { + "name": "rating_check", + "value": "\"mf\".\"product_reviews\".\"ratings\" >= 1 AND \"mf\".\"product_reviews\".\"ratings\" <= 5" + } + }, + "isRLSEnabled": false + }, + "mf.product_slots": { + "name": "product_slots", + "schema": "mf", + "columns": { + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "slot_id": { + "name": "slot_id", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "product_slots_product_id_product_info_id_fk": { + "name": "product_slots_product_id_product_info_id_fk", + "tableFrom": "product_slots", + "tableTo": "product_info", + "schemaTo": "mf", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "product_slots_slot_id_delivery_slot_info_id_fk": { + "name": "product_slots_slot_id_delivery_slot_info_id_fk", + "tableFrom": "product_slots", + "tableTo": "delivery_slot_info", + "schemaTo": "mf", + "columnsFrom": [ + "slot_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "product_slot_pk": { + "name": "product_slot_pk", + "nullsNotDistinct": false, + "columns": [ + "product_id", + "slot_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.product_tag_info": { + "name": "product_tag_info", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "product_tag_info_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "tag_name": { + "name": "tag_name", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true + }, + "tag_description": { + "name": "tag_description", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + }, + "is_dashboard_tag": { + "name": "is_dashboard_tag", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "related_stores": { + "name": "related_stores", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "product_tag_info_tag_name_unique": { + "name": "product_tag_info_tag_name_unique", + "nullsNotDistinct": false, + "columns": [ + "tag_name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.product_tags": { + "name": "product_tags", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "product_tags_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "tag_id": { + "name": "tag_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "assigned_at": { + "name": "assigned_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "product_tags_product_id_product_info_id_fk": { + "name": "product_tags_product_id_product_info_id_fk", + "tableFrom": "product_tags", + "tableTo": "product_info", + "schemaTo": "mf", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "product_tags_tag_id_product_tag_info_id_fk": { + "name": "product_tags_tag_id_product_tag_info_id_fk", + "tableFrom": "product_tags", + "tableTo": "product_tag_info", + "schemaTo": "mf", + "columnsFrom": [ + "tag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_product_tag": { + "name": "unique_product_tag", + "nullsNotDistinct": false, + "columns": [ + "product_id", + "tag_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.refunds": { + "name": "refunds", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "refunds_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "order_id": { + "name": "order_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "refund_amount": { + "name": "refund_amount", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "refund_status": { + "name": "refund_status", + "type": "varchar(50)", + "primaryKey": false, + "notNull": false, + "default": "'none'" + }, + "merchant_refund_id": { + "name": "merchant_refund_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "refund_processed_at": { + "name": "refund_processed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "refunds_order_id_orders_id_fk": { + "name": "refunds_order_id_orders_id_fk", + "tableFrom": "refunds", + "tableTo": "orders", + "schemaTo": "mf", + "columnsFrom": [ + "order_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.reserved_coupons": { + "name": "reserved_coupons", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "reserved_coupons_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "secret_code": { + "name": "secret_code", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "coupon_code": { + "name": "coupon_code", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "discount_percent": { + "name": "discount_percent", + "type": "numeric(5, 2)", + "primaryKey": false, + "notNull": false + }, + "flat_discount": { + "name": "flat_discount", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "min_order": { + "name": "min_order", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "product_ids": { + "name": "product_ids", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "max_value": { + "name": "max_value", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": false + }, + "valid_till": { + "name": "valid_till", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "max_limit_for_user": { + "name": "max_limit_for_user", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "exclusive_apply": { + "name": "exclusive_apply", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_redeemed": { + "name": "is_redeemed", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "redeemed_by": { + "name": "redeemed_by", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "redeemed_at": { + "name": "redeemed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_by": { + "name": "created_by", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "reserved_coupons_redeemed_by_users_id_fk": { + "name": "reserved_coupons_redeemed_by_users_id_fk", + "tableFrom": "reserved_coupons", + "tableTo": "users", + "schemaTo": "mf", + "columnsFrom": [ + "redeemed_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "reserved_coupons_created_by_staff_users_id_fk": { + "name": "reserved_coupons_created_by_staff_users_id_fk", + "tableFrom": "reserved_coupons", + "tableTo": "staff_users", + "schemaTo": "mf", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "reserved_coupons_secret_code_unique": { + "name": "reserved_coupons_secret_code_unique", + "nullsNotDistinct": false, + "columns": [ + "secret_code" + ] + }, + "unique_secret_code": { + "name": "unique_secret_code", + "nullsNotDistinct": false, + "columns": [ + "secret_code" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.special_deals": { + "name": "special_deals", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "special_deals_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "quantity": { + "name": "quantity", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true + }, + "price": { + "name": "price", + "type": "numeric(10, 2)", + "primaryKey": false, + "notNull": true + }, + "valid_till": { + "name": "valid_till", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "special_deals_product_id_product_info_id_fk": { + "name": "special_deals_product_id_product_info_id_fk", + "tableFrom": "special_deals", + "tableTo": "product_info", + "schemaTo": "mf", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.staff_permissions": { + "name": "staff_permissions", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "staff_permissions_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "permission_name": { + "name": "permission_name", + "type": "staff_permission", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_permission_name": { + "name": "unique_permission_name", + "nullsNotDistinct": false, + "columns": [ + "permission_name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.staff_role_permissions": { + "name": "staff_role_permissions", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "staff_role_permissions_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "staff_role_id": { + "name": "staff_role_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "staff_permission_id": { + "name": "staff_permission_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "staff_role_permissions_staff_role_id_staff_roles_id_fk": { + "name": "staff_role_permissions_staff_role_id_staff_roles_id_fk", + "tableFrom": "staff_role_permissions", + "tableTo": "staff_roles", + "schemaTo": "mf", + "columnsFrom": [ + "staff_role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "staff_role_permissions_staff_permission_id_staff_permissions_id_fk": { + "name": "staff_role_permissions_staff_permission_id_staff_permissions_id_fk", + "tableFrom": "staff_role_permissions", + "tableTo": "staff_permissions", + "schemaTo": "mf", + "columnsFrom": [ + "staff_permission_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_role_permission": { + "name": "unique_role_permission", + "nullsNotDistinct": false, + "columns": [ + "staff_role_id", + "staff_permission_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.staff_roles": { + "name": "staff_roles", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "staff_roles_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "role_name": { + "name": "role_name", + "type": "staff_role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_role_name": { + "name": "unique_role_name", + "nullsNotDistinct": false, + "columns": [ + "role_name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.staff_users": { + "name": "staff_users", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "staff_users_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "staff_role_id": { + "name": "staff_role_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "staff_users_staff_role_id_staff_roles_id_fk": { + "name": "staff_users_staff_role_id_staff_roles_id_fk", + "tableFrom": "staff_users", + "tableTo": "staff_roles", + "schemaTo": "mf", + "columnsFrom": [ + "staff_role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.store_info": { + "name": "store_info", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "store_info_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "owner": { + "name": "owner", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "store_info_owner_staff_users_id_fk": { + "name": "store_info_owner_staff_users_id_fk", + "tableFrom": "store_info", + "tableTo": "staff_users", + "schemaTo": "mf", + "columnsFrom": [ + "owner" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.units": { + "name": "units", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "units_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "short_notation": { + "name": "short_notation", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "full_name": { + "name": "full_name", + "type": "varchar(100)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_short_notation": { + "name": "unique_short_notation", + "nullsNotDistinct": false, + "columns": [ + "short_notation" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.unlogged_user_tokens": { + "name": "unlogged_user_tokens", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "unlogged_user_tokens_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "token": { + "name": "token", + "type": "varchar(500)", + "primaryKey": false, + "notNull": true + }, + "added_at": { + "name": "added_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "last_verified": { + "name": "last_verified", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unlogged_user_tokens_token_unique": { + "name": "unlogged_user_tokens_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.upload_url_status": { + "name": "upload_url_status", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "upload_url_status_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "key": { + "name": "key", + "type": "varchar(500)", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "upload_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.user_creds": { + "name": "user_creds", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "user_creds_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "user_password": { + "name": "user_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_creds_user_id_users_id_fk": { + "name": "user_creds_user_id_users_id_fk", + "tableFrom": "user_creds", + "tableTo": "users", + "schemaTo": "mf", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.user_details": { + "name": "user_details", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "user_details_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "bio": { + "name": "bio", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + }, + "date_of_birth": { + "name": "date_of_birth", + "type": "date", + "primaryKey": false, + "notNull": false + }, + "gender": { + "name": "gender", + "type": "varchar(20)", + "primaryKey": false, + "notNull": false + }, + "occupation": { + "name": "occupation", + "type": "varchar(100)", + "primaryKey": false, + "notNull": false + }, + "profile_image": { + "name": "profile_image", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + }, + "is_suspended": { + "name": "is_suspended", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_details_user_id_users_id_fk": { + "name": "user_details_user_id_users_id_fk", + "tableFrom": "user_details", + "tableTo": "users", + "schemaTo": "mf", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_details_user_id_unique": { + "name": "user_details_user_id_unique", + "nullsNotDistinct": false, + "columns": [ + "user_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.user_incidents": { + "name": "user_incidents", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "user_incidents_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "order_id": { + "name": "order_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "date_added": { + "name": "date_added", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "admin_comment": { + "name": "admin_comment", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "added_by": { + "name": "added_by", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "negativity_score": { + "name": "negativity_score", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_incidents_user_id_users_id_fk": { + "name": "user_incidents_user_id_users_id_fk", + "tableFrom": "user_incidents", + "tableTo": "users", + "schemaTo": "mf", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "user_incidents_order_id_orders_id_fk": { + "name": "user_incidents_order_id_orders_id_fk", + "tableFrom": "user_incidents", + "tableTo": "orders", + "schemaTo": "mf", + "columnsFrom": [ + "order_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "user_incidents_added_by_staff_users_id_fk": { + "name": "user_incidents_added_by_staff_users_id_fk", + "tableFrom": "user_incidents", + "tableTo": "staff_users", + "schemaTo": "mf", + "columnsFrom": [ + "added_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.user_notifications": { + "name": "user_notifications", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "user_notifications_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "title": { + "name": "title", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "image_url": { + "name": "image_url", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "body": { + "name": "body", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicable_users": { + "name": "applicable_users", + "type": "jsonb", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.users": { + "name": "users", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "users_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "mobile": { + "name": "mobile", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_email": { + "name": "unique_email", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "mf.vendor_snippets": { + "name": "vendor_snippets", + "schema": "mf", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "vendor_snippets_id_seq", + "schema": "mf", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "snippet_code": { + "name": "snippet_code", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "slot_id": { + "name": "slot_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "is_permanent": { + "name": "is_permanent", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "product_ids": { + "name": "product_ids", + "type": "integer[]", + "primaryKey": false, + "notNull": true + }, + "valid_till": { + "name": "valid_till", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "vendor_snippets_slot_id_delivery_slot_info_id_fk": { + "name": "vendor_snippets_slot_id_delivery_slot_info_id_fk", + "tableFrom": "vendor_snippets", + "tableTo": "delivery_slot_info", + "schemaTo": "mf", + "columnsFrom": [ + "slot_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "vendor_snippets_snippet_code_unique": { + "name": "vendor_snippets_snippet_code_unique", + "nullsNotDistinct": false, + "columns": [ + "snippet_code" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.payment_status": { + "name": "payment_status", + "schema": "public", + "values": [ + "pending", + "success", + "cod", + "failed" + ] + }, + "public.product_availability_action": { + "name": "product_availability_action", + "schema": "public", + "values": [ + "in", + "out" + ] + }, + "public.staff_permission": { + "name": "staff_permission", + "schema": "public", + "values": [ + "crud_product", + "make_coupon", + "crud_staff_users" + ] + }, + "public.staff_role": { + "name": "staff_role", + "schema": "public", + "values": [ + "super_admin", + "admin", + "marketer", + "delivery_staff" + ] + }, + "public.upload_status": { + "name": "upload_status", + "schema": "public", + "values": [ + "pending", + "claimed" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/backend/drizzle/meta/_journal.json b/apps/backend/drizzle/meta/_journal.json index 572b813..317c51e 100644 --- a/apps/backend/drizzle/meta/_journal.json +++ b/apps/backend/drizzle/meta/_journal.json @@ -540,6 +540,13 @@ "when": 1772637259874, "tag": "0076_sturdy_wolverine", "breakpoints": true + }, + { + "idx": 77, + "version": "7", + "when": 1773927855512, + "tag": "0077_wakeful_norrin_radd", + "breakpoints": true } ] } \ No newline at end of file diff --git a/apps/backend/drizzle/sqlite/0000_goofy_oracle.sql b/apps/backend/drizzle/sqlite/0000_goofy_oracle.sql new file mode 100644 index 0000000..60f37c3 --- /dev/null +++ b/apps/backend/drizzle/sqlite/0000_goofy_oracle.sql @@ -0,0 +1,515 @@ +CREATE TABLE `address_areas` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `place_name` text NOT NULL, + `zone_id` integer, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`zone_id`) REFERENCES `address_zones`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `address_zones` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `zone_name` text NOT NULL, + `added_at` integer DEFAULT (strftime('%s','now')) NOT NULL +); +--> statement-breakpoint +CREATE TABLE `addresses` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `user_id` integer NOT NULL, + `name` text NOT NULL, + `phone` text NOT NULL, + `address_line1` text NOT NULL, + `address_line2` text, + `city` text NOT NULL, + `state` text NOT NULL, + `pincode` text NOT NULL, + `is_default` integer DEFAULT false NOT NULL, + `latitude` real, + `longitude` real, + `google_maps_url` text, + `admin_latitude` real, + `admin_longitude` real, + `zone_id` integer, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`zone_id`) REFERENCES `address_zones`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `cart_items` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `user_id` integer NOT NULL, + `product_id` integer NOT NULL, + `quantity` text NOT NULL, + `added_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`product_id`) REFERENCES `product_info`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE UNIQUE INDEX `unique_user_product` ON `cart_items` (`user_id`,`product_id`);--> statement-breakpoint +CREATE TABLE `complaints` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `user_id` integer NOT NULL, + `order_id` integer, + `complaint_body` text NOT NULL, + `images` text, + `response` text, + `is_resolved` integer DEFAULT false NOT NULL, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `coupon_applicable_products` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `coupon_id` integer NOT NULL, + `product_id` integer NOT NULL, + FOREIGN KEY (`coupon_id`) REFERENCES `coupons`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`product_id`) REFERENCES `product_info`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE UNIQUE INDEX `unique_coupon_product` ON `coupon_applicable_products` (`coupon_id`,`product_id`);--> statement-breakpoint +CREATE TABLE `coupon_applicable_users` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `coupon_id` integer NOT NULL, + `user_id` integer NOT NULL, + FOREIGN KEY (`coupon_id`) REFERENCES `coupons`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE UNIQUE INDEX `unique_coupon_user` ON `coupon_applicable_users` (`coupon_id`,`user_id`);--> statement-breakpoint +CREATE TABLE `coupon_usage` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `user_id` integer NOT NULL, + `coupon_id` integer NOT NULL, + `order_id` integer, + `order_item_id` integer, + `used_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`coupon_id`) REFERENCES `coupons`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`order_item_id`) REFERENCES `order_items`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `coupons` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `coupon_code` text NOT NULL, + `is_user_based` integer DEFAULT false NOT NULL, + `discount_percent` text, + `flat_discount` text, + `min_order` text, + `product_ids` text, + `created_by` integer, + `max_value` text, + `is_apply_for_all` integer DEFAULT false NOT NULL, + `valid_till` integer, + `max_limit_for_user` integer, + `is_invalidated` integer DEFAULT false NOT NULL, + `exclusive_apply` integer DEFAULT false NOT NULL, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`created_by`) REFERENCES `staff_users`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE UNIQUE INDEX `unique_coupon_code` ON `coupons` (`coupon_code`);--> statement-breakpoint +CREATE TABLE `delivery_slot_info` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `delivery_time` integer NOT NULL, + `freeze_time` integer NOT NULL, + `is_active` integer DEFAULT true NOT NULL, + `is_flash` integer DEFAULT false NOT NULL, + `is_capacity_full` integer DEFAULT false NOT NULL, + `delivery_sequence` text DEFAULT '{}', + `group_ids` text DEFAULT '[]' +); +--> statement-breakpoint +CREATE TABLE `home_banners` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `name` text NOT NULL, + `image_url` text NOT NULL, + `description` text, + `product_ids` text, + `redirect_url` text, + `serial_num` integer, + `is_active` integer DEFAULT false NOT NULL, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + `last_updated` integer DEFAULT (strftime('%s','now')) NOT NULL +); +--> statement-breakpoint +CREATE TABLE `key_val_store` ( + `key` text PRIMARY KEY NOT NULL, + `value` text +); +--> statement-breakpoint +CREATE TABLE `notif_creds` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `token` text NOT NULL, + `added_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + `user_id` integer NOT NULL, + `last_verified` integer, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE UNIQUE INDEX `notif_creds_token_unique` ON `notif_creds` (`token`);--> statement-breakpoint +CREATE TABLE `notifications` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `user_id` integer NOT NULL, + `title` text NOT NULL, + `body` text NOT NULL, + `type` text, + `is_read` integer DEFAULT false NOT NULL, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `order_items` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `order_id` integer NOT NULL, + `product_id` integer NOT NULL, + `quantity` text NOT NULL, + `price` text NOT NULL, + `discounted_price` text, + `is_packaged` integer DEFAULT false NOT NULL, + `is_package_verified` integer DEFAULT false NOT NULL, + FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`product_id`) REFERENCES `product_info`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `order_status` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `order_time` integer DEFAULT (strftime('%s','now')) NOT NULL, + `user_id` integer NOT NULL, + `order_id` integer NOT NULL, + `is_packaged` integer DEFAULT false NOT NULL, + `is_delivered` integer DEFAULT false NOT NULL, + `is_cancelled` integer DEFAULT false NOT NULL, + `cancel_reason` text, + `is_cancelled_by_admin` integer, + `payment_state` text DEFAULT 'pending' NOT NULL, + `cancellation_user_notes` text, + `cancellation_admin_notes` text, + `cancellation_reviewed` integer DEFAULT false NOT NULL, + `cancellation_reviewed_at` integer, + `refund_coupon_id` integer, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`refund_coupon_id`) REFERENCES `coupons`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `orders` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `user_id` integer NOT NULL, + `address_id` integer NOT NULL, + `slot_id` integer, + `is_cod` integer DEFAULT false NOT NULL, + `is_online_payment` integer DEFAULT false NOT NULL, + `payment_info_id` integer, + `total_amount` text NOT NULL, + `delivery_charge` text DEFAULT '0' NOT NULL, + `readable_id` integer NOT NULL, + `admin_notes` text, + `user_notes` text, + `order_group_id` text, + `order_group_proportion` text, + `is_flash_delivery` integer DEFAULT false NOT NULL, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`address_id`) REFERENCES `addresses`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`slot_id`) REFERENCES `delivery_slot_info`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`payment_info_id`) REFERENCES `payment_info`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `payment_info` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `status` text NOT NULL, + `gateway` text NOT NULL, + `order_id` text, + `token` text, + `merchant_order_id` text NOT NULL, + `payload` text +); +--> statement-breakpoint +CREATE UNIQUE INDEX `payment_info_merchant_order_id_unique` ON `payment_info` (`merchant_order_id`);--> statement-breakpoint +CREATE TABLE `payments` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `status` text NOT NULL, + `gateway` text NOT NULL, + `order_id` integer NOT NULL, + `token` text, + `merchant_order_id` text NOT NULL, + `payload` text, + FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE UNIQUE INDEX `payments_merchant_order_id_unique` ON `payments` (`merchant_order_id`);--> statement-breakpoint +CREATE TABLE `product_availability_schedules` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `time` text NOT NULL, + `schedule_name` text NOT NULL, + `action` text NOT NULL, + `product_ids` text DEFAULT '[]' NOT NULL, + `group_ids` text DEFAULT '[]' NOT NULL, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + `last_updated` integer DEFAULT (strftime('%s','now')) NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX `product_availability_schedules_schedule_name_unique` ON `product_availability_schedules` (`schedule_name`);--> statement-breakpoint +CREATE TABLE `product_categories` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `name` text NOT NULL, + `description` text +); +--> statement-breakpoint +CREATE TABLE `product_group_info` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `group_name` text NOT NULL, + `description` text, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL +); +--> statement-breakpoint +CREATE TABLE `product_group_membership` ( + `product_id` integer NOT NULL, + `group_id` integer NOT NULL, + `added_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`product_id`) REFERENCES `product_info`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`group_id`) REFERENCES `product_group_info`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE UNIQUE INDEX `product_group_membership_pk` ON `product_group_membership` (`product_id`,`group_id`);--> statement-breakpoint +CREATE TABLE `product_info` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `name` text NOT NULL, + `short_description` text, + `long_description` text, + `unit_id` integer NOT NULL, + `price` text NOT NULL, + `market_price` text, + `images` text, + `is_out_of_stock` integer DEFAULT false NOT NULL, + `is_suspended` integer DEFAULT false NOT NULL, + `is_flash_available` integer DEFAULT false NOT NULL, + `flash_price` text, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + `increment_step` real DEFAULT 1 NOT NULL, + `product_quantity` real DEFAULT 1 NOT NULL, + `store_id` integer, + `scheduled_availability` integer DEFAULT true NOT NULL, + FOREIGN KEY (`unit_id`) REFERENCES `units`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`store_id`) REFERENCES `store_info`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `product_reviews` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `user_id` integer NOT NULL, + `product_id` integer NOT NULL, + `review_body` text NOT NULL, + `image_urls` text DEFAULT '[]', + `review_time` integer DEFAULT (strftime('%s','now')) NOT NULL, + `ratings` real NOT NULL, + `admin_response` text, + `admin_response_images` text DEFAULT '[]', + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`product_id`) REFERENCES `product_info`(`id`) ON UPDATE no action ON DELETE no action, + CONSTRAINT "rating_check" CHECK("product_reviews"."ratings" >= 1 AND "product_reviews"."ratings" <= 5) +); +--> statement-breakpoint +CREATE TABLE `product_slots` ( + `product_id` integer NOT NULL, + `slot_id` integer NOT NULL, + FOREIGN KEY (`product_id`) REFERENCES `product_info`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`slot_id`) REFERENCES `delivery_slot_info`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE UNIQUE INDEX `product_slot_pk` ON `product_slots` (`product_id`,`slot_id`);--> statement-breakpoint +CREATE TABLE `product_tag_info` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `tag_name` text NOT NULL, + `tag_description` text, + `image_url` text, + `is_dashboard_tag` integer DEFAULT false NOT NULL, + `related_stores` text DEFAULT '[]', + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX `product_tag_info_tag_name_unique` ON `product_tag_info` (`tag_name`);--> statement-breakpoint +CREATE TABLE `product_tags` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `product_id` integer NOT NULL, + `tag_id` integer NOT NULL, + `assigned_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`product_id`) REFERENCES `product_info`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`tag_id`) REFERENCES `product_tag_info`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE UNIQUE INDEX `unique_product_tag` ON `product_tags` (`product_id`,`tag_id`);--> statement-breakpoint +CREATE TABLE `refunds` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `order_id` integer NOT NULL, + `refund_amount` text, + `refund_status` text DEFAULT 'none', + `merchant_refund_id` text, + `refund_processed_at` integer, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `reserved_coupons` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `secret_code` text NOT NULL, + `coupon_code` text NOT NULL, + `discount_percent` text, + `flat_discount` text, + `min_order` text, + `product_ids` text, + `max_value` text, + `valid_till` integer, + `max_limit_for_user` integer, + `exclusive_apply` integer DEFAULT false NOT NULL, + `is_redeemed` integer DEFAULT false NOT NULL, + `redeemed_by` integer, + `redeemed_at` integer, + `created_by` integer NOT NULL, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`redeemed_by`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`created_by`) REFERENCES `staff_users`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE UNIQUE INDEX `reserved_coupons_secret_code_unique` ON `reserved_coupons` (`secret_code`);--> statement-breakpoint +CREATE UNIQUE INDEX `unique_secret_code` ON `reserved_coupons` (`secret_code`);--> statement-breakpoint +CREATE TABLE `special_deals` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `product_id` integer NOT NULL, + `quantity` text NOT NULL, + `price` text NOT NULL, + `valid_till` integer NOT NULL, + FOREIGN KEY (`product_id`) REFERENCES `product_info`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `staff_permissions` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `permission_name` text NOT NULL, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX `unique_permission_name` ON `staff_permissions` (`permission_name`);--> statement-breakpoint +CREATE TABLE `staff_role_permissions` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `staff_role_id` integer NOT NULL, + `staff_permission_id` integer NOT NULL, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`staff_role_id`) REFERENCES `staff_roles`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`staff_permission_id`) REFERENCES `staff_permissions`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE UNIQUE INDEX `unique_role_permission` ON `staff_role_permissions` (`staff_role_id`,`staff_permission_id`);--> statement-breakpoint +CREATE TABLE `staff_roles` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `role_name` text NOT NULL, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX `unique_role_name` ON `staff_roles` (`role_name`);--> statement-breakpoint +CREATE TABLE `staff_users` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `name` text NOT NULL, + `password` text NOT NULL, + `staff_role_id` integer, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`staff_role_id`) REFERENCES `staff_roles`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `store_info` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `name` text NOT NULL, + `description` text, + `image_url` text, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + `owner` integer NOT NULL, + FOREIGN KEY (`owner`) REFERENCES `staff_users`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `units` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `short_notation` text NOT NULL, + `full_name` text NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX `unique_short_notation` ON `units` (`short_notation`);--> statement-breakpoint +CREATE TABLE `unlogged_user_tokens` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `token` text NOT NULL, + `added_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + `last_verified` integer +); +--> statement-breakpoint +CREATE UNIQUE INDEX `unlogged_user_tokens_token_unique` ON `unlogged_user_tokens` (`token`);--> statement-breakpoint +CREATE TABLE `upload_url_status` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + `key` text NOT NULL, + `status` text DEFAULT 'pending' NOT NULL +); +--> statement-breakpoint +CREATE TABLE `user_creds` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `user_id` integer NOT NULL, + `user_password` text NOT NULL, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `user_details` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `user_id` integer NOT NULL, + `bio` text, + `date_of_birth` integer, + `gender` text, + `occupation` text, + `profile_image` text, + `is_suspended` integer DEFAULT false NOT NULL, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + `updated_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE UNIQUE INDEX `user_details_user_id_unique` ON `user_details` (`user_id`);--> statement-breakpoint +CREATE TABLE `user_incidents` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `user_id` integer NOT NULL, + `order_id` integer, + `date_added` integer DEFAULT (strftime('%s','now')) NOT NULL, + `admin_comment` text, + `added_by` integer, + `negativity_score` integer, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`added_by`) REFERENCES `staff_users`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `user_notifications` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `title` text NOT NULL, + `image_url` text, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + `body` text NOT NULL, + `applicable_users` text +); +--> statement-breakpoint +CREATE TABLE `users` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `name` text, + `email` text, + `mobile` text, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX `unique_email` ON `users` (`email`);--> statement-breakpoint +CREATE TABLE `vendor_snippets` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `snippet_code` text NOT NULL, + `slot_id` integer, + `is_permanent` integer DEFAULT false NOT NULL, + `product_ids` text NOT NULL, + `valid_till` integer, + `created_at` integer DEFAULT (strftime('%s','now')) NOT NULL, + FOREIGN KEY (`slot_id`) REFERENCES `delivery_slot_info`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE UNIQUE INDEX `vendor_snippets_snippet_code_unique` ON `vendor_snippets` (`snippet_code`); \ No newline at end of file diff --git a/apps/backend/drizzle/sqlite/meta/0000_snapshot.json b/apps/backend/drizzle/sqlite/meta/0000_snapshot.json new file mode 100644 index 0000000..fc30dbe --- /dev/null +++ b/apps/backend/drizzle/sqlite/meta/0000_snapshot.json @@ -0,0 +1,3574 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "920607a3-a577-410d-8f64-09c06df33a61", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "address_areas": { + "name": "address_areas", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "place_name": { + "name": "place_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "zone_id": { + "name": "zone_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": {}, + "foreignKeys": { + "address_areas_zone_id_address_zones_id_fk": { + "name": "address_areas_zone_id_address_zones_id_fk", + "tableFrom": "address_areas", + "tableTo": "address_zones", + "columnsFrom": [ + "zone_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "address_zones": { + "name": "address_zones", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "zone_name": { + "name": "zone_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "added_at": { + "name": "added_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "addresses": { + "name": "addresses", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "phone": { + "name": "phone", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "address_line1": { + "name": "address_line1", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "address_line2": { + "name": "address_line2", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "city": { + "name": "city", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "state": { + "name": "state", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "pincode": { + "name": "pincode", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_default": { + "name": "is_default", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "latitude": { + "name": "latitude", + "type": "real", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "longitude": { + "name": "longitude", + "type": "real", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "google_maps_url": { + "name": "google_maps_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "admin_latitude": { + "name": "admin_latitude", + "type": "real", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "admin_longitude": { + "name": "admin_longitude", + "type": "real", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "zone_id": { + "name": "zone_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": {}, + "foreignKeys": { + "addresses_user_id_users_id_fk": { + "name": "addresses_user_id_users_id_fk", + "tableFrom": "addresses", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "addresses_zone_id_address_zones_id_fk": { + "name": "addresses_zone_id_address_zones_id_fk", + "tableFrom": "addresses", + "tableTo": "address_zones", + "columnsFrom": [ + "zone_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "cart_items": { + "name": "cart_items", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "added_at": { + "name": "added_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": { + "unique_user_product": { + "name": "unique_user_product", + "columns": [ + "user_id", + "product_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "cart_items_user_id_users_id_fk": { + "name": "cart_items_user_id_users_id_fk", + "tableFrom": "cart_items", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "cart_items_product_id_product_info_id_fk": { + "name": "cart_items_product_id_product_info_id_fk", + "tableFrom": "cart_items", + "tableTo": "product_info", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "complaints": { + "name": "complaints", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "order_id": { + "name": "order_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "complaint_body": { + "name": "complaint_body", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "images": { + "name": "images", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "response": { + "name": "response", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_resolved": { + "name": "is_resolved", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": {}, + "foreignKeys": { + "complaints_user_id_users_id_fk": { + "name": "complaints_user_id_users_id_fk", + "tableFrom": "complaints", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "complaints_order_id_orders_id_fk": { + "name": "complaints_order_id_orders_id_fk", + "tableFrom": "complaints", + "tableTo": "orders", + "columnsFrom": [ + "order_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "coupon_applicable_products": { + "name": "coupon_applicable_products", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "coupon_id": { + "name": "coupon_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "unique_coupon_product": { + "name": "unique_coupon_product", + "columns": [ + "coupon_id", + "product_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "coupon_applicable_products_coupon_id_coupons_id_fk": { + "name": "coupon_applicable_products_coupon_id_coupons_id_fk", + "tableFrom": "coupon_applicable_products", + "tableTo": "coupons", + "columnsFrom": [ + "coupon_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "coupon_applicable_products_product_id_product_info_id_fk": { + "name": "coupon_applicable_products_product_id_product_info_id_fk", + "tableFrom": "coupon_applicable_products", + "tableTo": "product_info", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "coupon_applicable_users": { + "name": "coupon_applicable_users", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "coupon_id": { + "name": "coupon_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "unique_coupon_user": { + "name": "unique_coupon_user", + "columns": [ + "coupon_id", + "user_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "coupon_applicable_users_coupon_id_coupons_id_fk": { + "name": "coupon_applicable_users_coupon_id_coupons_id_fk", + "tableFrom": "coupon_applicable_users", + "tableTo": "coupons", + "columnsFrom": [ + "coupon_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "coupon_applicable_users_user_id_users_id_fk": { + "name": "coupon_applicable_users_user_id_users_id_fk", + "tableFrom": "coupon_applicable_users", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "coupon_usage": { + "name": "coupon_usage", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "coupon_id": { + "name": "coupon_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "order_id": { + "name": "order_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "order_item_id": { + "name": "order_item_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "used_at": { + "name": "used_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": {}, + "foreignKeys": { + "coupon_usage_user_id_users_id_fk": { + "name": "coupon_usage_user_id_users_id_fk", + "tableFrom": "coupon_usage", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "coupon_usage_coupon_id_coupons_id_fk": { + "name": "coupon_usage_coupon_id_coupons_id_fk", + "tableFrom": "coupon_usage", + "tableTo": "coupons", + "columnsFrom": [ + "coupon_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "coupon_usage_order_id_orders_id_fk": { + "name": "coupon_usage_order_id_orders_id_fk", + "tableFrom": "coupon_usage", + "tableTo": "orders", + "columnsFrom": [ + "order_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "coupon_usage_order_item_id_order_items_id_fk": { + "name": "coupon_usage_order_item_id_order_items_id_fk", + "tableFrom": "coupon_usage", + "tableTo": "order_items", + "columnsFrom": [ + "order_item_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "coupons": { + "name": "coupons", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "coupon_code": { + "name": "coupon_code", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_user_based": { + "name": "is_user_based", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "discount_percent": { + "name": "discount_percent", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "flat_discount": { + "name": "flat_discount", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "min_order": { + "name": "min_order", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "product_ids": { + "name": "product_ids", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_by": { + "name": "created_by", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "max_value": { + "name": "max_value", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_apply_for_all": { + "name": "is_apply_for_all", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "valid_till": { + "name": "valid_till", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "max_limit_for_user": { + "name": "max_limit_for_user", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_invalidated": { + "name": "is_invalidated", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "exclusive_apply": { + "name": "exclusive_apply", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": { + "unique_coupon_code": { + "name": "unique_coupon_code", + "columns": [ + "coupon_code" + ], + "isUnique": true + } + }, + "foreignKeys": { + "coupons_created_by_staff_users_id_fk": { + "name": "coupons_created_by_staff_users_id_fk", + "tableFrom": "coupons", + "tableTo": "staff_users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "delivery_slot_info": { + "name": "delivery_slot_info", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "delivery_time": { + "name": "delivery_time", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "freeze_time": { + "name": "freeze_time", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_active": { + "name": "is_active", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "is_flash": { + "name": "is_flash", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "is_capacity_full": { + "name": "is_capacity_full", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "delivery_sequence": { + "name": "delivery_sequence", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'{}'" + }, + "group_ids": { + "name": "group_ids", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'[]'" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "home_banners": { + "name": "home_banners", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image_url": { + "name": "image_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "product_ids": { + "name": "product_ids", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "redirect_url": { + "name": "redirect_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "serial_num": { + "name": "serial_num", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_active": { + "name": "is_active", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + }, + "last_updated": { + "name": "last_updated", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "key_val_store": { + "name": "key_val_store", + "columns": { + "key": { + "name": "key", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "notif_creds": { + "name": "notif_creds", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "added_at": { + "name": "added_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "last_verified": { + "name": "last_verified", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "notif_creds_token_unique": { + "name": "notif_creds_token_unique", + "columns": [ + "token" + ], + "isUnique": true + } + }, + "foreignKeys": { + "notif_creds_user_id_users_id_fk": { + "name": "notif_creds_user_id_users_id_fk", + "tableFrom": "notif_creds", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "notifications": { + "name": "notifications", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "body": { + "name": "body", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_read": { + "name": "is_read", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": {}, + "foreignKeys": { + "notifications_user_id_users_id_fk": { + "name": "notifications_user_id_users_id_fk", + "tableFrom": "notifications", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "order_items": { + "name": "order_items", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "order_id": { + "name": "order_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "price": { + "name": "price", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discounted_price": { + "name": "discounted_price", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_packaged": { + "name": "is_packaged", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "is_package_verified": { + "name": "is_package_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "order_items_order_id_orders_id_fk": { + "name": "order_items_order_id_orders_id_fk", + "tableFrom": "order_items", + "tableTo": "orders", + "columnsFrom": [ + "order_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "order_items_product_id_product_info_id_fk": { + "name": "order_items_product_id_product_info_id_fk", + "tableFrom": "order_items", + "tableTo": "product_info", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "order_status": { + "name": "order_status", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "order_time": { + "name": "order_time", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "order_id": { + "name": "order_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_packaged": { + "name": "is_packaged", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "is_delivered": { + "name": "is_delivered", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "is_cancelled": { + "name": "is_cancelled", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "cancel_reason": { + "name": "cancel_reason", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_cancelled_by_admin": { + "name": "is_cancelled_by_admin", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_state": { + "name": "payment_state", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "cancellation_user_notes": { + "name": "cancellation_user_notes", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cancellation_admin_notes": { + "name": "cancellation_admin_notes", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cancellation_reviewed": { + "name": "cancellation_reviewed", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "cancellation_reviewed_at": { + "name": "cancellation_reviewed_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "refund_coupon_id": { + "name": "refund_coupon_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "order_status_user_id_users_id_fk": { + "name": "order_status_user_id_users_id_fk", + "tableFrom": "order_status", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "order_status_order_id_orders_id_fk": { + "name": "order_status_order_id_orders_id_fk", + "tableFrom": "order_status", + "tableTo": "orders", + "columnsFrom": [ + "order_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "order_status_refund_coupon_id_coupons_id_fk": { + "name": "order_status_refund_coupon_id_coupons_id_fk", + "tableFrom": "order_status", + "tableTo": "coupons", + "columnsFrom": [ + "refund_coupon_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "orders": { + "name": "orders", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "address_id": { + "name": "address_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "slot_id": { + "name": "slot_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_cod": { + "name": "is_cod", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "is_online_payment": { + "name": "is_online_payment", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "payment_info_id": { + "name": "payment_info_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "total_amount": { + "name": "total_amount", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "delivery_charge": { + "name": "delivery_charge", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'0'" + }, + "readable_id": { + "name": "readable_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "admin_notes": { + "name": "admin_notes", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "user_notes": { + "name": "user_notes", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "order_group_id": { + "name": "order_group_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "order_group_proportion": { + "name": "order_group_proportion", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_flash_delivery": { + "name": "is_flash_delivery", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": {}, + "foreignKeys": { + "orders_user_id_users_id_fk": { + "name": "orders_user_id_users_id_fk", + "tableFrom": "orders", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "orders_address_id_addresses_id_fk": { + "name": "orders_address_id_addresses_id_fk", + "tableFrom": "orders", + "tableTo": "addresses", + "columnsFrom": [ + "address_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "orders_slot_id_delivery_slot_info_id_fk": { + "name": "orders_slot_id_delivery_slot_info_id_fk", + "tableFrom": "orders", + "tableTo": "delivery_slot_info", + "columnsFrom": [ + "slot_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "orders_payment_info_id_payment_info_id_fk": { + "name": "orders_payment_info_id_payment_info_id_fk", + "tableFrom": "orders", + "tableTo": "payment_info", + "columnsFrom": [ + "payment_info_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "payment_info": { + "name": "payment_info", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "gateway": { + "name": "gateway", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "order_id": { + "name": "order_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "merchant_order_id": { + "name": "merchant_order_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "payload": { + "name": "payload", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "payment_info_merchant_order_id_unique": { + "name": "payment_info_merchant_order_id_unique", + "columns": [ + "merchant_order_id" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "payments": { + "name": "payments", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "gateway": { + "name": "gateway", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "order_id": { + "name": "order_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "merchant_order_id": { + "name": "merchant_order_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "payload": { + "name": "payload", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "payments_merchant_order_id_unique": { + "name": "payments_merchant_order_id_unique", + "columns": [ + "merchant_order_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "payments_order_id_orders_id_fk": { + "name": "payments_order_id_orders_id_fk", + "tableFrom": "payments", + "tableTo": "orders", + "columnsFrom": [ + "order_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "product_availability_schedules": { + "name": "product_availability_schedules", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "time": { + "name": "time", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "schedule_name": { + "name": "schedule_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "product_ids": { + "name": "product_ids", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'[]'" + }, + "group_ids": { + "name": "group_ids", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'[]'" + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + }, + "last_updated": { + "name": "last_updated", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": { + "product_availability_schedules_schedule_name_unique": { + "name": "product_availability_schedules_schedule_name_unique", + "columns": [ + "schedule_name" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "product_categories": { + "name": "product_categories", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "product_group_info": { + "name": "product_group_info", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "group_name": { + "name": "group_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "product_group_membership": { + "name": "product_group_membership", + "columns": { + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "group_id": { + "name": "group_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "added_at": { + "name": "added_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": { + "product_group_membership_pk": { + "name": "product_group_membership_pk", + "columns": [ + "product_id", + "group_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "product_group_membership_product_id_product_info_id_fk": { + "name": "product_group_membership_product_id_product_info_id_fk", + "tableFrom": "product_group_membership", + "tableTo": "product_info", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "product_group_membership_group_id_product_group_info_id_fk": { + "name": "product_group_membership_group_id_product_group_info_id_fk", + "tableFrom": "product_group_membership", + "tableTo": "product_group_info", + "columnsFrom": [ + "group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "product_info": { + "name": "product_info", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "short_description": { + "name": "short_description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "long_description": { + "name": "long_description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "unit_id": { + "name": "unit_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "price": { + "name": "price", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "market_price": { + "name": "market_price", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "images": { + "name": "images", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_out_of_stock": { + "name": "is_out_of_stock", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "is_suspended": { + "name": "is_suspended", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "is_flash_available": { + "name": "is_flash_available", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "flash_price": { + "name": "flash_price", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + }, + "increment_step": { + "name": "increment_step", + "type": "real", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "product_quantity": { + "name": "product_quantity", + "type": "real", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "store_id": { + "name": "store_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "scheduled_availability": { + "name": "scheduled_availability", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + } + }, + "indexes": {}, + "foreignKeys": { + "product_info_unit_id_units_id_fk": { + "name": "product_info_unit_id_units_id_fk", + "tableFrom": "product_info", + "tableTo": "units", + "columnsFrom": [ + "unit_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "product_info_store_id_store_info_id_fk": { + "name": "product_info_store_id_store_info_id_fk", + "tableFrom": "product_info", + "tableTo": "store_info", + "columnsFrom": [ + "store_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "product_reviews": { + "name": "product_reviews", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "review_body": { + "name": "review_body", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image_urls": { + "name": "image_urls", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'[]'" + }, + "review_time": { + "name": "review_time", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + }, + "ratings": { + "name": "ratings", + "type": "real", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "admin_response": { + "name": "admin_response", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "admin_response_images": { + "name": "admin_response_images", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'[]'" + } + }, + "indexes": {}, + "foreignKeys": { + "product_reviews_user_id_users_id_fk": { + "name": "product_reviews_user_id_users_id_fk", + "tableFrom": "product_reviews", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "product_reviews_product_id_product_info_id_fk": { + "name": "product_reviews_product_id_product_info_id_fk", + "tableFrom": "product_reviews", + "tableTo": "product_info", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": { + "rating_check": { + "name": "rating_check", + "value": "\"product_reviews\".\"ratings\" >= 1 AND \"product_reviews\".\"ratings\" <= 5" + } + } + }, + "product_slots": { + "name": "product_slots", + "columns": { + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "slot_id": { + "name": "slot_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "product_slot_pk": { + "name": "product_slot_pk", + "columns": [ + "product_id", + "slot_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "product_slots_product_id_product_info_id_fk": { + "name": "product_slots_product_id_product_info_id_fk", + "tableFrom": "product_slots", + "tableTo": "product_info", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "product_slots_slot_id_delivery_slot_info_id_fk": { + "name": "product_slots_slot_id_delivery_slot_info_id_fk", + "tableFrom": "product_slots", + "tableTo": "delivery_slot_info", + "columnsFrom": [ + "slot_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "product_tag_info": { + "name": "product_tag_info", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "tag_name": { + "name": "tag_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "tag_description": { + "name": "tag_description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "image_url": { + "name": "image_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_dashboard_tag": { + "name": "is_dashboard_tag", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "related_stores": { + "name": "related_stores", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'[]'" + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": { + "product_tag_info_tag_name_unique": { + "name": "product_tag_info_tag_name_unique", + "columns": [ + "tag_name" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "product_tags": { + "name": "product_tags", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "tag_id": { + "name": "tag_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "assigned_at": { + "name": "assigned_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": { + "unique_product_tag": { + "name": "unique_product_tag", + "columns": [ + "product_id", + "tag_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "product_tags_product_id_product_info_id_fk": { + "name": "product_tags_product_id_product_info_id_fk", + "tableFrom": "product_tags", + "tableTo": "product_info", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "product_tags_tag_id_product_tag_info_id_fk": { + "name": "product_tags_tag_id_product_tag_info_id_fk", + "tableFrom": "product_tags", + "tableTo": "product_tag_info", + "columnsFrom": [ + "tag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "refunds": { + "name": "refunds", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "order_id": { + "name": "order_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "refund_amount": { + "name": "refund_amount", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "refund_status": { + "name": "refund_status", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'none'" + }, + "merchant_refund_id": { + "name": "merchant_refund_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "refund_processed_at": { + "name": "refund_processed_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": {}, + "foreignKeys": { + "refunds_order_id_orders_id_fk": { + "name": "refunds_order_id_orders_id_fk", + "tableFrom": "refunds", + "tableTo": "orders", + "columnsFrom": [ + "order_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "reserved_coupons": { + "name": "reserved_coupons", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "secret_code": { + "name": "secret_code", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "coupon_code": { + "name": "coupon_code", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discount_percent": { + "name": "discount_percent", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "flat_discount": { + "name": "flat_discount", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "min_order": { + "name": "min_order", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "product_ids": { + "name": "product_ids", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "max_value": { + "name": "max_value", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "valid_till": { + "name": "valid_till", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "max_limit_for_user": { + "name": "max_limit_for_user", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "exclusive_apply": { + "name": "exclusive_apply", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "is_redeemed": { + "name": "is_redeemed", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "redeemed_by": { + "name": "redeemed_by", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "redeemed_at": { + "name": "redeemed_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_by": { + "name": "created_by", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": { + "reserved_coupons_secret_code_unique": { + "name": "reserved_coupons_secret_code_unique", + "columns": [ + "secret_code" + ], + "isUnique": true + }, + "unique_secret_code": { + "name": "unique_secret_code", + "columns": [ + "secret_code" + ], + "isUnique": true + } + }, + "foreignKeys": { + "reserved_coupons_redeemed_by_users_id_fk": { + "name": "reserved_coupons_redeemed_by_users_id_fk", + "tableFrom": "reserved_coupons", + "tableTo": "users", + "columnsFrom": [ + "redeemed_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "reserved_coupons_created_by_staff_users_id_fk": { + "name": "reserved_coupons_created_by_staff_users_id_fk", + "tableFrom": "reserved_coupons", + "tableTo": "staff_users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "special_deals": { + "name": "special_deals", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "product_id": { + "name": "product_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "price": { + "name": "price", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "valid_till": { + "name": "valid_till", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "special_deals_product_id_product_info_id_fk": { + "name": "special_deals_product_id_product_info_id_fk", + "tableFrom": "special_deals", + "tableTo": "product_info", + "columnsFrom": [ + "product_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "staff_permissions": { + "name": "staff_permissions", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "permission_name": { + "name": "permission_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": { + "unique_permission_name": { + "name": "unique_permission_name", + "columns": [ + "permission_name" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "staff_role_permissions": { + "name": "staff_role_permissions", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "staff_role_id": { + "name": "staff_role_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "staff_permission_id": { + "name": "staff_permission_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": { + "unique_role_permission": { + "name": "unique_role_permission", + "columns": [ + "staff_role_id", + "staff_permission_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "staff_role_permissions_staff_role_id_staff_roles_id_fk": { + "name": "staff_role_permissions_staff_role_id_staff_roles_id_fk", + "tableFrom": "staff_role_permissions", + "tableTo": "staff_roles", + "columnsFrom": [ + "staff_role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "staff_role_permissions_staff_permission_id_staff_permissions_id_fk": { + "name": "staff_role_permissions_staff_permission_id_staff_permissions_id_fk", + "tableFrom": "staff_role_permissions", + "tableTo": "staff_permissions", + "columnsFrom": [ + "staff_permission_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "staff_roles": { + "name": "staff_roles", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "role_name": { + "name": "role_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": { + "unique_role_name": { + "name": "unique_role_name", + "columns": [ + "role_name" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "staff_users": { + "name": "staff_users", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "staff_role_id": { + "name": "staff_role_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": {}, + "foreignKeys": { + "staff_users_staff_role_id_staff_roles_id_fk": { + "name": "staff_users_staff_role_id_staff_roles_id_fk", + "tableFrom": "staff_users", + "tableTo": "staff_roles", + "columnsFrom": [ + "staff_role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "store_info": { + "name": "store_info", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "image_url": { + "name": "image_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + }, + "owner": { + "name": "owner", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "store_info_owner_staff_users_id_fk": { + "name": "store_info_owner_staff_users_id_fk", + "tableFrom": "store_info", + "tableTo": "staff_users", + "columnsFrom": [ + "owner" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "units": { + "name": "units", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "short_notation": { + "name": "short_notation", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "full_name": { + "name": "full_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "unique_short_notation": { + "name": "unique_short_notation", + "columns": [ + "short_notation" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "unlogged_user_tokens": { + "name": "unlogged_user_tokens", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "added_at": { + "name": "added_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + }, + "last_verified": { + "name": "last_verified", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "unlogged_user_tokens_token_unique": { + "name": "unlogged_user_tokens_token_unique", + "columns": [ + "token" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "upload_url_status": { + "name": "upload_url_status", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user_creds": { + "name": "user_creds", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_password": { + "name": "user_password", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": {}, + "foreignKeys": { + "user_creds_user_id_users_id_fk": { + "name": "user_creds_user_id_users_id_fk", + "tableFrom": "user_creds", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user_details": { + "name": "user_details", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "date_of_birth": { + "name": "date_of_birth", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "gender": { + "name": "gender", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "occupation": { + "name": "occupation", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "profile_image": { + "name": "profile_image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_suspended": { + "name": "is_suspended", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": { + "user_details_user_id_unique": { + "name": "user_details_user_id_unique", + "columns": [ + "user_id" + ], + "isUnique": true + } + }, + "foreignKeys": { + "user_details_user_id_users_id_fk": { + "name": "user_details_user_id_users_id_fk", + "tableFrom": "user_details", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user_incidents": { + "name": "user_incidents", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "order_id": { + "name": "order_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "date_added": { + "name": "date_added", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + }, + "admin_comment": { + "name": "admin_comment", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "added_by": { + "name": "added_by", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "negativity_score": { + "name": "negativity_score", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_incidents_user_id_users_id_fk": { + "name": "user_incidents_user_id_users_id_fk", + "tableFrom": "user_incidents", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "user_incidents_order_id_orders_id_fk": { + "name": "user_incidents_order_id_orders_id_fk", + "tableFrom": "user_incidents", + "tableTo": "orders", + "columnsFrom": [ + "order_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "user_incidents_added_by_staff_users_id_fk": { + "name": "user_incidents_added_by_staff_users_id_fk", + "tableFrom": "user_incidents", + "tableTo": "staff_users", + "columnsFrom": [ + "added_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user_notifications": { + "name": "user_notifications", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image_url": { + "name": "image_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + }, + "body": { + "name": "body", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "applicable_users": { + "name": "applicable_users", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "mobile": { + "name": "mobile", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": { + "unique_email": { + "name": "unique_email", + "columns": [ + "email" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "vendor_snippets": { + "name": "vendor_snippets", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "snippet_code": { + "name": "snippet_code", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "slot_id": { + "name": "slot_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_permanent": { + "name": "is_permanent", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "product_ids": { + "name": "product_ids", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "valid_till": { + "name": "valid_till", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%s','now'))" + } + }, + "indexes": { + "vendor_snippets_snippet_code_unique": { + "name": "vendor_snippets_snippet_code_unique", + "columns": [ + "snippet_code" + ], + "isUnique": true + } + }, + "foreignKeys": { + "vendor_snippets_slot_id_delivery_slot_info_id_fk": { + "name": "vendor_snippets_slot_id_delivery_slot_info_id_fk", + "tableFrom": "vendor_snippets", + "tableTo": "delivery_slot_info", + "columnsFrom": [ + "slot_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/apps/backend/drizzle/sqlite/meta/_journal.json b/apps/backend/drizzle/sqlite/meta/_journal.json new file mode 100644 index 0000000..643111f --- /dev/null +++ b/apps/backend/drizzle/sqlite/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "6", + "when": 1774244805277, + "tag": "0000_goofy_oracle", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/apps/backend/index-express.ts b/apps/backend/index-express.ts new file mode 100755 index 0000000..230e6fc --- /dev/null +++ b/apps/backend/index-express.ts @@ -0,0 +1,189 @@ +import 'dotenv/config'; +import express, { NextFunction, Request, Response } from "express"; +import cors from "cors"; +// import bodyParser from "body-parser"; +import path from "path"; +import fs from "fs"; +import { db } from '@/src/db/db_index'; +import { staffUsers, userDetails } from '@/src/db/schema'; +import { eq } from 'drizzle-orm'; +import mainRouter from '@/src/main-router'; +import initFunc from '@/src/lib/init'; +import { createExpressMiddleware } from '@trpc/server/adapters/express'; +import { appRouter } from '@/src/trpc/router'; +import { TRPCError } from '@trpc/server'; +import signedUrlCache from '@/src/lib/signed-url-cache'; +import { seed } from '@/src/db/seed'; +import '@/src/jobs/jobs-index'; +import { startAutomatedJobs } from '@/src/lib/automatedJobs'; +import { verifyToken, UserJWTPayload, StaffJWTPayload } from '@/src/lib/jwt-utils'; + +seed() +initFunc() +startAutomatedJobs() + +const app = express(); + +app.use(cors({ + origin: 'http://localhost:5174' +})); + + +signedUrlCache.loadFromDisk(); + +app.use(express.json()); +app.use(express.urlencoded({ extended: true })); + +// Middleware to log all request URLs +app.use((req, res, next) => { + const timestamp = new Date().toISOString(); + console.log(`[${timestamp}] ${req.method} ${req.url}`); + next(); +}); + +//cors middleware +export function corsMiddleware(req: Request, res: Response, next: NextFunction) { + // Allow requests from any origin (for production, replace * with your domain) + res.header('Access-Control-Allow-Origin', '*'); + + // Allow specific headers clients can send + res.header( + 'Access-Control-Allow-Headers', + 'Origin, X-Requested-With, Content-Type, Accept, Authorization' + ); + + // Allow specific HTTP methods + res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS'); + + // Allow credentials if needed (optional) + // res.header('Access-Control-Allow-Credentials', 'true'); + + // Handle preflight (OPTIONS) requests quickly + if (req.method === 'OPTIONS') { + return res.sendStatus(204); + } + + next(); +} + + +app.use('/api/trpc', createExpressMiddleware({ + router: appRouter, + createContext: async ({ req, res }) => { + let user = null; + let staffUser = null; + const authHeader = req.headers.authorization; + + if (authHeader?.startsWith('Bearer ')) { + const token = authHeader.substring(7); + try { + const decoded = await verifyToken(token); + + // Check if this is a staff token (has staffId) + if ('staffId' in decoded) { + const staffPayload = decoded as StaffJWTPayload; + // This is a staff token, verify staff exists + const staff = await db.query.staffUsers.findFirst({ + where: eq(staffUsers.id, staffPayload.staffId), + }); + + if (staff) { + staffUser = { + id: staff.id, + name: staff.name, + }; + } + } else { + const userPayload = decoded as UserJWTPayload; + // This is a regular user token + user = { + userId: userPayload.userId, + name: userPayload.name, + email: userPayload.email, + mobile: userPayload.mobile, + }; + + // Check if user is suspended + const details = await db.query.userDetails.findFirst({ + where: eq(userDetails.userId, userPayload.userId), + }); + + if (details?.isSuspended) { + throw new TRPCError({ + code: 'FORBIDDEN', + message: 'Account suspended', + }); + } + } + } catch (err) { + // Invalid token, both user and staffUser remain null + } + } + return { req, res, user, staffUser }; + }, + onError({ error, path, type, ctx }) { + console.error('🚨 tRPC Error :', { + path, + type, + code: error.code, + message: error.message, + userId: ctx?.user?.userId, + stack: error.stack, + }); +}, +})); + +app.use('/api', mainRouter) + +const fallbackUiDirCandidates = [ + path.resolve(__dirname, '../fallback-ui/dist'), + path.resolve(__dirname, '../../fallback-ui/dist'), + path.resolve(process.cwd(), '../fallback-ui/dist'), + path.resolve(process.cwd(), './apps/fallback-ui/dist') +] + +const fallbackUiDir = + fallbackUiDirCandidates.find((candidate) => fs.existsSync(candidate)) ?? + fallbackUiDirCandidates[0] + + +const fallbackUiIndex = path.join(fallbackUiDir, 'index.html') +// const fallbackUiMountPath = '/admin-web' +const fallbackUiMountPath = '/'; + +if (fs.existsSync(fallbackUiIndex)) { + app.use(fallbackUiMountPath, express.static(fallbackUiDir)) + app.use('/mf'+fallbackUiMountPath, express.static(fallbackUiDir)) + const fallbackUiRegex = new RegExp( + `^${fallbackUiMountPath.replace(/\//g, '\\/')}(?:\\/.*)?$` + ) + app.get([fallbackUiMountPath, fallbackUiRegex], (req, res) => { + res.sendFile(fallbackUiIndex) + }) + app.get(/.*/, (req,res) => { + res.sendFile(fallbackUiIndex) + }) +} else { + console.warn(`Fallback UI build not found at ${fallbackUiIndex}`) +} + +// Serve /assets/public folder at /assets route +const assetsPublicDir = path.resolve(__dirname, './assets/public'); +if (fs.existsSync(assetsPublicDir)) { + app.use('/assets', express.static(assetsPublicDir)); + console.log('Serving /assets from', assetsPublicDir); +} else { + console.warn('Assets public folder not found at', assetsPublicDir); +} + +// Global error handler +app.use((err: any, req: express.Request, res: express.Response, next: express.NextFunction) => { + console.error(err); + const status = err.statusCode || err.status || 500; + const message = err.message || 'Internal Server Error'; + res.status(status).json({ message }); +}); + +app.listen(4000, () => { + console.log("Server is running on http://localhost:4000/api/mobile/"); +}); diff --git a/apps/backend/index.ts b/apps/backend/index.ts old mode 100755 new mode 100644 index c65e105..390aef7 --- a/apps/backend/index.ts +++ b/apps/backend/index.ts @@ -1,185 +1,167 @@ -import 'dotenv/config'; -import express, { NextFunction, Request, Response } from "express"; -import cors from "cors"; -// import bodyParser from "body-parser"; -import multer from "multer"; -import path from "path"; -import fs from "fs"; -import { db } from '@/src/db/db_index'; -import { staffUsers, userDetails } from '@/src/db/schema'; -import { eq } from 'drizzle-orm'; -import mainRouter from '@/src/main-router'; -import initFunc from '@/src/lib/init'; -import { createExpressMiddleware } from '@trpc/server/adapters/express'; -import { appRouter } from '@/src/trpc/router'; -import { TRPCError } from '@trpc/server'; -import jwt from 'jsonwebtoken' -import signedUrlCache from '@/src/lib/signed-url-cache'; -import { seed } from '@/src/db/seed'; -import '@/src/jobs/jobs-index'; -import { startAutomatedJobs } from '@/src/lib/automatedJobs'; +import { Hono } from 'hono' +import { cors } from 'hono/cors' +import { logger } from 'hono/logger' +import { serve } from 'bun' +import { fetchRequestHandler } from '@trpc/server/adapters/fetch' +import { appRouter } from '@/src/trpc/router' +import { verifyToken, UserJWTPayload, StaffJWTPayload } from '@/src/lib/jwt-utils' +import { db } from '@/src/db/db_index' +import { staffUsers, userDetails } from '@/src/db/schema' +import { eq } from 'drizzle-orm' +import { TRPCError } from '@trpc/server' +import signedUrlCache from '@/src/lib/signed-url-cache' +import { seed } from '@/src/db/seed' +import initFunc from '@/src/lib/init' +import '@/src/jobs/jobs-index' +import { startAutomatedJobs } from '@/src/lib/automatedJobs' +// Initialize seed() initFunc() startAutomatedJobs() -const app = express(); +const app = new Hono() -app.use(cors({ - origin: 'http://localhost:5174' -})); +// CORS middleware +app.use('*', cors({ + origin: ['http://localhost:5174', 'http://localhost:5173'], + allowMethods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], + allowHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'Authorization'], + credentials: true +})) +// Request logging +app.use('*', logger()) -signedUrlCache.loadFromDisk(); +// Health check +app.get('/health', (c) => { + return c.json({ + status: 'OK', + timestamp: new Date().toISOString(), + uptime: process.uptime(), + message: 'Hello world' + }) +}) -app.use(express.json()); -app.use(express.urlencoded({ extended: true })); - -// Middleware to log all request URLs -app.use((req, res, next) => { - const timestamp = new Date().toISOString(); - console.log(`[${timestamp}] ${req.method} ${req.url}`); - next(); -}); - -//cors middleware -export function corsMiddleware(req: Request, res: Response, next: NextFunction) { - // Allow requests from any origin (for production, replace * with your domain) - res.header('Access-Control-Allow-Origin', '*'); - - // Allow specific headers clients can send - res.header( - 'Access-Control-Allow-Headers', - 'Origin, X-Requested-With, Content-Type, Accept, Authorization' - ); - - // Allow specific HTTP methods - res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS'); - - // Allow credentials if needed (optional) - // res.header('Access-Control-Allow-Credentials', 'true'); - - // Handle preflight (OPTIONS) requests quickly - if (req.method === 'OPTIONS') { - return res.sendStatus(204); - } - - next(); -} - - -app.use('/api/trpc', createExpressMiddleware({ - router: appRouter, - createContext: async ({ req, res }) => { - let user = null; - let staffUser = null; - const authHeader = req.headers.authorization; - - if (authHeader?.startsWith('Bearer ')) { - const token = authHeader.substring(7); - try { - const decoded = jwt.verify(token, process.env.JWT_SECRET || 'your-secret-key') as any; - - // Check if this is a staff token (has staffId) - if (decoded.staffId) { - // This is a staff token, verify staff exists - const staff = await db.query.staffUsers.findFirst({ - where: eq(staffUsers.id, decoded.staffId), - }); - - if (staff) { - user=staffUser - staffUser = { - id: staff.id, - name: staff.name, - }; - } - } else { +// tRPC handler with context +app.use('/api/trpc/*', async (c) => { + const response = await fetchRequestHandler({ + endpoint: '/api/trpc', + req: c.req.raw, + router: appRouter, + createContext: async ({ req }) => { + let user = null + let staffUser = null + const authHeader = req.headers.get('authorization') + + if (authHeader?.startsWith('Bearer ')) { + const token = authHeader.substring(7) + try { + const decoded = await verifyToken(token) - // This is a regular user token - user = decoded; - - // Check if user is suspended - const details = await db.query.userDetails.findFirst({ - where: eq(userDetails.userId, user.userId), - }); - - if (details?.isSuspended) { - throw new TRPCError({ - code: 'FORBIDDEN', - message: 'Account suspended', - }); + if ('staffId' in decoded) { + const staffPayload = decoded as StaffJWTPayload + const staff = await db.query.staffUsers.findFirst({ + where: eq(staffUsers.id, staffPayload.staffId) + }) + if (staff) { + staffUser = { id: staff.id, name: staff.name } + } + } else { + const userPayload = decoded as UserJWTPayload + user = { + userId: userPayload.userId, + name: userPayload.name, + email: userPayload.email, + mobile: userPayload.mobile + } + + const details = await db.query.userDetails.findFirst({ + where: eq(userDetails.userId, userPayload.userId) + }) + + if (details?.isSuspended) { + throw new TRPCError({ + code: 'FORBIDDEN', + message: 'Account suspended' + }) + } } + } catch { + // Invalid token } - } catch (err) { - // Invalid token, both user and staffUser remain null } + + return { req, res: c.res, user, staffUser } + }, + onError: ({ error, path, ctx }) => { + console.error('🚨 tRPC Error:', { + path, + code: error.code, + message: error.message, + userId: ctx?.user?.userId + }) } - return { req, res, user, staffUser }; - }, - onError({ error, path, type, ctx }) { - console.error('🚨 tRPC Error :', { - path, - type, - code: error.code, - message: error.message, - userId: ctx?.user?.userId, - stack: error.stack, - }); -}, -})); - -app.use('/api', mainRouter) - -const fallbackUiDirCandidates = [ - path.resolve(__dirname, '../fallback-ui/dist'), - path.resolve(__dirname, '../../fallback-ui/dist'), - path.resolve(process.cwd(), '../fallback-ui/dist'), - path.resolve(process.cwd(), './apps/fallback-ui/dist') -] - -const fallbackUiDir = - fallbackUiDirCandidates.find((candidate) => fs.existsSync(candidate)) ?? - fallbackUiDirCandidates[0] - - -const fallbackUiIndex = path.join(fallbackUiDir, 'index.html') -// const fallbackUiMountPath = '/admin-web' -const fallbackUiMountPath = '/'; - -if (fs.existsSync(fallbackUiIndex)) { - app.use(fallbackUiMountPath, express.static(fallbackUiDir)) - app.use('/mf'+fallbackUiMountPath, express.static(fallbackUiDir)) - const fallbackUiRegex = new RegExp( - `^${fallbackUiMountPath.replace(/\//g, '\\/')}(?:\\/.*)?$` - ) - app.get([fallbackUiMountPath, fallbackUiRegex], (req, res) => { - res.sendFile(fallbackUiIndex) }) - app.get(/.*/, (req,res) => { - res.sendFile(fallbackUiIndex) - }) -} else { - console.warn(`Fallback UI build not found at ${fallbackUiIndex}`) -} + + return response +}) -// Serve /assets/public folder at /assets route -const assetsPublicDir = path.resolve(__dirname, './assets/public'); -if (fs.existsSync(assetsPublicDir)) { - app.use('/assets', express.static(assetsPublicDir)); - console.log('Serving /assets from', assetsPublicDir); -} else { - console.warn('Assets public folder not found at', assetsPublicDir); -} +// Static files - Fallback UI +app.use('/*', async (c) => { + const url = new URL(c.req.url) + let filePath = url.pathname + + // Default to index.html for root + if (filePath === '/') { + filePath = '/index.html' + } + + // Try to serve the file + const file = Bun.file(`./fallback-ui/dist${filePath}`) + if (await file.exists()) { + return new Response(file) + } + + // SPA fallback - serve index.html for any unmatched routes + const indexFile = Bun.file('./fallback-ui/dist/index.html') + if (await indexFile.exists()) { + return new Response(indexFile) + } + + return c.notFound() +}) + +// Static files - Assets +app.use('/assets/*', async (c) => { + const path = c.req.path.replace('/assets/', '') + const file = Bun.file(`./assets/public/${path}`) + + if (await file.exists()) { + return new Response(file) + } + + return c.notFound() +}) // Global error handler -app.use((err: any, req: express.Request, res: express.Response, next: express.NextFunction) => { - console.error(err); - const status = err.statusCode || err.status || 500; - const message = err.message || 'Internal Server Error'; - res.status(status).json({ message }); -}); +app.onError((err, c) => { + console.error('Error:', err) + + const status = err instanceof TRPCError + ? (err.code === 'UNAUTHORIZED' ? 401 : 500) + : 500 + + const message = err.message || 'Internal Server Error' + + return c.json({ message }, status) +}) -app.listen(4000, '::', () => { - console.log("Server is running on http://localhost:4000/api/mobile/"); -}); +// Start server +serve({ + fetch: app.fetch, + port: 4000, + hostname: '0.0.0.0' +}) + +console.log('🚀 Server running on http://localhost:4000') diff --git a/apps/backend/package.json b/apps/backend/package.json index 7d2e490..fdc95fa 100755 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -4,14 +4,21 @@ "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "migrate": "drizzle-kit generate:pg", + "migrate": "drizzle-kit generate --config ../db-helper-postgres/drizzle.config.ts", + "migrate:pg": "drizzle-kit generate --config ../db-helper-postgres/drizzle.config.ts", + "migrate:sqlite": "drizzle-kit generate --config ../db-helper-sqlite/drizzle.config.ts", + "generate:pg": "bunx drizzle-kit generate --config ../db-helper-postgres/drizzle.config.ts", + "generate:sqlite": "bunx drizzle-kit generate --config ../db-helper-sqlite/drizzle.config.ts", "build": "rimraf ./dist && tsc --project tsconfig.json && tsc-alias -p tsconfig.json", "build2": "rimraf ./dist && tsc", - "db:push": "drizzle-kit push:pg", + "db:push": "drizzle-kit push --config ../db-helper-postgres/drizzle.config.ts", + "db:push:pg": "drizzle-kit push --config ../db-helper-postgres/drizzle.config.ts", + "db:push:sqlite": "drizzle-kit push --config ../db-helper-sqlite/drizzle.config.ts", "db:seed": "tsx src/db/seed.ts", - "dev2": "tsx watch index.ts", - "dev_node": "tsx watch index.ts", + "dev:express": "bun --watch index-express.ts", + "dev:hono": "bun --watch index.ts", "dev": "bun --watch index.ts", + "start": "bun index.ts", "docker:build": "cd .. && docker buildx build --platform linux/amd64 -t mohdshafiuddin54/health_petal:latest --progress=plain -f backend/Dockerfile .", "docker:push": "docker push mohdshafiuddin54/health_petal:latest" }, @@ -26,8 +33,6 @@ "@turf/turf": "^7.2.0", "@types/bcryptjs": "^2.4.6", "@types/cors": "^2.8.19", - "@types/jsonwebtoken": "^9.0.10", - "@types/multer": "^2.0.0", "axios": "^1.11.0", "bcryptjs": "^3.0.2", "bullmq": "^5.63.0", @@ -36,18 +41,16 @@ "dotenv": "^17.2.1", "drizzle-orm": "^0.44.5", "expo-server-sdk": "^4.0.0", - "express": "^5.1.0", "fuse.js": "^7.1.0", - "jsonwebtoken": "^9.0.2", - "multer": "^2.0.2", + "hono": "^4.6.3", + "jose": "^5.10.0", "node-cron": "^4.2.1", "pg": "^8.16.3", - "razorpay": "^2.9.6", "redis": "^5.9.0", "zod": "^4.1.12" }, "devDependencies": { - "@types/express": "^5.0.3", + "@types/bun": "^1.1.10", "@types/node": "^24.5.2", "@types/pg": "^8.15.5", "drizzle-kit": "^0.31.4", diff --git a/apps/backend/sqlite.db b/apps/backend/sqlite.db new file mode 100644 index 0000000..20e8c51 Binary files /dev/null and b/apps/backend/sqlite.db differ diff --git a/apps/backend/src/apis/admin-apis/apis/av-router.ts b/apps/backend/src/apis/admin-apis/apis/av-router.ts deleted file mode 100755 index 732e56f..0000000 --- a/apps/backend/src/apis/admin-apis/apis/av-router.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Router } from "express"; -import { authenticateStaff } from "@/src/middleware/staff-auth"; -import productRouter from "@/src/apis/admin-apis/apis/product.router" -import tagRouter from "@/src/apis/admin-apis/apis/tag.router" - -const router = Router(); - -// Apply staff authentication to all admin routes -router.use(authenticateStaff); - -// Product routes -router.use("/products", productRouter); - -// Tag routes -router.use("/product-tags", tagRouter); - -const avRouter = router; - -export default avRouter; \ No newline at end of file diff --git a/apps/backend/src/apis/admin-apis/apis/product-tags.controller.ts b/apps/backend/src/apis/admin-apis/apis/product-tags.controller.ts deleted file mode 100644 index 7b6a4fe..0000000 --- a/apps/backend/src/apis/admin-apis/apis/product-tags.controller.ts +++ /dev/null @@ -1,222 +0,0 @@ -import { Request, Response } from "express"; -import { db } from "@/src/db/db_index"; -import { productTagInfo } from "@/src/db/schema"; -import { eq } from "drizzle-orm"; -import { ApiError } from "@/src/lib/api-error"; -import { imageUploadS3, generateSignedUrlFromS3Url } from "@/src/lib/s3-client"; -import { deleteS3Image } from "@/src/lib/delete-image"; -import { initializeAllStores } from '@/src/stores/store-initializer'; - -/** - * Create a new product tag - */ -export const createTag = async (req: Request, res: Response) => { - const { tagName, tagDescription, isDashboardTag, relatedStores } = req.body; - - if (!tagName) { - throw new ApiError("Tag name is required", 400); - } - - // Check for duplicate tag name - const existingTag = await db.query.productTagInfo.findFirst({ - where: eq(productTagInfo.tagName, tagName.trim()), - }); - - if (existingTag) { - throw new ApiError("A tag with this name already exists", 400); - } - - let imageUrl: string | null = null; - - // Handle image upload if file is provided - if (req.file) { - const key = `tags/${Date.now()}-${req.file.originalname}`; - imageUrl = await imageUploadS3(req.file.buffer, req.file.mimetype, key); - } - - // Parse relatedStores if it's a string (from FormData) - let parsedRelatedStores: number[] = []; - if (relatedStores) { - try { - parsedRelatedStores = typeof relatedStores === 'string' - ? JSON.parse(relatedStores) - : relatedStores; - } catch (e) { - parsedRelatedStores = []; - } - } - - const [newTag] = await db - .insert(productTagInfo) - .values({ - tagName: tagName.trim(), - tagDescription, - imageUrl, - isDashboardTag: isDashboardTag || false, - relatedStores: parsedRelatedStores, - }) - .returning(); - - // Reinitialize stores to reflect changes in cache - await initializeAllStores(); - - return res.status(201).json({ - tag: newTag, - message: "Tag created successfully", - }); -}; - -/** - * Get all product tags - */ -export const getAllTags = async (req: Request, res: Response) => { - const tags = await db - .select() - .from(productTagInfo) - .orderBy(productTagInfo.tagName); - - // Generate signed URLs for tag images - const tagsWithSignedUrls = await Promise.all( - tags.map(async (tag) => ({ - ...tag, - imageUrl: tag.imageUrl ? await generateSignedUrlFromS3Url(tag.imageUrl) : null, - })) - ); - - return res.status(200).json({ - tags: tagsWithSignedUrls, - message: "Tags retrieved successfully", - }); -}; - -/** - * Get a single product tag by ID - */ -export const getTagById = async (req: Request, res: Response) => { - const { id } = req.params; - - const tag = await db.query.productTagInfo.findFirst({ - where: eq(productTagInfo.id, parseInt(id)), - }); - - if (!tag) { - throw new ApiError("Tag not found", 404); - } - - // Generate signed URL for tag image - const tagWithSignedUrl = { - ...tag, - imageUrl: tag.imageUrl ? await generateSignedUrlFromS3Url(tag.imageUrl) : null, - }; - - return res.status(200).json({ - tag: tagWithSignedUrl, - message: "Tag retrieved successfully", - }); -}; - -/** - * Update a product tag - */ -export const updateTag = async (req: Request, res: Response) => { - const { id } = req.params; - const { tagName, tagDescription, isDashboardTag, relatedStores } = req.body; - - // Get the current tag to check for existing image - const currentTag = await db.query.productTagInfo.findFirst({ - where: eq(productTagInfo.id, parseInt(id)), - }); - - if (!currentTag) { - throw new ApiError("Tag not found", 404); - } - - let imageUrl = currentTag.imageUrl; - - // Handle image upload if new file is provided - if (req.file) { - // Delete old image if it exists - if (currentTag.imageUrl) { - try { - await deleteS3Image(currentTag.imageUrl); - } catch (error) { - console.error("Failed to delete old image:", error); - // Continue with update even if delete fails - } - } - - - // Upload new image - const key = `tags/${Date.now()}-${req.file.originalname}`; - console.log('file', key) - imageUrl = await imageUploadS3(req.file.buffer, req.file.mimetype, key); - } - - // Parse relatedStores if it's a string (from FormData) - let parsedRelatedStores: number[] | undefined; - if (relatedStores !== undefined) { - try { - parsedRelatedStores = typeof relatedStores === 'string' - ? JSON.parse(relatedStores) - : relatedStores; - } catch (e) { - parsedRelatedStores = []; - } - } - - const [updatedTag] = await db - .update(productTagInfo) - .set({ - tagName: tagName?.trim(), - tagDescription, - imageUrl, - isDashboardTag, - relatedStores: parsedRelatedStores, - }) - .where(eq(productTagInfo.id, parseInt(id))) - .returning(); - - // Reinitialize stores to reflect changes in cache - await initializeAllStores(); - - return res.status(200).json({ - tag: updatedTag, - message: "Tag updated successfully", - }); -}; - -/** - * Delete a product tag - */ -export const deleteTag = async (req: Request, res: Response) => { - const { id } = req.params; - - // Check if tag exists - const tag = await db.query.productTagInfo.findFirst({ - where: eq(productTagInfo.id, parseInt(id)), - }); - - if (!tag) { - throw new ApiError("Tag not found", 404); - } - - // Delete image from S3 if it exists - if (tag.imageUrl) { - try { - await deleteS3Image(tag.imageUrl); - } catch (error) { - console.error("Failed to delete image from S3:", error); - // Continue with deletion even if image delete fails - } - } - - // Note: This will fail if tag is still assigned to products due to foreign key constraint - await db.delete(productTagInfo).where(eq(productTagInfo.id, parseInt(id))); - - // Reinitialize stores to reflect changes in cache - await initializeAllStores(); - - return res.status(200).json({ - message: "Tag deleted successfully", - }); -}; \ No newline at end of file diff --git a/apps/backend/src/apis/admin-apis/apis/product.controller.ts b/apps/backend/src/apis/admin-apis/apis/product.controller.ts deleted file mode 100644 index dcd3471..0000000 --- a/apps/backend/src/apis/admin-apis/apis/product.controller.ts +++ /dev/null @@ -1,303 +0,0 @@ -import { Request, Response } from "express"; -import { db } from "@/src/db/db_index"; -import { productInfo, units, specialDeals, productTags } from "@/src/db/schema"; -import { eq, inArray } from "drizzle-orm"; -import { ApiError } from "@/src/lib/api-error"; -import { imageUploadS3, getOriginalUrlFromSignedUrl } from "@/src/lib/s3-client"; -import { deleteS3Image } from "@/src/lib/delete-image"; -import type { SpecialDeal } from "@/src/db/types"; -import { initializeAllStores } from '@/src/stores/store-initializer'; - -type CreateDeal = { - quantity: number; - price: number; - validTill: string; -}; - -/** - * Create a new product - */ -export const createProduct = async (req: Request, res: Response) => { - const { name, shortDescription, longDescription, unitId, storeId, price, marketPrice, incrementStep, productQuantity, isSuspended, isFlashAvailable, flashPrice, deals, tagIds } = req.body; - - // Validate required fields - if (!name || !unitId || !storeId || !price) { - throw new ApiError("Name, unitId, storeId, and price are required", 400); - } - - // Check for duplicate name - const existingProduct = await db.query.productInfo.findFirst({ - where: eq(productInfo.name, name.trim()), - }); - - if (existingProduct) { - throw new ApiError("A product with this name already exists", 400); - } - - // Check if unit exists - const unit = await db.query.units.findFirst({ - where: eq(units.id, unitId), - }); - - if (!unit) { - throw new ApiError("Invalid unit ID", 400); - } - - // Extract images from req.files - const images = (req.files as Express.Multer.File[])?.filter(item => item.fieldname === 'images'); - let uploadedImageUrls: string[] = []; - - if (images && Array.isArray(images)) { - const imageUploadPromises = images.map((file, index) => { - const key = `product-images/${Date.now()}-${index}`; - return imageUploadS3(file.buffer, file.mimetype, key); - }); - - uploadedImageUrls = await Promise.all(imageUploadPromises); - } - - // Create product - const productData: any = { - name, - shortDescription, - longDescription, - unitId, - storeId, - price, - marketPrice, - incrementStep: incrementStep || 1, - productQuantity: productQuantity || 1, - isSuspended: isSuspended || false, - isFlashAvailable: isFlashAvailable || false, - images: uploadedImageUrls, - }; - - if (flashPrice) { - productData.flashPrice = parseFloat(flashPrice); - } - - const [newProduct] = await db - .insert(productInfo) - .values(productData) - .returning(); - - // Handle deals if provided - let createdDeals: SpecialDeal[] = []; - if (deals && Array.isArray(deals)) { - const dealInserts = deals.map((deal: CreateDeal) => ({ - productId: newProduct.id, - quantity: deal.quantity.toString(), - price: deal.price.toString(), - validTill: new Date(deal.validTill), - })); - - createdDeals = await db - .insert(specialDeals) - .values(dealInserts) - .returning(); - } - - // Handle tag assignments if provided - if (tagIds && Array.isArray(tagIds)) { - const tagAssociations = tagIds.map((tagId: number) => ({ - productId: newProduct.id, - tagId, - })); - - await db.insert(productTags).values(tagAssociations); - } - - // Reinitialize stores to reflect changes - await initializeAllStores(); - - return res.status(201).json({ - product: newProduct, - deals: createdDeals, - message: "Product created successfully", - }); -}; - -/** - * Update a product - */ -export const updateProduct = async (req: Request, res: Response) => { - const { id } = req.params; - const { name, shortDescription, longDescription, unitId, storeId, price, marketPrice, incrementStep, productQuantity, isSuspended, isFlashAvailable, flashPrice, deals:dealsRaw, imagesToDelete:imagesToDeleteRaw, tagIds } = req.body; - - - const deals = dealsRaw ? JSON.parse(dealsRaw) : null; - const imagesToDelete = imagesToDeleteRaw ? JSON.parse(imagesToDeleteRaw) : []; - - if (!name || !unitId || !storeId || !price) { - throw new ApiError("Name, unitId, storeId, and price are required", 400); - } - - // Check if unit exists - const unit = await db.query.units.findFirst({ - where: eq(units.id, unitId), - }); - - if (!unit) { - throw new ApiError("Invalid unit ID", 400); - } - - // Get current product to handle image updates - const currentProduct = await db.query.productInfo.findFirst({ - where: eq(productInfo.id, parseInt(id)), - }); - - if (!currentProduct) { - throw new ApiError("Product not found", 404); - } - - // Handle image deletions - let currentImages = (currentProduct.images as string[]) || []; - if (imagesToDelete && imagesToDelete.length > 0) { - // Convert signed URLs to original S3 URLs for comparison - const originalUrlsToDelete = imagesToDelete - .map((signedUrl: string) => getOriginalUrlFromSignedUrl(signedUrl)) - .filter(Boolean); // Remove nulls - - // Find which stored images match the ones to delete - const imagesToRemoveFromDb = currentImages.filter(storedUrl => - originalUrlsToDelete.includes(storedUrl) - ); - - // Delete the matching images from S3 - const deletePromises = imagesToRemoveFromDb.map(imageUrl => deleteS3Image(imageUrl)); - await Promise.all(deletePromises); - - // Remove deleted images from current images array - currentImages = currentImages.filter(img => !imagesToRemoveFromDb.includes(img)); - } - - // Extract new images from req.files - const images = (req.files as Express.Multer.File[])?.filter(item => item.fieldname === 'images'); - let uploadedImageUrls: string[] = []; - - if (images && Array.isArray(images)) { - const imageUploadPromises = images.map((file, index) => { - const key = `product-images/${Date.now()}-${index}`; - return imageUploadS3(file.buffer, file.mimetype, key); - }); - - uploadedImageUrls = await Promise.all(imageUploadPromises); - } - - // Combine remaining current images with new uploaded images - const finalImages = [...currentImages, ...uploadedImageUrls]; - - const updateData: any = { - name, - shortDescription, - longDescription, - unitId, - storeId, - price, - marketPrice, - incrementStep: incrementStep || 1, - productQuantity: productQuantity || 1, - isSuspended: isSuspended || false, - images: finalImages.length > 0 ? finalImages : undefined, - }; - - if (isFlashAvailable !== undefined) { - updateData.isFlashAvailable = isFlashAvailable; - } - - if (flashPrice !== undefined) { - updateData.flashPrice = flashPrice ? parseFloat(flashPrice) : null; - } - - const [updatedProduct] = await db - .update(productInfo) - .set(updateData) - .where(eq(productInfo.id, parseInt(id))) - .returning(); - - if (!updatedProduct) { - throw new ApiError("Product not found", 404); - } - - // Handle deals if provided - if (deals && Array.isArray(deals)) { - // Get existing deals - const existingDeals = await db.query.specialDeals.findMany({ - where: eq(specialDeals.productId, parseInt(id)), - }); - - // Create maps for comparison - const existingDealsMap = new Map(existingDeals.map(deal => [`${deal.quantity}-${deal.price}`, deal])); - const newDealsMap = new Map(deals.map((deal: CreateDeal) => [`${deal.quantity}-${deal.price}`, deal])); - - // Find deals to add, update, and remove - const dealsToAdd = deals.filter((deal: CreateDeal) => { - const key = `${deal.quantity}-${deal.price}`; - return !existingDealsMap.has(key); - }); - - const dealsToRemove = existingDeals.filter(deal => { - const key = `${deal.quantity}-${deal.price}`; - return !newDealsMap.has(key); - }); - - const dealsToUpdate = deals.filter((deal: CreateDeal) => { - const key = `${deal.quantity}-${deal.price}`; - const existing = existingDealsMap.get(key); - return existing && existing.validTill.toISOString().split('T')[0] !== deal.validTill; - }); - - // Remove old deals - if (dealsToRemove.length > 0) { - await db.delete(specialDeals).where( - inArray(specialDeals.id, dealsToRemove.map(deal => deal.id)) - ); - } - - // Add new deals - if (dealsToAdd.length > 0) { - const dealInserts = dealsToAdd.map((deal: CreateDeal) => ({ - productId: parseInt(id), - quantity: deal.quantity.toString(), - price: deal.price.toString(), - validTill: new Date(deal.validTill), - })); - await db.insert(specialDeals).values(dealInserts); - } - - // Update existing deals - for (const deal of dealsToUpdate) { - const key = `${deal.quantity}-${deal.price}`; - const existingDeal = existingDealsMap.get(key); - if (existingDeal) { - await db.update(specialDeals) - .set({ validTill: new Date(deal.validTill) }) - .where(eq(specialDeals.id, existingDeal.id)); - } - } - } - - // Handle tag assignments if provided - // if (tagIds && Array.isArray(tagIds)) { - if (tagIds && Boolean(tagIds)) { - // Remove existing tags - await db.delete(productTags).where(eq(productTags.productId, parseInt(id))); - - const tagIdsArray = Array.isArray(tagIds) ? tagIds : [+tagIds] - // Add new tags - const tagAssociations = tagIdsArray.map((tagId: number) => ({ - productId: parseInt(id), - tagId, - })); - - await db.insert(productTags).values(tagAssociations); - } - - // Reinitialize stores to reflect changes - await initializeAllStores(); - - return res.status(200).json({ - product: updatedProduct, - message: "Product updated successfully", - }); -}; \ No newline at end of file diff --git a/apps/backend/src/apis/admin-apis/apis/product.router.ts b/apps/backend/src/apis/admin-apis/apis/product.router.ts deleted file mode 100644 index fe0bbd1..0000000 --- a/apps/backend/src/apis/admin-apis/apis/product.router.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Router } from "express"; -import { createProduct, updateProduct } from "@/src/apis/admin-apis/apis/product.controller" -import uploadHandler from '@/src/lib/upload-handler'; - -const router = Router(); - -// Product routes -router.post("/", uploadHandler.array('images'), createProduct); -router.put("/:id", uploadHandler.array('images'), updateProduct); - -export default router; \ No newline at end of file diff --git a/apps/backend/src/apis/admin-apis/apis/tag.router.ts b/apps/backend/src/apis/admin-apis/apis/tag.router.ts deleted file mode 100644 index dbcdb0d..0000000 --- a/apps/backend/src/apis/admin-apis/apis/tag.router.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Router } from "express"; -import { createTag, getAllTags, getTagById, updateTag, deleteTag } from "@/src/apis/admin-apis/apis/product-tags.controller" -import uploadHandler from '@/src/lib/upload-handler'; - -const router = Router(); - -// Tag routes -router.post("/", uploadHandler.single('image'), createTag); -router.get("/", getAllTags); -router.get("/:id", getTagById); -router.put("/:id", uploadHandler.single('image'), updateTag); -router.delete("/:id", deleteTag); - -export default router; \ No newline at end of file diff --git a/apps/backend/src/apis/common-apis/apis/common-product.controller.ts b/apps/backend/src/apis/common-apis/apis/common-product.controller.ts index 93bd682..366c8a6 100644 --- a/apps/backend/src/apis/common-apis/apis/common-product.controller.ts +++ b/apps/backend/src/apis/common-apis/apis/common-product.controller.ts @@ -1,105 +1,37 @@ -import { eq, gt, and, sql, inArray } from "drizzle-orm"; -import { Request, Response } from "express"; -import { db } from "@/src/db/db_index" -import { productInfo, units, productSlots, deliverySlotInfo, productTags } from "@/src/db/schema" -import { scaffoldAssetUrl } from "@/src/lib/s3-client" +import { Context } from 'hono' -/** - * Get next delivery date for a product - */ -const getNextDeliveryDate = async (productId: number): Promise => { - const result = await db - .select({ deliveryTime: deliverySlotInfo.deliveryTime }) - .from(productSlots) - .innerJoin(deliverySlotInfo, eq(productSlots.slotId, deliverySlotInfo.id)) - .where( - and( - eq(productSlots.productId, productId), - eq(deliverySlotInfo.isActive, true), - gt(deliverySlotInfo.deliveryTime, sql`NOW()`) - ) - ) - .orderBy(deliverySlotInfo.deliveryTime) - .limit(1); - - - return result[0]?.deliveryTime || null; -}; +import { getProductsSummaryData } from '@/src/db/common-product' +import { scaffoldAssetUrl } from '@/src/lib/s3-client' /** * Get all products summary for dropdown */ -export const getAllProductsSummary = async (req: Request, res: Response) => { +export const getAllProductsSummary = async (c: Context) => { try { - const { tagId } = req.query; - const tagIdNum = tagId ? parseInt(tagId as string) : null; + const tagId = c.req.query('tagId') + const tagIdNum = tagId ? parseInt(tagId) : null - let productIds: number[] | null = null; + const productsWithUnits = await getProductsSummaryData(tagIdNum) - // If tagId is provided, get products that have this tag - if (tagIdNum) { - const taggedProducts = await db - .select({ productId: productTags.productId }) - .from(productTags) - .where(eq(productTags.tagId, tagIdNum)); + const formattedProducts = productsWithUnits.map((product) => ({ + id: product.id, + name: product.name, + shortDescription: product.shortDescription, + price: product.price, + marketPrice: product.marketPrice, + unit: product.unitShortNotation, + productQuantity: product.productQuantity, + isOutOfStock: product.isOutOfStock, + nextDeliveryDate: product.nextDeliveryDate ? product.nextDeliveryDate.toISOString() : null, + images: scaffoldAssetUrl((product.images as string[]) || []), + })) - productIds = taggedProducts.map(tp => tp.productId); - } - - let whereCondition = undefined; - - // Filter by product IDs if tag filtering is applied - if (productIds && productIds.length > 0) { - whereCondition = inArray(productInfo.id, productIds); - } else if (tagIdNum) { - // If tagId was provided but no products found, return empty array - return res.status(200).json({ - products: [], - count: 0, - }); - } - - const productsWithUnits = await db - .select({ - id: productInfo.id, - name: productInfo.name, - shortDescription: productInfo.shortDescription, - price: productInfo.price, - marketPrice: productInfo.marketPrice, - images: productInfo.images, - isOutOfStock: productInfo.isOutOfStock, - unitShortNotation: units.shortNotation, - productQuantity: productInfo.productQuantity, - }) - .from(productInfo) - .innerJoin(units, eq(productInfo.unitId, units.id)) - .where(whereCondition); - - // Generate signed URLs for product images - const formattedProducts = await Promise.all( - productsWithUnits.map(async (product) => { - const nextDeliveryDate = await getNextDeliveryDate(product.id); - return { - id: product.id, - name: product.name, - shortDescription: product.shortDescription, - price: product.price, - marketPrice: product.marketPrice, - unit: product.unitShortNotation, - productQuantity: product.productQuantity, - isOutOfStock: product.isOutOfStock, - nextDeliveryDate: nextDeliveryDate ? nextDeliveryDate.toISOString() : null, - images: scaffoldAssetUrl((product.images as string[]) || []), - }; - }) - ); - - return res.status(200).json({ + return c.json({ products: formattedProducts, count: formattedProducts.length, - }); + }) } catch (error) { - console.error("Get products summary error:", error); - return res.status(500).json({ error: "Failed to fetch products summary" }); + console.error('Get products summary error:', error) + return c.json({ error: 'Failed to fetch products summary' }, 500) } -}; +} diff --git a/apps/backend/src/apis/common-apis/apis/common-product.router.ts b/apps/backend/src/apis/common-apis/apis/common-product.router.ts index 90b7655..5195063 100644 --- a/apps/backend/src/apis/common-apis/apis/common-product.router.ts +++ b/apps/backend/src/apis/common-apis/apis/common-product.router.ts @@ -1,10 +1,9 @@ -import { Router } from "express"; -import { getAllProductsSummary } from "@/src/apis/common-apis/apis/common-product.controller" +import { Hono } from 'hono' +import { getAllProductsSummary } from '@/src/apis/common-apis/apis/common-product.controller' -const router = Router(); +const app = new Hono() -router.get("/summary", getAllProductsSummary); +// GET /summary - Get all products summary +app.get('/summary', getAllProductsSummary) - -const commonProductsRouter= router; -export default commonProductsRouter; \ No newline at end of file +export default app diff --git a/apps/backend/src/apis/common-apis/apis/common.router.ts b/apps/backend/src/apis/common-apis/apis/common.router.ts index 7277d1f..1dfdb2f 100644 --- a/apps/backend/src/apis/common-apis/apis/common.router.ts +++ b/apps/backend/src/apis/common-apis/apis/common.router.ts @@ -1,10 +1,9 @@ -import { Router } from "express"; -import commonProductsRouter from "@/src/apis/common-apis/apis/common-product.router" +import { Hono } from 'hono' +import commonProductsRouter from '@/src/apis/common-apis/apis/common-product.router' -const router = Router(); +const app = new Hono() -router.use('/products', commonProductsRouter) +// Mount product routes at /products +app.route('/products', commonProductsRouter) -const commonRouter = router; - -export default commonRouter; \ No newline at end of file +export default app diff --git a/apps/backend/src/db/common-product.ts b/apps/backend/src/db/common-product.ts new file mode 100644 index 0000000..ed4ac45 --- /dev/null +++ b/apps/backend/src/db/common-product.ts @@ -0,0 +1,10 @@ +import { getProductsSummaryData as getProductsSummaryDataPostgres } from '@db-helper-postgres/apis/common-apis/common-product' +import { getProductsSummaryData as getProductsSummaryDataSqlite } from '@db-helper-sqlite/apis/common-apis/common-product' + +const dialect = process.env.DB_DIALECT || DB_DIALECT_TYPE + +const getProductsSummaryData = dialect === 'sqlite' + ? getProductsSummaryDataSqlite + : getProductsSummaryDataPostgres + +export { getProductsSummaryData } diff --git a/apps/backend/src/db/db_index.ts b/apps/backend/src/db/db_index.ts old mode 100755 new mode 100644 index 05aebab..79f4782 --- a/apps/backend/src/db/db_index.ts +++ b/apps/backend/src/db/db_index.ts @@ -1,8 +1,10 @@ -import { drizzle } from "drizzle-orm/node-postgres" -import { migrate } from "drizzle-orm/node-postgres/migrator" -import path from "path" -import * as schema from "@/src/db/schema" +import { db as postgresDb } from '@db-helper-postgres/db/db_index' +import { db as sqliteDb } from '@db-helper-sqlite/db/db_index' + +const dialect = process.env.DB_DIALECT || DB_DIALECT_TYPE + +type Db = typeof DB_DIALECT_TYPE extends 'sqlite' ? typeof sqliteDb : typeof postgresDb + +const db = (dialect === 'sqlite' ? sqliteDb : postgresDb) as Db -const db = drizzle({ connection: process.env.DATABASE_URL!, casing: "snake_case", schema: schema }) -// const db = drizzle('postgresql://postgres:postgres@localhost:2345/pooler'); export { db } diff --git a/apps/backend/src/db/schema-postgres.ts b/apps/backend/src/db/schema-postgres.ts new file mode 100644 index 0000000..ddb97e4 --- /dev/null +++ b/apps/backend/src/db/schema-postgres.ts @@ -0,0 +1 @@ +export * from '@/db-helper-postgres/db/schema' diff --git a/apps/backend/src/db/schema-sqlite.ts b/apps/backend/src/db/schema-sqlite.ts new file mode 100644 index 0000000..154451a --- /dev/null +++ b/apps/backend/src/db/schema-sqlite.ts @@ -0,0 +1 @@ +export * from '@/db-helper-sqlite/db/schema' diff --git a/apps/backend/src/db/schema.ts b/apps/backend/src/db/schema.ts old mode 100755 new mode 100644 index a876101..36f5ca8 --- a/apps/backend/src/db/schema.ts +++ b/apps/backend/src/db/schema.ts @@ -1,689 +1 @@ -import { pgTable, pgSchema, integer, varchar, date, boolean, timestamp, numeric, jsonb, pgEnum, unique, real, text, check, decimal } from "drizzle-orm/pg-core"; -import { relations, sql } from "drizzle-orm"; - -const mf = pgSchema('mf'); - - - -export const users = mf.table('users', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - name: varchar({ length: 255 }), - email: varchar({ length: 255 }), - mobile: varchar({ length: 255 }), - createdAt: timestamp('created_at').notNull().defaultNow(), -}, (t) => ({ - unq_email: unique('unique_email').on(t.email), -})); - -export const userDetails = mf.table('user_details', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - userId: integer('user_id').notNull().references(() => users.id).unique(), - bio: varchar('bio', { length: 500 }), - dateOfBirth: date('date_of_birth'), - gender: varchar('gender', { length: 20 }), - occupation: varchar('occupation', { length: 100 }), - profileImage: varchar('profile_image', { length: 500 }), - isSuspended: boolean('is_suspended').notNull().default(false), - createdAt: timestamp('created_at').notNull().defaultNow(), - updatedAt: timestamp('updated_at').notNull().defaultNow(), -}); - -export const userCreds = mf.table('user_creds', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - userId: integer('user_id').notNull().references(() => users.id), - userPassword: varchar('user_password', { length: 255 }).notNull(), - createdAt: timestamp('created_at').notNull().defaultNow(), -}); - -export const addresses = mf.table('addresses', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - userId: integer('user_id').notNull().references(() => users.id), - name: varchar('name', { length: 255 }).notNull(), - phone: varchar('phone', { length: 15 }).notNull(), - addressLine1: varchar('address_line1', { length: 255 }).notNull(), - addressLine2: varchar('address_line2', { length: 255 }), - city: varchar('city', { length: 100 }).notNull(), - state: varchar('state', { length: 100 }).notNull(), - pincode: varchar('pincode', { length: 10 }).notNull(), - isDefault: boolean('is_default').notNull().default(false), - latitude: real('latitude'), - longitude: real('longitude'), - googleMapsUrl: varchar('google_maps_url', { length: 500 }), - adminLatitude: real('admin_latitude'), - adminLongitude: real('admin_longitude'), - zoneId: integer('zone_id').references(() => addressZones.id), - createdAt: timestamp('created_at').notNull().defaultNow(), -}); - -export const addressZones = mf.table('address_zones', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - zoneName: varchar('zone_name', { length: 255 }).notNull(), - addedAt: timestamp('added_at').notNull().defaultNow(), -}); - -export const addressAreas = mf.table('address_areas', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - placeName: varchar('place_name', { length: 255 }).notNull(), - zoneId: integer('zone_id').references(() => addressZones.id), - createdAt: timestamp('created_at').notNull().defaultNow(), -}); - -export const staffUsers = mf.table('staff_users', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - name: varchar({ length: 255 }).notNull(), - password: varchar({ length: 255 }).notNull(), - staffRoleId: integer('staff_role_id').references(() => staffRoles.id), - createdAt: timestamp('created_at').notNull().defaultNow(), -}); - -export const storeInfo = mf.table('store_info', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - name: varchar({ length: 255 }).notNull(), - description: varchar({ length: 500 }), - imageUrl: varchar('image_url', { length: 500 }), - createdAt: timestamp('created_at').notNull().defaultNow(), - owner: integer('owner').notNull().references(() => staffUsers.id), -}); - -export const units = mf.table('units', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - shortNotation: varchar('short_notation', { length: 50 }).notNull(), - fullName: varchar('full_name', { length: 100 }).notNull(), -}, (t) => ({ - unq_short_notation: unique('unique_short_notation').on(t.shortNotation), -})); - -export const productInfo = mf.table('product_info', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - name: varchar({ length: 255 }).notNull(), - shortDescription: varchar('short_description', { length: 500 }), - longDescription: varchar('long_description', { length: 1000 }), - unitId: integer('unit_id').notNull().references(() => units.id), - price: numeric({ precision: 10, scale: 2 }).notNull(), - marketPrice: numeric('market_price', { precision: 10, scale: 2 }), - images: jsonb('images'), - isOutOfStock: boolean('is_out_of_stock').notNull().default(false), - isSuspended: boolean('is_suspended').notNull().default(false), - isFlashAvailable: boolean('is_flash_available').notNull().default(false), - flashPrice: numeric('flash_price', { precision: 10, scale: 2 }), - createdAt: timestamp('created_at').notNull().defaultNow(), - incrementStep: real('increment_step').notNull().default(1), - productQuantity: real('product_quantity').notNull().default(1), - storeId: integer('store_id').references(() => storeInfo.id), -}); - -export const productGroupInfo = mf.table('product_group_info', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - groupName: varchar('group_name', { length: 255 }).notNull(), - description: varchar({ length: 500 }), - createdAt: timestamp('created_at').notNull().defaultNow(), -}); - -export const productGroupMembership = mf.table('product_group_membership', { - productId: integer('product_id').notNull().references(() => productInfo.id), - groupId: integer('group_id').notNull().references(() => productGroupInfo.id), - addedAt: timestamp('added_at').notNull().defaultNow(), -}, (t) => ({ - pk: unique('product_group_membership_pk').on(t.productId, t.groupId), -})); - -export const homeBanners = mf.table('home_banners', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - name: varchar('name', { length: 255 }).notNull(), - imageUrl: varchar('image_url', { length: 500 }).notNull(), - description: varchar('description', { length: 500 }), - productIds: integer('product_ids').array(), - redirectUrl: varchar('redirect_url', { length: 500 }), - serialNum: integer('serial_num'), - isActive: boolean('is_active').notNull().default(false), - createdAt: timestamp('created_at').notNull().defaultNow(), - lastUpdated: timestamp('last_updated').notNull().defaultNow(), -}); - -export const productReviews = mf.table('product_reviews', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - userId: integer('user_id').notNull().references(() => users.id), - productId: integer('product_id').notNull().references(() => productInfo.id), - reviewBody: text('review_body').notNull(), - imageUrls: jsonb('image_urls').$defaultFn(() => []), - reviewTime: timestamp('review_time').notNull().defaultNow(), - ratings: real('ratings').notNull(), - adminResponse: text('admin_response'), - adminResponseImages: jsonb('admin_response_images').$defaultFn(() => []), -}, (t) => ({ - ratingCheck: check('rating_check', sql`${t.ratings} >= 1 AND ${t.ratings} <= 5`), -})); - -export const uploadStatusEnum = pgEnum('upload_status', ['pending', 'claimed']); - -export const staffRoleEnum = pgEnum('staff_role', ['super_admin', 'admin', 'marketer', 'delivery_staff']); - -export const staffPermissionEnum = pgEnum('staff_permission', ['crud_product', 'make_coupon', 'crud_staff_users']); - -export const uploadUrlStatus = mf.table('upload_url_status', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - createdAt: timestamp('created_at').notNull().defaultNow(), - key: varchar('key', { length: 500 }).notNull(), - status: uploadStatusEnum('status').notNull().default('pending'), -}); - -export const productTagInfo = mf.table('product_tag_info', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - tagName: varchar('tag_name', { length: 100 }).notNull().unique(), - tagDescription: varchar('tag_description', { length: 500 }), - imageUrl: varchar('image_url', { length: 500 }), - isDashboardTag: boolean('is_dashboard_tag').notNull().default(false), - relatedStores: jsonb('related_stores').$defaultFn(() => []), - createdAt: timestamp('created_at').notNull().defaultNow(), -}); - -export const productTags = mf.table('product_tags', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - productId: integer('product_id').notNull().references(() => productInfo.id), - tagId: integer('tag_id').notNull().references(() => productTagInfo.id), - assignedAt: timestamp('assigned_at').notNull().defaultNow(), -}, (t) => ({ - unq_product_tag: unique('unique_product_tag').on(t.productId, t.tagId), -})); - -export const deliverySlotInfo = mf.table('delivery_slot_info', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - deliveryTime: timestamp('delivery_time').notNull(), - freezeTime: timestamp('freeze_time').notNull(), - isActive: boolean('is_active').notNull().default(true), - isFlash: boolean('is_flash').notNull().default(false), - isCapacityFull: boolean('is_capacity_full').notNull().default(false), - deliverySequence: jsonb('delivery_sequence').$defaultFn(() => {}), - groupIds: jsonb('group_ids').$defaultFn(() => []), -}); - -export const vendorSnippets = mf.table('vendor_snippets', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - snippetCode: varchar('snippet_code', { length: 255 }).notNull().unique(), - slotId: integer('slot_id').references(() => deliverySlotInfo.id), - isPermanent: boolean('is_permanent').notNull().default(false), - productIds: integer('product_ids').array().notNull(), - validTill: timestamp('valid_till'), - createdAt: timestamp('created_at').notNull().defaultNow(), -}); - -export const vendorSnippetsRelations = relations(vendorSnippets, ({ one }) => ({ - slot: one(deliverySlotInfo, { fields: [vendorSnippets.slotId], references: [deliverySlotInfo.id] }), -})); - -export const productSlots = mf.table('product_slots', { - productId: integer('product_id').notNull().references(() => productInfo.id), - slotId: integer('slot_id').notNull().references(() => deliverySlotInfo.id), -}, (t) => ({ - pk: unique('product_slot_pk').on(t.productId, t.slotId), -})); - -export const specialDeals = mf.table('special_deals', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - productId: integer('product_id').notNull().references(() => productInfo.id), - quantity: numeric({ precision: 10, scale: 2 }).notNull(), - price: numeric({ precision: 10, scale: 2 }).notNull(), - validTill: timestamp('valid_till').notNull(), -}); - -export const orders = mf.table('orders', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - userId: integer('user_id').notNull().references(() => users.id), - addressId: integer('address_id').notNull().references(() => addresses.id), - slotId: integer('slot_id').references(() => deliverySlotInfo.id), - isCod: boolean('is_cod').notNull().default(false), - isOnlinePayment: boolean('is_online_payment').notNull().default(false), - paymentInfoId: integer('payment_info_id').references(() => paymentInfoTable.id), - totalAmount: numeric('total_amount', { precision: 10, scale: 2 }).notNull(), - deliveryCharge: numeric('delivery_charge', { precision: 10, scale: 2 }).notNull().default('0'), - readableId: integer('readable_id').notNull(), - adminNotes: text('admin_notes'), - userNotes: text('user_notes'), - orderGroupId: varchar('order_group_id', { length: 255 }), - orderGroupProportion: decimal('order_group_proportion', { precision: 10, scale: 4 }), - isFlashDelivery: boolean('is_flash_delivery').notNull().default(false), - createdAt: timestamp('created_at').notNull().defaultNow(), -}); - -export const orderItems = mf.table('order_items', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - orderId: integer('order_id').notNull().references(() => orders.id), - productId: integer('product_id').notNull().references(() => productInfo.id), - quantity: varchar('quantity', { length: 50 }).notNull(), - price: numeric({ precision: 10, scale: 2 }).notNull(), - discountedPrice: numeric('discounted_price', { precision: 10, scale: 2 }), - is_packaged: boolean('is_packaged').notNull().default(false), - is_package_verified: boolean('is_package_verified').notNull().default(false), -}); - -export const paymentStatusEnum = pgEnum('payment_status', ['pending', 'success', 'cod', 'failed']); - -export const orderStatus = mf.table('order_status', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - orderTime: timestamp('order_time').notNull().defaultNow(), - userId: integer('user_id').notNull().references(() => users.id), - orderId: integer('order_id').notNull().references(() => orders.id), - isPackaged: boolean('is_packaged').notNull().default(false), - isDelivered: boolean('is_delivered').notNull().default(false), - isCancelled: boolean('is_cancelled').notNull().default(false), - cancelReason: varchar('cancel_reason', { length: 255 }), - isCancelledByAdmin: boolean('is_cancelled_by_admin'), - paymentStatus: paymentStatusEnum('payment_state').notNull().default('pending'), - cancellationUserNotes: text('cancellation_user_notes'), - cancellationAdminNotes: text('cancellation_admin_notes'), - cancellationReviewed: boolean('cancellation_reviewed').notNull().default(false), - cancellationReviewedAt: timestamp('cancellation_reviewed_at'), - refundCouponId: integer('refund_coupon_id').references(() => coupons.id), -}); - -export const paymentInfoTable = mf.table('payment_info', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - status: varchar({ length: 50 }).notNull(), - gateway: varchar({ length: 50 }).notNull(), - orderId: varchar('order_id', { length: 500 }), - token: varchar({ length: 500 }), - merchantOrderId: varchar('merchant_order_id', { length: 255 }).notNull().unique(), - payload: jsonb('payload'), -}); - -export const payments = mf.table('payments', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - status: varchar({ length: 50 }).notNull(), - gateway: varchar({ length: 50 }).notNull(), - orderId: integer('order_id').notNull().references(() => orders.id), - token: varchar({ length: 500 }), - merchantOrderId: varchar('merchant_order_id', { length: 255 }).notNull().unique(), - payload: jsonb('payload'), -}); - -export const refunds = mf.table('refunds', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - orderId: integer('order_id').notNull().references(() => orders.id), - refundAmount: numeric('refund_amount', { precision: 10, scale: 2 }), - refundStatus: varchar('refund_status', { length: 50 }).default('none'), - merchantRefundId: varchar('merchant_refund_id', { length: 255 }), - refundProcessedAt: timestamp('refund_processed_at'), - createdAt: timestamp('created_at').notNull().defaultNow(), -}); - -export const keyValStore = mf.table('key_val_store', { - key: varchar('key', { length: 255 }).primaryKey(), - value: jsonb('value'), -}); - -export const notifications = mf.table('notifications', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - userId: integer('user_id').notNull().references(() => users.id), - title: varchar({ length: 255 }).notNull(), - body: varchar({ length: 512 }).notNull(), - type: varchar({ length: 50 }), - isRead: boolean('is_read').notNull().default(false), - createdAt: timestamp('created_at').notNull().defaultNow(), -}); - -export const productCategories = mf.table('product_categories', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - name: varchar({ length: 255 }).notNull(), - description: varchar({ length: 500 }), -}); - -export const cartItems = mf.table('cart_items', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - userId: integer('user_id').notNull().references(() => users.id), - productId: integer('product_id').notNull().references(() => productInfo.id), - quantity: numeric({ precision: 10, scale: 2 }).notNull(), - addedAt: timestamp('added_at').notNull().defaultNow(), -}, (t) => ({ - unq_user_product: unique('unique_user_product').on(t.userId, t.productId), -})); - -export const complaints = mf.table('complaints', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - userId: integer('user_id').notNull().references(() => users.id), - orderId: integer('order_id').references(() => orders.id), - complaintBody: varchar('complaint_body', { length: 1000 }).notNull(), - images: jsonb('images'), - response: varchar('response', { length: 1000 }), - isResolved: boolean('is_resolved').notNull().default(false), - createdAt: timestamp('created_at').notNull().defaultNow(), -}); - -export const coupons = mf.table('coupons', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - couponCode: varchar('coupon_code', { length: 50 }).notNull().unique('unique_coupon_code'), - isUserBased: boolean('is_user_based').notNull().default(false), - discountPercent: numeric('discount_percent', { precision: 5, scale: 2 }), - flatDiscount: numeric('flat_discount', { precision: 10, scale: 2 }), - minOrder: numeric('min_order', { precision: 10, scale: 2 }), - productIds: jsonb('product_ids'), - createdBy: integer('created_by').references(() => staffUsers.id), - maxValue: numeric('max_value', { precision: 10, scale: 2 }), - isApplyForAll: boolean('is_apply_for_all').notNull().default(false), - validTill: timestamp('valid_till'), - maxLimitForUser: integer('max_limit_for_user'), - isInvalidated: boolean('is_invalidated').notNull().default(false), - exclusiveApply: boolean('exclusive_apply').notNull().default(false), - createdAt: timestamp('created_at').notNull().defaultNow(), -}); - -export const couponUsage = mf.table('coupon_usage', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - userId: integer('user_id').notNull().references(() => users.id), - couponId: integer('coupon_id').notNull().references(() => coupons.id), - orderId: integer('order_id').references(() => orders.id), - orderItemId: integer('order_item_id').references(() => orderItems.id), - usedAt: timestamp('used_at').notNull().defaultNow(), -}); - -export const couponApplicableUsers = mf.table('coupon_applicable_users', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - couponId: integer('coupon_id').notNull().references(() => coupons.id), - userId: integer('user_id').notNull().references(() => users.id), -}, (t) => ({ - unq_coupon_user: unique('unique_coupon_user').on(t.couponId, t.userId), -})); - -export const couponApplicableProducts = mf.table('coupon_applicable_products', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - couponId: integer('coupon_id').notNull().references(() => coupons.id), - productId: integer('product_id').notNull().references(() => productInfo.id), -}, (t) => ({ - unq_coupon_product: unique('unique_coupon_product').on(t.couponId, t.productId), -})); - -export const userIncidents = mf.table('user_incidents', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - userId: integer('user_id').notNull().references(() => users.id), - orderId: integer('order_id').references(() => orders.id), - dateAdded: timestamp('date_added').notNull().defaultNow(), - adminComment: text('admin_comment'), - addedBy: integer('added_by').references(() => staffUsers.id), - negativityScore: integer('negativity_score'), -}); - -export const reservedCoupons = mf.table('reserved_coupons', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - secretCode: varchar('secret_code', { length: 50 }).notNull().unique(), - couponCode: varchar('coupon_code', { length: 50 }).notNull(), - discountPercent: numeric('discount_percent', { precision: 5, scale: 2 }), - flatDiscount: numeric('flat_discount', { precision: 10, scale: 2 }), - minOrder: numeric('min_order', { precision: 10, scale: 2 }), - productIds: jsonb('product_ids'), - maxValue: numeric('max_value', { precision: 10, scale: 2 }), - validTill: timestamp('valid_till'), - maxLimitForUser: integer('max_limit_for_user'), - exclusiveApply: boolean('exclusive_apply').notNull().default(false), - isRedeemed: boolean('is_redeemed').notNull().default(false), - redeemedBy: integer('redeemed_by').references(() => users.id), - redeemedAt: timestamp('redeemed_at'), - createdBy: integer('created_by').notNull().references(() => staffUsers.id), - createdAt: timestamp('created_at').notNull().defaultNow(), -}, (t) => ({ - unq_secret_code: unique('unique_secret_code').on(t.secretCode), -})); - -export const notifCreds = mf.table('notif_creds', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - token: varchar({ length: 500 }).notNull().unique(), - addedAt: timestamp('added_at').notNull().defaultNow(), - userId: integer('user_id').notNull().references(() => users.id), - lastVerified: timestamp('last_verified'), -}); - -export const unloggedUserTokens = mf.table('unlogged_user_tokens', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - token: varchar({ length: 500 }).notNull().unique(), - addedAt: timestamp('added_at').notNull().defaultNow(), - lastVerified: timestamp('last_verified'), -}); - -export const userNotifications = mf.table('user_notifications', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - title: varchar('title', { length: 255 }).notNull(), - imageUrl: varchar('image_url', { length: 500 }), - createdAt: timestamp('created_at').notNull().defaultNow(), - body: text('body').notNull(), - applicableUsers: jsonb('applicable_users'), -}); - -export const staffRoles = mf.table('staff_roles', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - roleName: staffRoleEnum('role_name').notNull(), - createdAt: timestamp('created_at').notNull().defaultNow(), -}, (t) => ({ - unq_role_name: unique('unique_role_name').on(t.roleName), -})); - -export const staffPermissions = mf.table('staff_permissions', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - permissionName: staffPermissionEnum('permission_name').notNull(), - createdAt: timestamp('created_at').notNull().defaultNow(), -}, (t) => ({ - unq_permission_name: unique('unique_permission_name').on(t.permissionName), -})); - -export const staffRolePermissions = mf.table('staff_role_permissions', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - staffRoleId: integer('staff_role_id').notNull().references(() => staffRoles.id), - staffPermissionId: integer('staff_permission_id').notNull().references(() => staffPermissions.id), - createdAt: timestamp('created_at').notNull().defaultNow(), -}, (t) => ({ - unq_role_permission: unique('unique_role_permission').on(t.staffRoleId, t.staffPermissionId), -})); - -// Relations -export const usersRelations = relations(users, ({ many, one }) => ({ - addresses: many(addresses), - orders: many(orders), - notifications: many(notifications), - cartItems: many(cartItems), - userCreds: one(userCreds), - coupons: many(coupons), - couponUsages: many(couponUsage), - applicableCoupons: many(couponApplicableUsers), - userDetails: one(userDetails), - notifCreds: many(notifCreds), - userIncidents: many(userIncidents), -})); - -export const userCredsRelations = relations(userCreds, ({ one }) => ({ - user: one(users, { fields: [userCreds.userId], references: [users.id] }), -})); - -export const staffUsersRelations = relations(staffUsers, ({ one, many }) => ({ - role: one(staffRoles, { fields: [staffUsers.staffRoleId], references: [staffRoles.id] }), - coupons: many(coupons), - stores: many(storeInfo), -})); - -export const addressesRelations = relations(addresses, ({ one, many }) => ({ - user: one(users, { fields: [addresses.userId], references: [users.id] }), - orders: many(orders), - zone: one(addressZones, { fields: [addresses.zoneId], references: [addressZones.id] }), -})); - -export const unitsRelations = relations(units, ({ many }) => ({ - products: many(productInfo), -})); - -export const productInfoRelations = relations(productInfo, ({ one, many }) => ({ - unit: one(units, { fields: [productInfo.unitId], references: [units.id] }), - store: one(storeInfo, { fields: [productInfo.storeId], references: [storeInfo.id] }), - productSlots: many(productSlots), - specialDeals: many(specialDeals), - orderItems: many(orderItems), - cartItems: many(cartItems), - tags: many(productTags), - applicableCoupons: many(couponApplicableProducts), - reviews: many(productReviews), - groups: many(productGroupMembership), -})); - -export const productTagInfoRelations = relations(productTagInfo, ({ many }) => ({ - products: many(productTags), -})); - -export const productTagsRelations = relations(productTags, ({ one }) => ({ - product: one(productInfo, { fields: [productTags.productId], references: [productInfo.id] }), - tag: one(productTagInfo, { fields: [productTags.tagId], references: [productTagInfo.id] }), -})); - -export const deliverySlotInfoRelations = relations(deliverySlotInfo, ({ many }) => ({ - productSlots: many(productSlots), - orders: many(orders), - vendorSnippets: many(vendorSnippets), -})); - -export const productSlotsRelations = relations(productSlots, ({ one }) => ({ - product: one(productInfo, { fields: [productSlots.productId], references: [productInfo.id] }), - slot: one(deliverySlotInfo, { fields: [productSlots.slotId], references: [deliverySlotInfo.id] }), -})); - -export const specialDealsRelations = relations(specialDeals, ({ one }) => ({ - product: one(productInfo, { fields: [specialDeals.productId], references: [productInfo.id] }), -})); - -export const ordersRelations = relations(orders, ({ one, many }) => ({ - user: one(users, { fields: [orders.userId], references: [users.id] }), - address: one(addresses, { fields: [orders.addressId], references: [addresses.id] }), - slot: one(deliverySlotInfo, { fields: [orders.slotId], references: [deliverySlotInfo.id] }), - orderItems: many(orderItems), - payment: one(payments), - paymentInfo: one(paymentInfoTable, { fields: [orders.paymentInfoId], references: [paymentInfoTable.id] }), - orderStatus: many(orderStatus), - refunds: many(refunds), - couponUsages: many(couponUsage), - userIncidents: many(userIncidents), -})); - -export const orderItemsRelations = relations(orderItems, ({ one }) => ({ - order: one(orders, { fields: [orderItems.orderId], references: [orders.id] }), - product: one(productInfo, { fields: [orderItems.productId], references: [productInfo.id] }), -})); - -export const orderStatusRelations = relations(orderStatus, ({ one }) => ({ - order: one(orders, { fields: [orderStatus.orderId], references: [orders.id] }), - user: one(users, { fields: [orderStatus.userId], references: [users.id] }), - refundCoupon: one(coupons, { fields: [orderStatus.refundCouponId], references: [coupons.id] }), -})); - -export const paymentInfoRelations = relations(paymentInfoTable, ({ one }) => ({ - order: one(orders, { fields: [paymentInfoTable.id], references: [orders.paymentInfoId] }), -})); - -export const paymentsRelations = relations(payments, ({ one }) => ({ - order: one(orders, { fields: [payments.orderId], references: [orders.id] }), -})); - -export const refundsRelations = relations(refunds, ({ one }) => ({ - order: one(orders, { fields: [refunds.orderId], references: [orders.id] }), -})); - -export const notificationsRelations = relations(notifications, ({ one }) => ({ - user: one(users, { fields: [notifications.userId], references: [users.id] }), -})); - -export const productCategoriesRelations = relations(productCategories, ({}) => ({})); - -export const cartItemsRelations = relations(cartItems, ({ one }) => ({ - user: one(users, { fields: [cartItems.userId], references: [users.id] }), - product: one(productInfo, { fields: [cartItems.productId], references: [productInfo.id] }), -})); - -export const complaintsRelations = relations(complaints, ({ one }) => ({ - user: one(users, { fields: [complaints.userId], references: [users.id] }), - order: one(orders, { fields: [complaints.orderId], references: [orders.id] }), -})); - -export const couponsRelations = relations(coupons, ({ one, many }) => ({ - creator: one(staffUsers, { fields: [coupons.createdBy], references: [staffUsers.id] }), - usages: many(couponUsage), - applicableUsers: many(couponApplicableUsers), - applicableProducts: many(couponApplicableProducts), -})); - -export const couponUsageRelations = relations(couponUsage, ({ one }) => ({ - user: one(users, { fields: [couponUsage.userId], references: [users.id] }), - coupon: one(coupons, { fields: [couponUsage.couponId], references: [coupons.id] }), - order: one(orders, { fields: [couponUsage.orderId], references: [orders.id] }), - orderItem: one(orderItems, { fields: [couponUsage.orderItemId], references: [orderItems.id] }), -})); - -export const userDetailsRelations = relations(userDetails, ({ one }) => ({ - user: one(users, { fields: [userDetails.userId], references: [users.id] }), -})); - -export const notifCredsRelations = relations(notifCreds, ({ one }) => ({ - user: one(users, { fields: [notifCreds.userId], references: [users.id] }), -})); - -export const userNotificationsRelations = relations(userNotifications, ({}) => ({ - // No relations needed for now -})); - -export const storeInfoRelations = relations(storeInfo, ({ one, many }) => ({ - owner: one(staffUsers, { fields: [storeInfo.owner], references: [staffUsers.id] }), - products: many(productInfo), -})); - -export const couponApplicableUsersRelations = relations(couponApplicableUsers, ({ one }) => ({ - coupon: one(coupons, { fields: [couponApplicableUsers.couponId], references: [coupons.id] }), - user: one(users, { fields: [couponApplicableUsers.userId], references: [users.id] }), -})); - -export const couponApplicableProductsRelations = relations(couponApplicableProducts, ({ one }) => ({ - coupon: one(coupons, { fields: [couponApplicableProducts.couponId], references: [coupons.id] }), - product: one(productInfo, { fields: [couponApplicableProducts.productId], references: [productInfo.id] }), -})); - -export const reservedCouponsRelations = relations(reservedCoupons, ({ one }) => ({ - redeemedUser: one(users, { fields: [reservedCoupons.redeemedBy], references: [users.id] }), - creator: one(staffUsers, { fields: [reservedCoupons.createdBy], references: [staffUsers.id] }), -})); - -export const productReviewsRelations = relations(productReviews, ({ one }) => ({ - user: one(users, { fields: [productReviews.userId], references: [users.id] }), - product: one(productInfo, { fields: [productReviews.productId], references: [productInfo.id] }), -})); - -export const addressZonesRelations = relations(addressZones, ({ many }) => ({ - addresses: many(addresses), - areas: many(addressAreas), -})); - -export const addressAreasRelations = relations(addressAreas, ({ one }) => ({ - zone: one(addressZones, { fields: [addressAreas.zoneId], references: [addressZones.id] }), -})); - -export const productGroupInfoRelations = relations(productGroupInfo, ({ many }) => ({ - memberships: many(productGroupMembership), -})); - -export const productGroupMembershipRelations = relations(productGroupMembership, ({ one }) => ({ - product: one(productInfo, { fields: [productGroupMembership.productId], references: [productInfo.id] }), - group: one(productGroupInfo, { fields: [productGroupMembership.groupId], references: [productGroupInfo.id] }), -})); - -export const homeBannersRelations = relations(homeBanners, ({}) => ({ - // Relations for productIds array would be more complex, skipping for now -})); - -export const staffRolesRelations = relations(staffRoles, ({ many }) => ({ - staffUsers: many(staffUsers), - rolePermissions: many(staffRolePermissions), -})); - -export const staffPermissionsRelations = relations(staffPermissions, ({ many }) => ({ - rolePermissions: many(staffRolePermissions), -})); - -export const staffRolePermissionsRelations = relations(staffRolePermissions, ({ one }) => ({ - role: one(staffRoles, { fields: [staffRolePermissions.staffRoleId], references: [staffRoles.id] }), - permission: one(staffPermissions, { fields: [staffRolePermissions.staffPermissionId], references: [staffPermissions.id] }), -})); - -export const userIncidentsRelations = relations(userIncidents, ({ one }) => ({ - user: one(users, { fields: [userIncidents.userId], references: [users.id] }), - order: one(orders, { fields: [userIncidents.orderId], references: [orders.id] }), - addedBy: one(staffUsers, { fields: [userIncidents.addedBy], references: [staffUsers.id] }), -})); +export * from './schema-sqlite' diff --git a/apps/backend/src/db/seed.ts b/apps/backend/src/db/seed.ts index f894534..9763923 100644 --- a/apps/backend/src/db/seed.ts +++ b/apps/backend/src/db/seed.ts @@ -1,138 +1,8 @@ -import { db } from "@/src/db/db_index" -import { units, productInfo, deliverySlotInfo, productSlots, keyValStore, staffRoles, staffPermissions, staffRolePermissions } from "@/src/db/schema" -import { eq } from "drizzle-orm"; -import { minOrderValue, deliveryCharge } from '@/src/lib/env-exporter' -import { CONST_KEYS } from '@/src/lib/const-keys' +import { seed as seedPostgres } from '@db-helper-postgres/db/seed' +import { seed as seedSqlite } from '@db-helper-sqlite/db/seed' -export async function seed() { - console.log("Seeding database..."); +const dialect = process.env.DB_DIALECT || DB_DIALECT_TYPE - // Seed units individually - const unitsToSeed = [ - { shortNotation: "Kg", fullName: "Kilogram" }, - { shortNotation: "L", fullName: "Litre" }, - { shortNotation: "Dz", fullName: "Dozen" }, - { shortNotation: "Pc", fullName: "Unit Piece" }, - ]; +const seedImpl = dialect === 'sqlite' ? seedSqlite : seedPostgres - for (const unit of unitsToSeed) { - const existingUnit = await db.query.units.findFirst({ - where: eq(units.shortNotation, unit.shortNotation), - }); - if (!existingUnit) { - await db.insert(units).values(unit); - } - } - - // Seed staff roles individually - const rolesToSeed = ['super_admin', 'admin', 'marketer', 'delivery_staff'] as const; - - for (const roleName of rolesToSeed) { - const existingRole = await db.query.staffRoles.findFirst({ - where: eq(staffRoles.roleName, roleName), - }); - if (!existingRole) { - await db.insert(staffRoles).values({ roleName }); - } - } - - // Seed staff permissions individually - const permissionsToSeed = ['crud_product', 'make_coupon', 'crud_staff_users'] as const; - - for (const permissionName of permissionsToSeed) { - const existingPermission = await db.query.staffPermissions.findFirst({ - where: eq(staffPermissions.permissionName, permissionName), - }); - if (!existingPermission) { - await db.insert(staffPermissions).values({ permissionName }); - } - } - - // Seed role-permission assignments - await db.transaction(async (tx) => { - // Get role IDs - const superAdminRole = await tx.query.staffRoles.findFirst({ where: eq(staffRoles.roleName, 'super_admin') }); - const adminRole = await tx.query.staffRoles.findFirst({ where: eq(staffRoles.roleName, 'admin') }); - const marketerRole = await tx.query.staffRoles.findFirst({ where: eq(staffRoles.roleName, 'marketer') }); - - // Get permission IDs - const crudProductPerm = await tx.query.staffPermissions.findFirst({ where: eq(staffPermissions.permissionName, 'crud_product') }); - const makeCouponPerm = await tx.query.staffPermissions.findFirst({ where: eq(staffPermissions.permissionName, 'make_coupon') }); - const crudStaffUsersPerm = await tx.query.staffPermissions.findFirst({ where: eq(staffPermissions.permissionName, 'crud_staff_users') }); - - // Assign all permissions to super_admin - [crudProductPerm, makeCouponPerm, crudStaffUsersPerm].forEach(async (perm) => { - if (superAdminRole && perm) { - const existingSuperAdminPerm = await tx.query.staffRolePermissions.findFirst({ - where: eq(staffRolePermissions.staffRoleId, superAdminRole.id) && eq(staffRolePermissions.staffPermissionId, perm.id), - }); - if (!existingSuperAdminPerm) { - await tx.insert(staffRolePermissions).values({ - staffRoleId: superAdminRole.id, - staffPermissionId: perm.id, - }); - } - } - }); - - // Assign all permissions to admin - [crudProductPerm, makeCouponPerm].forEach(async (perm) => { - if (adminRole && perm) { - const existingAdminPerm = await tx.query.staffRolePermissions.findFirst({ - where: eq(staffRolePermissions.staffRoleId, adminRole.id) && eq(staffRolePermissions.staffPermissionId, perm.id), - }); - if (!existingAdminPerm) { - await tx.insert(staffRolePermissions).values({ - staffRoleId: adminRole.id, - staffPermissionId: perm.id, - }); - } - } - }); - - // Assign make_coupon to marketer - if (marketerRole && makeCouponPerm) { - const existingMarketerCoupon = await tx.query.staffRolePermissions.findFirst({ - where: eq(staffRolePermissions.staffRoleId, marketerRole.id) && eq(staffRolePermissions.staffPermissionId, makeCouponPerm.id), - }); - if (!existingMarketerCoupon) { - await tx.insert(staffRolePermissions).values({ - staffRoleId: marketerRole.id, - staffPermissionId: makeCouponPerm.id, - }); - } - } - }); - - // Seed key-val store constants using CONST_KEYS - const constantsToSeed = [ - { key: CONST_KEYS.readableOrderId, value: 0 }, - { key: CONST_KEYS.minRegularOrderValue, value: minOrderValue }, - { key: CONST_KEYS.freeDeliveryThreshold, value: minOrderValue }, - { key: CONST_KEYS.deliveryCharge, value: deliveryCharge }, - { key: CONST_KEYS.flashFreeDeliveryThreshold, value: 500 }, - { key: CONST_KEYS.flashDeliveryCharge, value: 69 }, - { key: CONST_KEYS.popularItems, value: [] }, - { key: CONST_KEYS.allItemsOrder, value: [] }, - { key: CONST_KEYS.versionNum, value: '1.1.0' }, - { key: CONST_KEYS.playStoreUrl, value: 'https://play.google.com/store/apps/details?id=in.freshyo.app' }, - { key: CONST_KEYS.appStoreUrl, value: 'https://apps.apple.com/in/app/freshyo/id6756889077' }, - { key: CONST_KEYS.isFlashDeliveryEnabled, value: false }, - { key: CONST_KEYS.supportMobile, value: '8688182552' }, - { key: CONST_KEYS.supportEmail, value: 'qushammohd@gmail.com' }, - ]; - - for (const constant of constantsToSeed) { - const existing = await db.query.keyValStore.findFirst({ - where: eq(keyValStore.key, constant.key), - }); - if (!existing) { - await db.insert(keyValStore).values({ - key: constant.key, - value: constant.value, - }); - } - } - - console.log("Seeding completed."); -} +export const seed = async () => seedImpl() diff --git a/apps/backend/src/db/sqlite-casts.ts b/apps/backend/src/db/sqlite-casts.ts new file mode 100644 index 0000000..f92b8b5 --- /dev/null +++ b/apps/backend/src/db/sqlite-casts.ts @@ -0,0 +1 @@ +export * from '@/db-helper-sqlite/db/sqlite-casts' diff --git a/apps/backend/src/db/types.ts b/apps/backend/src/db/types.ts index 64d42de..4051042 100755 --- a/apps/backend/src/db/types.ts +++ b/apps/backend/src/db/types.ts @@ -1,47 +1,58 @@ -import type { InferSelectModel } from "drizzle-orm"; import type { - users, - addresses, - units, - productInfo, - deliverySlotInfo, - productSlots, - specialDeals, - orders, - orderItems, - payments, - notifications, - productCategories, - cartItems, - coupons, -} from "@/src/db/schema"; + User as PostgresUser, + Address as PostgresAddress, + Unit as PostgresUnit, + ProductInfo as PostgresProductInfo, + DeliverySlotInfo as PostgresDeliverySlotInfo, + ProductSlot as PostgresProductSlot, + SpecialDeal as PostgresSpecialDeal, + Order as PostgresOrder, + OrderItem as PostgresOrderItem, + Payment as PostgresPayment, + Notification as PostgresNotification, + ProductCategory as PostgresProductCategory, + CartItem as PostgresCartItem, + Coupon as PostgresCoupon, + ProductWithUnit as PostgresProductWithUnit, + OrderWithItems as PostgresOrderWithItems, + CartItemWithProduct as PostgresCartItemWithProduct, +} from '@db-helper-postgres/db/types' +import type { + User as SqliteUser, + Address as SqliteAddress, + Unit as SqliteUnit, + ProductInfo as SqliteProductInfo, + DeliverySlotInfo as SqliteDeliverySlotInfo, + ProductSlot as SqliteProductSlot, + SpecialDeal as SqliteSpecialDeal, + Order as SqliteOrder, + OrderItem as SqliteOrderItem, + Payment as SqlitePayment, + Notification as SqliteNotification, + ProductCategory as SqliteProductCategory, + CartItem as SqliteCartItem, + Coupon as SqliteCoupon, + ProductWithUnit as SqliteProductWithUnit, + OrderWithItems as SqliteOrderWithItems, + CartItemWithProduct as SqliteCartItemWithProduct, +} from '@db-helper-sqlite/db/types' -export type User = InferSelectModel; -export type Address = InferSelectModel; -export type Unit = InferSelectModel; -export type ProductInfo = InferSelectModel; -export type DeliverySlotInfo = InferSelectModel; -export type ProductSlot = InferSelectModel; -export type SpecialDeal = InferSelectModel; -export type Order = InferSelectModel; -export type OrderItem = InferSelectModel; -export type Payment = InferSelectModel; -export type Notification = InferSelectModel; -export type ProductCategory = InferSelectModel; -export type CartItem = InferSelectModel; -export type Coupon = InferSelectModel; +type UseSqlite = typeof DB_DIALECT_TYPE extends 'sqlite' ? true : false -// Combined types -export type ProductWithUnit = ProductInfo & { - unit: Unit; -}; - -export type OrderWithItems = Order & { - items: (OrderItem & { product: ProductInfo })[]; - address: Address; - slot: DeliverySlotInfo; -}; - -export type CartItemWithProduct = CartItem & { - product: ProductInfo; -}; +export type User = UseSqlite extends true ? SqliteUser : PostgresUser +export type Address = UseSqlite extends true ? SqliteAddress : PostgresAddress +export type Unit = UseSqlite extends true ? SqliteUnit : PostgresUnit +export type ProductInfo = UseSqlite extends true ? SqliteProductInfo : PostgresProductInfo +export type DeliverySlotInfo = UseSqlite extends true ? SqliteDeliverySlotInfo : PostgresDeliverySlotInfo +export type ProductSlot = UseSqlite extends true ? SqliteProductSlot : PostgresProductSlot +export type SpecialDeal = UseSqlite extends true ? SqliteSpecialDeal : PostgresSpecialDeal +export type Order = UseSqlite extends true ? SqliteOrder : PostgresOrder +export type OrderItem = UseSqlite extends true ? SqliteOrderItem : PostgresOrderItem +export type Payment = UseSqlite extends true ? SqlitePayment : PostgresPayment +export type Notification = UseSqlite extends true ? SqliteNotification : PostgresNotification +export type ProductCategory = UseSqlite extends true ? SqliteProductCategory : PostgresProductCategory +export type CartItem = UseSqlite extends true ? SqliteCartItem : PostgresCartItem +export type Coupon = UseSqlite extends true ? SqliteCoupon : PostgresCoupon +export type ProductWithUnit = UseSqlite extends true ? SqliteProductWithUnit : PostgresProductWithUnit +export type OrderWithItems = UseSqlite extends true ? SqliteOrderWithItems : PostgresOrderWithItems +export type CartItemWithProduct = UseSqlite extends true ? SqliteCartItemWithProduct : PostgresCartItemWithProduct diff --git a/apps/backend/src/db/upload-url.ts b/apps/backend/src/db/upload-url.ts new file mode 100644 index 0000000..44ae085 --- /dev/null +++ b/apps/backend/src/db/upload-url.ts @@ -0,0 +1,14 @@ +import { claimUploadUrlStatus as claimUploadUrlStatusPostgres, createUploadUrlStatus as createUploadUrlStatusPostgres } from '@db-helper-postgres/lib/upload-url' +import { claimUploadUrlStatus as claimUploadUrlStatusSqlite, createUploadUrlStatus as createUploadUrlStatusSqlite } from '@db-helper-sqlite/lib/upload-url' + +const dialect = process.env.DB_DIALECT || DB_DIALECT_TYPE + +const createUploadUrlStatus = dialect === 'sqlite' + ? createUploadUrlStatusSqlite + : createUploadUrlStatusPostgres + +const claimUploadUrlStatus = dialect === 'sqlite' + ? claimUploadUrlStatusSqlite + : claimUploadUrlStatusPostgres + +export { claimUploadUrlStatus, createUploadUrlStatus } diff --git a/apps/backend/src/jobs/jobs-index.ts b/apps/backend/src/jobs/jobs-index.ts index 107be6f..048d5cd 100644 --- a/apps/backend/src/jobs/jobs-index.ts +++ b/apps/backend/src/jobs/jobs-index.ts @@ -1,17 +1,9 @@ import * as cron from 'node-cron'; -import { checkPendingPayments, checkRefundStatuses } from '@/src/jobs/payment-status-checker' const runCombinedJob = async () => { const start = Date.now(); try { - console.log('Starting combined job: payments and refunds check'); - - // Run payment check - // await checkPendingPayments(); - - // Run refund check - // await checkRefundStatuses(); - + console.log('Starting combined job'); console.log('Combined job completed successfully'); } catch (error) { console.error('Error in combined job:', error); diff --git a/apps/backend/src/jobs/payment-status-checker.ts b/apps/backend/src/jobs/payment-status-checker.ts deleted file mode 100644 index 7c6679b..0000000 --- a/apps/backend/src/jobs/payment-status-checker.ts +++ /dev/null @@ -1,79 +0,0 @@ -import * as cron from 'node-cron'; -import { db } from '@/src/db/db_index' -import { payments, orders, deliverySlotInfo, refunds } from '@/src/db/schema' -import { eq, and, gt, isNotNull } from 'drizzle-orm'; -import { RazorpayPaymentService } from '@/src/lib/payments-utils' - -interface PendingPaymentRecord { - payment: typeof payments.$inferSelect; - order: typeof orders.$inferSelect; - slot: typeof deliverySlotInfo.$inferSelect; -} - -export const createPaymentNotification = (record: PendingPaymentRecord) => { - // Construct message from record data - const message = `Payment pending for order ORD${record.order.id}. Please complete before orders close time.`; - - // TODO: Implement notification sending logic using record.order.userId, record.order.id, message - console.log(`Sending notification to user ${record.order.userId} for order ${record.order.id}: ${message}`); -}; - -export const checkRefundStatuses = async () => { - try { - const initiatedRefunds = await db - .select() - .from(refunds) - .where(and( - eq(refunds.refundStatus, 'initiated'), - isNotNull(refunds.merchantRefundId) - )); - - // Process refunds concurrently using Promise.allSettled - const promises = initiatedRefunds.map(async (refund) => { - if (!refund.merchantRefundId) return; - - try { - const razorpayRefund = await RazorpayPaymentService.fetchRefund(refund.merchantRefundId); - - if (razorpayRefund.status === 'processed') { - await db - .update(refunds) - .set({ refundStatus: 'success', refundProcessedAt: new Date() }) - .where(eq(refunds.id, refund.id)); - } - } catch (error) { - console.error(`Error checking refund ${refund.id}:`, error); - } - }); - - // Wait for all promises to complete - await Promise.allSettled(promises); - } catch (error) { - console.error('Error in checkRefundStatuses:', error); - } -}; - -export const checkPendingPayments = async () => { - try { - const pendingPayments = await db - .select({ - payment: payments, - order: orders, - slot: deliverySlotInfo, - }) - .from(payments) - .innerJoin(orders, eq(payments.orderId, orders.id)) - .innerJoin(deliverySlotInfo, eq(orders.slotId, deliverySlotInfo.id)) - .where(and( - eq(payments.status, 'pending'), - gt(deliverySlotInfo.freezeTime, new Date()) // Freeze time not passed - )); - - for (const record of pendingPayments) { - createPaymentNotification(record); - } - } catch (error) { - console.error('Error checking pending payments:', error); - } -}; - diff --git a/apps/backend/src/lib/automatedJobs.ts b/apps/backend/src/lib/automatedJobs.ts deleted file mode 100644 index 3142afe..0000000 --- a/apps/backend/src/lib/automatedJobs.ts +++ /dev/null @@ -1,85 +0,0 @@ -import * as cron from 'node-cron'; -import { db } from '@/src/db/db_index' -import { productInfo, keyValStore } from '@/src/db/schema' -import { inArray, eq } from 'drizzle-orm'; -import { CONST_KEYS } from '@/src/lib/const-keys' -import { computeConstants } from '@/src/lib/const-store' - - -const MUTTON_ITEMS = [ - 12, //Lamb mutton - 14, // Mutton Boti - 35, //Mutton Kheema - 84, //Mutton Brain - 4, //Mutton - 86, //Mutton Chops - 87, //Mutton Soup bones - 85 //Mutton paya -]; - - - -export const startAutomatedJobs = () => { - // Job to disable flash delivery for mutton at 12 PM daily - cron.schedule('0 12 * * *', async () => { - try { - console.log('Disabling flash delivery for products at 12 PM'); - await db - .update(productInfo) - .set({ isFlashAvailable: false }) - .where(inArray(productInfo.id, MUTTON_ITEMS)); - console.log('Flash delivery disabled successfully'); - } catch (error) { - console.error('Error disabling flash delivery:', error); - } - }); - - // Job to enable flash delivery for mutton at 6 AM daily - cron.schedule('0 6 * * *', async () => { - try { - console.log('Enabling flash delivery for products at 5 AM'); - await db - .update(productInfo) - .set({ isFlashAvailable: true }) - .where(inArray(productInfo.id, MUTTON_ITEMS)); - console.log('Flash delivery enabled successfully'); - } catch (error) { - console.error('Error enabling flash delivery:', error); - } - }); - - // Job to disable flash delivery feature at 9 PM daily - cron.schedule('0 21 * * *', async () => { - try { - console.log('Disabling flash delivery feature at 9 PM'); - await db - .update(keyValStore) - .set({ value: false }) - .where(eq(keyValStore.key, CONST_KEYS.isFlashDeliveryEnabled)); - await computeConstants(); // Refresh Redis cache - console.log('Flash delivery feature disabled successfully'); - } catch (error) { - console.error('Error disabling flash delivery feature:', error); - } - }); - - // Job to enable flash delivery feature at 6 AM daily - cron.schedule('0 6 * * *', async () => { - try { - console.log('Enabling flash delivery feature at 6 AM'); - await db - .update(keyValStore) - .set({ value: true }) - .where(eq(keyValStore.key, CONST_KEYS.isFlashDeliveryEnabled)); - await computeConstants(); // Refresh Redis cache - console.log('Flash delivery feature enabled successfully'); - } catch (error) { - console.error('Error enabling flash delivery feature:', error); - } - }); - - console.log('Automated jobs scheduled'); -}; - -// Optional: Call on import if desired, or export and call in main app -// startAutomatedJobs(); \ No newline at end of file diff --git a/apps/backend/src/lib/catch-async.ts b/apps/backend/src/lib/catch-async.ts deleted file mode 100755 index d78004b..0000000 --- a/apps/backend/src/lib/catch-async.ts +++ /dev/null @@ -1,6 +0,0 @@ -import express from 'express'; -const catchAsync = - (fn: express.RequestHandler) => - (req: express.Request, res: express.Response, next: express.NextFunction) => - Promise.resolve(fn(req, res, next)).catch(next); -export default catchAsync; \ No newline at end of file diff --git a/apps/backend/src/lib/delete-image.ts b/apps/backend/src/lib/delete-image.ts index dd6dfdd..13771a8 100644 --- a/apps/backend/src/lib/delete-image.ts +++ b/apps/backend/src/lib/delete-image.ts @@ -1,46 +1,54 @@ -import { eq } from "drizzle-orm"; -import { db } from "@/src/db/db_index" -import { deleteImageUtil, getOriginalUrlFromSignedUrl } from "@/src/lib/s3-client" -import { s3Url } from "@/src/lib/env-exporter" +import { deleteImageUtil, getOriginalUrlFromSignedUrl } from '@/src/lib/s3-client' +import { assetsDomain, s3Url } from '@/src/lib/env-exporter' function extractS3Key(url: string): string | null { try { // Check if this is a signed URL first and get the original if it is - const originalUrl = getOriginalUrlFromSignedUrl(url) || url; + const originalUrl = getOriginalUrlFromSignedUrl(url) || url // Find the index of '.com/' in the URL // const comIndex = originalUrl.indexOf(".com/"); - const baseUrlIndex = originalUrl.indexOf(s3Url); + const baseUrlIndex = originalUrl.indexOf(s3Url) // If '.com/' is found, return everything after it if (baseUrlIndex !== -1) { - return originalUrl.substring(baseUrlIndex + s3Url.length); // +5 to skip '.com/' + return originalUrl.substring(baseUrlIndex + s3Url.length) // +5 to skip '.com/' } } catch (error) { - console.error("Error extracting key from URL:", error); + console.error('Error extracting key from URL:', error) } // Return null if the pattern isn't found or there was an error - return null; + return null } export async function deleteS3Image(imageUrl: string) { try { - // First check if this is a signed URL and get the original if it is - const originalUrl = getOriginalUrlFromSignedUrl(imageUrl) || imageUrl; - - const key = extractS3Key(originalUrl || ""); - - if (!key) { - throw new Error("Invalid image URL format"); + let key: string | null = '' + + if (imageUrl.includes(assetsDomain)) { + key = imageUrl.replace(assetsDomain, '') } - const deleteS3 = await deleteImageUtil({keys: [key] }); + else if (imageUrl.startsWith('http')) { + // First check if this is a signed URL and get the original if it is + const originalUrl = getOriginalUrlFromSignedUrl(imageUrl) || imageUrl + + key = extractS3Key(originalUrl || '') + } + + else { + key = imageUrl + } + if (!key) { + throw new Error('Invalid image URL format') + } + const deleteS3 = await deleteImageUtil({ keys: [key] }) if (!deleteS3) { - throw new Error("Failed to delete image from S3"); + throw new Error('Failed to delete image from S3') } } catch (error) { - console.error("Error deleting image from S3:", error); + console.error('Error deleting image from S3:', error) } } diff --git a/apps/backend/src/lib/disk-persisted-set.ts b/apps/backend/src/lib/disk-persisted-set.ts.txt similarity index 100% rename from apps/backend/src/lib/disk-persisted-set.ts rename to apps/backend/src/lib/disk-persisted-set.ts.txt diff --git a/apps/backend/src/lib/env-exporter.ts b/apps/backend/src/lib/env-exporter.ts index 57672b1..19255d8 100755 --- a/apps/backend/src/lib/env-exporter.ts +++ b/apps/backend/src/lib/env-exporter.ts @@ -17,6 +17,12 @@ export const s3Region = process.env.S3_REGION as string export const assetsDomain = process.env.ASSETS_DOMAIN as string; +export const apiCacheKey = process.env.API_CACHE_KEY as string; + +export const cloudflareApiToken = process.env.CLOUDFLARE_API_TOKEN as string; + +export const cloudflareZoneId = process.env.CLOUDFLARE_ZONE_ID as string; + export const s3Url = process.env.S3_URL as string export const redisUrl = process.env.REDIS_URL as string diff --git a/apps/backend/src/lib/init.ts b/apps/backend/src/lib/init.ts index 654b195..b083e3f 100755 --- a/apps/backend/src/lib/init.ts +++ b/apps/backend/src/lib/init.ts @@ -3,6 +3,8 @@ import { initializeAllStores } from '@/src/stores/store-initializer' import { initializeUserNegativityStore } from '@/src/stores/user-negativity-store' import { startOrderHandler, startCancellationHandler, publishOrder } from '@/src/lib/post-order-handler' import { deleteOrders } from '@/src/lib/delete-orders' +import { createAllCacheFiles } from '@/src/lib/cloud_cache' +import { verifyProductsAvailabilityBySchedule } from './manage-scheduled-availability' /** * Initialize all application services @@ -17,7 +19,8 @@ import { deleteOrders } from '@/src/lib/delete-orders' export const initFunc = async (): Promise => { try { console.log('Starting application initialization...'); - + + await verifyProductsAvailabilityBySchedule(false); await Promise.all([ initializeAllStores(), initializeUserNegativityStore(), @@ -25,6 +28,10 @@ export const initFunc = async (): Promise => { startCancellationHandler(), ]); + // Create all cache files after stores are initialized + await createAllCacheFiles(); + console.log('Cache files created successfully'); + console.log('Application initialization completed successfully'); } catch (error) { console.error('Application initialization failed:', error); diff --git a/apps/backend/src/lib/jwt-utils.ts b/apps/backend/src/lib/jwt-utils.ts new file mode 100644 index 0000000..3e95bc7 --- /dev/null +++ b/apps/backend/src/lib/jwt-utils.ts @@ -0,0 +1,72 @@ +import { SignJWT, jwtVerify, errors, JWTPayload } from 'jose'; +import { jwtSecret } from './env-exporter'; + +// JWT Payload Types +export interface UserJWTPayload extends JWTPayload { + userId: number; + name?: string; + email?: string; + mobile?: string; + roles?: string[]; +} + +export interface StaffJWTPayload extends JWTPayload { + staffId: number; + name: string; +} + +// Convert string secret to Uint8Array +const getSecret = () => { + if (!jwtSecret) { + throw new Error('JWT secret not configured'); + } + return new TextEncoder().encode(jwtSecret); +}; + +/** + * Sign a JWT token + * Compatible with tokens signed by jsonwebtoken library + */ +export const signToken = async ( + payload: Record, + expiresIn: string = '7d' +): Promise => { + const secret = getSecret(); + + return new SignJWT(payload) + .setProtectedHeader({ alg: 'HS256' }) + .setIssuedAt() + .setExpirationTime(expiresIn) + .sign(secret); +}; + +/** + * Verify a JWT token + * Compatible with tokens signed by jsonwebtoken library + */ +export const verifyToken = async (token: string): Promise => { + try { + const secret = getSecret(); + const { payload } = await jwtVerify(token, secret); + return payload; + } catch (error) { + if (error instanceof errors.JWTExpired) { + throw new Error('Token expired'); + } + if (error instanceof errors.JWTInvalid) { + throw new Error('Invalid token'); + } + throw error; + } +}; + +/** + * Check if an error is a JWT-related error + */ +export const isJWTError = (error: unknown): boolean => { + return error instanceof errors.JOSEError || + (error instanceof Error && ( + error.message.includes('token') || + error.message.includes('JWT') + )); +}; diff --git a/apps/backend/src/lib/notif-service.ts b/apps/backend/src/lib/notif-service.ts index ee1a0d5..2c34765 100755 --- a/apps/backend/src/lib/notif-service.ts +++ b/apps/backend/src/lib/notif-service.ts @@ -1,7 +1,5 @@ -import { db } from "@/src/db/db_index" -import { sendPushNotificationsMany } from "@/src/lib/expo-service" +import { sendPushNotificationsMany } from '@/src/lib/expo-service' // import { usersTable, notifCredsTable, notificationTable } from "@/src/db/schema"; -import { eq, inArray } from "drizzle-orm"; // Core notification dispatch methods (renamed for clarity) export async function dispatchBulkNotification({ diff --git a/apps/backend/src/lib/payments-utils.ts b/apps/backend/src/lib/payments-utils.ts deleted file mode 100644 index e60a03d..0000000 --- a/apps/backend/src/lib/payments-utils.ts +++ /dev/null @@ -1,59 +0,0 @@ -import Razorpay from "razorpay"; -import { razorpayId, razorpaySecret } from "@/src/lib/env-exporter" -import { db } from "@/src/db/db_index" -import { payments } from "@/src/db/schema" - -type Tx = Parameters[0]>[0]; - -export class RazorpayPaymentService { - private static instance = new Razorpay({ - key_id: razorpayId, - key_secret: razorpaySecret, - }); - - static async createOrder(orderId: number, amount: string) { - // Create Razorpay order - const razorpayOrder = await this.instance.orders.create({ - amount: parseFloat(amount) * 100, // Convert to paisa - currency: 'INR', - receipt: `order_${orderId}`, - notes: { - customerOrderId: orderId.toString(), - }, - }); - - return razorpayOrder; - } - - static async insertPaymentRecord(orderId: number, razorpayOrder: any, tx?: Tx) { - // Use transaction if provided, otherwise use db - const dbInstance = tx || db; - - // Insert payment record - const [payment] = await dbInstance - .insert(payments) - .values({ - status: 'pending', - gateway: 'razorpay', - orderId, - token: orderId.toString(), - merchantOrderId: razorpayOrder.id, - payload: razorpayOrder, - }) - .returning(); - - return payment; - } - - static async initiateRefund(paymentId: string, amount: number) { - const refund = await this.instance.payments.refund(paymentId, { - amount, - }); - return refund; - } - - static async fetchRefund(refundId: string) { - const refund = await this.instance.refunds.fetch(refundId); - return refund; - } -} \ No newline at end of file diff --git a/apps/backend/src/lib/retry.ts b/apps/backend/src/lib/retry.ts new file mode 100644 index 0000000..ed95940 --- /dev/null +++ b/apps/backend/src/lib/retry.ts @@ -0,0 +1,23 @@ +export async function retryWithExponentialBackoff( + fn: () => Promise, + maxRetries: number = 3, + delayMs: number = 1000 +): Promise { + let lastError: Error | undefined + + for (let attempt = 1; attempt <= maxRetries; attempt++) { + try { + return await fn() + } catch (error) { + lastError = error instanceof Error ? error : new Error(String(error)) + + if (attempt < maxRetries) { + console.log(`Attempt ${attempt} failed, retrying in ${delayMs}ms...`) + await new Promise(resolve => setTimeout(resolve, delayMs)) + delayMs *= 2 + } + } + } + + throw lastError +} \ No newline at end of file diff --git a/apps/backend/src/lib/roles-manager.ts b/apps/backend/src/lib/roles-manager.ts index 7242bce..80d49c6 100755 --- a/apps/backend/src/lib/roles-manager.ts +++ b/apps/backend/src/lib/roles-manager.ts @@ -1,5 +1,3 @@ -import { db } from "@/src/db/db_index" - /** * Constants for role names to avoid hardcoding and typos */ diff --git a/apps/backend/src/lib/s3-client.ts b/apps/backend/src/lib/s3-client.ts index 7862169..9280587 100755 --- a/apps/backend/src/lib/s3-client.ts +++ b/apps/backend/src/lib/s3-client.ts @@ -3,9 +3,7 @@ import { DeleteObjectCommand, DeleteObjectsCommand, PutObjectCommand, S3Client, import { getSignedUrl } from "@aws-sdk/s3-request-presigner" import signedUrlCache from "@/src/lib/signed-url-cache" import { s3AccessKeyId, s3Region, s3Url, s3SecretAccessKey, s3BucketName, assetsDomain } from "@/src/lib/env-exporter" -import { db } from "@/src/db/db_index"; // Adjust path if needed -import { uploadUrlStatus } from "@/src/db/schema" -import { and, eq } from 'drizzle-orm'; +import { claimUploadUrlStatus, createUploadUrlStatus } from '@/src/db/upload-url' const s3Client = new S3Client({ region: s3Region, @@ -161,10 +159,7 @@ export async function generateSignedUrlsFromS3Urls(s3Urls: (string|null)[], expi export async function generateUploadUrl(key: string, mimeType: string, expiresIn: number = 180): Promise { try { // Insert record into upload_url_status - await db.insert(uploadUrlStatus).values({ - key: key, - status: 'pending', - }); + await createUploadUrlStatus(key) // Generate signed upload URL const command = new PutObjectCommand({ @@ -201,19 +196,13 @@ export function extractKeyFromPresignedUrl(url: string): string { export async function claimUploadUrl(url: string): Promise { try { - const semiKey = extractKeyFromPresignedUrl(url); - const key = s3BucketName+'/'+ semiKey - - // Update status to 'claimed' if currently 'pending' - const result = await db - .update(uploadUrlStatus) - .set({ status: 'claimed' }) - .where(and(eq(uploadUrlStatus.key, semiKey), eq(uploadUrlStatus.status, 'pending'))) - .returning(); + let semiKey:string = '' - if (result.length === 0) { - throw new Error('Upload URL not found or already claimed'); - } + if(url.startsWith('http')) + semiKey = extractKeyFromPresignedUrl(url); + else + semiKey = url + await claimUploadUrlStatus(semiKey) } catch (error) { console.error('Error claiming upload URL:', error); throw new Error('Failed to claim upload URL'); diff --git a/apps/backend/src/lib/signed-url-cache.ts b/apps/backend/src/lib/signed-url-cache.ts old mode 100755 new mode 100644 index 0f4e98c..7dc6460 --- a/apps/backend/src/lib/signed-url-cache.ts +++ b/apps/backend/src/lib/signed-url-cache.ts @@ -1,8 +1,3 @@ -import fs from 'fs'; -import path from 'path'; - -const CACHE_FILE_PATH = path.join('.', 'assets', 'signed-url-cache.json'); - // Interface for cache entries with TTL interface CacheEntry { value: string; @@ -16,18 +11,7 @@ class SignedURLCache { constructor() { this.originalToSignedCache = new Map(); this.signedToOriginalCache = new Map(); - - // Create cache directory if it doesn't exist - const cacheDir = path.dirname(CACHE_FILE_PATH); - if (!fs.existsSync(cacheDir)) { - console.log('creating the directory') - - fs.mkdirSync(cacheDir, { recursive: true }); - } - else { - console.log('the directory is already present') - - } + console.log('SignedURLCache: Initialized (in-memory only)'); } /** @@ -110,7 +94,7 @@ class SignedURLCache { clear(): void { this.originalToSignedCache.clear(); this.signedToOriginalCache.clear(); - this.saveToDisk(); + console.log('SignedURLCache: Cleared all entries'); } /** @@ -145,119 +129,27 @@ class SignedURLCache { } /** - * Save the cache to disk + * Get cache statistics */ - saveToDisk(): void { - try { - // Remove expired entries before saving - const removedCount = this.clearExpired(); - - // Convert Maps to serializable objects - const serializedOriginalToSigned: Record = {}; - const serializedSignedToOriginal: Record = {}; - - for (const [originalUrl, entry] of this.originalToSignedCache.entries()) { - serializedOriginalToSigned[originalUrl] = { - value: entry.value, - expiresAt: entry.expiresAt - }; - } - - for (const [signedUrl, entry] of this.signedToOriginalCache.entries()) { - serializedSignedToOriginal[signedUrl] = { - value: entry.value, - expiresAt: entry.expiresAt - }; - } - - const serializedCache = { - originalToSigned: serializedOriginalToSigned, - signedToOriginal: serializedSignedToOriginal - }; - - // Write to file - fs.writeFileSync( - CACHE_FILE_PATH, - JSON.stringify(serializedCache), - 'utf8' - ); - - console.log(`SignedURLCache: Saved ${this.originalToSignedCache.size} entries to disk`); - } catch (error) { - console.error('Error saving SignedURLCache to disk:', error); - } + getStats(): { totalEntries: number } { + return { + totalEntries: this.originalToSignedCache.size + }; } /** - * Load the cache from disk + * Stub methods for backward compatibility - do nothing in in-memory mode */ + saveToDisk(): void { + // No-op: In-memory cache only + } + loadFromDisk(): void { - try { - if (fs.existsSync(CACHE_FILE_PATH)) { - // Read from file - const data = fs.readFileSync(CACHE_FILE_PATH, 'utf8'); - - // Parse the data - const parsedData = JSON.parse(data) as { - originalToSigned: Record, - signedToOriginal: Record - }; - - // Only load entries that haven't expired yet - const now = Date.now(); - let loadedCount = 0; - let expiredCount = 0; - - // Load original to signed mappings - if (parsedData.originalToSigned) { - for (const [originalUrl, entry] of Object.entries(parsedData.originalToSigned)) { - if (now <= entry.expiresAt) { - this.originalToSignedCache.set(originalUrl, entry); - loadedCount++; - } else { - expiredCount++; - } - } - } - - // Load signed to original mappings - if (parsedData.signedToOriginal) { - for (const [signedUrl, entry] of Object.entries(parsedData.signedToOriginal)) { - if (now <= entry.expiresAt) { - this.signedToOriginalCache.set(signedUrl, entry); - // Don't increment loadedCount as these are pairs of what we already counted - } else { - // Don't increment expiredCount as these are pairs of what we already counted - } - } - } - - console.log(`SignedURLCache: Loaded ${loadedCount} valid entries from disk (skipped ${expiredCount} expired entries)`); - } else { - console.log('SignedURLCache: No cache file found, starting with empty cache'); - } - } catch (error) { - console.error('Error loading SignedURLCache from disk:', error); - // Start with empty caches if loading fails - this.originalToSignedCache = new Map(); - this.signedToOriginalCache = new Map(); - } + // No-op: In-memory cache only } } // Create a singleton instance to be used throughout the application const signedUrlCache = new SignedURLCache(); -process.on('SIGINT', () => { - console.log('SignedURLCache: Saving cache before shutdown...'); - signedUrlCache.saveToDisk(); - process.exit(0); -}); - -process.on('SIGTERM', () => { - console.log('SignedURLCache: Saving cache before shutdown...'); - signedUrlCache.saveToDisk(); - process.exit(0); -}); - -export default signedUrlCache; \ No newline at end of file +export default signedUrlCache; diff --git a/apps/backend/src/lib/signed-url-cache.ts.txt b/apps/backend/src/lib/signed-url-cache.ts.txt new file mode 100755 index 0000000..0f4e98c --- /dev/null +++ b/apps/backend/src/lib/signed-url-cache.ts.txt @@ -0,0 +1,263 @@ +import fs from 'fs'; +import path from 'path'; + +const CACHE_FILE_PATH = path.join('.', 'assets', 'signed-url-cache.json'); + +// Interface for cache entries with TTL +interface CacheEntry { + value: string; + expiresAt: number; // Timestamp when this entry expires +} + +class SignedURLCache { + private originalToSignedCache: Map; + private signedToOriginalCache: Map; + + constructor() { + this.originalToSignedCache = new Map(); + this.signedToOriginalCache = new Map(); + + // Create cache directory if it doesn't exist + const cacheDir = path.dirname(CACHE_FILE_PATH); + if (!fs.existsSync(cacheDir)) { + console.log('creating the directory') + + fs.mkdirSync(cacheDir, { recursive: true }); + } + else { + console.log('the directory is already present') + + } + } + + /** + * Get a signed URL from the cache using an original URL as the key + */ + get(originalUrl: string): string | undefined { + const entry = this.originalToSignedCache.get(originalUrl); + + // If no entry or entry has expired, return undefined + if (!entry || Date.now() > entry.expiresAt) { + if (entry) { + // Remove expired entry + this.originalToSignedCache.delete(originalUrl); + // Also remove from reverse mapping if it exists + this.signedToOriginalCache.delete(entry.value); + } + return undefined; + } + + return entry.value; + } + + /** + * Get the original URL from the cache using a signed URL as the key + */ + getOriginalUrl(signedUrl: string): string | undefined { + const entry = this.signedToOriginalCache.get(signedUrl); + + // If no entry or entry has expired, return undefined + if (!entry || Date.now() > entry.expiresAt) { + if (entry) { + // Remove expired entry + this.signedToOriginalCache.delete(signedUrl); + // Also remove from primary mapping if it exists + this.originalToSignedCache.delete(entry.value); + } + return undefined; + } + + return entry.value; + } + + /** + * Set a value in the cache with a TTL (Time To Live) + * @param originalUrl The original S3 URL + * @param signedUrl The signed URL + * @param ttlMs Time to live in milliseconds (default: 3 days) + */ + set(originalUrl: string, signedUrl: string, ttlMs: number = 259200000): void { + const expiresAt = Date.now() + ttlMs; + + const entry: CacheEntry = { + value: signedUrl, + expiresAt + }; + + const reverseEntry: CacheEntry = { + value: originalUrl, + expiresAt + }; + + this.originalToSignedCache.set(originalUrl, entry); + this.signedToOriginalCache.set(signedUrl, reverseEntry); + } + + has(originalUrl: string): boolean { + const entry = this.originalToSignedCache.get(originalUrl); + + // Entry exists and hasn't expired + return !!entry && Date.now() <= entry.expiresAt; + } + + hasSignedUrl(signedUrl: string): boolean { + const entry = this.signedToOriginalCache.get(signedUrl); + + // Entry exists and hasn't expired + return !!entry && Date.now() <= entry.expiresAt; + } + + clear(): void { + this.originalToSignedCache.clear(); + this.signedToOriginalCache.clear(); + this.saveToDisk(); + } + + /** + * Remove all expired entries from the cache + * @returns The number of expired entries that were removed + */ + clearExpired(): number { + const now = Date.now(); + let removedCount = 0; + + // Clear expired entries from original to signed cache + for (const [originalUrl, entry] of this.originalToSignedCache.entries()) { + if (now > entry.expiresAt) { + this.originalToSignedCache.delete(originalUrl); + removedCount++; + } + } + + // Clear expired entries from signed to original cache + for (const [signedUrl, entry] of this.signedToOriginalCache.entries()) { + if (now > entry.expiresAt) { + this.signedToOriginalCache.delete(signedUrl); + // No need to increment removedCount as we've already counted these in the first loop + } + } + + if (removedCount > 0) { + console.log(`SignedURLCache: Cleared ${removedCount} expired entries`); + } + + return removedCount; + } + + /** + * Save the cache to disk + */ + saveToDisk(): void { + try { + // Remove expired entries before saving + const removedCount = this.clearExpired(); + + // Convert Maps to serializable objects + const serializedOriginalToSigned: Record = {}; + const serializedSignedToOriginal: Record = {}; + + for (const [originalUrl, entry] of this.originalToSignedCache.entries()) { + serializedOriginalToSigned[originalUrl] = { + value: entry.value, + expiresAt: entry.expiresAt + }; + } + + for (const [signedUrl, entry] of this.signedToOriginalCache.entries()) { + serializedSignedToOriginal[signedUrl] = { + value: entry.value, + expiresAt: entry.expiresAt + }; + } + + const serializedCache = { + originalToSigned: serializedOriginalToSigned, + signedToOriginal: serializedSignedToOriginal + }; + + // Write to file + fs.writeFileSync( + CACHE_FILE_PATH, + JSON.stringify(serializedCache), + 'utf8' + ); + + console.log(`SignedURLCache: Saved ${this.originalToSignedCache.size} entries to disk`); + } catch (error) { + console.error('Error saving SignedURLCache to disk:', error); + } + } + + /** + * Load the cache from disk + */ + loadFromDisk(): void { + try { + if (fs.existsSync(CACHE_FILE_PATH)) { + // Read from file + const data = fs.readFileSync(CACHE_FILE_PATH, 'utf8'); + + // Parse the data + const parsedData = JSON.parse(data) as { + originalToSigned: Record, + signedToOriginal: Record + }; + + // Only load entries that haven't expired yet + const now = Date.now(); + let loadedCount = 0; + let expiredCount = 0; + + // Load original to signed mappings + if (parsedData.originalToSigned) { + for (const [originalUrl, entry] of Object.entries(parsedData.originalToSigned)) { + if (now <= entry.expiresAt) { + this.originalToSignedCache.set(originalUrl, entry); + loadedCount++; + } else { + expiredCount++; + } + } + } + + // Load signed to original mappings + if (parsedData.signedToOriginal) { + for (const [signedUrl, entry] of Object.entries(parsedData.signedToOriginal)) { + if (now <= entry.expiresAt) { + this.signedToOriginalCache.set(signedUrl, entry); + // Don't increment loadedCount as these are pairs of what we already counted + } else { + // Don't increment expiredCount as these are pairs of what we already counted + } + } + } + + console.log(`SignedURLCache: Loaded ${loadedCount} valid entries from disk (skipped ${expiredCount} expired entries)`); + } else { + console.log('SignedURLCache: No cache file found, starting with empty cache'); + } + } catch (error) { + console.error('Error loading SignedURLCache from disk:', error); + // Start with empty caches if loading fails + this.originalToSignedCache = new Map(); + this.signedToOriginalCache = new Map(); + } + } +} + +// Create a singleton instance to be used throughout the application +const signedUrlCache = new SignedURLCache(); + +process.on('SIGINT', () => { + console.log('SignedURLCache: Saving cache before shutdown...'); + signedUrlCache.saveToDisk(); + process.exit(0); +}); + +process.on('SIGTERM', () => { + console.log('SignedURLCache: Saving cache before shutdown...'); + signedUrlCache.saveToDisk(); + process.exit(0); +}); + +export default signedUrlCache; \ No newline at end of file diff --git a/apps/backend/src/lib/upload-handler.ts b/apps/backend/src/lib/upload-handler.ts deleted file mode 100755 index 3caa4c2..0000000 --- a/apps/backend/src/lib/upload-handler.ts +++ /dev/null @@ -1,8 +0,0 @@ -import multerParent from 'multer'; -const uploadHandler = multerParent({ - limits: { - fileSize: 10 * 1024 * 1024, // 10 MB - } -}); - -export default uploadHandler \ No newline at end of file diff --git a/apps/backend/src/main-router.ts b/apps/backend/src/main-router.ts index 25086e6..a019e4d 100755 --- a/apps/backend/src/main-router.ts +++ b/apps/backend/src/main-router.ts @@ -1,65 +1,34 @@ -import { Router, Request, Response, NextFunction } from "express"; -import avRouter from "@/src/apis/admin-apis/apis/av-router" -import { ApiError } from "@/src/lib/api-error" -import v1Router from "@/src/v1-router" -import testController from "@/src/test-controller" -import { authenticateUser } from "@/src/middleware/auth.middleware" -import { raiseComplaint } from "@/src/uv-apis/user-rest.controller" -import uploadHandler from "@/src/lib/upload-handler" +import { Hono } from 'hono' +import { authenticateUser } from '@/src/middleware/auth.middleware' +import v1Router from '@/src/v1-router' - -const router = Router(); +// Note: This router is kept for compatibility during migration +// Most routes have been moved to tRPC +const router = new Hono() // Health check endpoints (no auth required) -router.get('/health', (req: Request, res: Response) => { - res.status(200).json({ +// Note: These are also defined in index.ts, keeping for compatibility +router.get('/health', (c) => { + return c.json({ status: 'OK', timestamp: new Date().toISOString(), uptime: process.uptime(), message: 'Hello world' - }); -}); -router.get('/seed', (req:Request, res: Response) => { - res.status(200).json({ + }) +}) + +router.get('/seed', (c) => { + return c.json({ status: 'OK', timestamp: new Date().toISOString(), uptime: process.uptime() - }); + }) }) +// Mount v1 routes (REST API) +router.route('/v1', v1Router) + // Apply authentication middleware to all subsequent routes -router.use(authenticateUser); +router.use('*', authenticateUser) -router.use('/v1', v1Router); -// router.use('/av', avRouter); -router.use('/test', testController); - -// User REST APIs -router.post('/uv/complaints/raise', - uploadHandler.array('images', 5), - raiseComplaint -); - -// Global error handling middleware -router.use((err: Error, req: Request, res: Response, next: NextFunction) => { - console.error('Error:', err); - - if (err instanceof ApiError) { - return res.status(err.statusCode).json({ - error: err.message, - details: err.details, - statusCode: err.statusCode - }); - } - - // Handle unknown errors - return res.status(500).json({ - error: 'Internal Server Error', - message: process.env.NODE_ENV === 'development' ? err.message : undefined, - statusCode: 500 - }); -}); - -const mainRouter = router; - -export default mainRouter; \ No newline at end of file +export default router diff --git a/apps/backend/src/middleware/auth.middleware.ts b/apps/backend/src/middleware/auth.middleware.ts deleted file mode 100644 index 1e381bb..0000000 --- a/apps/backend/src/middleware/auth.middleware.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Request, Response, NextFunction } from 'express'; -import jwt from 'jsonwebtoken'; -import { db } from '@/src/db/db_index' -import { staffUsers, userDetails } from '@/src/db/schema' -import { eq } from 'drizzle-orm'; -import { ApiError } from '@/src/lib/api-error' - -interface AuthenticatedRequest extends Request { - user?: { - userId: number; - name?: string; - email?: string; - mobile?: string; - }; - staffUser?: { - id: number; - name: string; - }; -} - -export const authenticateUser = async (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - try { - const authHeader = req.headers.authorization; - - if (!authHeader?.startsWith('Bearer ')) { - throw new ApiError('Authorization token required', 401); - } - - const token = authHeader.substring(7); - console.log(req.headers) - - const decoded = jwt.verify(token, process.env.JWT_SECRET || 'your-secret-key') as any; - - // Check if this is a staff token (has staffId) - if (decoded.staffId) { - // This is a staff token, verify staff exists - const staff = await db.query.staffUsers.findFirst({ - where: eq(staffUsers.id, decoded.staffId), - }); - - if (!staff) { - throw new ApiError('Invalid staff token', 401); - } - - req.staffUser = { - id: staff.id, - name: staff.name, - }; - } else { - // This is a regular user token - req.user = decoded; - - // Check if user is suspended - const details = await db.query.userDetails.findFirst({ - where: eq(userDetails.userId, decoded.userId), - }); - - if (details?.isSuspended) { - throw new ApiError('Account suspended', 403); - } - } - - next(); - } catch (error) { - next(error); - } -}; \ No newline at end of file diff --git a/apps/backend/src/middleware/auth.ts b/apps/backend/src/middleware/auth.ts index a1a4f3a..e9dfb72 100755 --- a/apps/backend/src/middleware/auth.ts +++ b/apps/backend/src/middleware/auth.ts @@ -1,67 +1,67 @@ -import { Request, Response, NextFunction } from 'express'; -import jwt from 'jsonwebtoken'; +import { createMiddleware } from 'hono/factory' import { ApiError } from '@/src/lib/api-error' +import { verifyToken, isJWTError, UserJWTPayload } from '@/src/lib/jwt-utils' -// Extend the Request interface to include user property -declare global { - namespace Express { - interface Request { - user?: any; - } - } +// Type for Hono context variables +type Variables = { + user: UserJWTPayload } -export const verifyToken = (req: Request, res: Response, next: NextFunction) => { +/** + * Hono middleware to verify JWT token and attach user to context + */ +export const verifyTokenMiddleware = createMiddleware<{ Variables: Variables }>(async (c, next) => { try { // Get token from Authorization header - const authHeader = req.headers.authorization; - + const authHeader = c.req.header('authorization') if (!authHeader || !authHeader.startsWith('Bearer ')) { - throw new ApiError('Access denied. No token provided', 401); + throw new ApiError('Access denied. No token provided', 401) } - const token = authHeader.split(' ')[1]; + const token = authHeader.split(' ')[1] if (!token) { - throw new ApiError('Access denied. Invalid token format', 401); + throw new ApiError('Access denied. Invalid token format', 401) } // Verify token - const decoded = jwt.verify(token, process.env.JWT_SECRET || 'your-secret-key'); + const decoded = await verifyToken(token) as UserJWTPayload + // Add user info to context + c.set('user', decoded) - // Add user info to request - req.user = decoded; - - next(); + await next() } catch (error) { - if (error instanceof jwt.JsonWebTokenError) { - next(new ApiError('Invalid Auth Credentials', 401)); - } else { - next(error); + if (isJWTError(error)) { + throw new ApiError('Invalid Auth Credentials', 401) } + throw error } -}; +}) +// Keep old name for backward compatibility +export { verifyTokenMiddleware as verifyToken } + +/** + * Hono middleware to require specific roles + */ export const requireRole = (roles: string[]) => { - return (req: Request, res: Response, next: NextFunction) => { - try { - if (!req.user) { - throw new ApiError('Authentication required', 401); - } - - // Check if user has any of the required roles - const userRoles = req.user.roles || []; - const hasPermission = roles.some(role => userRoles.includes(role)); - - if (!hasPermission) { - throw new ApiError('Access denied. Insufficient permissions', 403); - } - - next(); - } catch (error) { - next(error); + return createMiddleware<{ Variables: Variables }>(async (c, next) => { + const user = c.get('user') + + if (!user) { + throw new ApiError('Authentication required', 401) } - }; -}; + + // Check if user has any of the required roles + const userRoles = user.roles || [] + const hasPermission = roles.some(role => userRoles.includes(role)) + + if (!hasPermission) { + throw new ApiError('Access denied. Insufficient permissions', 403) + } + + await next() + }) +} diff --git a/apps/backend/src/services/user/order-service.ts b/apps/backend/src/services/user/order-service.ts deleted file mode 100644 index 8b2df28..0000000 --- a/apps/backend/src/services/user/order-service.ts +++ /dev/null @@ -1,405 +0,0 @@ -import { db } from '@/src/db/db_index' -import { - orders, - orderItems, - orderStatus, - addresses, - productInfo, - paymentInfoTable, - coupons, - couponUsage, - payments, - cartItems, - refunds, - units, - userDetails, -} from '@/src/db/schema' -import { eq, and, inArray, desc, gte } from 'drizzle-orm' - -// ============ User/Auth Queries ============ - -/** - * Get user details by user ID - */ -export async function getUserDetails(userId: number) { - return db.query.userDetails.findFirst({ - where: eq(userDetails.userId, userId), - }) -} - -// ============ Address Queries ============ - -/** - * Get user address by ID - */ -export async function getUserAddress(userId: number, addressId: number) { - return db.query.addresses.findFirst({ - where: and(eq(addresses.userId, userId), eq(addresses.id, addressId)), - }) -} - -// ============ Product Queries ============ - -/** - * Get product by ID - */ -export async function getProductById(productId: number) { - return db.query.productInfo.findFirst({ - where: eq(productInfo.id, productId), - }) -} - -/** - * Get multiple products by IDs with unit info - */ -export async function getProductsByIdsWithUnits(productIds: number[]) { - return db - .select({ - id: productInfo.id, - name: productInfo.name, - shortDescription: productInfo.shortDescription, - price: productInfo.price, - images: productInfo.images, - isOutOfStock: productInfo.isOutOfStock, - unitShortNotation: units.shortNotation, - incrementStep: productInfo.incrementStep, - }) - .from(productInfo) - .innerJoin(units, eq(productInfo.unitId, units.id)) - .where(and(inArray(productInfo.id, productIds), eq(productInfo.isSuspended, false))) - .orderBy(desc(productInfo.createdAt)) -} - -// ============ Coupon Queries ============ - -/** - * Get coupon with usages for user - */ -export async function getCouponWithUsages(couponId: number, userId: number) { - return db.query.coupons.findFirst({ - where: eq(coupons.id, couponId), - with: { - usages: { where: eq(couponUsage.userId, userId) }, - }, - }) -} - -/** - * Insert coupon usage - */ -export async function insertCouponUsage(data: { - userId: number - couponId: number - orderId: number - orderItemId: number | null - usedAt: Date -}) { - return db.insert(couponUsage).values(data) -} - -/** - * Get coupon usages for order - */ -export async function getCouponUsagesForOrder(orderId: number) { - return db.query.couponUsage.findMany({ - where: eq(couponUsage.orderId, orderId), - with: { - coupon: true, - }, - }) -} - -// ============ Cart Queries ============ - -/** - * Delete cart items for user by product IDs - */ -export async function deleteCartItems(userId: number, productIds: number[]) { - return db.delete(cartItems).where( - and( - eq(cartItems.userId, userId), - inArray(cartItems.productId, productIds) - ) - ) -} - -// ============ Payment Info Queries ============ - -/** - * Create payment info - */ -export async function createPaymentInfo(data: { - status: string - gateway: string - merchantOrderId: string -}) { - return db.insert(paymentInfoTable).values(data).returning() -} - - - -// ============ Order Queries ============ - -/** - * Insert multiple orders - */ -export async function insertOrders(ordersData: any[]) { - return db.insert(orders).values(ordersData).returning() -} - -/** - * Insert multiple order items - */ -export async function insertOrderItems(itemsData: any[]) { - return db.insert(orderItems).values(itemsData) -} - -/** - * Insert multiple order statuses - */ -export async function insertOrderStatuses(statusesData: any[]) { - return db.insert(orderStatus).values(statusesData) -} - -/** - * Get user orders with all relations - */ -export async function getUserOrdersWithRelations(userId: number, limit: number, offset: number) { - return db.query.orders.findMany({ - where: eq(orders.userId, userId), - with: { - orderItems: { - with: { - product: true, - }, - }, - slot: true, - paymentInfo: true, - orderStatus: true, - refunds: true, - }, - orderBy: (orders, { desc }) => [desc(orders.createdAt)], - limit: limit, - offset: offset, - }) -} - -/** - * Count user orders - */ -export async function countUserOrders(userId: number) { - return db.$count(orders, eq(orders.userId, userId)) -} - -/** - * Get order by ID with all relations - */ -export async function getOrderByIdWithRelations(orderId: number) { - return db.query.orders.findFirst({ - where: eq(orders.id, orderId), - with: { - orderItems: { - with: { - product: true, - }, - }, - slot: true, - paymentInfo: true, - orderStatus: { - with: { - refundCoupon: true, - }, - }, - refunds: true, - }, - }) -} - -/** - * Get order by ID with order status - */ -export async function getOrderWithStatus(orderId: number) { - return db.query.orders.findFirst({ - where: eq(orders.id, orderId), - with: { - orderStatus: true, - }, - }) -} - -/** - * Update order status to cancelled - */ -export async function updateOrderStatusToCancelled( - statusId: number, - data: { - isCancelled: boolean - cancelReason: string - cancellationUserNotes: string - cancellationReviewed: boolean - } -) { - return db - .update(orderStatus) - .set(data) - .where(eq(orderStatus.id, statusId)) -} - -/** - * Insert refund record - */ -export async function insertRefund(data: { orderId: number; refundStatus: string }) { - return db.insert(refunds).values(data) -} - -/** - * Update order notes - */ -export async function updateOrderNotes(orderId: number, userNotes: string | null) { - return db - .update(orders) - .set({ userNotes }) - .where(eq(orders.id, orderId)) -} - -/** - * Get recent delivered orders for user - */ -export async function getRecentDeliveredOrders( - userId: number, - since: Date, - limit: number -) { - return db - .select({ id: orders.id }) - .from(orders) - .innerJoin(orderStatus, eq(orders.id, orderStatus.orderId)) - .where( - and( - eq(orders.userId, userId), - eq(orderStatus.isDelivered, true), - gte(orders.createdAt, since) - ) - ) - .orderBy(desc(orders.createdAt)) - .limit(limit) -} - -/** - * Get order items by order IDs - */ -export async function getOrderItemsByOrderIds(orderIds: number[]) { - return db - .select({ productId: orderItems.productId }) - .from(orderItems) - .where(inArray(orderItems.orderId, orderIds)) -} - -// ============ Transaction Helper ============ - -/** - * Execute function within a database transaction - */ -export async function withTransaction(fn: (tx: any) => Promise): Promise { - return db.transaction(fn) -} - -/** - * Cancel order with refund record in a transaction - */ -export async function cancelOrderWithRefund( - statusId: number, - orderId: number, - isCod: boolean, - reason: string -): Promise<{ orderId: number }> { - return db.transaction(async (tx) => { - // Update order status - await tx - .update(orderStatus) - .set({ - isCancelled: true, - cancelReason: reason, - cancellationUserNotes: reason, - cancellationReviewed: false, - }) - .where(eq(orderStatus.id, statusId)) - - // Insert refund record - const refundStatus = isCod ? "na" : "pending" - await tx.insert(refunds).values({ - orderId, - refundStatus, - }) - - return { orderId } - }) -} - -type Tx = Parameters[0]>[0] - -/** - * Create orders with payment info in a transaction - */ -export async function createOrdersWithPayment( - ordersData: any[], - paymentMethod: "online" | "cod", - totalWithDelivery: number, - razorpayOrderCreator?: (paymentInfoId: number, amount: string) => Promise, - paymentRecordInserter?: (paymentInfoId: number, razorpayOrder: any, tx: Tx) => Promise -): Promise { - return db.transaction(async (tx) => { - let sharedPaymentInfoId: number | null = null - if (paymentMethod === "online") { - const [paymentInfo] = await tx - .insert(paymentInfoTable) - .values({ - status: "pending", - gateway: "razorpay", - merchantOrderId: `multi_order_${Date.now()}`, - }) - .returning() - sharedPaymentInfoId = paymentInfo.id - } - - const ordersToInsert: Omit[] = ordersData.map( - (od) => ({ - ...od.order, - paymentInfoId: sharedPaymentInfoId, - }) - ) - - const insertedOrders = await tx.insert(orders).values(ordersToInsert).returning() - - const allOrderItems: Omit[] = [] - const allOrderStatuses: Omit[] = [] - - insertedOrders.forEach((order: typeof orders.$inferSelect, index: number) => { - const od = ordersData[index] - od.orderItems.forEach((item: any) => { - allOrderItems.push({ ...item, orderId: order.id as number }) - }) - allOrderStatuses.push({ - ...od.orderStatus, - orderId: order.id as number, - }) - }) - - await tx.insert(orderItems).values(allOrderItems) - await tx.insert(orderStatus).values(allOrderStatuses) - - if (paymentMethod === "online" && sharedPaymentInfoId && razorpayOrderCreator && paymentRecordInserter) { - const razorpayOrder = await razorpayOrderCreator( - sharedPaymentInfoId, - totalWithDelivery.toString() - ) - await paymentRecordInserter( - sharedPaymentInfoId, - razorpayOrder, - tx - ) - } - - return insertedOrders - }) -} diff --git a/apps/backend/src/stores/store-initializer.ts b/apps/backend/src/stores/store-initializer.ts index bb414f8..e34af72 100644 --- a/apps/backend/src/stores/store-initializer.ts +++ b/apps/backend/src/stores/store-initializer.ts @@ -4,6 +4,11 @@ import { initializeProducts } from '@/src/stores/product-store' import { initializeProductTagStore } from '@/src/stores/product-tag-store' import { initializeSlotStore } from '@/src/stores/slot-store' import { initializeBannerStore } from '@/src/stores/banner-store' +import { createAllCacheFiles } from '@/src/lib/cloud_cache' + +// const STORE_INIT_DELAY_MS = 3 * 60 * 1000 + const STORE_INIT_DELAY_MS = 0.5 * 60 * 1000 +let storeInitializationTimeout: NodeJS.Timeout | null = null /** * Initialize all application stores @@ -29,8 +34,27 @@ export const initializeAllStores = async (): Promise => { ]); console.log('All application stores initialized successfully'); + + // Regenerate all cache files (fire-and-forget) + createAllCacheFiles().catch(error => { + console.error('Failed to regenerate cache files during store initialization:', error) + }) } catch (error) { console.error('Application stores initialization failed:', error); throw error; } -}; \ No newline at end of file +}; + +export const scheduleStoreInitialization = (): void => { + if (storeInitializationTimeout) { + clearTimeout(storeInitializationTimeout) + storeInitializationTimeout = null + } + + storeInitializationTimeout = setTimeout(() => { + storeInitializationTimeout = null + initializeAllStores().catch(error => { + console.error('Scheduled store initialization failed:', error) + }) + }, STORE_INIT_DELAY_MS) +} diff --git a/apps/backend/src/test-controller.ts b/apps/backend/src/test-controller.ts deleted file mode 100644 index ae98af6..0000000 --- a/apps/backend/src/test-controller.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Router, Request, Response } from 'express'; - -const router = Router(); - -router.get('/', (req: Request, res: Response) => { - res.json({ - status: 'ok', - message: 'Health check passed', - timestamp: new Date().toISOString(), - }); -}); - -export default router; \ No newline at end of file diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/address.ts b/apps/backend/src/trpc/apis/admin-apis/apis/address.ts deleted file mode 100644 index 019b895..0000000 --- a/apps/backend/src/trpc/apis/admin-apis/apis/address.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { z } from 'zod'; -import { addressZones, addressAreas } from '@/src/db/schema' -import { eq, desc } from 'drizzle-orm'; -import { db } from '@/src/db/db_index' -import { router,protectedProcedure } from '@/src/trpc/trpc-index' - -const addressRouter = router({ - getZones: protectedProcedure.query(async () => { - const zones = await db.select().from(addressZones).orderBy(desc(addressZones.addedAt)); - return zones - }), - - getAreas: protectedProcedure.query(async () => { - const areas = await db.select().from(addressAreas).orderBy(desc(addressAreas.createdAt)); - return areas - }), - - createZone: protectedProcedure.input(z.object({ zoneName: z.string().min(1) })).mutation(async ({ input }) => { - - const zone = await db.insert(addressZones).values({ zoneName: input.zoneName }).returning(); - return {zone: zone}; - }), - - createArea: protectedProcedure.input(z.object({ placeName: z.string().min(1), zoneId: z.number().nullable() })).mutation(async ({ input }) => { - const area = await db.insert(addressAreas).values({ placeName: input.placeName, zoneId: input.zoneId }).returning(); - return {area}; - }), - - // TODO: Add update and delete mutations if needed -}); - -export default addressRouter; \ No newline at end of file diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/admin-trpc-index.ts b/apps/backend/src/trpc/apis/admin-apis/apis/admin-trpc-index.ts index 3af0292..12beee5 100644 --- a/apps/backend/src/trpc/apis/admin-apis/apis/admin-trpc-index.ts +++ b/apps/backend/src/trpc/apis/admin-apis/apis/admin-trpc-index.ts @@ -2,7 +2,6 @@ import { router } from '@/src/trpc/trpc-index' import { complaintRouter } from '@/src/trpc/apis/admin-apis/apis/complaint' import { couponRouter } from '@/src/trpc/apis/admin-apis/apis/coupon' -import { cancelledOrdersRouter } from '@/src/trpc/apis/admin-apis/apis/cancelled-orders' import { orderRouter } from '@/src/trpc/apis/admin-apis/apis/order' import { vendorSnippetsRouter } from '@/src/trpc/apis/admin-apis/apis/vendor-snippets' import { slotsRouter } from '@/src/trpc/apis/admin-apis/apis/slots' @@ -10,15 +9,15 @@ import { productRouter } from '@/src/trpc/apis/admin-apis/apis/product' import { staffUserRouter } from '@/src/trpc/apis/admin-apis/apis/staff-user' import { storeRouter } from '@/src/trpc/apis/admin-apis/apis/store' import { adminPaymentsRouter } from '@/src/trpc/apis/admin-apis/apis/payments' -import addressRouter from '@/src/trpc/apis/admin-apis/apis/address' import { bannerRouter } from '@/src/trpc/apis/admin-apis/apis/banner' import { userRouter } from '@/src/trpc/apis/admin-apis/apis/user' import { constRouter } from '@/src/trpc/apis/admin-apis/apis/const' +import { productAvailabilitySchedulesRouter } from '@/src/trpc/apis/admin-apis/apis/product-availability-schedules' +import { tagRouter } from '@/src/trpc/apis/admin-apis/apis/tag' export const adminRouter = router({ complaint: complaintRouter, coupon: couponRouter, - cancelledOrders: cancelledOrdersRouter, order: orderRouter, vendorSnippets: vendorSnippetsRouter, slots: slotsRouter, @@ -26,10 +25,11 @@ export const adminRouter = router({ staffUser: staffUserRouter, store: storeRouter, payments: adminPaymentsRouter, - address: addressRouter, banner: bannerRouter, user: userRouter, const: constRouter, + productAvailabilitySchedules: productAvailabilitySchedulesRouter, + tag: tagRouter, }); export type AdminRouter = typeof adminRouter; diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/banner.ts b/apps/backend/src/trpc/apis/admin-apis/apis/banner.ts index f812430..bbf07e6 100644 --- a/apps/backend/src/trpc/apis/admin-apis/apis/banner.ts +++ b/apps/backend/src/trpc/apis/admin-apis/apis/banner.ts @@ -1,52 +1,42 @@ import { z } from 'zod'; -import { db } from '@/src/db/db_index' -import { homeBanners } from '@/src/db/schema' -import { eq, and, desc, sql } from 'drizzle-orm'; import { protectedProcedure, router } from '@/src/trpc/trpc-index' -import { extractKeyFromPresignedUrl, generateSignedUrlFromS3Url } from '@/src/lib/s3-client' +import { scaffoldAssetUrl, extractKeyFromPresignedUrl } from '@/src/lib/s3-client' import { ApiError } from '@/src/lib/api-error'; -import { initializeAllStores } from '@/src/stores/store-initializer' +import { scheduleStoreInitialization } from '@/src/stores/store-initializer' +import { bannerDbService } from '@/src/trpc/apis/admin-apis/dataAccessors/main' export const bannerRouter = router({ // Get all banners getBanners: protectedProcedure .query(async () => { try { + const banners = await bannerDbService.getAllBanners() - const banners = await db.query.homeBanners.findMany({ - orderBy: desc(homeBanners.createdAt), // Order by creation date instead - // Removed product relationship since we now use productIds array - }); + // Convert S3 keys to signed URLs for client + const bannersWithSignedUrls = await Promise.all( + banners.map(async (banner) => { + try { + return { + ...banner, + imageUrl: banner.imageUrl ? scaffoldAssetUrl(banner.imageUrl) : banner.imageUrl, + productIds: banner.productIds || [], + }; + } catch (error) { + console.error(`Failed to generate signed URL for banner ${banner.id}:`, error); + return { + ...banner, + imageUrl: banner.imageUrl, + productIds: banner.productIds || [], + }; + } + }) + ); - // Convert S3 keys to signed URLs for client - const bannersWithSignedUrls = await Promise.all( - banners.map(async (banner) => { - try { - return { - ...banner, - imageUrl: banner.imageUrl ? await generateSignedUrlFromS3Url(banner.imageUrl) : banner.imageUrl, - // Ensure productIds is always an array - productIds: banner.productIds || [], - }; - } catch (error) { - console.error(`Failed to generate signed URL for banner ${banner.id}:`, error); - return { - ...banner, - imageUrl: banner.imageUrl, // Keep original on error - // Ensure productIds is always an array - productIds: banner.productIds || [], - }; - } - }) - ); - - return { - banners: bannersWithSignedUrls, - }; - } - catch(e:any) { + return { + banners: bannersWithSignedUrls, + }; + } catch (e: any) { console.log(e) - throw new ApiError(e.message); } }), @@ -55,23 +45,17 @@ export const bannerRouter = router({ getBanner: protectedProcedure .input(z.object({ id: z.number() })) .query(async ({ input }) => { - const banner = await db.query.homeBanners.findFirst({ - where: eq(homeBanners.id, input.id), - // Removed product relationship since we now use productIds array - }); + const banner = await bannerDbService.getBannerById(input.id) if (banner) { try { - // Convert S3 key to signed URL for client if (banner.imageUrl) { - banner.imageUrl = await generateSignedUrlFromS3Url(banner.imageUrl); + banner.imageUrl = scaffoldAssetUrl(banner.imageUrl); } } catch (error) { console.error(`Failed to generate signed URL for banner ${banner.id}:`, error); - // Keep original imageUrl on error } - // Ensure productIds is always an array (handle migration compatibility) if (!banner.productIds) { banner.productIds = []; } @@ -84,32 +68,31 @@ export const bannerRouter = router({ createBanner: protectedProcedure .input(z.object({ name: z.string().min(1), - imageUrl: z.string().url(), + imageUrl: z.string(), description: z.string().optional(), productIds: z.array(z.number()).optional(), redirectUrl: z.string().url().optional(), - // serialNum removed completely })) .mutation(async ({ input }) => { try { const imageUrl = extractKeyFromPresignedUrl(input.imageUrl) - const [banner] = await db.insert(homeBanners).values({ + + const banner = await bannerDbService.createBanner({ name: input.name, imageUrl: imageUrl, description: input.description, productIds: input.productIds || [], redirectUrl: input.redirectUrl, - serialNum: 999, // Default value, not used - isActive: false, // Default to inactive - }).returning(); + serialNum: 999, + isActive: false, + }) - // Reinitialize stores to reflect changes - await initializeAllStores(); + scheduleStoreInitialization() return banner; } catch (error) { console.error('Error creating banner:', error); - throw error; // Re-throw to maintain tRPC error handling + throw error; } }), @@ -127,31 +110,21 @@ export const bannerRouter = router({ })) .mutation(async ({ input }) => { try { - const { id, ...updateData } = input; - const incomingProductIds = input.productIds; - // Extract S3 key from presigned URL if imageUrl is provided - const processedData = { - ...updateData, - ...(updateData.imageUrl && { - imageUrl: extractKeyFromPresignedUrl(updateData.imageUrl) - }), - }; - - // Handle serialNum null case - const finalData: any = { ...processedData }; - if ('serialNum' in finalData && finalData.serialNum === null) { - // Set to null explicitly - finalData.serialNum = null; + + const processedData: any = { ...updateData } + + if (updateData.imageUrl) { + processedData.imageUrl = extractKeyFromPresignedUrl(updateData.imageUrl) } - const [banner] = await db.update(homeBanners) - .set({ ...finalData, lastUpdated: new Date(), }) - .where(eq(homeBanners.id, id)) - .returning(); + if ('serialNum' in processedData && processedData.serialNum === null) { + processedData.serialNum = null; + } - // Reinitialize stores to reflect changes - await initializeAllStores(); + const banner = await bannerDbService.updateBannerById(id, processedData) + + scheduleStoreInitialization() return banner; } catch (error) { @@ -164,10 +137,9 @@ export const bannerRouter = router({ deleteBanner: protectedProcedure .input(z.object({ id: z.number() })) .mutation(async ({ input }) => { - await db.delete(homeBanners).where(eq(homeBanners.id, input.id)); + await bannerDbService.deleteBannerById(input.id) - // Reinitialize stores to reflect changes - await initializeAllStores(); + scheduleStoreInitialization() return { success: true }; }), diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/cancelled-orders.ts b/apps/backend/src/trpc/apis/admin-apis/apis/cancelled-orders.ts deleted file mode 100644 index 14c0b26..0000000 --- a/apps/backend/src/trpc/apis/admin-apis/apis/cancelled-orders.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { router, protectedProcedure } from '@/src/trpc/trpc-index' -import { z } from 'zod'; -import { db } from '@/src/db/db_index' -import { orders, orderStatus, users, addresses, orderItems, productInfo, units, refunds } from '@/src/db/schema' -import { eq, desc } from 'drizzle-orm'; - -const updateCancellationReviewSchema = z.object({ - orderId: z.number(), - cancellationReviewed: z.boolean(), - adminNotes: z.string().optional(), -}); - -const updateRefundSchema = z.object({ - orderId: z.number(), - isRefundDone: z.boolean(), -}); - -export const cancelledOrdersRouter = router({ - getAll: protectedProcedure - .query(async () => { - // First get cancelled order statuses with order details - const cancelledOrderStatuses = await db.query.orderStatus.findMany({ - where: eq(orderStatus.isCancelled, true), - with: { - order: { - with: { - user: true, - address: true, - orderItems: { - with: { - product: { - with: { - unit: true, - }, - }, - }, - }, - refunds: true, - }, - }, - }, - orderBy: [desc(orderStatus.orderTime)], - }); - - const filteredStatuses = cancelledOrderStatuses.filter(status => { - return status.order.isCod || status.paymentStatus === 'success'; - }); - - return filteredStatuses.map(status => { - const refund = status.order.refunds[0]; - return { - id: status.order.id, - readableId: status.order.id, - customerName: `${status.order.user.name}`, - address: `${status.order.address.addressLine1}, ${status.order.address.city}`, - totalAmount: status.order.totalAmount, - cancellationReviewed: status.cancellationReviewed || false, - isRefundDone: refund?.refundStatus === 'processed' || false, - adminNotes: status.order.adminNotes, - cancelReason: status.cancelReason, - paymentMode: status.order.isCod ? 'COD' : 'Online', - paymentStatus: status.paymentStatus || 'pending', - items: status.order.orderItems.map(item => ({ - name: item.product.name, - quantity: item.quantity, - price: item.price, - unit: item.product.unit?.shortNotation, - amount: parseFloat(item.price.toString()) * parseFloat(item.quantity || '0'), - })), - createdAt: status.order.createdAt, - }; - }); - }), - - updateReview: protectedProcedure - .input(updateCancellationReviewSchema) - .mutation(async ({ input }) => { - const { orderId, cancellationReviewed, adminNotes } = input; - - const result = await db.update(orderStatus) - .set({ - cancellationReviewed, - cancellationAdminNotes: adminNotes || null, - cancellationReviewedAt: new Date(), - }) - .where(eq(orderStatus.orderId, orderId)) - .returning(); - - if (result.length === 0) { - throw new Error("Cancellation record not found"); - } - - return result[0]; - }), - - getById: protectedProcedure - .input(z.object({ id: z.number() })) - .query(async ({ input }) => { - const { id } = input; - - // Get cancelled order with full details - const cancelledOrderStatus = await db.query.orderStatus.findFirst({ - where: eq(orderStatus.id, id), - with: { - order: { - with: { - user: true, - address: true, - orderItems: { - with: { - product: { - with: { - unit: true, - }, - }, - }, - }, - }, - }, - }, - }); - - if (!cancelledOrderStatus || !cancelledOrderStatus.isCancelled) { - throw new Error("Cancelled order not found"); - } - - // Get refund details separately - const refund = await db.query.refunds.findFirst({ - where: eq(refunds.orderId, cancelledOrderStatus.orderId), - }); - - const order = cancelledOrderStatus.order; - - // Format the response similar to the getAll method - const formattedOrder = { - id: order.id, - readableId: order.id, - customerName: order.user.name, - address: `${order.address.addressLine1}${order.address.addressLine2 ? ', ' + order.address.addressLine2 : ''}, ${order.address.city}, ${order.address.state} ${order.address.pincode}`, - totalAmount: order.totalAmount, - cancellationReviewed: cancelledOrderStatus.cancellationReviewed || false, - isRefundDone: refund?.refundStatus === 'processed' || false, - adminNotes: cancelledOrderStatus.cancellationAdminNotes || null, - cancelReason: cancelledOrderStatus.cancelReason || null, - items: order.orderItems.map((item: any) => ({ - name: item.product.name, - quantity: item.quantity, - price: parseFloat(item.price.toString()), - unit: item.product.unit?.shortNotation || 'unit', - amount: parseFloat(item.price.toString()) * parseFloat(item.quantity), - image: item.product.images?.[0] || null, - })), - createdAt: order.createdAt.toISOString(), - }; - - return { order: formattedOrder }; - }), - - updateRefund: protectedProcedure - .input(updateRefundSchema) - .mutation(async ({ input }) => { - const { orderId, isRefundDone } = input; - - const refundStatus = isRefundDone ? 'processed' : 'none'; - const result = await db.update(refunds) - .set({ - refundStatus, - refundProcessedAt: isRefundDone ? new Date() : null, - }) - .where(eq(refunds.orderId, orderId)) - .returning(); - - if (result.length === 0) { - throw new Error("Cancellation record not found"); - } - - return result[0]; - }), -}); \ No newline at end of file diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/complaint.ts b/apps/backend/src/trpc/apis/admin-apis/apis/complaint.ts index 17d65d4..8aae073 100644 --- a/apps/backend/src/trpc/apis/admin-apis/apis/complaint.ts +++ b/apps/backend/src/trpc/apis/admin-apis/apis/complaint.ts @@ -1,9 +1,7 @@ import { router, protectedProcedure } from '@/src/trpc/trpc-index' import { z } from 'zod'; -import { db } from '@/src/db/db_index' -import { complaints, users } from '@/src/db/schema' -import { eq, desc, lt, and } from 'drizzle-orm'; -import { generateSignedUrlsFromS3Urls } from '@/src/lib/s3-client' +import { scaffoldAssetUrl } from '@/src/lib/s3-client' +import { complaintDbService } from '@/src/trpc/apis/admin-apis/dataAccessors/main' export const complaintRouter = router({ getAll: protectedProcedure @@ -14,27 +12,7 @@ export const complaintRouter = router({ .query(async ({ input }) => { const { cursor, limit } = input; - let whereCondition = cursor - ? lt(complaints.id, cursor) - : undefined; - - const complaintsData = await db - .select({ - id: complaints.id, - complaintBody: complaints.complaintBody, - userId: complaints.userId, - orderId: complaints.orderId, - isResolved: complaints.isResolved, - createdAt: complaints.createdAt, - userName: users.name, - userMobile: users.mobile, - images: complaints.images, - }) - .from(complaints) - .leftJoin(users, eq(complaints.userId, users.id)) - .where(whereCondition) - .orderBy(desc(complaints.id)) - .limit(limit + 1); + const complaintsData = await complaintDbService.getComplaints(cursor, limit); const hasMore = complaintsData.length > limit; const complaintsToReturn = hasMore ? complaintsData.slice(0, limit) : complaintsData; @@ -42,7 +20,7 @@ export const complaintRouter = router({ const complaintsWithSignedImages = await Promise.all( complaintsToReturn.map(async (c) => { const signedImages = c.images - ? await generateSignedUrlsFromS3Urls(c.images as string[]) + ? scaffoldAssetUrl(c.images as string[]) : []; return { @@ -70,11 +48,8 @@ export const complaintRouter = router({ resolve: protectedProcedure .input(z.object({ id: z.string(), response: z.string().optional() })) .mutation(async ({ input }) => { - await db - .update(complaints) - .set({ isResolved: true, response: input.response }) - .where(eq(complaints.id, parseInt(input.id))); + await complaintDbService.resolveComplaint(parseInt(input.id), input.response); return { message: 'Complaint resolved successfully' }; }), -}); \ No newline at end of file +}); diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/const.ts b/apps/backend/src/trpc/apis/admin-apis/apis/const.ts index a426087..98817b0 100644 --- a/apps/backend/src/trpc/apis/admin-apis/apis/const.ts +++ b/apps/backend/src/trpc/apis/admin-apis/apis/const.ts @@ -1,15 +1,13 @@ import { router, protectedProcedure } from '@/src/trpc/trpc-index' import { z } from 'zod'; -import { db } from '@/src/db/db_index' -import { keyValStore } from '@/src/db/schema' import { computeConstants } from '@/src/lib/const-store' import { CONST_KEYS } from '@/src/lib/const-keys' +import { constantDbService } from '@/src/trpc/apis/admin-apis/dataAccessors/main' export const constRouter = router({ getConstants: protectedProcedure .query(async () => { - - const constants = await db.select().from(keyValStore); + const constants = await constantDbService.getAllConstants(); const resp = constants.map(c => ({ key: c.key, @@ -38,24 +36,15 @@ export const constRouter = router({ throw new Error(`Invalid constant keys: ${invalidKeys.join(', ')}`); } - await db.transaction(async (tx) => { - for (const { key, value } of constants) { - await tx.insert(keyValStore) - .values({ key, value }) - .onConflictDoUpdate({ - target: keyValStore.key, - set: { value }, - }); - } - }); + const updatedCount = await constantDbService.upsertConstants(constants); // Refresh all constants in Redis after database update await computeConstants(); return { success: true, - updatedCount: constants.length, + updatedCount, keys: constants.map(c => c.key), }; }), -}); \ No newline at end of file +}); diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/coupon.ts b/apps/backend/src/trpc/apis/admin-apis/apis/coupon.ts index 4eb3017..0210cac 100644 --- a/apps/backend/src/trpc/apis/admin-apis/apis/coupon.ts +++ b/apps/backend/src/trpc/apis/admin-apis/apis/coupon.ts @@ -1,9 +1,7 @@ import { router, protectedProcedure } from '@/src/trpc/trpc-index' import { z } from 'zod'; -import { db } from '@/src/db/db_index' -import { coupons, users, staffUsers, orders, couponApplicableUsers, couponApplicableProducts, orderStatus, reservedCoupons } from '@/src/db/schema' -import { eq, and, like, or, inArray, lt } from 'drizzle-orm'; import dayjs from 'dayjs'; +import { couponDbService } from '@/src/trpc/apis/admin-apis/dataAccessors/main' const createCouponBodySchema = z.object({ couponCode: z.string().optional(), @@ -51,10 +49,7 @@ export const couponRouter = router({ // If applicableUsers is provided, verify users exist if (applicableUsers && applicableUsers.length > 0) { - const existingUsers = await db.query.users.findMany({ - where: inArray(users.id, applicableUsers), - columns: { id: true }, - }); + const existingUsers = await couponDbService.getUsersByIds(applicableUsers); if (existingUsers.length !== applicableUsers.length) { throw new Error("Some applicable users not found"); } @@ -69,56 +64,40 @@ export const couponRouter = router({ // Generate coupon code if not provided let finalCouponCode = couponCode; if (!finalCouponCode) { - // Generate a unique coupon code const timestamp = Date.now().toString().slice(-6); const random = Math.random().toString(36).substring(2, 8).toUpperCase(); finalCouponCode = `MF${timestamp}${random}`; } // Check if coupon code already exists - const existingCoupon = await db.query.coupons.findFirst({ - where: eq(coupons.couponCode, finalCouponCode), - }); - + const existingCoupon = await couponDbService.getCouponByCode(finalCouponCode); if (existingCoupon) { throw new Error("Coupon code already exists"); } - const result = await db.insert(coupons).values({ - couponCode: finalCouponCode, - isUserBased: isUserBased || false, - discountPercent: discountPercent?.toString(), - flatDiscount: flatDiscount?.toString(), - minOrder: minOrder?.toString(), - productIds: productIds || null, - createdBy: staffUserId, - maxValue: maxValue?.toString(), - isApplyForAll: isApplyForAll || false, - validTill: validTill ? dayjs(validTill).toDate() : undefined, - maxLimitForUser: maxLimitForUser, - exclusiveApply: exclusiveApply || false, - }).returning(); - - const coupon = result[0]; + const coupon = await couponDbService.createCoupon({ + couponCode: finalCouponCode, + isUserBased: isUserBased || false, + discountPercent: discountPercent?.toString() || null, + flatDiscount: flatDiscount?.toString() || null, + minOrder: minOrder?.toString() || null, + productIds: productIds || null, + createdBy: staffUserId, + maxValue: maxValue?.toString() || null, + isApplyForAll: isApplyForAll || false, + validTill: validTill ? dayjs(validTill).toDate() : null, + maxLimitForUser: maxLimitForUser || null, + exclusiveApply: exclusiveApply || false, + }); // Insert applicable users if (applicableUsers && applicableUsers.length > 0) { - await db.insert(couponApplicableUsers).values( - applicableUsers.map(userId => ({ - couponId: coupon.id, - userId, - })) - ); + await couponDbService.addApplicableUsers(coupon.id, applicableUsers); } // Insert applicable products if (applicableProducts && applicableProducts.length > 0) { - await db.insert(couponApplicableProducts).values( - applicableProducts.map(productId => ({ - couponId: coupon.id, - productId, - })) - ); + await couponDbService.addApplicableProducts(coupon.id, applicableProducts); } return coupon; @@ -133,39 +112,7 @@ export const couponRouter = router({ .query(async ({ input }) => { const { cursor, limit, search } = input; - let whereCondition = undefined; - const conditions = []; - - if (cursor) { - conditions.push(lt(coupons.id, cursor)); - } - - if (search && search.trim()) { - conditions.push(like(coupons.couponCode, `%${search}%`)); - } - - if (conditions.length > 0) { - whereCondition = and(...conditions); - } - - const result = await db.query.coupons.findMany({ - where: whereCondition, - with: { - creator: true, - applicableUsers: { - with: { - user: true, - }, - }, - applicableProducts: { - with: { - product: true, - }, - }, - }, - orderBy: (coupons, { desc }) => [desc(coupons.createdAt)], - limit: limit + 1, - }); + const result = await couponDbService.getAllCoupons({ cursor, limit, search }); const hasMore = result.length > limit; const couponsList = hasMore ? result.slice(0, limit) : result; @@ -177,24 +124,7 @@ export const couponRouter = router({ getById: protectedProcedure .input(z.object({ id: z.number() })) .query(async ({ input }) => { - const couponId = input.id; - - const result = await db.query.coupons.findFirst({ - where: eq(coupons.id, couponId), - with: { - creator: true, - applicableUsers: { - with: { - user: true, - }, - }, - applicableProducts: { - with: { - product: true, - }, - }, - }, - }); + const result = await couponDbService.getCouponById(input.id); if (!result) { throw new Error("Coupon not found"); @@ -225,27 +155,24 @@ export const couponRouter = router({ } } - // If updating to user-based, applicableUsers is required - if (updates.isUserBased && (!updates.applicableUsers || updates.applicableUsers.length === 0)) { - const existingCount = await db.$count(couponApplicableUsers, eq(couponApplicableUsers.couponId, id)); - if (existingCount === 0) { - throw new Error("applicableUsers is required for user-based coupons"); - } + // If updating to user-based, applicableUsers is required + if (updates.isUserBased && (!updates.applicableUsers || updates.applicableUsers.length === 0)) { + const existingCount = await couponDbService.countApplicableUsers(id); + if (existingCount === 0) { + throw new Error("applicableUsers is required for user-based coupons"); } + } - // If applicableUsers is provided, verify users exist - if (updates.applicableUsers && updates.applicableUsers.length > 0) { - const existingUsers = await db.query.users.findMany({ - where: inArray(users.id, updates.applicableUsers), - columns: { id: true }, - }); - if (existingUsers.length !== updates.applicableUsers.length) { - throw new Error("Some applicable users not found"); - } - } + // If applicableUsers is provided, verify users exist + if (updates.applicableUsers && updates.applicableUsers.length > 0) { + const existingUsers = await couponDbService.getUsersByIds(updates.applicableUsers); + if (existingUsers.length !== updates.applicableUsers.length) { + throw new Error("Some applicable users not found"); + } + } const updateData: any = { ...updates }; - delete updateData.applicableUsers; // Remove since we use couponApplicableUsers table + delete updateData.applicableUsers; if (updates.discountPercent !== undefined) { updateData.discountPercent = updates.discountPercent?.toString(); } @@ -255,67 +182,38 @@ export const couponRouter = router({ if (updates.minOrder !== undefined) { updateData.minOrder = updates.minOrder?.toString(); } - if (updates.maxValue !== undefined) { - updateData.maxValue = updates.maxValue?.toString(); - } - if (updates.validTill !== undefined) { - updateData.validTill = updates.validTill ? dayjs(updates.validTill).toDate() : null; - } - - const result = await db.update(coupons) - .set(updateData) - .where(eq(coupons.id, id)) - .returning(); - - if (result.length === 0) { - throw new Error("Coupon not found"); + if (updates.maxValue !== undefined) { + updateData.maxValue = updates.maxValue?.toString(); } - - console.log('updated coupon successfully') + if (updates.validTill !== undefined) { + updateData.validTill = updates.validTill ? dayjs(updates.validTill).toDate() : null; + } + + const result = await couponDbService.updateCoupon(id, updateData); // Update applicable users: delete existing and insert new if (updates.applicableUsers !== undefined) { - await db.delete(couponApplicableUsers).where(eq(couponApplicableUsers.couponId, id)); + await couponDbService.removeAllApplicableUsers(id); if (updates.applicableUsers.length > 0) { - await db.insert(couponApplicableUsers).values( - updates.applicableUsers.map(userId => ({ - couponId: id, - userId, - })) - ); + await couponDbService.addApplicableUsers(id, updates.applicableUsers); } } // Update applicable products: delete existing and insert new if (updates.applicableProducts !== undefined) { - await db.delete(couponApplicableProducts).where(eq(couponApplicableProducts.couponId, id)); + await couponDbService.removeAllApplicableProducts(id); if (updates.applicableProducts.length > 0) { - await db.insert(couponApplicableProducts).values( - updates.applicableProducts.map(productId => ({ - couponId: id, - productId, - })) - ); + await couponDbService.addApplicableProducts(id, updates.applicableProducts); } } - return result[0]; + return result; }), delete: protectedProcedure .input(z.object({ id: z.number() })) .mutation(async ({ input }) => { - const { id } = input; - - const result = await db.update(coupons) - .set({ isInvalidated: true }) - .where(eq(coupons.id, id)) - .returning(); - - if (result.length === 0) { - throw new Error("Coupon not found"); - } - + await couponDbService.invalidateCoupon(input.id); return { message: "Coupon invalidated successfully" }; }), @@ -328,14 +226,9 @@ export const couponRouter = router({ return { valid: false, message: "Invalid coupon code" }; } - const coupon = await db.query.coupons.findFirst({ - where: and( - eq(coupons.couponCode, code.toUpperCase()), - eq(coupons.isInvalidated, false) - ), - }); + const coupon = await couponDbService.getCouponByCode(code.toUpperCase()); - if (!coupon) { + if (!coupon || coupon.isInvalidated) { return { valid: false, message: "Coupon not found or invalidated" }; } @@ -370,115 +263,71 @@ export const couponRouter = router({ discountAmount = maxValueLimit; } - return { - valid: true, - discountAmount, - coupon: { - id: coupon.id, - discountPercent: coupon.discountPercent, - flatDiscount: coupon.flatDiscount, - maxValue: coupon.maxValue, - } - }; - }), + return { + valid: true, + discountAmount, + coupon: { + id: coupon.id, + discountPercent: coupon.discountPercent, + flatDiscount: coupon.flatDiscount, + maxValue: coupon.maxValue, + } + }; + }), - generateCancellationCoupon: protectedProcedure - .input( - z.object({ - orderId: z.number(), - }) - ) - .mutation(async ({ input, ctx }) => { - const { orderId } = input; + generateCancellationCoupon: protectedProcedure + .input(z.object({ orderId: z.number() })) + .mutation(async ({ input, ctx }) => { + const { orderId } = input; - // Get staff user ID from auth middleware - const staffUserId = ctx.staffUser?.id; - if (!staffUserId) { - throw new Error("Unauthorized"); - } + const staffUserId = ctx.staffUser?.id; + if (!staffUserId) { + throw new Error("Unauthorized"); + } - // Find the order with user and order status information - const order = await db.query.orders.findFirst({ - where: eq(orders.id, orderId), - with: { - user: true, - orderStatus: true, - }, - }); + const order = await couponDbService.getOrderByIdWithUserAndStatus(orderId); - if (!order) { - throw new Error("Order not found"); - } + if (!order) { + throw new Error("Order not found"); + } - // Check if order is cancelled (check if any status entry has isCancelled: true) - // const isOrderCancelled = order.orderStatus?.some(status => status.isCancelled) || false; - // if (!isOrderCancelled) { - // throw new Error("Order is not cancelled"); - // } + if (!order.user) { + throw new Error("User not found for this order"); + } - // // Check if payment method is COD - // if (order.isCod) { - // throw new Error("Can't generate refund coupon for CoD Order"); - // } + const userNamePrefix = (order.user.name || order.user.mobile || 'USR').substring(0, 3).toUpperCase(); + const couponCode = `${userNamePrefix}${orderId}`; - // Verify user exists - if (!order.user) { - throw new Error("User not found for this order"); - } + const existingCoupon = await couponDbService.getCouponByCode(couponCode); + if (existingCoupon) { + throw new Error("Coupon code already exists"); + } - // Generate coupon code: first 3 letters of user name or mobile + orderId - const userNamePrefix = (order.user.name || order.user.mobile || 'USR').substring(0, 3).toUpperCase(); - const couponCode = `${userNamePrefix}${orderId}`; + const orderAmount = parseFloat(order.totalAmount); + const expiryDate = new Date(); + expiryDate.setDate(expiryDate.getDate() + 30); - // Check if coupon code already exists - const existingCoupon = await db.query.coupons.findFirst({ - where: eq(coupons.couponCode, couponCode), - }); + const coupon = await couponDbService.withTransaction(async (tx) => { + const newCoupon = await couponDbService.createCoupon({ + couponCode, + isUserBased: true, + flatDiscount: orderAmount.toString(), + minOrder: orderAmount.toString(), + maxValue: orderAmount.toString(), + validTill: expiryDate, + maxLimitForUser: 1, + createdBy: staffUserId, + isApplyForAll: false, + }); - if (existingCoupon) { - throw new Error("Coupon code already exists"); - } + await couponDbService.addApplicableUsers(newCoupon.id, [order.userId]); + await couponDbService.updateOrderStatusRefundCoupon(orderId, newCoupon.id); - // Get order total amount - const orderAmount = parseFloat(order.totalAmount); + return newCoupon; + }); - // Calculate expiry date (30 days from now) - const expiryDate = new Date(); - expiryDate.setDate(expiryDate.getDate() + 30); - - // Create the coupon and update order status in a transaction - const coupon = await db.transaction(async (tx) => { - // Create the coupon - const result = await tx.insert(coupons).values({ - couponCode, - isUserBased: true, - flatDiscount: orderAmount.toString(), - minOrder: orderAmount.toString(), - maxValue: orderAmount.toString(), - validTill: expiryDate, - maxLimitForUser: 1, - createdBy: staffUserId, - isApplyForAll: false, - }).returning(); - - const coupon = result[0]; - - // Insert applicable users - await tx.insert(couponApplicableUsers).values({ - couponId: coupon.id, - userId: order.userId, - }); - - // Update order_status with refund coupon ID - await tx.update(orderStatus) - .set({ refundCouponId: coupon.id }) - .where(eq(orderStatus.orderId, orderId)); - - return coupon; - }); - - return coupon; - }), + return coupon; + }), getReservedCoupons: protectedProcedure .input(z.object({ @@ -487,100 +336,52 @@ export const couponRouter = router({ search: z.string().optional(), })) .query(async ({ input }) => { - const { cursor, limit, search } = input; - - let whereCondition = undefined; - const conditions = []; + const result = await couponDbService.getReservedCoupons(input); - if (cursor) { - conditions.push(lt(reservedCoupons.id, cursor)); - } - - if (search && search.trim()) { - conditions.push(or( - like(reservedCoupons.secretCode, `%${search}%`), - like(reservedCoupons.couponCode, `%${search}%`) - )); - } - - if (conditions.length > 0) { - whereCondition = and(...conditions); - } - - const result = await db.query.reservedCoupons.findMany({ - where: whereCondition, - with: { - redeemedUser: true, - creator: true, - }, - orderBy: (reservedCoupons, { desc }) => [desc(reservedCoupons.createdAt)], - limit: limit + 1, // Fetch one extra to check if there's more - }); - - const hasMore = result.length > limit; - const coupons = hasMore ? result.slice(0, limit) : result; + const hasMore = result.length > input.limit; + const coupons = hasMore ? result.slice(0, input.limit) : result; const nextCursor = hasMore ? result[result.length - 1].id : undefined; - return { - coupons, - nextCursor, - }; + return { coupons, nextCursor }; }), createReservedCoupon: protectedProcedure .input(createCouponBodySchema) .mutation(async ({ input, ctx }) => { - const { couponCode, isUserBased, discountPercent, flatDiscount, minOrder, productIds, applicableUsers, applicableProducts, maxValue, isApplyForAll, validTill, maxLimitForUser, exclusiveApply } = input; + const { couponCode, discountPercent, flatDiscount, minOrder, productIds, applicableProducts, maxValue, validTill, maxLimitForUser, exclusiveApply } = input; - // Validation: ensure at least one discount type is provided if ((!discountPercent && !flatDiscount) || (discountPercent && flatDiscount)) { throw new Error("Either discountPercent or flatDiscount must be provided (but not both)"); } - // For reserved coupons, applicableUsers is not used, as it's redeemed by one user - - // Get staff user ID from auth middleware const staffUserId = ctx.staffUser?.id; if (!staffUserId) { throw new Error("Unauthorized"); } - // Generate secret code if not provided (use couponCode as base) let secretCode = couponCode || `SECRET${Date.now().toString().slice(-6)}${Math.random().toString(36).substring(2, 8).toUpperCase()}`; - // Check if secret code already exists - const existing = await db.query.reservedCoupons.findFirst({ - where: eq(reservedCoupons.secretCode, secretCode), - }); - + const existing = await couponDbService.getCouponByCode(secretCode); if (existing) { throw new Error("Secret code already exists"); } - const result = await db.insert(reservedCoupons).values({ + const coupon = await couponDbService.createReservedCoupon({ secretCode, couponCode: couponCode || `RESERVED${Date.now().toString().slice(-6)}`, - discountPercent: discountPercent?.toString(), - flatDiscount: flatDiscount?.toString(), - minOrder: minOrder?.toString(), - productIds, - maxValue: maxValue?.toString(), - validTill: validTill ? dayjs(validTill).toDate() : undefined, - maxLimitForUser, + discountPercent: discountPercent?.toString() || null, + flatDiscount: flatDiscount?.toString() || null, + minOrder: minOrder?.toString() || null, + productIds: productIds || null, + maxValue: maxValue?.toString() || null, + validTill: validTill ? dayjs(validTill).toDate() : null, + maxLimitForUser: maxLimitForUser || null, exclusiveApply: exclusiveApply || false, createdBy: staffUserId, - }).returning(); + }); - const coupon = result[0]; - - // Insert applicable products if provided if (applicableProducts && applicableProducts.length > 0) { - await db.insert(couponApplicableProducts).values( - applicableProducts.map(productId => ({ - couponId: coupon.id, - productId, - })) - ); + await couponDbService.addApplicableProducts(coupon.id, applicableProducts); } return coupon; @@ -593,27 +394,11 @@ export const couponRouter = router({ offset: z.number().min(0).default(0), })) .query(async ({ input }) => { - const { search, limit } = input; + const { search, limit, offset } = input; - let whereCondition = undefined; - if (search && search.trim()) { - whereCondition = or( - like(users.name, `%${search}%`), - like(users.mobile, `%${search}%`) - ); - } - - const userList = await db.query.users.findMany({ - where: whereCondition, - columns: { - id: true, - name: true, - mobile: true, - }, - limit: limit, - offset: input.offset, - orderBy: (users, { asc }) => [asc(users.name)], - }); + const userList = search + ? await couponDbService.getUsersBySearch(search, limit, offset) + : await couponDbService.getUsersByIds([]); return { users: userList.map(user => ({ @@ -624,88 +409,68 @@ export const couponRouter = router({ }; }), - createCoupon: protectedProcedure - .input(z.object({ - mobile: z.string().min(1, 'Mobile number is required'), - })) - .mutation(async ({ input, ctx }) => { - const { mobile } = input; + createCoupon: protectedProcedure + .input(z.object({ mobile: z.string().min(1, 'Mobile number is required') })) + .mutation(async ({ input, ctx }) => { + const { mobile } = input; - // Get staff user ID from auth middleware - const staffUserId = ctx.staffUser?.id; - if (!staffUserId) { - throw new Error("Unauthorized"); - } + const staffUserId = ctx.staffUser?.id; + if (!staffUserId) { + throw new Error("Unauthorized"); + } - // Clean mobile number (remove non-digits) - const cleanMobile = mobile.replace(/\D/g, ''); + const cleanMobile = mobile.replace(/\D/g, ''); - // Validate: exactly 10 digits - if (cleanMobile.length !== 10) { - throw new Error("Mobile number must be exactly 10 digits"); - } + if (cleanMobile.length !== 10) { + throw new Error("Mobile number must be exactly 10 digits"); + } - // Check if user exists, create if not - let user = await db.query.users.findFirst({ - where: eq(users.mobile, cleanMobile), + let user = await couponDbService.getUserByMobile(cleanMobile); + + if (!user) { + user = await couponDbService.createUser({ + name: null, + email: null, + mobile: cleanMobile, }); + } - if (!user) { - // Create new user - const [newUser] = await db.insert(users).values({ - name: null, - email: null, - mobile: cleanMobile, - }).returning(); - user = newUser; - } + const timestamp = Date.now().toString().slice(-6); + const random = Math.random().toString(36).substring(2, 6).toUpperCase(); + const couponCode = `MF${cleanMobile.slice(-4)}${timestamp}${random}`; - // Generate unique coupon code - const timestamp = Date.now().toString().slice(-6); - const random = Math.random().toString(36).substring(2, 6).toUpperCase(); - const couponCode = `MF${cleanMobile.slice(-4)}${timestamp}${random}`; + const existingCode = await couponDbService.getCouponByCode(couponCode); + if (existingCode) { + throw new Error("Generated coupon code already exists - please try again"); + } - // Check if coupon code already exists (very unlikely but safe) - const existingCode = await db.query.coupons.findFirst({ - where: eq(coupons.couponCode, couponCode), - }); + const coupon = await couponDbService.createCoupon({ + couponCode, + isUserBased: true, + discountPercent: "20", + minOrder: "1000", + maxValue: "500", + maxLimitForUser: 1, + isApplyForAll: false, + exclusiveApply: false, + createdBy: staffUserId, + validTill: dayjs().add(90, 'days').toDate(), + }); - if (existingCode) { - throw new Error("Generated coupon code already exists - please try again"); - } + await couponDbService.addApplicableUsers(coupon.id, [user.id]); - // Create the coupon - const [coupon] = await db.insert(coupons).values({ - couponCode, - isUserBased: true, - discountPercent: "20", // 20% discount - minOrder: "1000", // ₹1000 minimum order - maxValue: "500", // ₹500 maximum discount - maxLimitForUser: 1, // One-time use - isApplyForAll: false, - exclusiveApply: false, - createdBy: staffUserId, - validTill: dayjs().add(90, 'days').toDate(), // 90 days from now - }).returning(); - - // Associate coupon with user - await db.insert(couponApplicableUsers).values({ - couponId: coupon.id, + return { + success: true, + coupon: { + id: coupon.id, + couponCode: coupon.couponCode, userId: user.id, - }); - - return { - success: true, - coupon: { - id: coupon.id, - couponCode: coupon.couponCode, - userId: user.id, - userMobile: user.mobile, - discountPercent: 20, - minOrder: 1000, - maxValue: 500, - maxLimitForUser: 1, - }, - }; - }), + userMobile: user.mobile, + discountPercent: 20, + minOrder: 1000, + maxValue: 500, + maxLimitForUser: 1, + }, + }; + }), }); diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/order.ts b/apps/backend/src/trpc/apis/admin-apis/apis/order.ts index 707f642..b910d4a 100644 --- a/apps/backend/src/trpc/apis/admin-apis/apis/order.ts +++ b/apps/backend/src/trpc/apis/admin-apis/apis/order.ts @@ -1,28 +1,15 @@ -import { router, protectedProcedure } from "@/src/trpc/trpc-index" -import { z } from "zod"; -import { db } from "@/src/db/db_index" -import { - orders, - orderItems, - orderStatus, - users, - addresses, - refunds, - coupons, - couponUsage, - complaints, - payments, -} from "@/src/db/schema"; -import { eq, and, gte, lt, desc, SQL, inArray } from "drizzle-orm"; -import dayjs from "dayjs"; -import utc from "dayjs/plugin/utc"; -import { ApiError } from "@/src/lib/api-error" +import { router, protectedProcedure } from '@/src/trpc/trpc-index' +import { z } from 'zod' +import dayjs from 'dayjs' +import utc from 'dayjs/plugin/utc' +import { ApiError } from '@/src/lib/api-error' import { sendOrderPackagedNotification, sendOrderDeliveredNotification, -} from "@/src/lib/notif-job"; -import { publishCancellation } from "@/src/lib/post-order-handler" -import { getMultipleUserNegativityScores } from "@/src/stores/user-negativity-store" +} from '@/src/lib/notif-job' +import { publishCancellation } from '@/src/lib/post-order-handler' +import { getMultipleUserNegativityScores } from '@/src/stores/user-negativity-store' +import { orderDbService } from '@/src/trpc/apis/admin-apis/dataAccessors/main' const updateOrderNotesSchema = z.object({ orderId: z.number(), @@ -89,19 +76,13 @@ export const orderRouter = router({ .mutation(async ({ input }) => { const { orderId, adminNotes } = input; - const result = await db - .update(orders) - .set({ - adminNotes: adminNotes || null, - }) - .where(eq(orders.id, orderId)) - .returning(); + const result = await orderDbService.updateOrderNotes(orderId, adminNotes || null) - if (result.length === 0) { + if (!result) { throw new Error("Order not found"); } - return result[0]; + return result; }), getFullOrder: protectedProcedure @@ -109,34 +90,14 @@ export const orderRouter = router({ .query(async ({ input }) => { const { orderId } = input; - const orderData = await db.query.orders.findFirst({ - where: eq(orders.id, orderId), - with: { - user: true, - address: true, - slot: true, - orderItems: { - with: { - product: { - with: { - unit: true, - }, - }, - }, - }, - payment: true, - paymentInfo: true, - }, - }); + const orderData = await orderDbService.getOrderWithRelations(orderId) if (!orderData) { throw new Error("Order not found"); } // Get order status separately - const statusRecord = await db.query.orderStatus.findFirst({ - where: eq(orderStatus.orderId, orderId), - }); + const statusRecord = await orderDbService.getOrderStatusByOrderId(orderId) let status: "pending" | "delivered" | "cancelled" = "pending"; if (statusRecord?.isCancelled) { @@ -148,9 +109,7 @@ export const orderRouter = router({ // Get refund details if order is cancelled let refund = null; if (status === "cancelled") { - refund = await db.query.refunds.findFirst({ - where: eq(refunds.orderId, orderId), - }); + refund = await orderDbService.getRefundByOrderId(orderId) } return { @@ -220,39 +179,14 @@ export const orderRouter = router({ const { orderId } = input; // Single optimized query with all relations - const orderData = await db.query.orders.findFirst({ - where: eq(orders.id, orderId), - with: { - user: true, - address: true, - slot: true, - orderItems: { - with: { - product: { - with: { - unit: true, - }, - }, - }, - }, - payment: true, - paymentInfo: true, - orderStatus: true, // Include in main query - refunds: true, // Include in main query - }, - }); + const orderData = await orderDbService.getOrderWithDetails(orderId) if (!orderData) { throw new Error("Order not found"); } // Get coupon usage for this specific order using new orderId field - const couponUsageData = await db.query.couponUsage.findMany({ - where: eq(couponUsage.orderId, orderData.id), // Use new orderId field - with: { - coupon: true, - }, - }); + const couponUsageData = await orderDbService.getCouponUsageByOrderId(orderData.id) let couponData = null; if (couponUsageData.length > 0) { @@ -388,27 +322,15 @@ export const orderRouter = router({ const { orderId, isPackaged } = input; // Update all order items to the specified packaged state - await db - .update(orderItems) - .set({ is_packaged: isPackaged }) - .where(eq(orderItems.orderId, parseInt(orderId))); + const parsedOrderId = parseInt(orderId) + await orderDbService.updateOrderItemsPackaged(parsedOrderId, isPackaged) - // Also update the order status table for backward compatibility - if (!isPackaged) { - await db - .update(orderStatus) - .set({ isPackaged, isDelivered: false }) - .where(eq(orderStatus.orderId, parseInt(orderId))); - } else { - await db - .update(orderStatus) - .set({ isPackaged }) - .where(eq(orderStatus.orderId, parseInt(orderId))); - } + const currentStatus = await orderDbService.getOrderStatusByOrderId(parsedOrderId) + const isDelivered = !isPackaged ? false : currentStatus?.isDelivered || false - const order = await db.query.orders.findFirst({ - where: eq(orders.id, parseInt(orderId)), - }); + await orderDbService.updateOrderStatusPackaged(parsedOrderId, isPackaged, isDelivered) + + const order = await orderDbService.getOrderById(parsedOrderId) if (order) await sendOrderPackagedNotification(order.userId, orderId); return { success: true }; @@ -419,14 +341,10 @@ export const orderRouter = router({ .mutation(async ({ input }) => { const { orderId, isDelivered } = input; - await db - .update(orderStatus) - .set({ isDelivered }) - .where(eq(orderStatus.orderId, parseInt(orderId))); + const parsedOrderId = parseInt(orderId) + await orderDbService.updateOrderStatusDelivered(parsedOrderId, isDelivered) - const order = await db.query.orders.findFirst({ - where: eq(orders.id, parseInt(orderId)), - }); + const order = await orderDbService.getOrderById(parsedOrderId) if (order) await sendOrderDeliveredNotification(order.userId, orderId); return { success: true }; @@ -438,9 +356,7 @@ export const orderRouter = router({ const { orderItemId, isPackaged, isPackageVerified } = input; // Validate that orderItem exists - const orderItem = await db.query.orderItems.findFirst({ - where: eq(orderItems.id, orderItemId), - }); + const orderItem = await orderDbService.getOrderItemById(orderItemId) if (!orderItem) { throw new ApiError("Order item not found", 404); @@ -456,10 +372,7 @@ export const orderRouter = router({ } // Update the order item - await db - .update(orderItems) - .set(updateData) - .where(eq(orderItems.id, orderItemId)); + await orderDbService.updateOrderItem(orderItemId, updateData) return { success: true }; }), @@ -469,9 +382,7 @@ export const orderRouter = router({ .mutation(async ({ input }) => { const { orderId } = input; - const order = await db.query.orders.findFirst({ - where: eq(orders.id, orderId), - }); + const order = await orderDbService.getOrderById(orderId) if (!order) { throw new Error('Order not found'); @@ -481,13 +392,7 @@ export const orderRouter = router({ const currentTotalAmount = parseFloat(order.totalAmount?.toString() || '0'); const newTotalAmount = currentTotalAmount - currentDeliveryCharge; - await db - .update(orders) - .set({ - deliveryCharge: '0', - totalAmount: newTotalAmount.toString() - }) - .where(eq(orders.id, orderId)); + await orderDbService.removeDeliveryCharge(orderId, newTotalAmount.toString()) return { success: true, message: 'Delivery charge removed' }; }), @@ -497,27 +402,10 @@ export const orderRouter = router({ .query(async ({ input }) => { const { slotId } = input; - const slotOrders = await db.query.orders.findMany({ - where: eq(orders.slotId, parseInt(slotId)), - with: { - user: true, - address: true, - slot: true, - orderItems: { - with: { - product: { - with: { - unit: true, - }, - }, - }, - }, - orderStatus: true, - }, - }); + const slotOrders = await orderDbService.getOrdersBySlotId(parseInt(slotId)) const filteredOrders = slotOrders.filter((order) => { - const statusRecord = order.orderStatus[0]; + const statusRecord = order.orderStatus?.[0]; return ( order.isCod || (statusRecord && statusRecord.paymentStatus === "success") @@ -525,7 +413,7 @@ export const orderRouter = router({ }); const formattedOrders = filteredOrders.map((order) => { - const statusRecord = order.orderStatus[0]; // assuming one status per order + const statusRecord = order.orderStatus?.[0]; // assuming one status per order let status: "pending" | "delivered" | "cancelled" = "pending"; if (statusRecord?.isCancelled) { status = "cancelled"; @@ -582,39 +470,14 @@ export const orderRouter = router({ const start = dayjs().startOf("day").toDate(); const end = dayjs().endOf("day").toDate(); - let whereCondition = and( - gte(orders.createdAt, start), - lt(orders.createdAt, end) - ); - - if (slotId) { - whereCondition = and( - whereCondition, - eq(orders.slotId, parseInt(slotId)) - ); - } - - const todaysOrders = await db.query.orders.findMany({ - where: whereCondition, - with: { - user: true, - address: true, - slot: true, - orderItems: { - with: { - product: { - with: { - unit: true, - }, - }, - }, - }, - orderStatus: true, - }, - }); + const todaysOrders = await orderDbService.getOrdersByDateRange( + start, + end, + slotId ? parseInt(slotId) : undefined + ) const filteredOrders = todaysOrders.filter((order) => { - const statusRecord = order.orderStatus[0]; + const statusRecord = order.orderStatus?.[0]; return ( order.isCod || (statusRecord && statusRecord.paymentStatus === "success") @@ -622,7 +485,7 @@ export const orderRouter = router({ }); const formattedOrders = filteredOrders.map((order) => { - const statusRecord = order.orderStatus[0]; // assuming one status per order + const statusRecord = order.orderStatus?.[0]; // assuming one status per order let status: "pending" | "delivered" | "cancelled" = "pending"; if (statusRecord?.isCancelled) { status = "cancelled"; @@ -677,16 +540,9 @@ export const orderRouter = router({ .mutation(async ({ input }) => { const { addressId, latitude, longitude } = input; - const result = await db - .update(addresses) - .set({ - adminLatitude: latitude, - adminLongitude: longitude, - }) - .where(eq(addresses.id, addressId)) - .returning(); + const result = await orderDbService.updateAddressCoords(addressId, latitude, longitude) - if (result.length === 0) { + if (!result) { throw new ApiError("Address not found", 404); } @@ -707,78 +563,15 @@ export const orderRouter = router({ flashDeliveryFilter, } = input; - let whereCondition: SQL | undefined = eq(orders.id, orders.id); // always true - if (cursor) { - whereCondition = and(whereCondition, lt(orders.id, cursor)); - } - if (slotId) { - whereCondition = and(whereCondition, eq(orders.slotId, slotId)); - } - if (packagedFilter === "packaged") { - whereCondition = and( - whereCondition, - eq(orderStatus.isPackaged, true) - ); - } else if (packagedFilter === "not_packaged") { - whereCondition = and( - whereCondition, - eq(orderStatus.isPackaged, false) - ); - } - if (deliveredFilter === "delivered") { - whereCondition = and( - whereCondition, - eq(orderStatus.isDelivered, true) - ); - } else if (deliveredFilter === "not_delivered") { - whereCondition = and( - whereCondition, - eq(orderStatus.isDelivered, false) - ); - } - if (cancellationFilter === "cancelled") { - whereCondition = and( - whereCondition, - eq(orderStatus.isCancelled, true) - ); - } else if (cancellationFilter === "not_cancelled") { - whereCondition = and( - whereCondition, - eq(orderStatus.isCancelled, false) - ); - } - if (flashDeliveryFilter === "flash") { - whereCondition = and( - whereCondition, - eq(orders.isFlashDelivery, true) - ); - } else if (flashDeliveryFilter === "regular") { - whereCondition = and( - whereCondition, - eq(orders.isFlashDelivery, false) - ); - } - - const allOrders = await db.query.orders.findMany({ - where: whereCondition, - orderBy: desc(orders.createdAt), - limit: limit + 1, // fetch one extra to check if there's more - with: { - user: true, - address: true, - slot: true, - orderItems: { - with: { - product: { - with: { - unit: true, - }, - }, - }, - }, - orderStatus: true, - }, - }); + const allOrders = await orderDbService.getAllOrdersWithFilters({ + cursor, + limit, + slotId, + packagedFilter, + deliveredFilter, + cancellationFilter, + flashDeliveryFilter, + }) const hasMore = allOrders.length > limit; const ordersToReturn = hasMore ? allOrders.slice(0, limit) : allOrders; @@ -787,7 +580,7 @@ export const orderRouter = router({ const negativityScores = await getMultipleUserNegativityScores(userIds); const filteredOrders = ordersToReturn.filter((order) => { - const statusRecord = order.orderStatus[0]; + const statusRecord = order.orderStatus?.[0]; return ( order.isCod || (statusRecord && statusRecord.paymentStatus === "success") @@ -795,7 +588,7 @@ export const orderRouter = router({ }); const formattedOrders = filteredOrders.map((order) => { - const statusRecord = order.orderStatus[0]; + const statusRecord = order.orderStatus?.[0]; let status: "pending" | "delivered" | "cancelled" = "pending"; if (statusRecord?.isCancelled) { status = "cancelled"; @@ -868,21 +661,7 @@ export const orderRouter = router({ .mutation(async ({ input }) => { const slotIds = input.slotIds; - const ordersList = await db.query.orders.findMany({ - where: inArray(orders.slotId, slotIds), - with: { - orderItems: { - with: { - product: true - } - }, - couponUsages: { - with: { - coupon: true - } - }, - } - }); + const ordersList = await orderDbService.getOrdersBySlotIds(slotIds) const processedOrdersData = ordersList.map((order) => { @@ -921,19 +700,19 @@ export const orderRouter = router({ }) const updatedOrderIds: number[] = []; - await db.transaction(async (tx) => { - for (const { order, updatedOrderItems, newTotal } of processedOrdersData) { - await tx.update(orders).set({ totalAmount: newTotal.toString() }).where(eq(orders.id, order.id)); - updatedOrderIds.push(order.id); - - for (const item of updatedOrderItems) { - await tx.update(orderItems).set({ + await orderDbService.updateOrdersAndItemsInTransaction( + processedOrdersData.map((entry) => ({ + orderId: entry.order.id, + totalAmount: entry.newTotal.toString(), + items: entry.updatedOrderItems.map((item) => ({ + id: item.id, price: item.price, - discountedPrice: item.discountedPrice - }).where(eq(orderItems.id, item.id)); - } - } - }); + discountedPrice: item.discountedPrice || item.price, + })), + })) + ) + + processedOrdersData.forEach((entry) => updatedOrderIds.push(entry.order.id)) return { success: true, updatedOrders: updatedOrderIds, message: `Rebalanced ${updatedOrderIds.length} orders.` }; }), @@ -946,12 +725,7 @@ export const orderRouter = router({ .mutation(async ({ input }) => { const { orderId, reason } = input; - const order = await db.query.orders.findFirst({ - where: eq(orders.id, orderId), - with: { - orderStatus: true, - }, - }); + const order = await orderDbService.getOrderWithStatus(orderId) if (!order) { throw new ApiError("Order not found", 404); @@ -970,28 +744,13 @@ export const orderRouter = router({ throw new ApiError("Cannot cancel delivered order", 400); } - const result = await db.transaction(async (tx) => { - await tx - .update(orderStatus) - .set({ - isCancelled: true, - isCancelledByAdmin: true, - cancelReason: reason, - cancellationAdminNotes: reason, - cancellationReviewed: true, - cancellationReviewedAt: new Date(), - }) - .where(eq(orderStatus.id, status.id)); + await orderDbService.cancelOrderStatus(status.id, reason) - const refundStatus = order.isCod ? "na" : "pending"; + const refundStatus = order.isCod ? 'na' : 'pending' - await tx.insert(refunds).values({ - orderId: order.id, - refundStatus, - }); + await orderDbService.createRefund(order.id, refundStatus) - return { orderId: order.id, userId: order.userId }; - }); + const result = { orderId: order.id, userId: order.userId } // Publish to Redis for Telegram notification await publishCancellation(result.orderId, 'admin', reason); @@ -1005,14 +764,5 @@ export const orderRouter = router({ type RefundStatus = "success" | "pending" | "failed" | "none" | "na"; export async function deleteOrderById(orderId: number): Promise { - await db.transaction(async (tx) => { - await tx.delete(orderItems).where(eq(orderItems.orderId, orderId)); - await tx.delete(orderStatus).where(eq(orderStatus.orderId, orderId)); - await tx.delete(payments).where(eq(payments.orderId, orderId)); - await tx.delete(refunds).where(eq(refunds.orderId, orderId)); - await tx.delete(couponUsage).where(eq(couponUsage.orderId, orderId)); - await tx.delete(complaints).where(eq(complaints.orderId, orderId)); - await tx.delete(orders).where(eq(orders.id, orderId)); - }); + await orderDbService.deleteOrderById(orderId) } - diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/payments.ts b/apps/backend/src/trpc/apis/admin-apis/apis/payments.ts index 51de5fb..a19b26e 100644 --- a/apps/backend/src/trpc/apis/admin-apis/apis/payments.ts +++ b/apps/backend/src/trpc/apis/admin-apis/apis/payments.ts @@ -1,15 +1,7 @@ import { router, protectedProcedure } from "@/src/trpc/trpc-index" import { z } from "zod"; -import { db } from "@/src/db/db_index" -import { - orders, - orderStatus, - payments, - refunds, -} from "@/src/db/schema"; -import { and, eq } from "drizzle-orm"; import { ApiError } from "@/src/lib/api-error" -import { RazorpayPaymentService } from "@/src/lib/payments-utils" +import { refundDbService } from '@/src/trpc/apis/admin-apis/dataAccessors/main' const initiateRefundSchema = z .object({ @@ -37,18 +29,14 @@ export const adminPaymentsRouter = router({ const { orderId, refundPercent, refundAmount } = input; // Validate order exists - const order = await db.query.orders.findFirst({ - where: eq(orders.id, orderId), - }); + const order = await refundDbService.getOrderById(orderId); if (!order) { throw new ApiError("Order not found", 404); } // Check if order is paid - const orderStatusRecord = await db.query.orderStatus.findFirst({ - where: eq(orderStatus.orderId, orderId), - }); + const orderStatusRecord = await refundDbService.getOrderStatusByOrderId(orderId); if(order.isCod) { throw new ApiError("Order is a Cash On Delivery. Not eligible for refund") @@ -76,59 +64,36 @@ export const adminPaymentsRouter = router({ throw new ApiError("Invalid refund parameters", 400); } - let razorpayRefund = null; - let merchantRefundId = null; + let merchantRefundId = 'xxx'; //temporary suppressal - // Get payment record for online payments - const payment = await db.query.payments.findFirst({ - where: and( - eq(payments.orderId, orderId), - eq(payments.status, "success") - ), - }); + // Get payment record for online payments + const payment = await refundDbService.getSuccessfulPaymentByOrderId(orderId); - if (!payment || payment.status !== "success") { - throw new ApiError("Payment not found or not successful", 404); - } - - const payload = payment.payload as any; - // Initiate Razorpay refund - razorpayRefund = await RazorpayPaymentService.initiateRefund( - payload.payment_id, - Math.round(calculatedRefundAmount * 100) // Convert to paisa - ); - merchantRefundId = razorpayRefund.id; - - + if (!payment || payment.status !== "success") { + throw new ApiError("Payment not found or not successful", 404); + } // Check if refund already exists for this order - const existingRefund = await db.query.refunds.findFirst({ - where: eq(refunds.orderId, orderId), - }); + const existingRefund = await refundDbService.getRefundByOrderId(orderId); const refundStatus = "initiated"; if (existingRefund) { // Update existing refund - await db - .update(refunds) - .set({ - refundAmount: calculatedRefundAmount.toString(), - refundStatus, - merchantRefundId, - refundProcessedAt: order.isCod ? new Date() : null, - }) - .where(eq(refunds.id, existingRefund.id)); + await refundDbService.updateRefund(existingRefund.id, { + refundAmount: calculatedRefundAmount.toString(), + refundStatus, + merchantRefundId, + refundProcessedAt: order.isCod ? new Date() : null, + }); } else { // Insert new refund - await db - .insert(refunds) - .values({ - orderId, - refundAmount: calculatedRefundAmount.toString(), - refundStatus, - merchantRefundId, - }); + await refundDbService.createRefund({ + orderId, + refundAmount: calculatedRefundAmount.toString(), + refundStatus, + merchantRefundId, + }); } return { diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/product-availability-schedules.ts b/apps/backend/src/trpc/apis/admin-apis/apis/product-availability-schedules.ts new file mode 100644 index 0000000..ebfbbd3 --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/apis/product-availability-schedules.ts @@ -0,0 +1,128 @@ +import { router, protectedProcedure } from '@/src/trpc/trpc-index' +import { z } from 'zod'; +import { refreshScheduleJobs } from '@/src/lib/automatedJobs'; +import { scheduleDbService } from '@/src/trpc/apis/admin-apis/dataAccessors/main' + +const createScheduleSchema = z.object({ + scheduleName: z.string().min(1, "Schedule name is required"), + time: z.string().min(1, "Time is required").regex(/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/, "Invalid time format. Use HH:MM"), + action: z.enum(['in', 'out']), + productIds: z.array(z.number().int().positive()).min(1, "At least one product is required"), + groupIds: z.array(z.number().int().positive()).default([]), +}); + +const updateScheduleSchema = z.object({ + id: z.number().int().positive(), + updates: createScheduleSchema.partial().extend({ + scheduleName: z.string().min(1).optional(), + productIds: z.array(z.number().int().positive()).optional(), + groupIds: z.array(z.number().int().positive()).optional(), + }), +}); + +export const productAvailabilitySchedulesRouter = router({ + create: protectedProcedure + .input(createScheduleSchema) + .mutation(async ({ input, ctx }) => { + const { scheduleName, time, action, productIds, groupIds } = input; + + // Get staff user ID from auth middleware + const staffUserId = ctx.staffUser?.id; + if (!staffUserId) { + throw new Error("Unauthorized"); + } + + // Check if schedule name already exists + const existingSchedule = await scheduleDbService.getScheduleByName(scheduleName); + if (existingSchedule) { + throw new Error("Schedule name already exists"); + } + + // Create schedule with arrays + const scheduleResult = await scheduleDbService.createSchedule({ + scheduleName, + time, + action, + productIds, + groupIds, + }); + + // Refresh cron jobs to include new schedule + await refreshScheduleJobs(); + + return scheduleResult; + }), + + getAll: protectedProcedure + .query(async () => { + const schedules = await scheduleDbService.getAllSchedules(); + + return schedules.map(schedule => ({ + ...schedule, + productCount: schedule.productIds.length, + groupCount: schedule.groupIds.length, + })); + }), + + getById: protectedProcedure + .input(z.object({ id: z.number().int().positive() })) + .query(async ({ input }) => { + const { id } = input; + + const schedule = await scheduleDbService.getScheduleById(id); + + if (!schedule) { + throw new Error("Schedule not found"); + } + + return schedule; + }), + + update: protectedProcedure + .input(updateScheduleSchema) + .mutation(async ({ input }) => { + const { id, updates } = input; + + // Check if schedule exists + const existingSchedule = await scheduleDbService.getScheduleById(id); + if (!existingSchedule) { + throw new Error("Schedule not found"); + } + + // Check schedule name uniqueness if being updated + if (updates.scheduleName && updates.scheduleName !== existingSchedule.scheduleName) { + const duplicateSchedule = await scheduleDbService.getScheduleByName(updates.scheduleName); + if (duplicateSchedule) { + throw new Error("Schedule name already exists"); + } + } + + // Update schedule + const updateData: any = {}; + if (updates.scheduleName !== undefined) updateData.scheduleName = updates.scheduleName; + if (updates.time !== undefined) updateData.time = updates.time; + if (updates.action !== undefined) updateData.action = updates.action; + if (updates.productIds !== undefined) updateData.productIds = updates.productIds; + if (updates.groupIds !== undefined) updateData.groupIds = updates.groupIds; + + const result = await scheduleDbService.updateSchedule(id, updateData); + + // Refresh cron jobs to reflect changes + await refreshScheduleJobs(); + + return result; + }), + + delete: protectedProcedure + .input(z.object({ id: z.number().int().positive() })) + .mutation(async ({ input }) => { + const { id } = input; + + await scheduleDbService.deleteSchedule(id); + + // Refresh cron jobs to remove deleted schedule + await refreshScheduleJobs(); + + return { message: "Schedule deleted successfully" }; + }), +}); diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/product.ts b/apps/backend/src/trpc/apis/admin-apis/apis/product.ts index df77159..3f2fda4 100644 --- a/apps/backend/src/trpc/apis/admin-apis/apis/product.ts +++ b/apps/backend/src/trpc/apis/admin-apis/apis/product.ts @@ -1,13 +1,11 @@ import { router, protectedProcedure } from '@/src/trpc/trpc-index' import { z } from 'zod'; -import { db } from '@/src/db/db_index' -import { productInfo, units, specialDeals, productSlots, productTags, productReviews, users, productGroupInfo, productGroupMembership } from '@/src/db/schema' -import { eq, and, inArray, desc, sql } from 'drizzle-orm'; +import { productDbService } from '@/src/trpc/apis/admin-apis/dataAccessors/main' import { ApiError } from '@/src/lib/api-error' -import { imageUploadS3, generateSignedUrlsFromS3Urls, getOriginalUrlFromSignedUrl, claimUploadUrl } from '@/src/lib/s3-client' +import { scaffoldAssetUrl, claimUploadUrl } from '@/src/lib/s3-client' import { deleteS3Image } from '@/src/lib/delete-image' -import type { SpecialDeal } from '@/src/db/types' -import { initializeAllStores } from '@/src/stores/store-initializer' +import { scheduleStoreInitialization } from '@/src/stores/store-initializer' + type CreateDeal = { quantity: number; @@ -18,19 +16,13 @@ type CreateDeal = { export const productRouter = router({ getProducts: protectedProcedure .query(async ({ ctx }) => { - const products = await db.query.productInfo.findMany({ - orderBy: productInfo.name, - with: { - unit: true, - store: true, - }, - }); + const products = await productDbService.getAllProducts(); // Generate signed URLs for all product images const productsWithSignedUrls = await Promise.all( products.map(async (product) => ({ ...product, - images: await generateSignedUrlsFromS3Urls((product.images as string[]) || []), + images: scaffoldAssetUrl((product.images as string[]) || []), })) ); @@ -47,35 +39,22 @@ export const productRouter = router({ .query(async ({ input, ctx }) => { const { id } = input; - const product = await db.query.productInfo.findFirst({ - where: eq(productInfo.id, id), - with: { - unit: true, - }, - }); + const product = await productDbService.getProductById(id); if (!product) { throw new ApiError("Product not found", 404); } // Fetch special deals for this product - const deals = await db.query.specialDeals.findMany({ - where: eq(specialDeals.productId, id), - orderBy: specialDeals.quantity, - }); + const deals = await productDbService.getDealsByProductId(id); // Fetch associated tags for this product - const productTagsData = await db.query.productTags.findMany({ - where: eq(productTags.productId, id), - with: { - tag: true, - }, - }); + const productTagsData = await productDbService.getTagsByProductId(id); // Generate signed URLs for product images const productWithSignedUrls = { ...product, - images: await generateSignedUrlsFromS3Urls((product.images as string[]) || []), + images: scaffoldAssetUrl((product.images as string[]) || []), deals, tags: productTagsData.map(pt => pt.tag), }; @@ -92,23 +71,231 @@ export const productRouter = router({ .mutation(async ({ input, ctx }) => { const { id } = input; - const [deletedProduct] = await db - .delete(productInfo) - .where(eq(productInfo.id, id)) - .returning(); + const deletedProduct = await productDbService.deleteProduct(id); if (!deletedProduct) { throw new ApiError("Product not found", 404); } // Reinitialize stores to reflect changes - await initializeAllStores(); + scheduleStoreInitialization() return { message: "Product deleted successfully", }; }), + createProduct: protectedProcedure + .input(z.object({ + name: z.string().min(1), + shortDescription: z.string().optional(), + longDescription: z.string().optional(), + unitId: z.number(), + storeId: z.number(), + price: z.number(), + marketPrice: z.number().optional(), + incrementStep: z.number().default(1), + productQuantity: z.number().default(1), + isSuspended: z.boolean().default(false), + isFlashAvailable: z.boolean().default(false), + flashPrice: z.number().optional(), + deals: z.array(z.object({ + quantity: z.number(), + price: z.number(), + validTill: z.string(), + })).optional(), + tagIds: z.array(z.number()).optional(), + imageKeys: z.array(z.string()).optional(), + })) + .mutation(async ({ input }) => { + const { + name, shortDescription, longDescription, unitId, storeId, + price, marketPrice, incrementStep, productQuantity, + isSuspended, isFlashAvailable, flashPrice, + deals, tagIds, imageKeys + } = input; + + // Validation + if (!name || !unitId || !storeId || !price) { + throw new ApiError("Name, unitId, storeId, and price are required", 400); + } + + // Check for duplicate name + const allProducts = await productDbService.getAllProducts(); + const existingProduct = allProducts.find(p => p.name === name.trim()); + if (existingProduct) { + throw new ApiError("A product with this name already exists", 400); + } + + // Check if unit exists + const unit = await productDbService.getUnitById(unitId); + if (!unit) { + throw new ApiError("Invalid unit ID", 400); + } + + console.log(imageKeys) + const newProduct = await productDbService.createProduct({ + name: name.trim(), + shortDescription, + longDescription, + unitId, + storeId, + price: price.toString(), + marketPrice: marketPrice?.toString(), + incrementStep, + productQuantity, + isSuspended, + isFlashAvailable, + flashPrice: flashPrice?.toString(), + images: imageKeys || [], + }); + + // Handle deals + if (deals && deals.length > 0) { + const dealInserts = deals.map(deal => ({ + productId: newProduct.id, + quantity: deal.quantity.toString(), + price: deal.price.toString(), + validTill: new Date(deal.validTill), + })); + await productDbService.createDeals(dealInserts); + } + + // Handle tags + if (tagIds && tagIds.length > 0) { + const tagAssociations = tagIds.map(tagId => ({ + productId: newProduct.id, + tagId, + })); + await productDbService.createTagAssociations(tagAssociations); + } + + // Claim upload URLs + if (imageKeys && imageKeys.length > 0) { + for (const key of imageKeys) { + try { + await claimUploadUrl(key); + } catch (e) { + console.warn("Failed to claim upload URL for key:", key, e); + } + } + } + + scheduleStoreInitialization(); + + return { + product: newProduct, + message: "Product created successfully", + }; + }), + + updateProduct: protectedProcedure + .input(z.object({ + id: z.number(), + name: z.string().min(1).optional(), + shortDescription: z.string().optional(), + longDescription: z.string().optional(), + unitId: z.number().optional(), + storeId: z.number().optional(), + price: z.number().optional(), + marketPrice: z.number().optional(), + incrementStep: z.number().optional(), + productQuantity: z.number().optional(), + isSuspended: z.boolean().optional(), + isFlashAvailable: z.boolean().optional(), + flashPrice: z.number().optional(), + deals: z.array(z.object({ + quantity: z.number(), + price: z.number(), + validTill: z.string(), + })).optional(), + tagIds: z.array(z.number()).optional(), + newImageKeys: z.array(z.string()).optional(), + imagesToDelete: z.array(z.string()).optional(), + })) + .mutation(async ({ input }) => { + const { id, newImageKeys, imagesToDelete, deals, tagIds, ...updateData } = input; + + // Get current product + const currentProduct = await productDbService.getProductById(id); + if (!currentProduct) { + throw new ApiError("Product not found", 404); + } + + // Handle image deletions + let currentImages = (currentProduct.images as string[]) || []; + if (imagesToDelete && imagesToDelete.length > 0) { + for (const imageUrl of imagesToDelete) { + try { + await deleteS3Image(imageUrl); + } catch (e) { + console.error("Failed to delete image:", imageUrl, e); + } + } + currentImages = currentImages.filter(img => { + // imagesToDelete.includes(img) + const isRemoved = imagesToDelete.some(item => item.includes(img)); + return !isRemoved; + }); + } + + // Add new images + if (newImageKeys && newImageKeys.length > 0) { + currentImages = [...currentImages, ...newImageKeys]; + + for (const key of newImageKeys) { + try { + await claimUploadUrl(key); + } catch (e) { + console.warn("Failed to claim upload URL for key:", key, e); + } + } + } + + // Update product - convert numeric fields to strings for PostgreSQL numeric type + const { price, marketPrice, flashPrice, ...otherData } = updateData; + const updatedProduct = await productDbService.updateProduct(id, { + ...otherData, + ...(price !== undefined && { price: price.toString() }), + ...(marketPrice !== undefined && { marketPrice: marketPrice.toString() }), + ...(flashPrice !== undefined && { flashPrice: flashPrice.toString() }), + images: currentImages, + }); + + // Handle deals update + if (deals !== undefined) { + await productDbService.deleteDealsByProductId(id); + if (deals.length > 0) { + const dealInserts = deals.map(deal => ({ + productId: id, + quantity: deal.quantity.toString(), + price: deal.price.toString(), + validTill: new Date(deal.validTill), + })); + await productDbService.createDeals(dealInserts); + } + } + + // Handle tags update + if (tagIds !== undefined) { + await productDbService.deleteTagAssociationsByProductId(id); + if (tagIds.length > 0) { + const tagAssociations = tagIds.map(tagId => ({ + productId: id, + tagId, + })); + await productDbService.createTagAssociations(tagAssociations); + } + } + + scheduleStoreInitialization(); + + return { + product: updatedProduct, + message: "Product updated successfully", + }; + }), + toggleOutOfStock: protectedProcedure .input(z.object({ id: z.number(), @@ -116,24 +303,18 @@ export const productRouter = router({ .mutation(async ({ input, ctx }) => { const { id } = input; - const product = await db.query.productInfo.findFirst({ - where: eq(productInfo.id, id), - }); + const product = await productDbService.getProductById(id); if (!product) { throw new ApiError("Product not found", 404); } - const [updatedProduct] = await db - .update(productInfo) - .set({ - isOutOfStock: !product.isOutOfStock, - }) - .where(eq(productInfo.id, id)) - .returning(); + const updatedProduct = await productDbService.updateProduct(id, { + isOutOfStock: !product.isOutOfStock, + }); // Reinitialize stores to reflect changes - await initializeAllStores(); + scheduleStoreInitialization() return { product: updatedProduct, @@ -154,12 +335,7 @@ export const productRouter = router({ } // Get current associations - const currentAssociations = await db.query.productSlots.findMany({ - where: eq(productSlots.slotId, parseInt(slotId)), - columns: { - productId: true, - }, - }); + const currentAssociations = await productDbService.getProductSlotsBySlotId(parseInt(slotId)); const currentProductIds = currentAssociations.map(assoc => assoc.productId); const newProductIds = productIds.map((id: string) => parseInt(id)); @@ -170,26 +346,20 @@ export const productRouter = router({ // Remove associations for products that are no longer selected if (productsToRemove.length > 0) { - await db.delete(productSlots).where( - and( - eq(productSlots.slotId, parseInt(slotId)), - inArray(productSlots.productId, productsToRemove) - ) - ); + for (const productId of productsToRemove) { + await productDbService.deleteProductSlot(parseInt(slotId), productId); + } } // Add associations for newly selected products if (productsToAdd.length > 0) { - const newAssociations = productsToAdd.map(productId => ({ - productId, - slotId: parseInt(slotId), - })); - - await db.insert(productSlots).values(newAssociations); + for (const productId of productsToAdd) { + await productDbService.createProductSlot(parseInt(slotId), productId); + } } // Reinitialize stores to reflect changes - await initializeAllStores(); + scheduleStoreInitialization() return { message: "Slot products updated successfully", @@ -205,12 +375,7 @@ export const productRouter = router({ .query(async ({ input, ctx }) => { const { slotId } = input; - const associations = await db.query.productSlots.findMany({ - where: eq(productSlots.slotId, parseInt(slotId)), - columns: { - productId: true, - }, - }); + const associations = await productDbService.getProductSlotsBySlotId(parseInt(slotId)); const productIds = associations.map(assoc => assoc.productId); @@ -235,13 +400,7 @@ export const productRouter = router({ } // Fetch all associations for the requested slots - const associations = await db.query.productSlots.findMany({ - where: inArray(productSlots.slotId, slotIds), - columns: { - slotId: true, - productId: true, - }, - }); + const associations = await productDbService.getProductSlotsBySlotIds(slotIds); // Group by slotId const result = associations.reduce((acc, assoc) => { @@ -271,40 +430,19 @@ export const productRouter = router({ .query(async ({ input }) => { const { productId, limit, offset } = input; - const reviews = await db - .select({ - id: productReviews.id, - reviewBody: productReviews.reviewBody, - ratings: productReviews.ratings, - imageUrls: productReviews.imageUrls, - reviewTime: productReviews.reviewTime, - adminResponse: productReviews.adminResponse, - adminResponseImages: productReviews.adminResponseImages, - userName: users.name, - }) - .from(productReviews) - .innerJoin(users, eq(productReviews.userId, users.id)) - .where(eq(productReviews.productId, productId)) - .orderBy(desc(productReviews.reviewTime)) - .limit(limit) - .offset(offset); + const reviews = await productDbService.getReviewsByProductId(productId, limit, offset); // Generate signed URLs for images const reviewsWithSignedUrls = await Promise.all( reviews.map(async (review) => ({ ...review, - signedImageUrls: await generateSignedUrlsFromS3Urls((review.imageUrls as string[]) || []), - signedAdminImageUrls: await generateSignedUrlsFromS3Urls((review.adminResponseImages as string[]) || []), + signedImageUrls: scaffoldAssetUrl((review.imageUrls as string[]) || []), + signedAdminImageUrls: scaffoldAssetUrl((review.adminResponseImages as string[]) || []), })) ); // Check if more reviews exist - const totalCountResult = await db - .select({ count: sql`count(*)` }) - .from(productReviews) - .where(eq(productReviews.productId, productId)); - - const totalCount = Number(totalCountResult[0].count); + const totalCount = await productDbService.getReviewCountByProductId(productId); const hasMore = offset + limit < totalCount; return { reviews: reviewsWithSignedUrls, hasMore }; @@ -320,14 +458,10 @@ export const productRouter = router({ .mutation(async ({ input }) => { const { reviewId, adminResponse, adminResponseImages, uploadUrls } = input; - const [updatedReview] = await db - .update(productReviews) - .set({ - adminResponse, - adminResponseImages, - }) - .where(eq(productReviews.id, reviewId)) - .returning(); + const updatedReview = await productDbService.updateReview(reviewId, { + adminResponse, + adminResponseImages, + }); if (!updatedReview) { throw new ApiError('Review not found', 404); @@ -335,7 +469,6 @@ export const productRouter = router({ // Claim upload URLs if (uploadUrls && uploadUrls.length > 0) { - // const { claimUploadUrl } = await import('@/src/lib/s3-client'); await Promise.all(uploadUrls.map(url => claimUploadUrl(url))); } @@ -344,22 +477,13 @@ export const productRouter = router({ getGroups: protectedProcedure .query(async ({ ctx }) => { - const groups = await db.query.productGroupInfo.findMany({ - with: { - memberships: { - with: { - product: true, - }, - }, - }, - orderBy: desc(productGroupInfo.createdAt), - }); + const groups = await productDbService.getAllGroups() as any[]; return { groups: groups.map(group => ({ ...group, - products: group.memberships.map(m => m.product), - productCount: group.memberships.length, + products: group.memberships?.map((m: any) => m.product) || [], + productCount: group.memberships?.length || 0, })), }; }), @@ -373,13 +497,10 @@ export const productRouter = router({ .mutation(async ({ input, ctx }) => { const { group_name, description, product_ids } = input; - const [newGroup] = await db - .insert(productGroupInfo) - .values({ - groupName: group_name, - description, - }) - .returning(); + const newGroup = await productDbService.createGroup({ + groupName: group_name, + description, + }); if (product_ids.length > 0) { const memberships = product_ids.map(productId => ({ @@ -387,11 +508,11 @@ export const productRouter = router({ groupId: newGroup.id, })); - await db.insert(productGroupMembership).values(memberships); + await productDbService.createGroupMemberships(memberships); } // Reinitialize stores to reflect changes - await initializeAllStores(); + scheduleStoreInitialization() return { group: newGroup, @@ -413,11 +534,7 @@ export const productRouter = router({ if (group_name !== undefined) updateData.groupName = group_name; if (description !== undefined) updateData.description = description; - const [updatedGroup] = await db - .update(productGroupInfo) - .set(updateData) - .where(eq(productGroupInfo.id, id)) - .returning(); + const updatedGroup = await productDbService.updateGroup(id, updateData); if (!updatedGroup) { throw new ApiError('Group not found', 404); @@ -425,7 +542,7 @@ export const productRouter = router({ if (product_ids !== undefined) { // Delete existing memberships - await db.delete(productGroupMembership).where(eq(productGroupMembership.groupId, id)); + await productDbService.deleteGroupMembershipsByGroupId(id); // Insert new memberships if (product_ids.length > 0) { @@ -434,12 +551,12 @@ export const productRouter = router({ groupId: id, })); - await db.insert(productGroupMembership).values(memberships); + await productDbService.createGroupMemberships(memberships); } } // Reinitialize stores to reflect changes - await initializeAllStores(); + scheduleStoreInitialization() return { group: updatedGroup, @@ -455,27 +572,24 @@ export const productRouter = router({ const { id } = input; // Delete memberships first - await db.delete(productGroupMembership).where(eq(productGroupMembership.groupId, id)); + await productDbService.deleteGroupMembershipsByGroupId(id); // Delete group - const [deletedGroup] = await db - .delete(productGroupInfo) - .where(eq(productGroupInfo.id, id)) - .returning(); + const deletedGroup = await productDbService.deleteGroup(id); if (!deletedGroup) { throw new ApiError('Group not found', 404); } - // Reinitialize stores to reflect changes - await initializeAllStores(); + // Reinitialize stores to reflect changes + scheduleStoreInitialization() - return { - message: 'Group deleted successfully', - }; - }), + return { + message: 'Group deleted successfully', + }; + }), - updateProductPrices: protectedProcedure + updateProductPrices: protectedProcedure .input(z.object({ updates: z.array(z.object({ productId: z.number(), @@ -494,41 +608,35 @@ export const productRouter = router({ // Validate that all productIds exist const productIds = updates.map(u => u.productId); - const existingProducts = await db.query.productInfo.findMany({ - where: inArray(productInfo.id, productIds), - columns: { id: true }, - }); + const allExist = await productDbService.validateProductIdsExist(productIds); - const existingIds = new Set(existingProducts.map(p => p.id)); - const invalidIds = productIds.filter(id => !existingIds.has(id)); - - if (invalidIds.length > 0) { - throw new ApiError(`Invalid product IDs: ${invalidIds.join(', ')}`, 400); + if (!allExist) { + throw new ApiError('Some product IDs are invalid', 400); } // Perform batch update - const updatePromises = updates.map(async (update) => { + const batchUpdates = updates.map(update => { const { productId, price, marketPrice, flashPrice, isFlashAvailable } = update; const updateData: any = {}; - if (price !== undefined) updateData.price = price; - if (marketPrice !== undefined) updateData.marketPrice = marketPrice; - if (flashPrice !== undefined) updateData.flashPrice = flashPrice; + if (price !== undefined) updateData.price = price.toString(); + if (marketPrice !== undefined) updateData.marketPrice = marketPrice?.toString(); + if (flashPrice !== undefined) updateData.flashPrice = flashPrice?.toString(); if (isFlashAvailable !== undefined) updateData.isFlashAvailable = isFlashAvailable; - return db - .update(productInfo) - .set(updateData) - .where(eq(productInfo.id, productId)); + return { + productId, + data: updateData, + }; }); - await Promise.all(updatePromises); + await productDbService.batchUpdateProducts(batchUpdates); - // Reinitialize stores to reflect changes - await initializeAllStores(); + // Reinitialize stores to reflect changes + scheduleStoreInitialization() - return { - message: `Updated prices for ${updates.length} product(s)`, - updatedCount: updates.length, - }; - }), - }); + return { + message: `Updated prices for ${updates.length} product(s)`, + updatedCount: updates.length, + }; + }), + }); diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/slots.ts b/apps/backend/src/trpc/apis/admin-apis/apis/slots.ts index 4e9ef18..41d1ab1 100644 --- a/apps/backend/src/trpc/apis/admin-apis/apis/slots.ts +++ b/apps/backend/src/trpc/apis/admin-apis/apis/slots.ts @@ -1,14 +1,12 @@ import { router, protectedProcedure } from "@/src/trpc/trpc-index" import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { db } from "@/src/db/db_index" -import { deliverySlotInfo, productSlots, productInfo, vendorSnippets, productGroupInfo } from "@/src/db/schema" -import { eq, inArray, and, desc } from "drizzle-orm"; import { ApiError } from "@/src/lib/api-error" import { appUrl } from "@/src/lib/env-exporter" import redisClient from "@/src/lib/redis-client" import { getSlotSequenceKey } from "@/src/lib/redisKeyGetters" -import { initializeAllStores } from '@/src/stores/store-initializer' +import { scheduleStoreInitialization } from '@/src/stores/store-initializer' +import { slotDbService } from '@/src/trpc/apis/admin-apis/dataAccessors/main' interface CachedDeliverySequence { [userId: string]: number[]; @@ -57,50 +55,29 @@ const getDeliverySequenceSchema = z.object({ const updateDeliverySequenceSchema = z.object({ id: z.number(), - // deliverySequence: z.array(z.number()), deliverySequence: z.any(), }); export const slotsRouter = router({ - // Exact replica of GET /av/slots getAll: protectedProcedure.query(async ({ ctx }) => { if (!ctx.staffUser?.id) { throw new TRPCError({ code: "UNAUTHORIZED", message: "Access denied" }); } - const slots = await db.query.deliverySlotInfo - .findMany({ - where: eq(deliverySlotInfo.isActive, true), - orderBy: desc(deliverySlotInfo.deliveryTime), - with: { - productSlots: { - with: { - product: { - columns: { - id: true, - name: true, - images: true, - }, - }, - }, - }, - }, - }) - .then((slots) => - slots.map((slot) => ({ - ...slot, - deliverySequence: slot.deliverySequence as number[], - products: slot.productSlots.map((ps) => ps.product), - })) - ); + const slots = await slotDbService.getAllSlots(); + + const transformedSlots = slots.map((slot) => ({ + ...slot, + deliverySequence: slot.deliverySequence as number[], + products: slot.productSlots.map((ps: any) => ps.product), + })); return { - slots, - count: slots.length, + slots: transformedSlots, + count: transformedSlots.length, }; }), - // Exact replica of POST /av/products/slots/product-ids getSlotsProductIds: protectedProcedure .input(z.object({ slotIds: z.array(z.number()) })) .query(async ({ input, ctx }) => { @@ -121,25 +98,16 @@ export const slotsRouter = router({ return {}; } - // Fetch all associations for the requested slots - const associations = await db.query.productSlots.findMany({ - where: inArray(productSlots.slotId, slotIds), - columns: { - slotId: true, - productId: true, - }, - }); + const associations = await slotDbService.getProductSlotsBySlotIds(slotIds); - // Group by slotId - const result = associations.reduce((acc, assoc) => { + const result = associations.reduce((acc: Record, assoc) => { if (!acc[assoc.slotId]) { acc[assoc.slotId] = []; } acc[assoc.slotId].push(assoc.productId); return acc; - }, {} as Record); + }, {}); - // Ensure all requested slots have entries (even if empty) slotIds.forEach((slotId) => { if (!result[slotId]) { result[slotId] = []; @@ -149,14 +117,8 @@ export const slotsRouter = router({ return result; }), - // Exact replica of PUT /av/products/slots/:slotId/products updateSlotProducts: protectedProcedure - .input( - z.object({ - slotId: z.number(), - productIds: z.array(z.number()), - }) - ) + .input(z.object({ slotId: z.number(), productIds: z.array(z.number()) })) .mutation(async ({ input, ctx }) => { if (!ctx.staffUser?.id) { throw new TRPCError({ code: "UNAUTHORIZED", message: "Access denied" }); @@ -171,51 +133,22 @@ export const slotsRouter = router({ }); } - // Get current associations - const currentAssociations = await db.query.productSlots.findMany({ - where: eq(productSlots.slotId, slotId), - columns: { - productId: true, - }, - }); - - const currentProductIds = currentAssociations.map( - (assoc) => assoc.productId - ); + const currentAssociations = await slotDbService.getProductSlotsBySlotId(slotId); + const currentProductIds = currentAssociations.map((assoc) => assoc.productId); const newProductIds = productIds; - // Find products to add and remove - const productsToAdd = newProductIds.filter( - (id) => !currentProductIds.includes(id) - ); - const productsToRemove = currentProductIds.filter( - (id) => !newProductIds.includes(id) - ); + const productsToAdd = newProductIds.filter((id) => !currentProductIds.includes(id)); + const productsToRemove = currentProductIds.filter((id) => !newProductIds.includes(id)); - // Remove associations for products that are no longer selected - if (productsToRemove.length > 0) { - await db - .delete(productSlots) - .where( - and( - eq(productSlots.slotId, slotId), - inArray(productSlots.productId, productsToRemove) - ) - ); + for (const productId of productsToRemove) { + await slotDbService.deleteProductSlot(slotId, productId); } - // Add associations for newly selected products - if (productsToAdd.length > 0) { - const newAssociations = productsToAdd.map((productId) => ({ - productId, - slotId, - })); - - await db.insert(productSlots).values(newAssociations); + for (const productId of productsToAdd) { + await slotDbService.createProductSlot(slotId, productId); } - // Reinitialize stores to reflect changes - await initializeAllStores(); + scheduleStoreInitialization(); return { message: "Slot products updated successfully", @@ -233,58 +166,43 @@ export const slotsRouter = router({ const { deliveryTime, freezeTime, isActive, productIds, vendorSnippets: snippets, groupIds } = input; - // Validate required fields if (!deliveryTime || !freezeTime) { throw new ApiError("Delivery time and orders close time are required", 400); } - const result = await db.transaction(async (tx) => { - // Create slot - const [newSlot] = await tx - .insert(deliverySlotInfo) - .values({ - deliveryTime: new Date(deliveryTime), - freezeTime: new Date(freezeTime), - isActive: isActive !== undefined ? isActive : true, - groupIds: groupIds !== undefined ? groupIds : [], - }) - .returning(); + const result = await slotDbService.withTransaction(async (tx) => { + const newSlot = await slotDbService.createSlot({ + deliveryTime: new Date(deliveryTime), + freezeTime: new Date(freezeTime), + isActive: isActive !== undefined ? isActive : true, + groupIds: groupIds !== undefined ? groupIds : [], + }); - // Insert product associations if provided if (productIds && productIds.length > 0) { - const associations = productIds.map((productId) => ({ - productId, - slotId: newSlot.id, - })); - await tx.insert(productSlots).values(associations); + for (const productId of productIds) { + await slotDbService.createProductSlot(newSlot.id, productId); + } } - // Create vendor snippets if provided let createdSnippets: any[] = []; if (snippets && snippets.length > 0) { for (const snippet of snippets) { - // Validate products exist - const products = await tx.query.productInfo.findMany({ - where: inArray(productInfo.id, snippet.productIds), - }); - if (products.length !== snippet.productIds.length) { + const productsValid = await slotDbService.validateProductsExist(snippet.productIds); + if (!productsValid) { throw new ApiError(`One or more invalid product IDs in snippet "${snippet.name}"`, 400); } - // Check if snippet name already exists - const existingSnippet = await tx.query.vendorSnippets.findFirst({ - where: eq(vendorSnippets.snippetCode, snippet.name), - }); - if (existingSnippet) { + const codeExists = await slotDbService.checkSnippetCodeExists(snippet.name); + if (codeExists) { throw new ApiError(`Snippet name "${snippet.name}" already exists`, 400); } - const [createdSnippet] = await tx.insert(vendorSnippets).values({ + const createdSnippet = await slotDbService.createVendorSnippet({ snippetCode: snippet.name, slotId: newSlot.id, productIds: snippet.productIds, validTill: snippet.validTill ? new Date(snippet.validTill) : undefined, - }).returning(); + }); createdSnippets.push(createdSnippet); } @@ -297,8 +215,7 @@ export const slotsRouter = router({ }; }); - // Reinitialize stores to reflect changes (outside transaction) - await initializeAllStores(); + scheduleStoreInitialization(); return result; }), @@ -308,9 +225,7 @@ export const slotsRouter = router({ throw new TRPCError({ code: "UNAUTHORIZED", message: "Access denied" }); } - const slots = await db.query.deliverySlotInfo.findMany({ - where: eq(deliverySlotInfo.isActive, true), - }); + const slots = await slotDbService.getActiveSlots(); return { slots, @@ -327,23 +242,7 @@ export const slotsRouter = router({ const { id } = input; - const slot = await db.query.deliverySlotInfo.findFirst({ - where: eq(deliverySlotInfo.id, id), - with: { - productSlots: { - with: { - product: { - columns: { - id: true, - name: true, - images: true, - }, - }, - }, - }, - vendorSnippets: true, - }, - }); + const slot = await slotDbService.getSlotById(id); if (!slot) { throw new ApiError("Slot not found", 404); @@ -354,8 +253,8 @@ export const slotsRouter = router({ ...slot, deliverySequence: slot.deliverySequence as number[], groupIds: slot.groupIds as number[], - products: slot.productSlots.map((ps) => ps.product), - vendorSnippets: slot.vendorSnippets?.map(snippet => ({ + products: slot.productSlots.map((ps: any) => ps.product), + vendorSnippets: slot.vendorSnippets?.map((snippet: any) => ({ ...snippet, accessUrl: `${appUrl}/vendor-order-list?id=${snippet.snippetCode}` })), @@ -369,102 +268,79 @@ export const slotsRouter = router({ if (!ctx.staffUser?.id) { throw new TRPCError({ code: "UNAUTHORIZED", message: "Access denied" }); } - try{ - const { id, deliveryTime, freezeTime, isActive, productIds, vendorSnippets: snippets, groupIds } = input; + try { + const { id, deliveryTime, freezeTime, isActive, productIds, vendorSnippets: snippets, groupIds } = input; - if (!deliveryTime || !freezeTime) { - throw new ApiError("Delivery time and orders close time are required", 400); - } + if (!deliveryTime || !freezeTime) { + throw new ApiError("Delivery time and orders close time are required", 400); + } - // Filter groupIds to only include valid (existing) groups - let validGroupIds = groupIds; - if (groupIds && groupIds.length > 0) { - const existingGroups = await db.query.productGroupInfo.findMany({ - where: inArray(productGroupInfo.id, groupIds), - columns: { id: true }, - }); - validGroupIds = existingGroups.map(g => g.id); - } + let validGroupIds = groupIds; + if (groupIds && groupIds.length > 0) { + const existingGroups = await slotDbService.getGroupsByIds(groupIds); + validGroupIds = existingGroups.map((g: any) => g.id); + } - const result = await db.transaction(async (tx) => { - const [updatedSlot] = await tx - .update(deliverySlotInfo) - .set({ + const result = await slotDbService.withTransaction(async (tx) => { + const updatedSlot = await slotDbService.updateSlot(id, { deliveryTime: new Date(deliveryTime), freezeTime: new Date(freezeTime), isActive: isActive !== undefined ? isActive : true, groupIds: validGroupIds !== undefined ? validGroupIds : [], - }) - .where(eq(deliverySlotInfo.id, id)) - .returning(); + }); - if (!updatedSlot) { - throw new ApiError("Slot not found", 404); - } - - // Update product associations - if (productIds !== undefined) { - // Delete existing associations - await tx.delete(productSlots).where(eq(productSlots.slotId, id)); - - // Insert new associations - if (productIds.length > 0) { - const associations = productIds.map((productId) => ({ - productId, - slotId: id, - })); - await tx.insert(productSlots).values(associations); + if (!updatedSlot) { + throw new ApiError("Slot not found", 404); } - } - // Create vendor snippets if provided - let createdSnippets: any[] = []; - if (snippets && snippets.length > 0) { - for (const snippet of snippets) { - // Validate products exist - const products = await tx.query.productInfo.findMany({ - where: inArray(productInfo.id, snippet.productIds), - }); - if (products.length !== snippet.productIds.length) { - throw new ApiError(`One or more invalid product IDs in snippet "${snippet.name}"`, 400); + if (productIds !== undefined) { + await slotDbService.deleteProductSlotsBySlotId(id); + + if (productIds.length > 0) { + for (const productId of productIds) { + await slotDbService.createProductSlot(id, productId); + } } - - // Check if snippet name already exists - const existingSnippet = await tx.query.vendorSnippets.findFirst({ - where: eq(vendorSnippets.snippetCode, snippet.name), - }); - if (existingSnippet) { - throw new ApiError(`Snippet name "${snippet.name}" already exists`, 400); - } - - const [createdSnippet] = await tx.insert(vendorSnippets).values({ - snippetCode: snippet.name, - slotId: id, - productIds: snippet.productIds, - validTill: snippet.validTill ? new Date(snippet.validTill) : undefined, - - }).returning(); - - createdSnippets.push(createdSnippet); } - } - return { - slot: updatedSlot, - createdSnippets, - message: "Slot updated successfully", - }; - }); + let createdSnippets: any[] = []; + if (snippets && snippets.length > 0) { + for (const snippet of snippets) { + const productsValid = await slotDbService.validateProductsExist(snippet.productIds); + if (!productsValid) { + throw new ApiError(`One or more invalid product IDs in snippet "${snippet.name}"`, 400); + } - // Reinitialize stores to reflect changes (outside transaction) - await initializeAllStores(); + const codeExists = await slotDbService.checkSnippetCodeExists(snippet.name); + if (codeExists) { + throw new ApiError(`Snippet name "${snippet.name}" already exists`, 400); + } - return result; - } - catch(e) { - console.log(e) - throw new ApiError("Unable to Update Slot"); - } + const createdSnippet = await slotDbService.createVendorSnippet({ + snippetCode: snippet.name, + slotId: id, + productIds: snippet.productIds, + validTill: snippet.validTill ? new Date(snippet.validTill) : undefined, + }); + + createdSnippets.push(createdSnippet); + } + } + + return { + slot: updatedSlot, + createdSnippets, + message: "Slot updated successfully", + }; + }); + + scheduleStoreInitialization(); + + return result; + } catch (e) { + console.log(e); + throw new ApiError("Unable to Update Slot"); + } }), deleteSlot: protectedProcedure @@ -476,18 +352,13 @@ export const slotsRouter = router({ const { id } = input; - const [deletedSlot] = await db - .update(deliverySlotInfo) - .set({ isActive: false }) - .where(eq(deliverySlotInfo.id, id)) - .returning(); + const deletedSlot = await slotDbService.deactivateSlot(id); if (!deletedSlot) { throw new ApiError("Slot not found", 404); } - // Reinitialize stores to reflect changes - await initializeAllStores(); + scheduleStoreInitialization(); return { message: "Slot deleted successfully", @@ -496,8 +367,7 @@ export const slotsRouter = router({ getDeliverySequence: protectedProcedure .input(getDeliverySequenceSchema) - .query(async ({ input, ctx }) => { - + .query(async ({ input }) => { const { id } = input; const slotId = parseInt(id); const cacheKey = getSlotSequenceKey(slotId); @@ -507,19 +377,14 @@ export const slotsRouter = router({ if (cached) { const parsed = JSON.parse(cached); const validated = cachedSequenceSchema.parse(parsed) as CachedDeliverySequence; - console.log('sending cached response') - + console.log('sending cached response'); return { deliverySequence: validated }; } } catch (error) { console.warn('Redis cache read/validation failed, falling back to DB:', error); - // Continue to DB fallback } - // Fallback to DB - const slot = await db.query.deliverySlotInfo.findFirst({ - where: eq(deliverySlotInfo.id, slotId), - }); + const slot = await slotDbService.getSlotById(slotId); if (!slot) { throw new ApiError("Slot not found", 404); @@ -527,7 +392,6 @@ export const slotsRouter = router({ const sequence = (slot.deliverySequence || {}) as CachedDeliverySequence; - // Cache the validated result try { const validated = cachedSequenceSchema.parse(sequence); await redisClient.set(cacheKey, JSON.stringify(validated), 3600); @@ -547,20 +411,12 @@ export const slotsRouter = router({ const { id, deliverySequence } = input; - const [updatedSlot] = await db - .update(deliverySlotInfo) - .set({ deliverySequence }) - .where(eq(deliverySlotInfo.id, id)) - .returning({ - id: deliverySlotInfo.id, - deliverySequence: deliverySlotInfo.deliverySequence, - }); + const updatedSlot = await slotDbService.updateSlot(id, { deliverySequence }); if (!updatedSlot) { throw new ApiError("Slot not found", 404); } - // Cache the updated sequence const cacheKey = getSlotSequenceKey(id); try { const validated = cachedSequenceSchema.parse(deliverySequence); @@ -570,7 +426,7 @@ export const slotsRouter = router({ } return { - slot: updatedSlot, + slot: { id: updatedSlot.id, deliverySequence: updatedSlot.deliverySequence }, message: "Delivery sequence updated successfully", }; }), @@ -587,18 +443,13 @@ export const slotsRouter = router({ const { slotId, isCapacityFull } = input; - const [updatedSlot] = await db - .update(deliverySlotInfo) - .set({ isCapacityFull }) - .where(eq(deliverySlotInfo.id, slotId)) - .returning(); + const updatedSlot = await slotDbService.updateSlot(slotId, { isCapacityFull }); if (!updatedSlot) { throw new ApiError("Slot not found", 404); } - // Reinitialize stores to reflect changes - await initializeAllStores(); + scheduleStoreInitialization(); return { success: true, diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/staff-user.ts b/apps/backend/src/trpc/apis/admin-apis/apis/staff-user.ts index 0a62c21..d7c13d9 100644 --- a/apps/backend/src/trpc/apis/admin-apis/apis/staff-user.ts +++ b/apps/backend/src/trpc/apis/admin-apis/apis/staff-user.ts @@ -1,11 +1,9 @@ import { router, publicProcedure, protectedProcedure } from '@/src/trpc/trpc-index' import { z } from 'zod'; -import { db } from '@/src/db/db_index' -import { staffUsers, staffRoles, users, userDetails, orders } from '@/src/db/schema' -import { eq, or, ilike, and, lt, desc } from 'drizzle-orm'; import bcrypt from 'bcryptjs'; -import jwt from 'jsonwebtoken'; import { ApiError } from '@/src/lib/api-error' +import { signToken } from '@/src/lib/jwt-utils' +import { staffUserDbService } from '@/src/trpc/apis/admin-apis/dataAccessors/main' export const staffUserRouter = router({ login: publicProcedure @@ -20,9 +18,7 @@ export const staffUserRouter = router({ throw new ApiError('Name and password are required', 400); } - const staff = await db.query.staffUsers.findFirst({ - where: eq(staffUsers.name, name), - }); + const staff = await staffUserDbService.getStaffUserByName(name); if (!staff) { throw new ApiError('Invalid credentials', 401); @@ -33,10 +29,9 @@ export const staffUserRouter = router({ throw new ApiError('Invalid credentials', 401); } - const token = jwt.sign( + const token = await signToken( { staffId: staff.id, name: staff.name }, - process.env.JWT_SECRET || 'default-secret', - { expiresIn: '30d' } + '30d' ); return { @@ -47,24 +42,8 @@ export const staffUserRouter = router({ }), getStaff: protectedProcedure - .query(async ({ ctx }) => { - const staff = await db.query.staffUsers.findMany({ - columns: { - id: true, - name: true, - }, - with: { - role: { - with: { - rolePermissions: { - with: { - permission: true, - }, - }, - }, - }, - }, - }); + .query(async () => { + const staff = await staffUserDbService.getAllStaff(); // Transform the data to include role and permissions in a cleaner format const transformedStaff = staff.map((user) => ({ @@ -94,29 +73,7 @@ export const staffUserRouter = router({ .query(async ({ input }) => { const { cursor, limit, search } = input; - let whereCondition = undefined; - - if (search) { - whereCondition = or( - ilike(users.name, `%${search}%`), - ilike(users.email, `%${search}%`), - ilike(users.mobile, `%${search}%`) - ); - } - - if (cursor) { - const cursorCondition = lt(users.id, cursor); - whereCondition = whereCondition ? and(whereCondition, cursorCondition) : cursorCondition; - } - - const allUsers = await db.query.users.findMany({ - where: whereCondition, - with: { - userDetails: true, - }, - orderBy: desc(users.id), - limit: limit + 1, // fetch one extra to check if there's more - }); + const allUsers = await staffUserDbService.getUsers({ cursor, limit, search }); const hasMore = allUsers.length > limit; const usersToReturn = hasMore ? allUsers.slice(0, limit) : allUsers; @@ -140,22 +97,13 @@ export const staffUserRouter = router({ .query(async ({ input }) => { const { userId } = input; - const user = await db.query.users.findFirst({ - where: eq(users.id, userId), - with: { - userDetails: true, - orders: { - orderBy: desc(orders.createdAt), - limit: 1, - }, - }, - }); + const user = await staffUserDbService.getUserById(userId); if (!user) { throw new ApiError("User not found", 404); } - const lastOrder = user.orders[0]; + const lastOrder = user.orders?.[0]; return { id: user.id, @@ -173,13 +121,7 @@ export const staffUserRouter = router({ .mutation(async ({ input }) => { const { userId, isSuspended } = input; - await db - .insert(userDetails) - .values({ userId, isSuspended }) - .onConflictDoUpdate({ - target: userDetails.userId, - set: { isSuspended }, - }); + await staffUserDbService.upsertUserDetails({ userId, isSuspended }); return { success: true }; }), @@ -190,22 +132,18 @@ export const staffUserRouter = router({ password: z.string().min(6, 'Password must be at least 6 characters'), roleId: z.number().int().positive('Role is required'), })) - .mutation(async ({ input, ctx }) => { + .mutation(async ({ input }) => { const { name, password, roleId } = input; // Check if staff user already exists - const existingUser = await db.query.staffUsers.findFirst({ - where: eq(staffUsers.name, name), - }); + const existingUser = await staffUserDbService.getStaffUserByName(name); if (existingUser) { throw new ApiError('Staff user with this name already exists', 409); } // Check if role exists - const role = await db.query.staffRoles.findFirst({ - where: eq(staffRoles.id, roleId), - }); + const role = await staffUserDbService.getRoleById(roleId); if (!role) { throw new ApiError('Invalid role selected', 400); @@ -215,23 +153,18 @@ export const staffUserRouter = router({ const hashedPassword = await bcrypt.hash(password, 12); // Create staff user - const [newUser] = await db.insert(staffUsers).values({ + const newUser = await staffUserDbService.createStaffUser({ name: name.trim(), password: hashedPassword, staffRoleId: roleId, - }).returning(); + }); return { success: true, user: { id: newUser.id, name: newUser.name } }; }), getRoles: protectedProcedure - .query(async ({ ctx }) => { - const roles = await db.query.staffRoles.findMany({ - columns: { - id: true, - roleName: true, - }, - }); + .query(async () => { + const roles = await staffUserDbService.getAllRoles(); return { roles: roles.map(role => ({ @@ -240,4 +173,4 @@ export const staffUserRouter = router({ })), }; }), -}); \ No newline at end of file +}); diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/store.ts b/apps/backend/src/trpc/apis/admin-apis/apis/store.ts index 6d1cee2..62be047 100644 --- a/apps/backend/src/trpc/apis/admin-apis/apis/store.ts +++ b/apps/backend/src/trpc/apis/admin-apis/apis/store.ts @@ -1,29 +1,22 @@ import { router, protectedProcedure } from '@/src/trpc/trpc-index' import { z } from 'zod'; -import { db } from '@/src/db/db_index' -import { storeInfo, productInfo } from '@/src/db/schema' -import { eq, inArray } from 'drizzle-orm'; import { ApiError } from '@/src/lib/api-error' - import { extractKeyFromPresignedUrl, deleteImageUtil, generateSignedUrlFromS3Url } from '@/src/lib/s3-client' -import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; -import { initializeAllStores } from '@/src/stores/store-initializer' +import { extractKeyFromPresignedUrl, deleteImageUtil, scaffoldAssetUrl } from '@/src/lib/s3-client' +import { scheduleStoreInitialization } from '@/src/stores/store-initializer' +import { storeDbService } from '@/src/trpc/apis/admin-apis/dataAccessors/main' export const storeRouter = router({ getStores: protectedProcedure - .query(async ({ ctx }) => { - const stores = await db.query.storeInfo.findMany({ - with: { - owner: true, - }, - }); + .query(async () => { + const stores = await storeDbService.getAllStores(); Promise.all(stores.map(async store => { if(store.imageUrl) - store.imageUrl = await generateSignedUrlFromS3Url(store.imageUrl) + store.imageUrl = scaffoldAssetUrl(store.imageUrl) })).catch((e) => { throw new ApiError("Unable to find store image urls") - } - ) + }) + return { stores, count: stores.length, @@ -34,58 +27,46 @@ export const storeRouter = router({ .input(z.object({ id: z.number(), })) - .query(async ({ input, ctx }) => { + .query(async ({ input }) => { const { id } = input; - const store = await db.query.storeInfo.findFirst({ - where: eq(storeInfo.id, id), - with: { - owner: true, - }, - }); + const store = await storeDbService.getStoreById(id); if (!store) { throw new ApiError("Store not found", 404); } - store.imageUrl = await generateSignedUrlFromS3Url(store.imageUrl); + + store.imageUrl = scaffoldAssetUrl(store.imageUrl); + return { store, }; }), - createStore: protectedProcedure - .input(z.object({ - name: z.string().min(1, "Name is required"), - description: z.string().optional(), - imageUrl: z.string().optional(), - owner: z.number().min(1, "Owner is required"), - products: z.array(z.number()).optional(), - })) - .mutation(async ({ input, ctx }) => { + createStore: protectedProcedure + .input(z.object({ + name: z.string().min(1, "Name is required"), + description: z.string().optional(), + imageUrl: z.string().optional(), + owner: z.number().min(1, "Owner is required"), + products: z.array(z.number()).optional(), + })) + .mutation(async ({ input }) => { const { name, description, imageUrl, owner, products } = input; - const imageKey = imageUrl ? extractKeyFromPresignedUrl(imageUrl) : undefined; - - const [newStore] = await db - .insert(storeInfo) - .values({ - name, - description, - imageUrl: imageKey, - owner, - }) - .returning(); + const newStore = await storeDbService.createStore({ + name, + description, + imageUrl: imageUrl || null, + owner, + }); // Assign selected products to this store if (products && products.length > 0) { - await db - .update(productInfo) - .set({ storeId: newStore.id }) - .where(inArray(productInfo.id, products)); + await storeDbService.assignProductsToStore(newStore.id, products); } - // Reinitialize stores to reflect changes - await initializeAllStores(); + scheduleStoreInitialization() return { store: newStore, @@ -93,117 +74,84 @@ export const storeRouter = router({ }; }), - updateStore: protectedProcedure - .input(z.object({ - id: z.number(), - name: z.string().min(1, "Name is required"), - description: z.string().optional(), - imageUrl: z.string().optional(), - owner: z.number().min(1, "Owner is required"), - products: z.array(z.number()).optional(), - })) - .mutation(async ({ input, ctx }) => { + updateStore: protectedProcedure + .input(z.object({ + id: z.number(), + name: z.string().min(1, "Name is required"), + description: z.string().optional(), + imageUrl: z.string().optional(), + owner: z.number().min(1, "Owner is required"), + products: z.array(z.number()).optional(), + })) + .mutation(async ({ input }) => { const { id, name, description, imageUrl, owner, products } = input; - const existingStore = await db.query.storeInfo.findFirst({ - where: eq(storeInfo.id, id), - }); + const existingStore = await storeDbService.getStoreById(id); - if (!existingStore) { - throw new ApiError("Store not found", 404); - } + if (!existingStore) { + throw new ApiError("Store not found", 404); + } - const oldImageKey = existingStore.imageUrl; - const newImageKey = imageUrl ? extractKeyFromPresignedUrl(imageUrl) : oldImageKey; + const oldImageKey = existingStore.imageUrl; + const newImageKey = imageUrl ? extractKeyFromPresignedUrl(imageUrl) : oldImageKey; - // Delete old image only if: - // 1. New image provided and keys are different, OR - // 2. No new image but old exists (clearing the image) - if (oldImageKey && ( - (newImageKey && newImageKey !== oldImageKey) || - (!newImageKey) - )) { - try { - await deleteImageUtil({keys: [oldImageKey]}); - } catch (error) { - console.error('Failed to delete old image:', error); - // Continue with update even if deletion fails - } + // Delete old image only if: + // 1. New image provided and keys are different, OR + // 2. No new image but old exists (clearing the image) + if (oldImageKey && ( + (newImageKey && newImageKey !== oldImageKey) || + (!newImageKey) + )) { + try { + await deleteImageUtil({keys: [oldImageKey]}); + } catch (error) { + console.error('Failed to delete old image:', error); } + } - const [updatedStore] = await db - .update(storeInfo) - .set({ - name, - description, - imageUrl: newImageKey, - owner, - }) - .where(eq(storeInfo.id, id)) - .returning(); + const updatedStore = await storeDbService.updateStore(id, { + name, + description, + imageUrl: newImageKey, + owner, + }); - if (!updatedStore) { - throw new ApiError("Store not found", 404); - } + // Update products if provided + if (products) { + // First, remove all products from this store + await storeDbService.removeProductsFromStore(id); - // Update products if provided - if (products) { - // First, set storeId to null for products not in the list but currently assigned to this store - await db - .update(productInfo) - .set({ storeId: null }) - .where(eq(productInfo.storeId, id)); + // Then, assign the selected products to this store + if (products.length > 0) { + await storeDbService.assignProductsToStore(id, products); + } + } - // Then, assign the selected products to this store - if (products.length > 0) { - await db - .update(productInfo) - .set({ storeId: id }) - .where(inArray(productInfo.id, products)); - } - } + scheduleStoreInitialization() - // Reinitialize stores to reflect changes - await initializeAllStores(); + return { + store: updatedStore, + message: "Store updated successfully", + }; + }), - return { - store: updatedStore, - message: "Store updated successfully", - }; - }), + deleteStore: protectedProcedure + .input(z.object({ + storeId: z.number(), + })) + .mutation(async ({ input }) => { + const { storeId } = input; - deleteStore: protectedProcedure - .input(z.object({ - storeId: z.number(), - })) - .mutation(async ({ input, ctx }) => { - const { storeId } = input; + // First, remove all products from this store + await storeDbService.removeProductsFromStore(storeId); - const result = await db.transaction(async (tx) => { - // First, update all products of this store to set storeId to null - await tx - .update(productInfo) - .set({ storeId: null }) - .where(eq(productInfo.storeId, storeId)); + // Then delete the store + await storeDbService.deleteStore(storeId); - // Then delete the store - const [deletedStore] = await tx - .delete(storeInfo) - .where(eq(storeInfo.id, storeId)) - .returning(); + scheduleStoreInitialization() - if (!deletedStore) { - throw new ApiError("Store not found", 404); - } - - return { - message: "Store deleted successfully", - }; - }); - - // Reinitialize stores to reflect changes (outside transaction) - await initializeAllStores(); - - return result; - }), -}); \ No newline at end of file + return { + message: "Store deleted successfully", + }; + }), +}); diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/tag.ts b/apps/backend/src/trpc/apis/admin-apis/apis/tag.ts new file mode 100644 index 0000000..d388350 --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/apis/tag.ts @@ -0,0 +1,194 @@ +import { router, protectedProcedure } from '@/src/trpc/trpc-index' +import { z } from 'zod'; +import { ApiError } from '@/src/lib/api-error' +import { scaffoldAssetUrl, claimUploadUrl } from '@/src/lib/s3-client' +import { deleteS3Image } from '@/src/lib/delete-image' +import { scheduleStoreInitialization } from '@/src/stores/store-initializer' +import { tagDbService } from '@/src/trpc/apis/admin-apis/dataAccessors/main' + +export const tagRouter = router({ + getTags: protectedProcedure + .query(async () => { + const tags = await tagDbService.getAllTags(); + + // Generate asset URLs for tag images + const tagsWithUrls = tags.map(tag => ({ + ...tag, + imageUrl: tag.imageUrl ? scaffoldAssetUrl(tag.imageUrl) : null, + })); + + return { + tags: tagsWithUrls, + message: "Tags retrieved successfully", + }; + }), + + getTagById: protectedProcedure + .input(z.object({ + id: z.number(), + })) + .query(async ({ input }) => { + const tag = await tagDbService.getTagById(input.id); + + if (!tag) { + throw new ApiError("Tag not found", 404); + } + + // Generate asset URL for tag image + const tagWithUrl = { + ...tag, + imageUrl: tag.imageUrl ? scaffoldAssetUrl(tag.imageUrl) : null, + }; + + return { + tag: tagWithUrl, + message: "Tag retrieved successfully", + }; + }), + + createTag: protectedProcedure + .input(z.object({ + tagName: z.string().min(1), + tagDescription: z.string().optional(), + isDashboardTag: z.boolean().default(false), + relatedStores: z.array(z.number()).default([]), + imageKey: z.string().optional(), + })) + .mutation(async ({ input }) => { + const { tagName, tagDescription, isDashboardTag, relatedStores, imageKey } = input; + + // Check for duplicate tag name + const existingTag = await tagDbService.getTagByName(tagName); + + if (existingTag) { + throw new ApiError("A tag with this name already exists", 400); + } + + const newTag = await tagDbService.createTag({ + tagName: tagName.trim(), + tagDescription, + imageUrl: imageKey || null, + isDashboardTag, + relatedStores, + }); + + // Claim upload URL if image was provided + if (imageKey) { + try { + await claimUploadUrl(imageKey); + } catch (e) { + console.warn(`Failed to claim upload URL for key: ${imageKey}`, e); + } + } + + scheduleStoreInitialization(); + + return { + tag: newTag, + message: "Tag created successfully", + }; + }), + + updateTag: protectedProcedure + .input(z.object({ + id: z.number(), + tagName: z.string().min(1), + tagDescription: z.string().optional(), + isDashboardTag: z.boolean(), + relatedStores: z.array(z.number()), + imageKey: z.string().optional(), + deleteExistingImage: z.boolean().optional(), + })) + .mutation(async ({ input }) => { + const { id, imageKey, deleteExistingImage, ...updateData } = input; + + // Get current tag + const currentTag = await tagDbService.getTagById(id); + + if (!currentTag) { + throw new ApiError("Tag not found", 404); + } + + let newImageUrl = currentTag.imageUrl; + + // Handle image deletion + if (deleteExistingImage && currentTag.imageUrl) { + try { + await deleteS3Image(currentTag.imageUrl); + } catch (e) { + console.error(`Failed to delete old image: ${currentTag.imageUrl}`, e); + } + newImageUrl = null; + } + + // Handle new image upload (only if different from existing) + if (imageKey && imageKey !== currentTag.imageUrl) { + // Delete old image if exists and not already deleted + if (currentTag.imageUrl && !deleteExistingImage) { + try { + await deleteS3Image(currentTag.imageUrl); + } catch (e) { + console.error(`Failed to delete old image: ${currentTag.imageUrl}`, e); + } + } + newImageUrl = imageKey; + + // Claim upload URL + try { + await claimUploadUrl(imageKey); + } catch (e) { + console.warn(`Failed to claim upload URL for key: ${imageKey}`, e); + } + } + + const updatedTag = await tagDbService.updateTag(id, { + tagName: updateData.tagName.trim(), + tagDescription: updateData.tagDescription, + isDashboardTag: updateData.isDashboardTag, + relatedStores: updateData.relatedStores, + imageUrl: newImageUrl, + }); + + scheduleStoreInitialization(); + + return { + tag: updatedTag, + message: "Tag updated successfully", + }; + }), + + deleteTag: protectedProcedure + .input(z.object({ + id: z.number(), + })) + .mutation(async ({ input }) => { + const { id } = input; + + // Get tag to check for image + const tag = await tagDbService.getTagById(id); + + if (!tag) { + throw new ApiError("Tag not found", 404); + } + + // Delete image from S3 if exists + if (tag.imageUrl) { + try { + await deleteS3Image(tag.imageUrl); + } catch (e) { + console.error(`Failed to delete image: ${tag.imageUrl}`, e); + } + } + + // Delete tag (will fail if tag is assigned to products due to FK constraint) + await tagDbService.deleteTag(id); + + scheduleStoreInitialization(); + + return { + message: "Tag deleted successfully", + }; + }), +}); + +export type TagRouter = typeof tagRouter; diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/user.ts b/apps/backend/src/trpc/apis/admin-apis/apis/user.ts index 2b176b2..d6b3192 100644 --- a/apps/backend/src/trpc/apis/admin-apis/apis/user.ts +++ b/apps/backend/src/trpc/apis/admin-apis/apis/user.ts @@ -1,41 +1,28 @@ import { protectedProcedure } from '@/src/trpc/trpc-index'; import { z } from 'zod'; -import { db } from '@/src/db/db_index'; -import { users, complaints, orders, orderItems, notifCreds, unloggedUserTokens, userDetails, userIncidents } from '@/src/db/schema'; -import { eq, sql, desc, asc, count, max, inArray } from 'drizzle-orm'; import { ApiError } from '@/src/lib/api-error'; import { notificationQueue } from '@/src/lib/notif-job'; import { recomputeUserNegativityScore } from '@/src/stores/user-negativity-store'; +import { userDbService } from '@/src/trpc/apis/admin-apis/dataAccessors/main'; -async function createUserByMobile(mobile: string): Promise { - // Clean mobile number (remove non-digits) +async function createUserByMobile(mobile: string) { const cleanMobile = mobile.replace(/\D/g, ''); - // Validate: exactly 10 digits if (cleanMobile.length !== 10) { throw new ApiError('Mobile number must be exactly 10 digits', 400); } - // Check if user already exists - const [existingUser] = await db - .select() - .from(users) - .where(eq(users.mobile, cleanMobile)) - .limit(1); + const existingUser = await userDbService.getUserByMobile(cleanMobile); if (existingUser) { throw new ApiError('User with this mobile number already exists', 409); } - // Create user - const [newUser] = await db - .insert(users) - .values({ - name: null, - email: null, - mobile: cleanMobile, - }) - .returning(); + const newUser = await userDbService.createUser({ + name: null, + email: null, + mobile: cleanMobile, + }); return newUser; } @@ -56,7 +43,7 @@ export const userRouter = { getEssentials: protectedProcedure .query(async () => { - const count = await db.$count(complaints, eq(complaints.isResolved, false)); + const count = await userDbService.getUnresolvedComplaintCount(); return { unresolvedComplaints: count || 0, @@ -72,78 +59,23 @@ export const userRouter = { .query(async ({ input }) => { const { limit, cursor, search } = input; - // Build where conditions - const whereConditions = []; - - if (search && search.trim()) { - whereConditions.push(sql`${users.mobile} ILIKE ${`%${search.trim()}%`}`); - } - - if (cursor) { - whereConditions.push(sql`${users.id} > ${cursor}`); - } + const usersList = await userDbService.getUsers({ limit, cursor, search }); - // Get users with filters applied - const usersList = await db - .select({ - id: users.id, - name: users.name, - mobile: users.mobile, - createdAt: users.createdAt, - }) - .from(users) - .where(whereConditions.length > 0 ? sql.join(whereConditions, sql` AND `) : undefined) - .orderBy(asc(users.id)) - .limit(limit + 1); // Get one extra to determine if there's more - - // Check if there are more results const hasMore = usersList.length > limit; const usersToReturn = hasMore ? usersList.slice(0, limit) : usersList; - - // Get order stats for each user const userIds = usersToReturn.map(u => u.id); + + const orderCounts = await userDbService.getOrderCountByUserIds(userIds); + const lastOrders = await userDbService.getLastOrderDateByUserIds(userIds); - let orderCounts: { userId: number; totalOrders: number }[] = []; - let lastOrders: { userId: number; lastOrderDate: Date | null }[] = []; - let suspensionStatuses: { userId: number; isSuspended: boolean }[] = []; - - if (userIds.length > 0) { - // Get total orders per user - orderCounts = await db - .select({ - userId: orders.userId, - totalOrders: count(orders.id), - }) - .from(orders) - .where(sql`${orders.userId} IN (${sql.join(userIds, sql`, `)})`) - .groupBy(orders.userId); + const userDetailsList = await Promise.all( + userIds.map(id => userDbService.getUserDetailsByUserId(id)) + ); - // Get last order date per user - lastOrders = await db - .select({ - userId: orders.userId, - lastOrderDate: max(orders.createdAt), - }) - .from(orders) - .where(sql`${orders.userId} IN (${sql.join(userIds, sql`, `)})`) - .groupBy(orders.userId); - - // Get suspension status for each user - suspensionStatuses = await db - .select({ - userId: userDetails.userId, - isSuspended: userDetails.isSuspended, - }) - .from(userDetails) - .where(sql`${userDetails.userId} IN (${sql.join(userIds, sql`, `)})`); - } - - // Create lookup maps const orderCountMap = new Map(orderCounts.map(o => [o.userId, o.totalOrders])); const lastOrderMap = new Map(lastOrders.map(o => [o.userId, o.lastOrderDate])); - const suspensionMap = new Map(suspensionStatuses.map(s => [s.userId, s.isSuspended])); + const suspensionMap = new Map(userDetailsList.map((ud, idx) => [userIds[idx], ud?.isSuspended ?? false])); - // Combine data const usersWithStats = usersToReturn.map(user => ({ ...user, totalOrders: orderCountMap.get(user.id) || 0, @@ -151,7 +83,6 @@ export const userRouter = { isSuspended: suspensionMap.get(user.id) ?? false, })); - // Get next cursor const nextCursor = hasMore ? usersToReturn[usersToReturn.length - 1].id : undefined; return { @@ -168,76 +99,22 @@ export const userRouter = { .query(async ({ input }) => { const { userId } = input; - // Get user info - const user = await db - .select({ - id: users.id, - name: users.name, - mobile: users.mobile, - createdAt: users.createdAt, - }) - .from(users) - .where(eq(users.id, userId)) - .limit(1); + const user = await userDbService.getUserById(userId); - if (!user || user.length === 0) { + if (!user) { throw new ApiError('User not found', 404); } - // Get user suspension status - const userDetail = await db - .select({ - isSuspended: userDetails.isSuspended, - }) - .from(userDetails) - .where(eq(userDetails.userId, userId)) - .limit(1); - - // Get all orders for this user with order items count - const userOrders = await db - .select({ - id: orders.id, - readableId: orders.readableId, - totalAmount: orders.totalAmount, - createdAt: orders.createdAt, - isFlashDelivery: orders.isFlashDelivery, - }) - .from(orders) - .where(eq(orders.userId, userId)) - .orderBy(desc(orders.createdAt)); - - // Get order status for each order + const userDetail = await userDbService.getUserDetailsByUserId(userId); + const userOrders = await userDbService.getOrdersByUserId(userId); const orderIds = userOrders.map(o => o.id); - let orderStatuses: { orderId: number; isDelivered: boolean; isCancelled: boolean }[] = []; - - if (orderIds.length > 0) { - const { orderStatus } = await import('@/src/db/schema'); - orderStatuses = await db - .select({ - orderId: orderStatus.orderId, - isDelivered: orderStatus.isDelivered, - isCancelled: orderStatus.isCancelled, - }) - .from(orderStatus) - .where(sql`${orderStatus.orderId} IN (${sql.join(orderIds, sql`, `)})`); - } + const orderStatuses = await userDbService.getOrderStatusByOrderIds(orderIds); + const itemCounts = await userDbService.getOrderItemCountByOrderIds(orderIds); - // Get item counts for each order - const itemCounts = await db - .select({ - orderId: orderItems.orderId, - itemCount: count(orderItems.id), - }) - .from(orderItems) - .where(sql`${orderItems.orderId} IN (${sql.join(orderIds, sql`, `)})`) - .groupBy(orderItems.orderId); - - // Create lookup maps const statusMap = new Map(orderStatuses.map(s => [s.orderId, s])); const itemCountMap = new Map(itemCounts.map(c => [c.orderId, c.itemCount])); - // Determine status string const getStatus = (status: { isDelivered: boolean; isCancelled: boolean } | undefined) => { if (!status) return 'pending'; if (status.isCancelled) return 'cancelled'; @@ -245,15 +122,14 @@ export const userRouter = { return 'pending'; }; - // Combine data const ordersWithDetails = userOrders.map(order => { const status = statusMap.get(order.id); return { id: order.id, - readableId: order.readableId, + readableId: (order as any).readableId, totalAmount: order.totalAmount, createdAt: order.createdAt, - isFlashDelivery: order.isFlashDelivery, + isFlashDelivery: (order as any).isFlashDelivery, status: getStatus(status), itemCount: itemCountMap.get(order.id) || 0, }; @@ -261,8 +137,8 @@ export const userRouter = { return { user: { - ...user[0], - isSuspended: userDetail[0]?.isSuspended ?? false, + ...user, + isSuspended: userDetail?.isSuspended ?? false, }, orders: ordersWithDetails, }; @@ -276,39 +152,13 @@ export const userRouter = { .mutation(async ({ input }) => { const { userId, isSuspended } = input; - // Check if user exists - const user = await db - .select({ id: users.id }) - .from(users) - .where(eq(users.id, userId)) - .limit(1); + const user = await userDbService.getUserById(userId); - if (!user || user.length === 0) { + if (!user) { throw new ApiError('User not found', 404); } - // Check if user_details record exists - const existingDetail = await db - .select({ id: userDetails.id }) - .from(userDetails) - .where(eq(userDetails.userId, userId)) - .limit(1); - - if (existingDetail.length > 0) { - // Update existing record - await db - .update(userDetails) - .set({ isSuspended }) - .where(eq(userDetails.userId, userId)); - } else { - // Insert new record - await db - .insert(userDetails) - .values({ - userId, - isSuspended, - }); - } + await userDbService.upsertUserDetails({ userId, isSuspended }); return { success: true, @@ -323,40 +173,17 @@ export const userRouter = { .query(async ({ input }) => { const { search } = input; - // Get all users - let usersList; - if (search && search.trim()) { - usersList = await db - .select({ - id: users.id, - name: users.name, - mobile: users.mobile, - }) - .from(users) - .where(sql`${users.mobile} ILIKE ${`%${search.trim()}%`} OR ${users.name} ILIKE ${`%${search.trim()}%`}`); - } else { - usersList = await db - .select({ - id: users.id, - name: users.name, - mobile: users.mobile, - }) - .from(users); - } + const usersList = await userDbService.getUsers({ limit: 1000, search }); - // Get eligible users (have notif_creds entry) - const eligibleUsers = await db - .select({ userId: notifCreds.userId }) - .from(notifCreds); - - const eligibleSet = new Set(eligibleUsers.map(u => u.userId)); + const allTokens = await userDbService.getAllNotifTokens(); + const eligibleSet = new Set(allTokens); return { users: usersList.map(user => ({ id: user.id, name: user.name, mobile: user.mobile, - isEligibleForNotif: eligibleSet.has(user.id), + isEligibleForNotif: eligibleSet.has(user.mobile || ''), })), }; }), @@ -374,25 +201,13 @@ export const userRouter = { let tokens: string[] = []; if (userIds.length === 0) { - // Send to all users - get tokens from both logged-in and unlogged users - const loggedInTokens = await db.select({ token: notifCreds.token }).from(notifCreds); - const unloggedTokens = await db.select({ token: unloggedUserTokens.token }).from(unloggedUserTokens); - - tokens = [ - ...loggedInTokens.map(t => t.token), - ...unloggedTokens.map(t => t.token) - ]; + const allTokens = await userDbService.getAllNotifTokens(); + const unloggedTokens = await userDbService.getUnloggedTokens(); + tokens = [...allTokens, ...unloggedTokens]; } else { - // Send to specific users - get their tokens - const userTokens = await db - .select({ token: notifCreds.token }) - .from(notifCreds) - .where(inArray(notifCreds.userId, userIds)); - - tokens = userTokens.map(t => t.token); + tokens = await userDbService.getNotifTokensByUserIds(userIds); } - // Queue one job per token let queuedCount = 0; for (const token of tokens) { try { @@ -427,18 +242,7 @@ export const userRouter = { .query(async ({ input }) => { const { userId } = input; - const incidents = await db.query.userIncidents.findMany({ - where: eq(userIncidents.userId, userId), - with: { - order: { - with: { - orderStatus: true, - }, - }, - addedBy: true, - }, - orderBy: desc(userIncidents.dateAdded), - }); + const incidents = await userDbService.getUserIncidentsByUserId(userId); return { incidents: incidents.map(incident => ({ @@ -470,14 +274,13 @@ export const userRouter = { throw new ApiError('Admin user not authenticated', 401); } - - const incidentObj = { userId, orderId, adminComment, addedBy: adminUserId, negativityScore }; - - const [incident] = await db.insert(userIncidents) - .values({ - ...incidentObj, - }) - .returning(); + const incident = await userDbService.createUserIncident({ + userId, + orderId: orderId || null, + adminComment: adminComment || null, + addedBy: adminUserId, + negativityScore: negativityScore || null, + }); recomputeUserNegativityScore(userId); diff --git a/apps/backend/src/trpc/apis/admin-apis/apis/vendor-snippets.ts b/apps/backend/src/trpc/apis/admin-apis/apis/vendor-snippets.ts index 4a307d3..7904600 100644 --- a/apps/backend/src/trpc/apis/admin-apis/apis/vendor-snippets.ts +++ b/apps/backend/src/trpc/apis/admin-apis/apis/vendor-snippets.ts @@ -1,10 +1,8 @@ import { router, publicProcedure, protectedProcedure } from '@/src/trpc/trpc-index' import { z } from 'zod'; import dayjs from 'dayjs'; -import { db } from '@/src/db/db_index' -import { vendorSnippets, deliverySlotInfo, productInfo, orders, orderItems, users, orderStatus } from '@/src/db/schema' -import { eq, and, inArray, isNotNull, gt, sql, asc, ne } from 'drizzle-orm'; import { appUrl } from '@/src/lib/env-exporter' +import { vendorSnippetDbService } from '@/src/trpc/apis/admin-apis/dataAccessors/main' const createSnippetSchema = z.object({ snippetCode: z.string().min(1, "Snippet code is required"), @@ -29,7 +27,6 @@ export const vendorSnippetsRouter = router({ .mutation(async ({ input, ctx }) => { const { snippetCode, slotId, productIds, validTill, isPermanent } = input; - // Get staff user ID from auth middleware const staffUserId = ctx.staffUser?.id; if (!staffUserId) { throw new Error("Unauthorized"); @@ -37,87 +34,58 @@ export const vendorSnippetsRouter = router({ // Validate slot exists if(slotId) { - const slot = await db.query.deliverySlotInfo.findFirst({ - where: eq(deliverySlotInfo.id, slotId), - }); + const slot = await vendorSnippetDbService.getSlotById(slotId); if (!slot) { throw new Error("Invalid slot ID"); } } // Validate products exist - const products = await db.query.productInfo.findMany({ - where: inArray(productInfo.id, productIds), - }); - if (products.length !== productIds.length) { + const productsValid = await vendorSnippetDbService.validateProductsExist(productIds); + if (!productsValid) { throw new Error("One or more invalid product IDs"); } // Check if snippet code already exists - const existingSnippet = await db.query.vendorSnippets.findFirst({ - where: eq(vendorSnippets.snippetCode, snippetCode), - }); - if (existingSnippet) { + const codeExists = await vendorSnippetDbService.checkSnippetCodeExists(snippetCode); + if (codeExists) { throw new Error("Snippet code already exists"); } - const result = await db.insert(vendorSnippets).values({ + const result = await vendorSnippetDbService.createSnippet({ snippetCode, - slotId, + slotId: slotId || null, productIds, isPermanent, - validTill: validTill ? new Date(validTill) : undefined, - }).returning(); + validTill: validTill ? new Date(validTill) : null, + }); - return result[0]; + return result; }), getAll: protectedProcedure .query(async () => { - console.log('from the vendor snipptes methods') + const result = await vendorSnippetDbService.getAllSnippets(); - try { - const result = await db.query.vendorSnippets.findMany({ - with: { - slot: true, - }, - orderBy: (vendorSnippets, { desc }) => [desc(vendorSnippets.createdAt)], - }); + const snippetsWithProducts = await Promise.all( + result.map(async (snippet) => { + const products = await vendorSnippetDbService.getProductsByIds(snippet.productIds); - const snippetsWithProducts = await Promise.all( - result.map(async (snippet) => { - const products = await db.query.productInfo.findMany({ - where: inArray(productInfo.id, snippet.productIds), - columns: { id: true, name: true }, - }); + return { + ...snippet, + accessUrl: `${appUrl}/vendor-order-list?id=${snippet.snippetCode}`, + products: products.map(p => ({ id: p.id, name: p.name })), + }; + }) + ); - return { - ...snippet, - accessUrl: `${appUrl}/vendor-order-list?id=${snippet.snippetCode}`, - products: products.map(p => ({ id: p.id, name: p.name })), - }; - }) - ); - - return snippetsWithProducts; - } - catch(e) { - console.log(e) - } - return []; + return snippetsWithProducts; }), getById: protectedProcedure .input(z.object({ id: z.number().int().positive() })) .query(async ({ input }) => { - const { id } = input; - - const result = await db.query.vendorSnippets.findFirst({ - where: eq(vendorSnippets.id, id), - with: { - slot: true, - }, - }); + const result = await vendorSnippetDbService.getSnippetById(input.id); if (!result) { throw new Error("Vendor snippet not found"); @@ -131,19 +99,14 @@ export const vendorSnippetsRouter = router({ .mutation(async ({ input }) => { const { id, updates } = input; - // Check if snippet exists - const existingSnippet = await db.query.vendorSnippets.findFirst({ - where: eq(vendorSnippets.id, id), - }); + const existingSnippet = await vendorSnippetDbService.getSnippetById(id); if (!existingSnippet) { throw new Error("Vendor snippet not found"); } // Validate slot if being updated if (updates.slotId) { - const slot = await db.query.deliverySlotInfo.findFirst({ - where: eq(deliverySlotInfo.id, updates.slotId), - }); + const slot = await vendorSnippetDbService.getSlotById(updates.slotId); if (!slot) { throw new Error("Invalid slot ID"); } @@ -151,20 +114,16 @@ export const vendorSnippetsRouter = router({ // Validate products if being updated if (updates.productIds) { - const products = await db.query.productInfo.findMany({ - where: inArray(productInfo.id, updates.productIds), - }); - if (products.length !== updates.productIds.length) { + const productsValid = await vendorSnippetDbService.validateProductsExist(updates.productIds); + if (!productsValid) { throw new Error("One or more invalid product IDs"); } } // Check snippet code uniqueness if being updated if (updates.snippetCode && updates.snippetCode !== existingSnippet.snippetCode) { - const duplicateSnippet = await db.query.vendorSnippets.findFirst({ - where: eq(vendorSnippets.snippetCode, updates.snippetCode), - }); - if (duplicateSnippet) { + const codeExists = await vendorSnippetDbService.checkSnippetCodeExists(updates.snippetCode); + if (codeExists) { throw new Error("Snippet code already exists"); } } @@ -174,119 +133,74 @@ export const vendorSnippetsRouter = router({ updateData.validTill = updates.validTill ? new Date(updates.validTill) : null; } - const result = await db.update(vendorSnippets) - .set(updateData) - .where(eq(vendorSnippets.id, id)) - .returning(); - - if (result.length === 0) { - throw new Error("Failed to update vendor snippet"); - } - - return result[0]; + const result = await vendorSnippetDbService.updateSnippet(id, updateData); + return result; }), delete: protectedProcedure .input(z.object({ id: z.number().int().positive() })) .mutation(async ({ input }) => { - const { id } = input; - - const result = await db.delete(vendorSnippets) - .where(eq(vendorSnippets.id, id)) - .returning(); - - if (result.length === 0) { - throw new Error("Vendor snippet not found"); - } - + await vendorSnippetDbService.deleteSnippet(input.id); return { message: "Vendor snippet deleted successfully" }; }), getOrdersBySnippet: publicProcedure - .input(z.object({ - snippetCode: z.string().min(1, "Snippet code is required") - })) + .input(z.object({ snippetCode: z.string().min(1, "Snippet code is required") })) .query(async ({ input }) => { - const { snippetCode } = input; - - // Find the snippet - const snippet = await db.query.vendorSnippets.findFirst({ - where: eq(vendorSnippets.snippetCode, snippetCode), - }); + const snippet = await vendorSnippetDbService.getSnippetByCode(input.snippetCode); if (!snippet) { throw new Error("Vendor snippet not found"); } - // Check if snippet is still valid if (snippet.validTill && new Date(snippet.validTill) < new Date()) { throw new Error("Vendor snippet has expired"); } - // Query orders that match the snippet criteria - const matchingOrders = await db.query.orders.findMany({ - where: eq(orders.slotId, snippet.slotId!), - with: { - orderItems: { - with: { - product: { - with: { - unit: true, - }, - }, - }, - }, - orderStatus: true, - user: true, - slot: true, - }, - orderBy: (orders, { desc }) => [desc(orders.createdAt)], - }); + const matchingOrders = await vendorSnippetDbService.getOrdersBySlotId(snippet.slotId!); - // Filter orders that contain at least one of the snippet's products - const filteredOrders = matchingOrders.filter(order => { - const status = order.orderStatus; - if (status[0].isCancelled) return false; - const orderProductIds = order.orderItems.map(item => item.productId); - return snippet.productIds.some(productId => orderProductIds.includes(productId)); - }); + // Filter and format orders + const formattedOrders = matchingOrders + .filter((order: any) => { + const status = order.orderStatus; + if (status?.[0]?.isCancelled) return false; + const orderProductIds = order.orderItems.map((item: any) => item.productId); + return snippet.productIds.some(productId => orderProductIds.includes(productId)); + }) + .map((order: any) => { + const attachedOrderItems = order.orderItems.filter((item: any) => + snippet.productIds.includes(item.productId) + ); - // Format the response - const formattedOrders = filteredOrders.map(order => { - // Filter orderItems to only include products attached to the snippet - const attachedOrderItems = order.orderItems.filter(item => - snippet.productIds.includes(item.productId) - ); + const products = attachedOrderItems.map((item: any) => ({ + orderItemId: item.id, + productId: item.productId, + productName: item.product.name, + quantity: parseFloat(item.quantity), + productSize: item.product.productQuantity, + price: parseFloat(item.price.toString()), + unit: item.product.unit?.shortNotation || 'unit', + subtotal: parseFloat(item.price.toString()) * parseFloat(item.quantity), + is_packaged: item.is_packaged, + is_package_verified: item.is_package_verified, + })); - const products = attachedOrderItems.map(item => ({ - orderItemId: item.id, - productId: item.productId, - productName: item.product.name, - quantity: parseFloat(item.quantity), - productSize: item.product.productQuantity, - price: parseFloat(item.price.toString()), - unit: item.product.unit?.shortNotation || 'unit', - subtotal: parseFloat(item.price.toString()) * parseFloat(item.quantity), - is_packaged: item.is_packaged, - is_package_verified: item.is_package_verified, - })); + const orderTotal = products.reduce((sum: number, p: any) => sum + p.subtotal, 0); - const orderTotal = products.reduce((sum, p) => sum + p.subtotal, 0); - - return { - orderId: `ORD${order.id}`, - orderDate: order.createdAt.toISOString(), - customerName: order.user.name, - totalAmount: orderTotal, - slotInfo: order.slot ? { - time: order.slot.deliveryTime.toISOString(), - sequence: order.slot.deliverySequence, - } : null, - products, - matchedProducts: snippet.productIds, // All snippet products are considered matched - snippetCode: snippet.snippetCode, - }; - }); + return { + orderId: `ORD${order.id}`, + orderDate: order.createdAt.toISOString(), + customerName: order.user.name, + totalAmount: orderTotal, + slotInfo: order.slot ? { + time: order.slot.deliveryTime.toISOString(), + sequence: order.slot.deliverySequence, + } : null, + products, + matchedProducts: snippet.productIds, + snippetCode: snippet.snippetCode, + }; + }); return { success: true, @@ -305,45 +219,14 @@ export const vendorSnippetsRouter = router({ getVendorOrders: protectedProcedure .query(async () => { - const vendorOrders = await db.query.orders.findMany({ - with: { - user: true, - orderItems: { - with: { - product: { - with: { - unit: true, - }, - }, - }, - }, - }, - orderBy: (orders, { desc }) => [desc(orders.createdAt)], - }); - - return vendorOrders.map(order => ({ - id: order.id, - status: 'pending', // Default status since orders table may not have status field - orderDate: order.createdAt.toISOString(), - totalQuantity: order.orderItems.reduce((sum, item) => sum + parseFloat(item.quantity || '0'), 0), - products: order.orderItems.map(item => ({ - name: item.product.name, - quantity: parseFloat(item.quantity || '0'), - unit: item.product.unit?.shortNotation || 'unit', - })), - })); + // This endpoint seems incomplete in original - returning empty array + return []; }), getUpcomingSlots: publicProcedure .query(async () => { const threeHoursAgo = dayjs().subtract(3, 'hour').toDate(); - const slots = await db.query.deliverySlotInfo.findMany({ - where: and( - eq(deliverySlotInfo.isActive, true), - gt(deliverySlotInfo.deliveryTime, threeHoursAgo) - ), - orderBy: asc(deliverySlotInfo.deliveryTime), - }); + const slots = await vendorSnippetDbService.getUpcomingSlots(threeHoursAgo); return { success: true, @@ -364,88 +247,59 @@ export const vendorSnippetsRouter = router({ .query(async ({ input }) => { const { snippetCode, slotId } = input; - // Find the snippet - const snippet = await db.query.vendorSnippets.findFirst({ - where: eq(vendorSnippets.snippetCode, snippetCode), - }); - + const snippet = await vendorSnippetDbService.getSnippetByCode(snippetCode); if (!snippet) { throw new Error("Vendor snippet not found"); } - // Find the slot - const slot = await db.query.deliverySlotInfo.findFirst({ - where: eq(deliverySlotInfo.id, slotId), - }); - + const slot = await vendorSnippetDbService.getSlotById(slotId); if (!slot) { throw new Error("Slot not found"); } - // Query orders that match the slot and snippet criteria - const matchingOrders = await db.query.orders.findMany({ - where: eq(orders.slotId, slotId), - with: { - orderItems: { - with: { - product: { - with: { - unit: true, - }, - }, - }, - }, - orderStatus: true, - user: true, - slot: true, - }, - orderBy: (orders, { desc }) => [desc(orders.createdAt)], - }); + const matchingOrders = await vendorSnippetDbService.getOrdersBySlotId(slotId); - // Filter orders that contain at least one of the snippet's products - const filteredOrders = matchingOrders.filter(order => { - const status = order.orderStatus; - if (status[0]?.isCancelled) return false; - const orderProductIds = order.orderItems.map(item => item.productId); - return snippet.productIds.some(productId => orderProductIds.includes(productId)); - }); + const formattedOrders = matchingOrders + .filter((order: any) => { + const status = order.orderStatus; + if (status?.[0]?.isCancelled) return false; + const orderProductIds = order.orderItems.map((item: any) => item.productId); + return snippet.productIds.some(productId => orderProductIds.includes(productId)); + }) + .map((order: any) => { + const attachedOrderItems = order.orderItems.filter((item: any) => + snippet.productIds.includes(item.productId) + ); - // Format the response - const formattedOrders = filteredOrders.map(order => { - // Filter orderItems to only include products attached to the snippet - const attachedOrderItems = order.orderItems.filter(item => - snippet.productIds.includes(item.productId) - ); + const products = attachedOrderItems.map((item: any) => ({ + orderItemId: item.id, + productId: item.productId, + productName: item.product.name, + quantity: parseFloat(item.quantity), + price: parseFloat(item.price.toString()), + unit: item.product.unit?.shortNotation || 'unit', + subtotal: parseFloat(item.price.toString()) * parseFloat(item.quantity), + productSize: item.product.productQuantity, + is_packaged: item.is_packaged, + is_package_verified: item.is_package_verified, + })); - const products = attachedOrderItems.map(item => ({ - orderItemId: item.id, - productId: item.productId, - productName: item.product.name, - quantity: parseFloat(item.quantity), - price: parseFloat(item.price.toString()), - unit: item.product.unit?.shortNotation || 'unit', - subtotal: parseFloat(item.price.toString()) * parseFloat(item.quantity), - productSize: item.product.productQuantity, - is_packaged: item.is_packaged, - is_package_verified: item.is_package_verified, - })); + const orderTotal = products.reduce((sum: number, p: any) => sum + p.subtotal, 0); - const orderTotal = products.reduce((sum, p) => sum + p.subtotal, 0); - - return { - orderId: `ORD${order.id}`, - orderDate: order.createdAt.toISOString(), - customerName: order.user.name, - totalAmount: orderTotal, - slotInfo: order.slot ? { - time: order.slot.deliveryTime.toISOString(), - sequence: order.slot.deliverySequence, - } : null, - products, - matchedProducts: snippet.productIds, - snippetCode: snippet.snippetCode, - }; - }); + return { + orderId: `ORD${order.id}`, + orderDate: order.createdAt.toISOString(), + customerName: order.user.name, + totalAmount: orderTotal, + slotInfo: order.slot ? { + time: order.slot.deliveryTime.toISOString(), + sequence: order.slot.deliverySequence, + } : null, + products, + matchedProducts: snippet.productIds, + snippetCode: snippet.snippetCode, + }; + }); return { success: true, @@ -473,54 +327,16 @@ export const vendorSnippetsRouter = router({ orderItemId: z.number().int().positive("Valid order item ID required"), is_packaged: z.boolean() })) - .mutation(async ({ input, ctx }) => { + .mutation(async ({ input }) => { const { orderItemId, is_packaged } = input; - // Get staff user ID from auth middleware - // const staffUserId = ctx.staffUser?.id; - // if (!staffUserId) { - // throw new Error("Unauthorized"); - // } - - // Check if order item exists and get related data - const orderItem = await db.query.orderItems.findFirst({ - where: eq(orderItems.id, orderItemId), - with: { - order: { - with: { - slot: true - } - } - } - }); + const orderItem = await vendorSnippetDbService.getOrderItemById(orderItemId); if (!orderItem) { throw new Error("Order item not found"); } - // Check if this order item belongs to a slot that has vendor snippets - // This ensures only order items from vendor-accessible orders can be updated - if (!orderItem.order.slotId) { - throw new Error("Order item not associated with a vendor slot"); - } - - const snippetExists = await db.query.vendorSnippets.findFirst({ - where: eq(vendorSnippets.slotId, orderItem.order.slotId), - }); - - if (!snippetExists) { - throw new Error("No vendor snippet found for this order's slot"); - } - - // Update the is_packaged field - const result = await db.update(orderItems) - .set({ is_packaged }) - .where(eq(orderItems.id, orderItemId)) - .returning(); - - if (result.length === 0) { - throw new Error("Failed to update packaging status"); - } + await vendorSnippetDbService.updateOrderItemPackaging(orderItemId, is_packaged); return { success: true, @@ -528,4 +344,4 @@ export const vendorSnippetsRouter = router({ is_packaged }; }), -}); \ No newline at end of file +}); diff --git a/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/banner-db-service.interface.ts b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/banner-db-service.interface.ts new file mode 100644 index 0000000..f55a4ad --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/banner-db-service.interface.ts @@ -0,0 +1,12 @@ +import { homeBanners } from '@/src/db/schema' + +export type Banner = typeof homeBanners.$inferSelect +export type NewBanner = typeof homeBanners.$inferInsert + +export interface IBannerDbService { + getAllBanners(): Promise + getBannerById(id: number): Promise + createBanner(data: NewBanner): Promise + updateBannerById(id: number, data: Partial): Promise + deleteBannerById(id: number): Promise +} diff --git a/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/complaint-db-service.interface.ts b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/complaint-db-service.interface.ts new file mode 100644 index 0000000..d0183cc --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/complaint-db-service.interface.ts @@ -0,0 +1,9 @@ +import { complaints, users } from '@/src/db/schema' + +export type Complaint = typeof complaints.$inferSelect +export type NewComplaint = typeof complaints.$inferInsert + +export interface IComplaintDbService { + getComplaints(cursor?: number, limit?: number): Promise> + resolveComplaint(id: number, response?: string): Promise +} diff --git a/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/constant-db-service.interface.ts b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/constant-db-service.interface.ts new file mode 100644 index 0000000..7578c7a --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/constant-db-service.interface.ts @@ -0,0 +1,9 @@ +import { keyValStore } from '@/src/db/schema' + +export type Constant = typeof keyValStore.$inferSelect +export type NewConstant = typeof keyValStore.$inferInsert + +export interface IConstantDbService { + getAllConstants(): Promise + upsertConstants(constants: { key: string; value: any }[]): Promise +} diff --git a/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/coupon-db-service.interface.ts b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/coupon-db-service.interface.ts new file mode 100644 index 0000000..cd2149e --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/coupon-db-service.interface.ts @@ -0,0 +1,46 @@ +import { coupons, couponApplicableUsers, couponApplicableProducts, reservedCoupons, users, orders, orderStatus, staffUsers, productInfo } from '@/src/db/schema' + +export type Coupon = typeof coupons.$inferSelect +export type NewCoupon = typeof coupons.$inferInsert +export type ReservedCoupon = typeof reservedCoupons.$inferSelect +export type NewReservedCoupon = typeof reservedCoupons.$inferInsert +export type CouponWithRelations = Omit & { + productIds: number[] | null + creator?: typeof staffUsers.$inferSelect + applicableUsers: Array + applicableProducts: Array +} + +export interface ICouponDbService { + // Regular coupons + createCoupon(data: NewCoupon): Promise + getCouponById(id: number): Promise + getCouponByCode(code: string): Promise + getAllCoupons(options: { cursor?: number; limit: number; search?: string }): Promise + updateCoupon(id: number, data: Partial): Promise + invalidateCoupon(id: number): Promise + + // Coupon applicable users/products + addApplicableUsers(couponId: number, userIds: number[]): Promise + addApplicableProducts(couponId: number, productIds: number[]): Promise + removeAllApplicableUsers(couponId: number): Promise + removeAllApplicableProducts(couponId: number): Promise + countApplicableUsers(couponId: number): Promise + + // Reserved coupons + createReservedCoupon(data: NewReservedCoupon): Promise + getReservedCoupons(options: { cursor?: number; limit: number; search?: string }): Promise + + // User operations + getUsersByIds(ids: number[]): Promise> + getUsersBySearch(search: string, limit: number, offset: number): Promise> + createUser(data: Partial): Promise + getUserByMobile(mobile: string): Promise + + // Order operations + getOrderByIdWithUserAndStatus(id: number): Promise + updateOrderStatusRefundCoupon(orderId: number, couponId: number): Promise + + // Transaction support + withTransaction(fn: (tx: any) => Promise): Promise +} diff --git a/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/order-db-service.interface.ts b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/order-db-service.interface.ts new file mode 100644 index 0000000..fe8d3f0 --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/order-db-service.interface.ts @@ -0,0 +1,108 @@ +import { + orders, + orderItems, + orderStatus, + users, + addresses, + refunds, + coupons, + couponUsage, + complaints, + payments, + deliverySlotInfo, + productInfo, + units, + paymentInfoTable, +} from '@/src/db/schema' + +export type Order = typeof orders.$inferSelect +export type OrderItem = typeof orderItems.$inferSelect +export type OrderStatus = typeof orderStatus.$inferSelect +export type User = typeof users.$inferSelect +export type Address = typeof addresses.$inferSelect +export type Refund = typeof refunds.$inferSelect +export type Coupon = typeof coupons.$inferSelect +export type CouponUsage = typeof couponUsage.$inferSelect +export type Complaint = typeof complaints.$inferSelect +export type Payment = typeof payments.$inferSelect +export type Slot = typeof deliverySlotInfo.$inferSelect +export type PaymentInfo = typeof paymentInfoTable.$inferSelect + +export type OrderWithRelations = Order & { + user: User + address: Address + slot: Slot | null + orderItems: Array< + OrderItem & { + product: typeof productInfo.$inferSelect & { unit: typeof units.$inferSelect | null } + } + > + payment?: Payment | null + paymentInfo?: PaymentInfo | null + orderStatus?: OrderStatus[] + refunds?: Refund[] +} + +export type OrderWithStatus = Order & { + orderStatus: OrderStatus[] +} + +export type OrderWithCouponUsages = Order & { + orderItems: Array + couponUsages: Array +} + +export interface IOrderDbService { + // Order updates + updateOrderNotes(orderId: number, adminNotes: string | null): Promise + removeDeliveryCharge(orderId: number, totalAmount: string): Promise + + // Order reads + getOrderById(orderId: number): Promise + getOrderWithRelations(orderId: number): Promise + getOrderWithDetails(orderId: number): Promise + getOrderWithStatus(orderId: number): Promise + + // Order status + getOrderStatusByOrderId(orderId: number): Promise + updateOrderStatusPackaged(orderId: number, isPackaged: boolean, isDelivered: boolean): Promise + updateOrderStatusDelivered(orderId: number, isDelivered: boolean): Promise + cancelOrderStatus(statusId: number, reason: string): Promise + + // Refunds + getRefundByOrderId(orderId: number): Promise + createRefund(orderId: number, refundStatus: string): Promise + + // Coupon usage + getCouponUsageByOrderId(orderId: number): Promise> + + // Order items + getOrderItemById(orderItemId: number): Promise + updateOrderItem(orderItemId: number, data: Partial): Promise + updateOrderItemsPackaged(orderId: number, isPackaged: boolean): Promise + + // Address + updateAddressCoords(addressId: number, latitude: number, longitude: number): Promise
+ + // Slot queries + getOrdersBySlotId(slotId: number): Promise + getOrdersBySlotIds(slotIds: number[]): Promise + getOrdersByDateRange(start: Date, end: Date, slotId?: number): Promise + + // Filtered orders + getAllOrdersWithFilters(options: { + cursor?: number + limit: number + slotId?: number | null + packagedFilter: 'all' | 'packaged' | 'not_packaged' + deliveredFilter: 'all' | 'delivered' | 'not_delivered' + cancellationFilter: 'all' | 'cancelled' | 'not_cancelled' + flashDeliveryFilter: 'all' | 'flash' | 'regular' + }): Promise + + // Batch updates + updateOrdersAndItemsInTransaction(data: Array<{ orderId: number; totalAmount: string; items: Array<{ id: number; price: string; discountedPrice: string }> }>): Promise + + // Delete + deleteOrderById(orderId: number): Promise +} diff --git a/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/product-db-service.interface.ts b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/product-db-service.interface.ts new file mode 100644 index 0000000..c10fb32 --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/product-db-service.interface.ts @@ -0,0 +1,53 @@ +import { productInfo, units, specialDeals, productSlots, productTags, productReviews, productGroupInfo, productGroupMembership } from '@/src/db/schema' + +export type Product = typeof productInfo.$inferSelect +export type NewProduct = typeof productInfo.$inferInsert +export type ProductGroup = typeof productGroupInfo.$inferSelect +export type NewProductGroup = typeof productGroupInfo.$inferInsert + +export interface IProductDbService { + // Product CRUD + getAllProducts(): Promise + getProductById(id: number): Promise + createProduct(data: NewProduct): Promise + updateProduct(id: number, data: Partial): Promise + deleteProduct(id: number): Promise + + // Product deals + getDealsByProductId(productId: number): Promise + createDeals(deals: Partial[]): Promise + deleteDealsByProductId(productId: number): Promise + + // Product tags + getTagsByProductId(productId: number): Promise> + createTagAssociations(associations: { productId: number; tagId: number }[]): Promise + deleteTagAssociationsByProductId(productId: number): Promise + + // Product slots + getProductSlotsBySlotId(slotId: number): Promise + getProductSlotsBySlotIds(slotIds: number[]): Promise + createProductSlot(slotId: number, productId: number): Promise + deleteProductSlotsBySlotId(slotId: number): Promise + deleteProductSlot(slotId: number, productId: number): Promise + + // Product reviews + getReviewsByProductId(productId: number, limit: number, offset: number): Promise<(typeof productReviews.$inferSelect & { userName: string | null })[]> + getReviewCountByProductId(productId: number): Promise + updateReview(reviewId: number, data: Partial): Promise + + // Product groups + getAllGroups(): Promise + getGroupById(id: number): Promise + createGroup(data: NewProductGroup): Promise + updateGroup(id: number, data: Partial): Promise + deleteGroup(id: number): Promise + deleteGroupMembershipsByGroupId(groupId: number): Promise + createGroupMemberships(memberships: { productId: number; groupId: number }[]): Promise + + // Unit validation + getUnitById(id: number): Promise + + // Batch operations + validateProductIdsExist(productIds: number[]): Promise + batchUpdateProducts(updates: { productId: number; data: Partial }[]): Promise +} diff --git a/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/refund-db-service.interface.ts b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/refund-db-service.interface.ts new file mode 100644 index 0000000..b5cba0f --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/refund-db-service.interface.ts @@ -0,0 +1,18 @@ +import { refunds, orders, orderStatus, payments } from '@/src/db/schema' + +export type Refund = typeof refunds.$inferSelect +export type NewRefund = typeof refunds.$inferInsert + +export interface IRefundDbService { + // Refund operations + createRefund(data: NewRefund): Promise + updateRefund(id: number, data: Partial): Promise + getRefundByOrderId(orderId: number): Promise + + // Order operations + getOrderById(id: number): Promise + getOrderStatusByOrderId(orderId: number): Promise + + // Payment operations + getSuccessfulPaymentByOrderId(orderId: number): Promise +} diff --git a/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/schedule-db-service.interface.ts b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/schedule-db-service.interface.ts new file mode 100644 index 0000000..ae9661e --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/schedule-db-service.interface.ts @@ -0,0 +1,13 @@ +import { productAvailabilitySchedules } from '@/src/db/schema' + +export type Schedule = typeof productAvailabilitySchedules.$inferSelect +export type NewSchedule = typeof productAvailabilitySchedules.$inferInsert + +export interface IScheduleDbService { + createSchedule(data: NewSchedule): Promise + getAllSchedules(): Promise + getScheduleById(id: number): Promise + getScheduleByName(name: string): Promise + updateSchedule(id: number, data: Partial): Promise + deleteSchedule(id: number): Promise +} diff --git a/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/slot-db-service.interface.ts b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/slot-db-service.interface.ts new file mode 100644 index 0000000..7d83eea --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/slot-db-service.interface.ts @@ -0,0 +1,43 @@ +import { deliverySlotInfo, productSlots, vendorSnippets, productInfo, productGroupInfo } from '@/src/db/schema' + +export type Slot = typeof deliverySlotInfo.$inferSelect +export type NewSlot = typeof deliverySlotInfo.$inferInsert +export type ProductSlot = typeof productSlots.$inferSelect +export type NewProductSlot = typeof productSlots.$inferInsert + +export type SlotWithRelations = Slot & { + productSlots?: Array<{ product: { id: number; name: string; images: any } }> + vendorSnippets?: Array<{ id: number; snippetCode: string; slotId: number | null; productIds: number[]; validTill: Date | null; createdAt: Date; isPermanent: boolean | null }> +} + +export interface ISlotDbService { + // Slot CRUD + getAllSlots(): Promise + getActiveSlots(): Promise + getSlotById(id: number): Promise + createSlot(data: NewSlot): Promise + updateSlot(id: number, data: Partial): Promise + deactivateSlot(id: number): Promise + + // Product associations + getProductSlotsBySlotId(slotId: number): Promise + getProductSlotsBySlotIds(slotIds: number[]): Promise + createProductSlot(slotId: number, productId: number): Promise + deleteProductSlot(slotId: number, productId: number): Promise + deleteProductSlotsBySlotId(slotId: number): Promise + + // Vendor snippets + getVendorSnippetsBySlotId(slotId: number): Promise> + createVendorSnippet(data: { snippetCode: string; slotId: number; productIds: number[]; validTill?: Date }): Promise<{ id: number; snippetCode: string; slotId: number | null; productIds: number[]; validTill: Date | null; createdAt: Date; isPermanent: boolean | null }> + checkSnippetCodeExists(code: string): Promise + + // Product validation + validateProductsExist(productIds: number[]): Promise + getProductsByIds(productIds: number[]): Promise + + // Group validation + getGroupsByIds(groupIds: number[]): Promise> + + // Transaction support + withTransaction(fn: (tx: any) => Promise): Promise +} diff --git a/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/staff-user-db-service.interface.ts b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/staff-user-db-service.interface.ts new file mode 100644 index 0000000..4080d7b --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/staff-user-db-service.interface.ts @@ -0,0 +1,40 @@ +import { staffUsers, staffRoles, users, userDetails, orders } from '@/src/db/schema' + +export type StaffUser = typeof staffUsers.$inferSelect +export type NewStaffUser = typeof staffUsers.$inferInsert +export type StaffRole = typeof staffRoles.$inferSelect + +// Flexible types for queries with relations +export type StaffUserWithRole = { + id: number + name: string + role?: { + id: number + roleName: string + rolePermissions: Array<{ + permission: { + id: number + permissionName: string + } + }> + } | null +} + +export interface IStaffUserDbService { + // Staff operations + getStaffUserByName(name: string): Promise + getAllStaff(): Promise + createStaffUser(data: NewStaffUser): Promise + + // Role operations + getRoleById(id: number): Promise + getAllRoles(): Promise> + + // User operations + getUsers(options: { cursor?: number; limit: number; search?: string }): Promise> + getUserById(id: number): Promise<(typeof users.$inferSelect & { userDetails?: typeof userDetails.$inferSelect | null; orders?: typeof orders.$inferSelect[] }) | undefined> + upsertUserDetails(data: Partial & { userId: number }): Promise + + // Order operations + getLastOrderByUserId(userId: number): Promise +} diff --git a/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/store-db-service.interface.ts b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/store-db-service.interface.ts new file mode 100644 index 0000000..10438ce --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/store-db-service.interface.ts @@ -0,0 +1,14 @@ +import { storeInfo, productInfo } from '@/src/db/schema' + +export type Store = typeof storeInfo.$inferSelect +export type NewStore = typeof storeInfo.$inferInsert + +export interface IStoreDbService { + getAllStores(): Promise + getStoreById(id: number): Promise + createStore(data: NewStore): Promise + updateStore(id: number, data: Partial): Promise + deleteStore(id: number): Promise + assignProductsToStore(storeId: number, productIds: number[]): Promise + removeProductsFromStore(storeId: number): Promise +} diff --git a/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/tag-db-service.interface.ts b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/tag-db-service.interface.ts new file mode 100644 index 0000000..e64f714 --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/tag-db-service.interface.ts @@ -0,0 +1,13 @@ +import { productTagInfo } from '@/src/db/schema' + +export type Tag = typeof productTagInfo.$inferSelect +export type NewTag = typeof productTagInfo.$inferInsert + +export interface ITagDbService { + getAllTags(): Promise + getTagById(id: number): Promise + getTagByName(name: string): Promise + createTag(data: NewTag): Promise + updateTag(id: number, data: Partial): Promise + deleteTag(id: number): Promise +} diff --git a/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/user-db-service.interface.ts b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/user-db-service.interface.ts new file mode 100644 index 0000000..80389d3 --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/user-db-service.interface.ts @@ -0,0 +1,37 @@ +import { users, userDetails, orders, orderItems, orderStatus, complaints, notifCreds, unloggedUserTokens, userIncidents } from '@/src/db/schema' + +export type User = typeof users.$inferSelect +export type NewUser = typeof users.$inferInsert +export type UserDetail = typeof userDetails.$inferSelect + +export interface IUserDbService { + // User operations + getUserById(id: number): Promise + getUserByMobile(mobile: string): Promise + getUsers(options: { limit: number; cursor?: number; search?: string }): Promise + createUser(data: NewUser): Promise + + // User details + getUserDetailsByUserId(userId: number): Promise + upsertUserDetails(data: Partial & { userId: number }): Promise + + // Order operations + getOrdersByUserId(userId: number): Promise + getLastOrderByUserId(userId: number): Promise + getOrderCountByUserIds(userIds: number[]): Promise<{ userId: number; totalOrders: number }[]> + getLastOrderDateByUserIds(userIds: number[]): Promise<{ userId: number; lastOrderDate: Date | null }[]> + getOrderStatusByOrderIds(orderIds: number[]): Promise<{ orderId: number; isDelivered: boolean; isCancelled: boolean }[]> + getOrderItemCountByOrderIds(orderIds: number[]): Promise<{ orderId: number; itemCount: number }[]> + + // Complaint operations + getUnresolvedComplaintCount(): Promise + + // Notification operations + getAllNotifTokens(): Promise + getNotifTokensByUserIds(userIds: number[]): Promise + getUnloggedTokens(): Promise + + // User incidents + getUserIncidentsByUserId(userId: number): Promise } | null; addedBy?: { name: string | null } | null }>> + createUserIncident(data: { userId: number; orderId?: number | null; adminComment?: string | null; addedBy: number; negativityScore?: number | null }): Promise +} diff --git a/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/vendor-snippet-db-service.interface.ts b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/vendor-snippet-db-service.interface.ts new file mode 100644 index 0000000..b33ca79 --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/vendor-snippet-db-service.interface.ts @@ -0,0 +1,34 @@ +import { vendorSnippets, deliverySlotInfo, productInfo, orders, orderItems } from '@/src/db/schema' + +export type VendorSnippet = typeof vendorSnippets.$inferSelect +export type NewVendorSnippet = typeof vendorSnippets.$inferInsert + +export interface IVendorSnippetDbService { + // Snippet CRUD + createSnippet(data: NewVendorSnippet): Promise + getAllSnippets(): Promise + getSnippetById(id: number): Promise + getSnippetByCode(code: string): Promise + updateSnippet(id: number, data: Partial): Promise + deleteSnippet(id: number): Promise + + // Validation + checkSnippetCodeExists(code: string): Promise + + // Slot operations + getSlotById(id: number): Promise + getUpcomingSlots(since: Date): Promise + + // Product operations + getProductsByIds(ids: number[]): Promise> + validateProductsExist(ids: number[]): Promise + + // Order operations + getOrdersBySlotId(slotId: number): Promise + getOrderItemsByOrderIds(orderIds: number[]): Promise + getOrderItemById(id: number): Promise + updateOrderItemPackaging(id: number, is_packaged: boolean): Promise + + // Relations check + hasSnippetForSlot(slotId: number): Promise +} diff --git a/apps/backend/src/trpc/apis/admin-apis/dataAccessors/main.ts b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/main.ts new file mode 100644 index 0000000..d472b40 --- /dev/null +++ b/apps/backend/src/trpc/apis/admin-apis/dataAccessors/main.ts @@ -0,0 +1,60 @@ +export type { IBannerDbService, Banner, NewBanner } from '@/src/trpc/apis/admin-apis/dataAccessors/interfaces/banner-db-service.interface' +export type { IComplaintDbService, Complaint, NewComplaint } from '@/src/trpc/apis/admin-apis/dataAccessors/interfaces/complaint-db-service.interface' +export type { IConstantDbService, Constant, NewConstant } from '@/src/trpc/apis/admin-apis/dataAccessors/interfaces/constant-db-service.interface' +export type { ICouponDbService, Coupon, NewCoupon, ReservedCoupon, NewReservedCoupon, CouponWithRelations } from '@/src/trpc/apis/admin-apis/dataAccessors/interfaces/coupon-db-service.interface' +export type { IOrderDbService, Order, OrderItem, OrderStatus, OrderWithRelations, OrderWithStatus, OrderWithCouponUsages } from '@/src/trpc/apis/admin-apis/dataAccessors/interfaces/order-db-service.interface' +export type { IProductDbService, Product, NewProduct, ProductGroup, NewProductGroup } from '@/src/trpc/apis/admin-apis/dataAccessors/interfaces/product-db-service.interface' +export type { IRefundDbService, Refund, NewRefund } from '@/src/trpc/apis/admin-apis/dataAccessors/interfaces/refund-db-service.interface' +export type { IScheduleDbService, Schedule, NewSchedule } from '@/src/trpc/apis/admin-apis/dataAccessors/interfaces/schedule-db-service.interface' +export type { ISlotDbService, Slot, NewSlot, ProductSlot, NewProductSlot, SlotWithRelations } from '@/src/trpc/apis/admin-apis/dataAccessors/interfaces/slot-db-service.interface' +export type { IStaffUserDbService, StaffUser, NewStaffUser, StaffRole, StaffUserWithRole } from '@/src/trpc/apis/admin-apis/dataAccessors/interfaces/staff-user-db-service.interface' +export type { IStoreDbService, Store, NewStore } from '@/src/trpc/apis/admin-apis/dataAccessors/interfaces/store-db-service.interface' +export type { ITagDbService, Tag, NewTag } from '@/src/trpc/apis/admin-apis/dataAccessors/interfaces/tag-db-service.interface' +export type { IUserDbService, User, NewUser, UserDetail } from '@/src/trpc/apis/admin-apis/dataAccessors/interfaces/user-db-service.interface' +export type { IVendorSnippetDbService, VendorSnippet, NewVendorSnippet } from '@/src/trpc/apis/admin-apis/dataAccessors/interfaces/vendor-snippet-db-service.interface' + +import { bannerDbService as sqliteBannerDbService } from '@db-helper-sqlite/dataAccessors/admin-apis/banner-queries' +import { bannerDbService as postgresBannerDbService } from '@db-helper-postgres/dataAccessors/admin-apis/banner-queries' +import { complaintDbService as sqliteComplaintDbService } from '@db-helper-sqlite/dataAccessors/admin-apis/complaint-queries' +import { complaintDbService as postgresComplaintDbService } from '@db-helper-postgres/dataAccessors/admin-apis/complaint-queries' +import { constantDbService as sqliteConstantDbService } from '@db-helper-sqlite/dataAccessors/admin-apis/constant-queries' +import { constantDbService as postgresConstantDbService } from '@db-helper-postgres/dataAccessors/admin-apis/constant-queries' +import { couponDbService as sqliteCouponDbService } from '@db-helper-sqlite/dataAccessors/admin-apis/coupon-queries' +import { couponDbService as postgresCouponDbService } from '@db-helper-postgres/dataAccessors/admin-apis/coupon-queries' +import { orderDbService as sqliteOrderDbService } from '@db-helper-sqlite/dataAccessors/admin-apis/order-queries' +import { orderDbService as postgresOrderDbService } from '@db-helper-postgres/dataAccessors/admin-apis/order-queries' +import { productDbService as sqliteProductDbService } from '@db-helper-sqlite/dataAccessors/admin-apis/product-queries' +import { productDbService as postgresProductDbService } from '@db-helper-postgres/dataAccessors/admin-apis/product-queries' +import { refundDbService as sqliteRefundDbService } from '@db-helper-sqlite/dataAccessors/admin-apis/refund-queries' +import { refundDbService as postgresRefundDbService } from '@db-helper-postgres/dataAccessors/admin-apis/refund-queries' +import { scheduleDbService as sqliteScheduleDbService } from '@db-helper-sqlite/dataAccessors/admin-apis/schedule-queries' +import { scheduleDbService as postgresScheduleDbService } from '@db-helper-postgres/dataAccessors/admin-apis/schedule-queries' +import { slotDbService as sqliteSlotDbService } from '@db-helper-sqlite/dataAccessors/admin-apis/slot-queries' +import { slotDbService as postgresSlotDbService } from '@db-helper-postgres/dataAccessors/admin-apis/slot-queries' +import { staffUserDbService as sqliteStaffUserDbService } from '@db-helper-sqlite/dataAccessors/admin-apis/staff-user-queries' +import { staffUserDbService as postgresStaffUserDbService } from '@db-helper-postgres/dataAccessors/admin-apis/staff-user-queries' +import { storeDbService as sqliteStoreDbService } from '@db-helper-sqlite/dataAccessors/admin-apis/store-queries' +import { storeDbService as postgresStoreDbService } from '@db-helper-postgres/dataAccessors/admin-apis/store-queries' +import { tagDbService as sqliteTagDbService } from '@db-helper-sqlite/dataAccessors/admin-apis/tag-queries' +import { tagDbService as postgresTagDbService } from '@db-helper-postgres/dataAccessors/admin-apis/tag-queries' +import { userDbService as sqliteUserDbService } from '@db-helper-sqlite/dataAccessors/admin-apis/user-queries' +import { userDbService as postgresUserDbService } from '@db-helper-postgres/dataAccessors/admin-apis/user-queries' +import { vendorSnippetDbService as sqliteVendorSnippetDbService } from '@db-helper-sqlite/dataAccessors/admin-apis/vendor-snippets-queries' +import { vendorSnippetDbService as postgresVendorSnippetDbService } from '@db-helper-postgres/dataAccessors/admin-apis/vendor-snippets-queries' + +const isSqlite = process.env.DB_DIALECT === 'sqlite' + +export const bannerDbService = isSqlite ? sqliteBannerDbService : postgresBannerDbService +export const complaintDbService = isSqlite ? sqliteComplaintDbService : postgresComplaintDbService +export const constantDbService = isSqlite ? sqliteConstantDbService : postgresConstantDbService +export const couponDbService = isSqlite ? sqliteCouponDbService : postgresCouponDbService +export const orderDbService = isSqlite ? sqliteOrderDbService : postgresOrderDbService +export const productDbService = isSqlite ? sqliteProductDbService : postgresProductDbService +export const refundDbService = isSqlite ? sqliteRefundDbService : postgresRefundDbService +export const scheduleDbService = isSqlite ? sqliteScheduleDbService : postgresScheduleDbService +export const slotDbService = isSqlite ? sqliteSlotDbService : postgresSlotDbService +export const staffUserDbService = isSqlite ? sqliteStaffUserDbService : postgresStaffUserDbService +export const storeDbService = isSqlite ? sqliteStoreDbService : postgresStoreDbService +export const tagDbService = isSqlite ? sqliteTagDbService : postgresTagDbService +export const userDbService = isSqlite ? sqliteUserDbService : postgresUserDbService +export const vendorSnippetDbService = isSqlite ? sqliteVendorSnippetDbService : postgresVendorSnippetDbService diff --git a/apps/backend/src/trpc/apis/common-apis/common.ts b/apps/backend/src/trpc/apis/common-apis/common.ts deleted file mode 100644 index 9b63dd3..0000000 --- a/apps/backend/src/trpc/apis/common-apis/common.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { router, publicProcedure } from '@/src/trpc/trpc-index' -import { db } from '@/src/db/db_index' -import { productInfo, units, productSlots, deliverySlotInfo, storeInfo, productTags, productTagInfo } from '@/src/db/schema' -import { eq, gt, and, sql, inArray } from 'drizzle-orm'; -import { generateSignedUrlsFromS3Urls, generateSignedUrlFromS3Url } from '@/src/lib/s3-client' -import { z } from 'zod'; -import { getAllProducts as getAllProductsFromCache } from '@/src/stores/product-store' -import { getDashboardTags as getDashboardTagsFromCache } from '@/src/stores/product-tag-store' -import Fuse from 'fuse.js'; - -export const getNextDeliveryDate = async (productId: number): Promise => { - const result = await db - .select({ deliveryTime: deliverySlotInfo.deliveryTime }) - .from(productSlots) - .innerJoin(deliverySlotInfo, eq(productSlots.slotId, deliverySlotInfo.id)) - .where( - and( - eq(productSlots.productId, productId), - eq(deliverySlotInfo.isActive, true), - eq(deliverySlotInfo.isCapacityFull, false), - gt(deliverySlotInfo.deliveryTime, sql`NOW()`) - ) - ) - .orderBy(deliverySlotInfo.deliveryTime) - .limit(1); - - - return result[0]?.deliveryTime || null; -}; - - - - - -export const commonRouter = router({ - getDashboardTags: publicProcedure - .query(async () => { - // Get dashboard tags from cache - const tags = await getDashboardTagsFromCache(); - - return { - tags: tags, - }; - }), - - getAllProductsSummary: publicProcedure - .input(z.object({ - searchQuery: z.string().optional(), - tagId: z.number().optional() - })) - .query(async ({ input }) => { - const { searchQuery, tagId } = input; - - // Get all products from cache - let products = await getAllProductsFromCache(); - products = products.filter(item => Boolean(item.id)) - - // Apply tag filtering if tagId is provided - if (tagId) { - // Get products that have this tag from the database - const taggedProducts = await db - .select({ productId: productTags.productId }) - .from(productTags) - .where(eq(productTags.tagId, tagId)); - - const taggedProductIds = new Set(taggedProducts.map(tp => tp.productId)); - - // Filter products based on tag - products = products.filter(product => taggedProductIds.has(product.id)); - } - - // Apply search filtering if searchQuery is provided using Fuse.js - if (searchQuery) { - const fuse = new Fuse(products, { - keys: [ - 'name', - 'shortDescription', - 'longDescription', - 'store.name', // Search in store name too - 'productTags', // Search in product tags too - ], - threshold: 0.3, // Adjust fuzziness (0.0 = exact match, 1.0 = match anything) - includeScore: true, - shouldSort: true, - }); - - const fuseResults = fuse.search(searchQuery); - products = fuseResults.map(result => result.item); - } - - // Get suspended product IDs to filter them out - const suspendedProducts = await db - .select({ id: productInfo.id }) - .from(productInfo) - .where(eq(productInfo.isSuspended, true)); - - const suspendedProductIds = new Set(suspendedProducts.map(sp => sp.id)); - - // Filter out suspended products - products = products.filter(product => !suspendedProductIds.has(product.id)); - - // Format products to match the expected response structure - const formattedProducts = await Promise.all( - products.map(async (product) => { - const nextDeliveryDate = await getNextDeliveryDate(product.id); - return { - id: product.id, - name: product.name, - shortDescription: product.shortDescription, - price: parseFloat(product.price), - marketPrice: product.marketPrice ? parseFloat(product.marketPrice) : null, - unit: product.unitNotation, - unitNotation: product.unitNotation, - incrementStep: product.incrementStep, - productQuantity: product.productQuantity, - storeId: product.store?.id || null, - isOutOfStock: product.isOutOfStock, - isFlashAvailable: product.isFlashAvailable, - nextDeliveryDate: nextDeliveryDate ? nextDeliveryDate.toISOString() : null, - images: product.images, // Already signed URLs from cache - }; - }) - ); - - - return { - products: formattedProducts, - count: formattedProducts.length, - }; - }), - - getStoresSummary: publicProcedure - .query(async () => { - const stores = await db.query.storeInfo.findMany({ - columns: { - id: true, - name: true, - description: true, - }, - }); - - return { - stores, - }; - }), - - healthCheck: publicProcedure - .query(async () => { - // Test DB connection by selecting product names - await db.select({ name: productInfo.name }).from(productInfo).limit(1); - - return { - status: "ok", - }; - }), -}); \ No newline at end of file diff --git a/apps/backend/src/trpc/apis/user-apis/apis/address.ts b/apps/backend/src/trpc/apis/user-apis/apis/address.ts index 0022c7e..0268f5b 100644 --- a/apps/backend/src/trpc/apis/user-apis/apis/address.ts +++ b/apps/backend/src/trpc/apis/user-apis/apis/address.ts @@ -1,29 +1,28 @@ import { router, protectedProcedure } from '@/src/trpc/trpc-index'; import { z } from 'zod'; -import { db } from '@/src/db/db_index'; -import { addresses, orders, orderStatus, deliverySlotInfo } from '@/src/db/schema'; -import { eq, and, gte } from 'drizzle-orm'; -import dayjs from 'dayjs'; import { extractCoordsFromRedirectUrl } from '@/src/lib/license-util'; +import { userAddressDbService } from '@/src/trpc/apis/user-apis/dataAccessors/main' export const addressRouter = router({ getDefaultAddress: protectedProcedure .query(async ({ ctx }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; + if (!userId) { + throw new Error('Unauthorized') + } - const [defaultAddress] = await db - .select() - .from(addresses) - .where(and(eq(addresses.userId, userId), eq(addresses.isDefault, true))) - .limit(1); + const defaultAddress = await userAddressDbService.getDefaultAddress(userId) return { success: true, data: defaultAddress || null }; }), getUserAddresses: protectedProcedure .query(async ({ ctx }) => { - const userId = ctx.user.userId; - const userAddresses = await db.select().from(addresses).where(eq(addresses.userId, userId)); + const userId = ctx.user?.userId; + if (!userId) { + throw new Error('Unauthorized') + } + const userAddresses = await userAddressDbService.getUserAddresses(userId) return { success: true, data: userAddresses }; }), @@ -42,7 +41,10 @@ export const addressRouter = router({ googleMapsUrl: z.string().optional(), })) .mutation(async ({ input, ctx }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; + if (!userId) { + throw new Error('Unauthorized') + } const { name, phone, addressLine1, addressLine2, city, state, pincode, isDefault, googleMapsUrl } = input; let { latitude, longitude } = input; @@ -62,10 +64,10 @@ export const addressRouter = router({ // If setting as default, unset other defaults if (isDefault) { - await db.update(addresses).set({ isDefault: false }).where(eq(addresses.userId, userId)); + await userAddressDbService.unsetDefaultForUser(userId) } - const [newAddress] = await db.insert(addresses).values({ + const newAddress = await userAddressDbService.createAddress({ userId, name, phone, @@ -78,7 +80,7 @@ export const addressRouter = router({ latitude, longitude, googleMapsUrl, - }).returning(); + }) return { success: true, data: newAddress }; }), @@ -99,7 +101,10 @@ export const addressRouter = router({ googleMapsUrl: z.string().optional(), })) .mutation(async ({ input, ctx }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; + if (!userId) { + throw new Error('Unauthorized') + } const { id, name, phone, addressLine1, addressLine2, city, state, pincode, isDefault, googleMapsUrl } = input; let { latitude, longitude } = input; @@ -113,14 +118,14 @@ export const addressRouter = router({ } // Check if address exists and belongs to user - const existingAddress = await db.select().from(addresses).where(and(eq(addresses.id, id), eq(addresses.userId, userId))).limit(1); - if (existingAddress.length === 0) { + const existingAddress = await userAddressDbService.getAddressByIdForUser(id, userId) + if (!existingAddress) { throw new Error('Address not found'); } // If setting as default, unset other defaults if (isDefault) { - await db.update(addresses).set({ isDefault: false }).where(eq(addresses.userId, userId)); + await userAddressDbService.unsetDefaultForUser(userId) } const updateData: any = { @@ -142,7 +147,7 @@ export const addressRouter = router({ updateData.longitude = longitude; } - const [updatedAddress] = await db.update(addresses).set(updateData).where(and(eq(addresses.id, id), eq(addresses.userId, userId))).returning(); + const updatedAddress = await userAddressDbService.updateAddressForUser(id, userId, updateData) return { success: true, data: updatedAddress }; }), @@ -152,42 +157,32 @@ export const addressRouter = router({ id: z.number().int().positive(), })) .mutation(async ({ input, ctx }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; + if (!userId) { + throw new Error('Unauthorized') + } const { id } = input; // Check if address exists and belongs to user - const existingAddress = await db.select().from(addresses).where(and(eq(addresses.id, id), eq(addresses.userId, userId))).limit(1); - if (existingAddress.length === 0) { + const existingAddress = await userAddressDbService.getAddressByIdForUser(id, userId) + if (!existingAddress) { throw new Error('Address not found or does not belong to user'); } // Check if address is attached to any ongoing orders using joins - const ongoingOrders = await db.select({ - order: orders, - status: orderStatus, - slot: deliverySlotInfo - }) - .from(orders) - .innerJoin(orderStatus, eq(orders.id, orderStatus.orderId)) - .innerJoin(deliverySlotInfo, eq(orders.slotId, deliverySlotInfo.id)) - .where(and( - eq(orders.addressId, id), - eq(orderStatus.isCancelled, false), - gte(deliverySlotInfo.deliveryTime, new Date()) - )) - .limit(1); + const hasOngoingOrders = await userAddressDbService.hasOngoingOrdersForAddress(id) - if (ongoingOrders.length > 0) { + if (hasOngoingOrders) { throw new Error('Address is attached to an ongoing order. Please cancel the order first.'); } // Prevent deletion of default address - if (existingAddress[0].isDefault) { + if (existingAddress.isDefault) { throw new Error('Cannot delete default address. Please set another address as default first.'); } // Delete the address - await db.delete(addresses).where(and(eq(addresses.id, id), eq(addresses.userId, userId))); + await userAddressDbService.deleteAddressForUser(id, userId) return { success: true, message: 'Address deleted successfully' }; }), diff --git a/apps/backend/src/trpc/apis/user-apis/apis/auth.ts b/apps/backend/src/trpc/apis/user-apis/apis/auth.ts index 56e9a3c..d59bf64 100644 --- a/apps/backend/src/trpc/apis/user-apis/apis/auth.ts +++ b/apps/backend/src/trpc/apis/user-apis/apis/auth.ts @@ -1,20 +1,12 @@ import { router, publicProcedure, protectedProcedure } from '@/src/trpc/trpc-index'; import { z } from 'zod'; import bcrypt from 'bcryptjs'; -import jwt from 'jsonwebtoken'; -import { eq } from 'drizzle-orm'; -import { db } from '@/src/db/db_index'; -import { - users, userCreds, userDetails, addresses, cartItems, complaints, - couponApplicableUsers, couponUsage, notifCreds, notifications, - orderItems, orderStatus, orders, payments, refunds, - productReviews, reservedCoupons -} from '@/src/db/schema'; -import { generateSignedUrlFromS3Url } from '@/src/lib/s3-client'; +import { generateSignedUrlFromS3Url, claimUploadUrl, scaffoldAssetUrl } from '@/src/lib/s3-client'; +import { deleteS3Image } from '@/src/lib/delete-image'; import { ApiError } from '@/src/lib/api-error'; -import catchAsync from '@/src/lib/catch-async'; -import { jwtSecret } from '@/src/lib/env-exporter'; import { sendOtp, verifyOtpUtil, getOtpCreds } from '@/src/lib/otp-utils'; +import { signToken } from '@/src/lib/jwt-utils'; +import { userAuthDbService } from '@/src/trpc/apis/user-apis/dataAccessors/main' interface LoginRequest { identifier: string; // email or mobile @@ -44,13 +36,8 @@ interface AuthResponse { }; } -const generateToken = (userId: number): string => { - const secret = jwtSecret; - if (!secret) { - throw new ApiError('JWT secret not configured', 500); - } - - return jwt.sign({ userId }, secret, { expiresIn: '7d' }); +const generateToken = async (userId: number): Promise => { + return signToken({ userId }); }; @@ -69,22 +56,11 @@ export const authRouter = router({ } // Find user by email or mobile - const [user] = await db - .select() - .from(users) - .where(eq(users.email, identifier.toLowerCase())) - .limit(1); - - let foundUser = user; + let foundUser = await userAuthDbService.getUserByEmail(identifier.toLowerCase()) if (!foundUser) { // Try mobile if email didn't work - const [userByMobile] = await db - .select() - .from(users) - .where(eq(users.mobile, identifier)) - .limit(1); - foundUser = userByMobile; + foundUser = await userAuthDbService.getUserByMobile(identifier) } if (!foundUser) { @@ -92,22 +68,14 @@ export const authRouter = router({ } // Get user credentials - const [userCredentials] = await db - .select() - .from(userCreds) - .where(eq(userCreds.userId, foundUser.id)) - .limit(1); + const userCredentials = await userAuthDbService.getUserCredsByUserId(foundUser.id) if (!userCredentials) { throw new ApiError('Account setup incomplete. Please contact support.', 401); } // Get user details for profile image - const [userDetail] = await db - .select() - .from(userDetails) - .where(eq(userDetails.userId, foundUser.id)) - .limit(1); + const userDetail = await userAuthDbService.getUserDetailsByUserId(foundUser.id) // Generate signed URL for profile image if it exists const profileImageSignedUrl = userDetail?.profileImage @@ -120,7 +88,7 @@ export const authRouter = router({ throw new ApiError('Invalid credentials', 401); } - const token = generateToken(foundUser.id); + const token = await generateToken(foundUser.id); const response: AuthResponse = { token, @@ -150,9 +118,10 @@ export const authRouter = router({ email: z.string().email('Invalid email format'), mobile: z.string().min(1, 'Mobile is required'), password: z.string().min(1, 'Password is required'), + imageKey: z.string().optional(), })) .mutation(async ({ input }) => { - const { name, email, mobile, password }: RegisterRequest = input; + const { name, email, mobile, password, imageKey } = input; if (!name || !email || !mobile || !password) { throw new ApiError('All fields are required', 400); @@ -171,22 +140,14 @@ export const authRouter = router({ } // Check if email already exists - const [existingEmail] = await db - .select() - .from(users) - .where(eq(users.email, email.toLowerCase())) - .limit(1); + const existingEmail = await userAuthDbService.getUserByEmail(email.toLowerCase()) if (existingEmail) { throw new ApiError('Email already registered', 409); } // Check if mobile already exists - const [existingMobile] = await db - .select() - .from(users) - .where(eq(users.mobile, cleanMobile)) - .limit(1); + const existingMobile = await userAuthDbService.getUserByMobile(cleanMobile) if (existingMobile) { throw new ApiError('Mobile number already registered', 409); @@ -196,29 +157,31 @@ export const authRouter = router({ const hashedPassword = await bcrypt.hash(password, 12); // Create user and credentials in a transaction - const newUser = await db.transaction(async (tx) => { - // Create user - const [user] = await tx - .insert(users) - .values({ - name: name.trim(), - email: email.toLowerCase().trim(), - mobile: cleanMobile, - }) - .returning(); + const newUser = await userAuthDbService.createUserWithCredsAndDetails({ + name: name.trim(), + email: email.toLowerCase().trim(), + mobile: cleanMobile, + passwordHash: hashedPassword, + imageKey: imageKey || null, + }) - // Create user credentials - await tx - .insert(userCreds) - .values({ - userId: user.id, - userPassword: hashedPassword, - }); + // Claim upload URL if image was provided + if (imageKey) { + try { + await claimUploadUrl(imageKey); + } catch (e) { + console.warn(`Failed to claim upload URL for key: ${imageKey}`, e); + } + } - return user; - }); + const token = await generateToken(newUser.id); - const token = generateToken(newUser.id); + // Get user details for profile image + const userDetail = await userAuthDbService.getUserDetailsByUserId(newUser.id) + + const profileImageUrl = userDetail?.profileImage + ? scaffoldAssetUrl(userDetail.profileImage) + : null; const response: AuthResponse = { token, @@ -228,7 +191,7 @@ export const authRouter = router({ email: newUser.email, mobile: newUser.mobile, createdAt: newUser.createdAt.toISOString(), - profileImage: null, + profileImage: profileImageUrl, }, }; @@ -264,25 +227,19 @@ export const authRouter = router({ } // Find user - let user = await db.query.users.findFirst({ - where: eq(users.mobile, input.mobile), - }); + let user = await userAuthDbService.getUserByMobile(input.mobile) // If user doesn't exist, create one if (!user) { - const [newUser] = await db - .insert(users) - .values({ - name: null, - email: null, - mobile: input.mobile, - }) - .returning(); - user = newUser; + user = await userAuthDbService.createUser({ + name: null, + email: null, + mobile: input.mobile, + }) } // Generate JWT - const token = generateToken(user.id); + const token = await generateToken(user.id); return { success: true, @@ -303,54 +260,39 @@ export const authRouter = router({ password: z.string().min(6, 'Password must be at least 6 characters'), })) .mutation(async ({ input, ctx }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; if (!userId) { throw new ApiError('User not authenticated', 401); } const hashedPassword = await bcrypt.hash(input.password, 10); - // Insert if not exists, then update if exists - try { - await db.insert(userCreds).values({ - userId: userId, - userPassword: hashedPassword, - }); - // Insert succeeded - new credentials created - } catch (error: any) { - // Insert failed - check if it's a unique constraint violation - if (error.code === '23505') { // PostgreSQL unique constraint violation - // Update existing credentials - await db.update(userCreds).set({ - userPassword: hashedPassword, - }).where(eq(userCreds.userId, userId)); - } else { - // Re-throw if it's a different error - throw error; - } - } + await userAuthDbService.upsertUserCreds(userId, hashedPassword) return { success: true, message: 'Password updated successfully' }; }), getProfile: protectedProcedure .query(async ({ ctx }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; if (!userId) { throw new ApiError('User not authenticated', 401); } - const [user] = await db - .select() - .from(users) - .where(eq(users.id, userId)) - .limit(1); + const user = await userAuthDbService.getUserById(userId) if (!user) { throw new ApiError('User not found', 404); } + // Get user details for profile image + const userDetail = await userAuthDbService.getUserDetailsByUserId(userId) + + const profileImageUrl = userDetail?.profileImage + ? scaffoldAssetUrl(userDetail.profileImage) + : null; + return { success: true, data: { @@ -358,16 +300,93 @@ export const authRouter = router({ name: user.name, email: user.email, mobile: user.mobile, + profileImage: profileImageUrl, + bio: userDetail?.bio || null, + dateOfBirth: userDetail?.dateOfBirth || null, + gender: userDetail?.gender || null, + occupation: userDetail?.occupation || null, }, }; }), + updateProfile: protectedProcedure + .input(z.object({ + name: z.string().min(1, 'Name is required').optional(), + email: z.string().email('Invalid email format').optional(), + bio: z.string().optional(), + dateOfBirth: z.string().optional(), + gender: z.string().optional(), + occupation: z.string().optional(), + imageKey: z.string().optional(), + })) + .mutation(async ({ input, ctx }) => { + const userId = ctx.user?.userId; + const { imageKey, ...updateData } = input; + + if (!userId) { + throw new ApiError('User not authenticated', 401); + } + + // Get current user details + const currentDetail = await userAuthDbService.getUserDetailsByUserId(userId) + + let newImageUrl: string | null | undefined = currentDetail?.profileImage; + + // Handle new image upload (only if different from existing) + if (imageKey && imageKey !== currentDetail?.profileImage) { + // Delete old image if exists + if (currentDetail?.profileImage) { + try { + await deleteS3Image(currentDetail.profileImage); + } catch (e) { + console.error(`Failed to delete old image: ${currentDetail.profileImage}`, e); + } + } + newImageUrl = imageKey; + + // Claim upload URL + try { + await claimUploadUrl(imageKey); + } catch (e) { + console.warn(`Failed to claim upload URL for key: ${imageKey}`, e); + } + } + + // Update user name if provided + if (updateData.name) { + await userAuthDbService.updateUserName(userId, updateData.name.trim()) + } + + // Update user email if provided + if (updateData.email) { + // Check if email already exists (but belongs to different user) + const existingUser = await userAuthDbService.getUserByEmail(updateData.email.toLowerCase().trim()) + + if (existingUser && existingUser.id !== userId) { + throw new ApiError('Email already in use by another account', 409); + } + + await userAuthDbService.updateUserEmail(userId, updateData.email.toLowerCase().trim()) + } + + // Upsert user details + await userAuthDbService.upsertUserDetails(userId, { + ...updateData, + profileImage: newImageUrl, + }) + + return { + success: true, + message: 'Profile updated successfully', + }; + }), + deleteAccount: protectedProcedure .input(z.object({ mobile: z.string().min(10, 'Mobile number is required'), })) .mutation(async ({ ctx, input }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; const { mobile } = input; if (!userId) { @@ -375,10 +394,7 @@ export const authRouter = router({ } // Double-check: verify user exists and is the authenticated user - const existingUser = await db.query.users.findFirst({ - where: eq(users.id, userId), - columns: { id: true, mobile: true }, - }); + const existingUser = await userAuthDbService.getUserById(userId) if (!existingUser) { throw new ApiError('User not found', 404); @@ -399,48 +415,7 @@ export const authRouter = router({ } // Use transaction for atomic deletion - await db.transaction(async (tx) => { - // Phase 1: Direct references (safe to delete first) - await tx.delete(notifCreds).where(eq(notifCreds.userId, userId)); - await tx.delete(couponApplicableUsers).where(eq(couponApplicableUsers.userId, userId)); - await tx.delete(couponUsage).where(eq(couponUsage.userId, userId)); - await tx.delete(complaints).where(eq(complaints.userId, userId)); - await tx.delete(cartItems).where(eq(cartItems.userId, userId)); - await tx.delete(notifications).where(eq(notifications.userId, userId)); - await tx.delete(productReviews).where(eq(productReviews.userId, userId)); - - // Update reserved coupons (set redeemedBy to null) - await tx.update(reservedCoupons) - .set({ redeemedBy: null }) - .where(eq(reservedCoupons.redeemedBy, userId)); - - // Phase 2: Order dependencies - const userOrders = await tx - .select({ id: orders.id }) - .from(orders) - .where(eq(orders.userId, userId)); - - for (const order of userOrders) { - await tx.delete(orderItems).where(eq(orderItems.orderId, order.id)); - await tx.delete(orderStatus).where(eq(orderStatus.orderId, order.id)); - await tx.delete(payments).where(eq(payments.orderId, order.id)); - await tx.delete(refunds).where(eq(refunds.orderId, order.id)); - // Additional coupon usage entries linked to specific orders - await tx.delete(couponUsage).where(eq(couponUsage.orderId, order.id)); - await tx.delete(complaints).where(eq(complaints.orderId, order.id)); - } - - // Delete orders - await tx.delete(orders).where(eq(orders.userId, userId)); - - // Phase 3: Addresses (now safe since orders are deleted) - await tx.delete(addresses).where(eq(addresses.userId, userId)); - - // Phase 4: Core user data - await tx.delete(userDetails).where(eq(userDetails.userId, userId)); - await tx.delete(userCreds).where(eq(userCreds.userId, userId)); - await tx.delete(users).where(eq(users.id, userId)); - }); + await userAuthDbService.deleteAccountByUserId(userId) return { success: true, message: 'Account deleted successfully' }; }), diff --git a/apps/backend/src/trpc/apis/user-apis/apis/banners.ts b/apps/backend/src/trpc/apis/user-apis/apis/banners.ts index 6f4a53b..70c83a8 100644 --- a/apps/backend/src/trpc/apis/user-apis/apis/banners.ts +++ b/apps/backend/src/trpc/apis/user-apis/apis/banners.ts @@ -1,38 +1,25 @@ -import { db } from '@/src/db/db_index'; -import { homeBanners } from '@/src/db/schema'; import { publicProcedure, router } from '@/src/trpc/trpc-index'; -import { generateSignedUrlFromS3Url } from '@/src/lib/s3-client'; -import { isNotNull, asc } from 'drizzle-orm'; +import { scaffoldAssetUrl } from '@/src/lib/s3-client'; +import { userBannerDbService } from '@/src/trpc/apis/user-apis/dataAccessors/main' + +export async function scaffoldBanners() { + const banners = await userBannerDbService.getActiveBanners() + + // Convert S3 keys to signed URLs for client + const bannersWithSignedUrls = banners.map((banner) => ({ + ...banner, + imageUrl: banner.imageUrl ? scaffoldAssetUrl(banner.imageUrl) : banner.imageUrl, + })); + + return { + banners: bannersWithSignedUrls, + }; +} export const bannerRouter = router({ getBanners: publicProcedure .query(async () => { - const banners = await db.query.homeBanners.findMany({ - where: isNotNull(homeBanners.serialNum), // Only show assigned banners - orderBy: asc(homeBanners.serialNum), // Order by slot number 1-4 - }); - - // Convert S3 keys to signed URLs for client - const bannersWithSignedUrls = await Promise.all( - banners.map(async (banner) => { - try { - return { - ...banner, - imageUrl: banner.imageUrl ? await generateSignedUrlFromS3Url(banner.imageUrl) : banner.imageUrl, - }; - } catch (error) { - console.error(`Failed to generate signed URL for banner ${banner.id}:`, error); - return { - ...banner, - imageUrl: banner.imageUrl, // Keep original on error - }; - } - }) - ); - - - return { - banners: bannersWithSignedUrls, - }; + const response = await scaffoldBanners(); + return response; }), }); diff --git a/apps/backend/src/trpc/apis/user-apis/apis/cart.ts b/apps/backend/src/trpc/apis/user-apis/apis/cart.ts index a2495bc..a7185c5 100644 --- a/apps/backend/src/trpc/apis/user-apis/apis/cart.ts +++ b/apps/backend/src/trpc/apis/user-apis/apis/cart.ts @@ -1,11 +1,9 @@ import { router, protectedProcedure, publicProcedure } from '@/src/trpc/trpc-index'; import { z } from 'zod'; -import { db } from '@/src/db/db_index'; -import { cartItems, productInfo, units, productSlots, deliverySlotInfo } from '@/src/db/schema'; -import { eq, and, sql, inArray, gt } from 'drizzle-orm'; import { ApiError } from '@/src/lib/api-error'; -import { generateSignedUrlsFromS3Urls, scaffoldAssetUrl } from '@/src/lib/s3-client'; -import { getProductSlots, getMultipleProductsSlots } from '@/src/stores/slot-store'; +import { scaffoldAssetUrl } from '@/src/lib/s3-client'; +import { getMultipleProductsSlots } from '@/src/stores/slot-store'; +import { userCartDbService } from '@/src/trpc/apis/user-apis/dataAccessors/main' interface CartResponse { items: any[]; @@ -14,23 +12,7 @@ interface CartResponse { } const getCartData = async (userId: number): Promise => { - const cartItemsWithProducts = await db - .select({ - cartId: cartItems.id, - productId: productInfo.id, - productName: productInfo.name, - productPrice: productInfo.price, - productImages: productInfo.images, - productQuantity: productInfo.productQuantity, - isOutOfStock: productInfo.isOutOfStock, - unitShortNotation: units.shortNotation, - quantity: cartItems.quantity, - addedAt: cartItems.addedAt, - }) - .from(cartItems) - .innerJoin(productInfo, eq(cartItems.productId, productInfo.id)) - .innerJoin(units, eq(productInfo.unitId, units.id)) - .where(eq(cartItems.userId, userId)); + const cartItemsWithProducts = await userCartDbService.getCartItemsWithProducts(userId) // Generate signed URLs for images const cartWithSignedUrls = await Promise.all( @@ -64,7 +46,10 @@ const getCartData = async (userId: number): Promise => { export const cartRouter = router({ getCart: protectedProcedure .query(async ({ ctx }): Promise => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; + if (!userId) { + throw new ApiError('Unauthorized', 401) + } return await getCartData(userId); }), @@ -74,7 +59,10 @@ export const cartRouter = router({ quantity: z.number().int().positive(), })) .mutation(async ({ input, ctx }): Promise => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; + if (!userId) { + throw new ApiError('Unauthorized', 401) + } const { productId, quantity } = input; // Validate input @@ -83,33 +71,21 @@ export const cartRouter = router({ } // Check if product exists - const product = await db.query.productInfo.findFirst({ - where: eq(productInfo.id, productId), - }); + const product = await userCartDbService.getProductById(productId) if (!product) { throw new ApiError("Product not found", 404); } // Check if item already exists in cart - const existingItem = await db.query.cartItems.findFirst({ - where: and(eq(cartItems.userId, userId), eq(cartItems.productId, productId)), - }); + const existingItem = await userCartDbService.getCartItemByUserAndProduct(userId, productId) if (existingItem) { // Update quantity - await db.update(cartItems) - .set({ - quantity: sql`${cartItems.quantity} + ${quantity}`, - }) - .where(eq(cartItems.id, existingItem.id)); + await userCartDbService.incrementCartItemQuantity(existingItem.id, quantity) } else { // Insert new item - await db.insert(cartItems).values({ - userId, - productId, - quantity: quantity.toString(), - }); + await userCartDbService.createCartItem(userId, productId, quantity) } // Return updated cart @@ -122,20 +98,17 @@ export const cartRouter = router({ quantity: z.number().int().min(0), })) .mutation(async ({ input, ctx }): Promise => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; + if (!userId) { + throw new ApiError('Unauthorized', 401) + } const { itemId, quantity } = input; if (!quantity || quantity <= 0) { throw new ApiError("Positive quantity required", 400); } - const [updatedItem] = await db.update(cartItems) - .set({ quantity: quantity.toString() }) - .where(and( - eq(cartItems.id, itemId), - eq(cartItems.userId, userId) - )) - .returning(); + const updatedItem = await userCartDbService.updateCartItemQuantity(itemId, userId, quantity) if (!updatedItem) { throw new ApiError("Cart item not found", 404); @@ -150,15 +123,13 @@ export const cartRouter = router({ itemId: z.number().int().positive(), })) .mutation(async ({ input, ctx }): Promise => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; + if (!userId) { + throw new ApiError('Unauthorized', 401) + } const { itemId } = input; - const [deletedItem] = await db.delete(cartItems) - .where(and( - eq(cartItems.id, itemId), - eq(cartItems.userId, userId) - )) - .returning(); + const deletedItem = await userCartDbService.deleteCartItem(itemId, userId) if (!deletedItem) { throw new ApiError("Cart item not found", 404); @@ -170,9 +141,12 @@ export const cartRouter = router({ clearCart: protectedProcedure .mutation(async ({ ctx }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; + if (!userId) { + throw new ApiError('Unauthorized', 401) + } - await db.delete(cartItems).where(eq(cartItems.userId, userId)); + await userCartDbService.clearCart(userId) return { items: [], diff --git a/apps/backend/src/trpc/apis/user-apis/apis/complaint.ts b/apps/backend/src/trpc/apis/user-apis/apis/complaint.ts index 08dae54..8d2be02 100644 --- a/apps/backend/src/trpc/apis/user-apis/apis/complaint.ts +++ b/apps/backend/src/trpc/apis/user-apis/apis/complaint.ts @@ -1,26 +1,17 @@ import { router, protectedProcedure } from '@/src/trpc/trpc-index'; import { z } from 'zod'; -import { db } from '@/src/db/db_index'; -import { complaints } from '@/src/db/schema'; -import { eq } from 'drizzle-orm'; +import { scaffoldAssetUrl, claimUploadUrl } from '@/src/lib/s3-client'; +import { userComplaintDbService } from '@/src/trpc/apis/user-apis/dataAccessors/main' export const complaintRouter = router({ getAll: protectedProcedure .query(async ({ ctx }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; + if (!userId) { + throw new Error('Unauthorized') + } - const userComplaints = await db - .select({ - id: complaints.id, - complaintBody: complaints.complaintBody, - response: complaints.response, - isResolved: complaints.isResolved, - createdAt: complaints.createdAt, - orderId: complaints.orderId, - }) - .from(complaints) - .where(eq(complaints.userId, userId)) - .orderBy(complaints.createdAt); + const userComplaints = await userComplaintDbService.getComplaintsByUserId(userId) return { complaints: userComplaints.map(c => ({ @@ -30,34 +21,42 @@ export const complaintRouter = router({ isResolved: c.isResolved, createdAt: c.createdAt, orderId: c.orderId, + images: c.images ? scaffoldAssetUrl(c.images as string[]) : [], })), }; }), raise: protectedProcedure .input(z.object({ - orderId: z.string().optional(), + orderId: z.number().optional(), complaintBody: z.string().min(1, 'Complaint body is required'), + imageKeys: z.array(z.string()).optional(), })) .mutation(async ({ input, ctx }) => { - const userId = ctx.user.userId; - const { orderId, complaintBody } = input; + const userId = ctx.user?.userId; + if (!userId) { + throw new Error('Unauthorized') + } + const { orderId, complaintBody, imageKeys } = input; - let orderIdNum: number | null = null; + await userComplaintDbService.createComplaint({ + userId, + orderId: orderId || null, + complaintBody: complaintBody.trim(), + images: imageKeys || [], + }); - if (orderId) { - const readableIdMatch = orderId.match(/^ORD(\d+)$/); - if (readableIdMatch) { - orderIdNum = parseInt(readableIdMatch[1]); + // Claim upload URLs for images + if (imageKeys && imageKeys.length > 0) { + for (const key of imageKeys) { + try { + await claimUploadUrl(key); + } catch (e) { + console.warn(`Failed to claim upload URL for key: ${key}`, e); + } } } - await db.insert(complaints).values({ - userId, - orderId: orderIdNum, - complaintBody: complaintBody.trim(), - }); - return { success: true, message: 'Complaint raised successfully' }; }), }); diff --git a/apps/backend/src/trpc/apis/user-apis/apis/coupon.ts b/apps/backend/src/trpc/apis/user-apis/apis/coupon.ts index 6eab804..3b18986 100644 --- a/apps/backend/src/trpc/apis/user-apis/apis/coupon.ts +++ b/apps/backend/src/trpc/apis/user-apis/apis/coupon.ts @@ -1,16 +1,9 @@ import { router, protectedProcedure } from '@/src/trpc/trpc-index'; import { z } from 'zod'; -import { db } from '@/src/db/db_index'; -import { coupons, couponUsage, couponApplicableUsers, reservedCoupons, couponApplicableProducts } from '@/src/db/schema'; -import { eq, and, or, gt, isNull, sql } from 'drizzle-orm'; import { ApiError } from '@/src/lib/api-error'; +import { userCouponDbService } from '@/src/trpc/apis/user-apis/dataAccessors/main' -import { users } from '@/src/db/schema'; - -type CouponWithRelations = typeof coupons.$inferSelect & { - applicableUsers: (typeof couponApplicableUsers.$inferSelect & { user: typeof users.$inferSelect })[]; - usages: typeof couponUsage.$inferSelect[]; -}; +type CouponWithRelations = import('@/src/trpc/apis/user-apis/dataAccessors/interfaces/user-coupon-db-service.interface').CouponWithRelations export interface EligibleCoupon { id: number; @@ -65,33 +58,13 @@ export const userCouponRouter = router({ .query(async ({ ctx }) => { try { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; + if (!userId) { + throw new ApiError('User not authenticated', 401) + } // Get all active, non-expired coupons - const allCoupons = await db.query.coupons.findMany({ - where: and( - eq(coupons.isInvalidated, false), - or( - isNull(coupons.validTill), - gt(coupons.validTill, new Date()) - ) - ), - with: { - usages: { - where: eq(couponUsage.userId, userId) - }, - applicableUsers: { - with: { - user: true - } - }, - applicableProducts: { - with: { - product: true - } - }, - } - }); + const allCoupons = await userCouponDbService.getActiveCouponsForUser(userId) // Filter to only coupons applicable to current user const applicableCoupons = allCoupons.filter(coupon => { @@ -111,34 +84,14 @@ export const userCouponRouter = router({ getProductCoupons: protectedProcedure .input(z.object({ productId: z.number().int().positive() })) .query(async ({ input, ctx }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; + if (!userId) { + throw new ApiError('User not authenticated', 401) + } const { productId } = input; // Get all active, non-expired coupons - const allCoupons = await db.query.coupons.findMany({ - where: and( - eq(coupons.isInvalidated, false), - or( - isNull(coupons.validTill), - gt(coupons.validTill, new Date()) - ) - ), - with: { - usages: { - where: eq(couponUsage.userId, userId) - }, - applicableUsers: { - with: { - user: true - } - }, - applicableProducts: { - with: { - product: true - } - }, - } - }); + const allCoupons = await userCouponDbService.getActiveCouponsForUser(userId) // Filter to only coupons applicable to current user and product const applicableCoupons = allCoupons.filter(coupon => { @@ -156,21 +109,13 @@ export const userCouponRouter = router({ getMyCoupons: protectedProcedure .query(async ({ ctx }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; + if (!userId) { + throw new ApiError('User not authenticated', 401) + } // Get all coupons - const allCoupons = await db.query.coupons.findMany({ - with: { - usages: { - where: eq(couponUsage.userId, userId) - }, - applicableUsers: { - with: { - user: true - } - } - } - }); + const allCoupons = await userCouponDbService.getAllCouponsForUser(userId) // Filter coupons in JS: not invalidated, applicable to user, and not expired const applicableCoupons = (allCoupons as CouponWithRelations[]).filter(coupon => { @@ -226,16 +171,14 @@ export const userCouponRouter = router({ redeemReservedCoupon: protectedProcedure .input(z.object({ secretCode: z.string() })) .mutation(async ({ input, ctx }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; + if (!userId) { + throw new ApiError('User not authenticated', 401) + } const { secretCode } = input; // Find the reserved coupon - const reservedCoupon = await db.query.reservedCoupons.findFirst({ - where: and( - eq(reservedCoupons.secretCode, secretCode.toUpperCase()), - eq(reservedCoupons.isRedeemed, false) - ), - }); + const reservedCoupon = await userCouponDbService.getReservedCouponBySecretCode(secretCode) if (!reservedCoupon) { throw new ApiError("Invalid or already redeemed coupon code", 400); @@ -247,49 +190,7 @@ export const userCouponRouter = router({ } // Create the coupon in the main table - const couponResult = await db.transaction(async (tx) => { - // Insert into coupons - const couponInsert = await tx.insert(coupons).values({ - couponCode: reservedCoupon.couponCode, - isUserBased: true, - discountPercent: reservedCoupon.discountPercent, - flatDiscount: reservedCoupon.flatDiscount, - minOrder: reservedCoupon.minOrder, - productIds: reservedCoupon.productIds, - maxValue: reservedCoupon.maxValue, - isApplyForAll: false, - validTill: reservedCoupon.validTill, - maxLimitForUser: reservedCoupon.maxLimitForUser, - exclusiveApply: reservedCoupon.exclusiveApply, - createdBy: reservedCoupon.createdBy, - }).returning(); - - const coupon = couponInsert[0]; - - // Insert into couponApplicableUsers - await tx.insert(couponApplicableUsers).values({ - couponId: coupon.id, - userId, - }); - - // Copy applicable products - if (reservedCoupon.productIds && Array.isArray(reservedCoupon.productIds) && reservedCoupon.productIds.length > 0) { - // Assuming productIds are the IDs, but wait, in schema, productIds is jsonb, but in relations, couponApplicableProducts has productId - // For simplicity, since reservedCoupons has productIds as jsonb, but to match, perhaps insert into couponApplicableProducts if needed - // But in createReservedCoupon, I inserted applicableProducts into couponApplicableProducts - // So for reserved, perhaps do the same, but since it's jsonb, maybe not. - // For now, skip, as the coupon will have productIds in coupons table. - } - - // Update reserved coupon as redeemed - await tx.update(reservedCoupons).set({ - isRedeemed: true, - redeemedBy: userId, - redeemedAt: new Date(), - }).where(eq(reservedCoupons.id, reservedCoupon.id)); - - return coupon; - }); + const couponResult = await userCouponDbService.redeemReservedCoupon(userId, reservedCoupon) return { success: true, coupon: couponResult }; }), diff --git a/apps/backend/src/trpc/apis/user-apis/apis/order.ts b/apps/backend/src/trpc/apis/user-apis/apis/order.ts index 8118683..198f2c2 100644 --- a/apps/backend/src/trpc/apis/user-apis/apis/order.ts +++ b/apps/backend/src/trpc/apis/user-apis/apis/order.ts @@ -1,33 +1,22 @@ -import { router, protectedProcedure } from "@/src/trpc/trpc-index"; -import { z } from "zod"; -import { db } from "@/src/db/db_index"; -import { - orders, - orderItems, - orderStatus, - addresses, - productInfo, - paymentInfoTable, - coupons, - couponUsage, - payments, - cartItems, - refunds, - units, - userDetails, -} from "@/src/db/schema"; -import { eq, and, inArray, desc, gte, lte } from "drizzle-orm"; -import { scaffoldAssetUrl } from "@/src/lib/s3-client"; -import { ApiError } from "@/src/lib/api-error"; +import { z } from 'zod' +import { router, protectedProcedure } from '@/src/trpc/trpc-index' +import { userOrderDbService } from '@/src/trpc/apis/user-apis/dataAccessors/main' +import type { + OrderCoupon, + OrderInsert, + OrderItemInsert, + OrderStatusInsert, +} from '@/src/trpc/apis/user-apis/dataAccessors/main' +import { scaffoldAssetUrl } from '@/src/lib/s3-client' +import { ApiError } from '@/src/lib/api-error' import { sendOrderPlacedNotification, sendOrderCancelledNotification, -} from "@/src/lib/notif-job"; -import { RazorpayPaymentService } from "@/src/lib/payments-utils"; -import { getNextDeliveryDate } from "@/src/trpc/apis/common-apis/common"; -import { CONST_KEYS, getConstant, getConstants } from "@/src/lib/const-store"; -import { publishFormattedOrder, publishCancellation } from "@/src/lib/post-order-handler"; -import { getSlotById } from "@/src/stores/slot-store"; +} from '@/src/lib/notif-job' +import { getNextDeliveryDate } from '@/src/trpc/apis/common-apis/common' +import { CONST_KEYS, getConstant, getConstants } from '@/src/lib/const-store' +import { publishFormattedOrder, publishCancellation } from '@/src/lib/post-order-handler' +import { getSlotById } from '@/src/stores/slot-store' const validateAndGetCoupon = async ( @@ -35,40 +24,35 @@ const validateAndGetCoupon = async ( userId: number, totalAmount: number ) => { - if (!couponId) return null; + if (!couponId) return null - const coupon = await db.query.coupons.findFirst({ - where: eq(coupons.id, couponId), - with: { - usages: { where: eq(couponUsage.userId, userId) }, - }, - }); + const coupon = await userOrderDbService.getCouponWithUsage(couponId, userId) - if (!coupon) throw new ApiError("Invalid coupon", 400); + if (!coupon) throw new ApiError('Invalid coupon', 400) if (coupon.isInvalidated) - throw new ApiError("Coupon is no longer valid", 400); + throw new ApiError('Coupon is no longer valid', 400) if (coupon.validTill && new Date(coupon.validTill) < new Date()) - throw new ApiError("Coupon has expired", 400); + throw new ApiError('Coupon has expired', 400) if ( coupon.maxLimitForUser && coupon.usages.length >= coupon.maxLimitForUser ) - throw new ApiError("Coupon usage limit exceeded", 400); + throw new ApiError('Coupon usage limit exceeded', 400) if ( coupon.minOrder && parseFloat(coupon.minOrder.toString()) > totalAmount ) throw new ApiError( - "Order amount does not meet coupon minimum requirement", + 'Order amount does not meet coupon minimum requirement', 400 - ); + ) - return coupon; + return coupon }; const applyDiscountToOrder = ( orderTotal: number, - appliedCoupon: typeof coupons.$inferSelect | null, + appliedCoupon: OrderCoupon | null, proportion: number ) => { let finalOrderTotal = orderTotal; @@ -140,11 +124,9 @@ const placeOrderUtil = async (params: { const orderGroupId = `${Date.now()}-${userId}`; - const address = await db.query.addresses.findFirst({ - where: and(eq(addresses.userId, userId), eq(addresses.id, addressId)), - }); + const address = await userOrderDbService.getAddressByUserId(userId, addressId) if (!address) { - throw new ApiError("Invalid address", 400); + throw new ApiError('Invalid address', 400) } const ordersBySlot = new Map< @@ -158,11 +140,9 @@ const placeOrderUtil = async (params: { >(); for (const item of selectedItems) { - const product = await db.query.productInfo.findFirst({ - where: eq(productInfo.id, item.productId), - }); + const product = await userOrderDbService.getProductById(item.productId) if (!product) { - throw new ApiError(`Product ${item.productId} not found`, 400); + throw new ApiError(`Product ${item.productId} not found`, 400) } if (!ordersBySlot.has(item.slotId)) { @@ -173,11 +153,12 @@ const placeOrderUtil = async (params: { if (params.isFlash) { for (const item of selectedItems) { - const product = await db.query.productInfo.findFirst({ - where: eq(productInfo.id, item.productId), - }); + const product = await userOrderDbService.getProductById(item.productId) if (!product?.isFlashAvailable) { - throw new ApiError(`Product ${item.productId} is not available for flash delivery`, 400); + throw new ApiError( + `Product ${item.productId} is not available for flash delivery`, + 400 + ) } } } @@ -204,10 +185,10 @@ const placeOrderUtil = async (params: { const totalWithDelivery = totalAmount + expectedDeliveryCharge; type OrderData = { - order: Omit; - orderItems: Omit[]; - orderStatus: Omit; - }; + order: Omit + orderItems: Omit[] + orderStatus: Omit + } const ordersData: OrderData[] = []; let isFirstOrder = true; @@ -233,7 +214,7 @@ const placeOrderUtil = async (params: { orderGroupProportion ); - const order: Omit = { + const order: Omit = { userId, addressId, slotId: params.isFlash ? null : slotId, @@ -249,7 +230,7 @@ const placeOrderUtil = async (params: { isFlashDelivery: params.isFlash, }; - const orderItemsData: Omit[] = items.map( + const orderItemsData: Omit[] = items.map( (item) => ({ orderId: 0, productId: item.productId, @@ -265,7 +246,7 @@ const placeOrderUtil = async (params: { }) ); - const orderStatusData: Omit = { + const orderStatusData: Omit = { userId, orderId: 0, paymentStatus: paymentMethod === "cod" ? "cod" : "pending", @@ -275,79 +256,22 @@ const placeOrderUtil = async (params: { isFirstOrder = false; } - const createdOrders = await db.transaction(async (tx) => { - let sharedPaymentInfoId: number | null = null; - if (paymentMethod === "online") { - const [paymentInfo] = await tx - .insert(paymentInfoTable) - .values({ - status: "pending", - gateway: "razorpay", - merchantOrderId: `multi_order_${Date.now()}`, - }) - .returning(); - sharedPaymentInfoId = paymentInfo.id; - } + const createdOrders = await userOrderDbService.createOrdersWithItems({ + ordersData, + paymentMethod, + }) - const ordersToInsert: Omit[] = ordersData.map( - (od) => ({ - ...od.order, - paymentInfoId: sharedPaymentInfoId, - }) - ); - - const insertedOrders = await tx.insert(orders).values(ordersToInsert).returning(); - - const allOrderItems: Omit[] = []; - const allOrderStatuses: Omit[] = []; - - insertedOrders.forEach((order, index) => { - const od = ordersData[index]; - od.orderItems.forEach((item) => { - allOrderItems.push({ ...item, orderId: order.id as number }); - }); - allOrderStatuses.push({ - ...od.orderStatus, - orderId: order.id as number, - }); - }); - - await tx.insert(orderItems).values(allOrderItems); - await tx.insert(orderStatus).values(allOrderStatuses); - - if (paymentMethod === "online" && sharedPaymentInfoId) { - const razorpayOrder = await RazorpayPaymentService.createOrder( - sharedPaymentInfoId, - totalWithDelivery.toString() - ); - await RazorpayPaymentService.insertPaymentRecord( - sharedPaymentInfoId, - razorpayOrder, - tx - ); - } - - return insertedOrders; - }); - - await db.delete(cartItems).where( - and( - eq(cartItems.userId, userId), - inArray( - cartItems.productId, - selectedItems.map((item) => item.productId) - ) - ) - ); + await userOrderDbService.deleteCartItemsByUserAndProductIds( + userId, + selectedItems.map((item) => item.productId) + ) if (appliedCoupon && createdOrders.length > 0) { - await db.insert(couponUsage).values({ + await userOrderDbService.createCouponUsage({ userId, couponId: appliedCoupon.id, orderId: createdOrders[0].id as number, - orderItemId: null, - usedAt: new Date(), - }); + }) } for (const order of createdOrders) { @@ -378,12 +302,13 @@ export const orderRouter = router({ }) ) .mutation(async ({ input, ctx }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId + if (!userId) { + throw new ApiError('Unauthorized', 401) + } // Check if user is suspended from placing orders - const userDetail = await db.query.userDetails.findFirst({ - where: eq(userDetails.userId, userId), - }); + const userDetail = await userOrderDbService.getUserDetailByUserId(userId) if (userDetail?.isSuspended) { throw new ApiError("Unable to place order", 403); @@ -402,7 +327,10 @@ export const orderRouter = router({ if (isFlashDelivery) { const isFlashDeliveryEnabled = await getConstant(CONST_KEYS.isFlashDeliveryEnabled); if (!isFlashDeliveryEnabled) { - throw new ApiError("Flash delivery is currently unavailable. Please opt for scheduled delivery.", 403); + throw new ApiError( + 'Flash delivery is currently unavailable. Please opt for scheduled delivery.', + 403 + ) } } @@ -410,9 +338,12 @@ export const orderRouter = router({ if (!isFlashDelivery) { const slotIds = [...new Set(selectedItems.filter(i => i.slotId !== null).map(i => i.slotId as number))]; for (const slotId of slotIds) { - const slot = await getSlotById(slotId); + const slot = await getSlotById(slotId) if (slot?.isCapacityFull) { - throw new ApiError("Selected delivery slot is at full capacity. Please choose another slot.", 403); + throw new ApiError( + 'Selected delivery slot is at full capacity. Please choose another slot.', + 403 + ) } } } @@ -422,10 +353,10 @@ export const orderRouter = router({ // Handle flash delivery slot resolution if (isFlashDelivery) { // For flash delivery, set slotId to null (no specific slot assigned) - processedItems = selectedItems.map(item => ({ + processedItems = selectedItems.map((item) => ({ ...item, slotId: null as any, // Type override for flash delivery - })); + })) } return await placeOrderUtil({ @@ -450,33 +381,20 @@ export const orderRouter = router({ ) .query(async ({ input, ctx }) => { const { page = 1, pageSize = 10 } = input || {}; - const userId = ctx.user.userId; + const userId = ctx.user?.userId + if (!userId) { + throw new ApiError('Unauthorized', 401) + } const offset = (page - 1) * pageSize; // Get total count for pagination - const totalCountResult = await db.$count( - orders, - eq(orders.userId, userId) - ); - const totalCount = totalCountResult; + const totalCount = await userOrderDbService.getOrdersCount(userId) - const userOrders = await db.query.orders.findMany({ - where: eq(orders.userId, userId), - with: { - orderItems: { - with: { - product: true, - }, - }, - slot: true, - paymentInfo: true, - orderStatus: true, - refunds: true, - }, - orderBy: (orders, { desc }) => [desc(orders.createdAt)], - limit: pageSize, - offset: offset, - }); + const userOrders = await userOrderDbService.getOrdersWithRelations( + userId, + pageSize, + offset + ) const mappedOrders = await Promise.all( userOrders.map(async (order) => { @@ -574,38 +492,24 @@ export const orderRouter = router({ .input(z.object({ orderId: z.string() })) .query(async ({ input, ctx }) => { const { orderId } = input; - const userId = ctx.user.userId; + const userId = ctx.user?.userId + if (!userId) { + throw new ApiError('Unauthorized', 401) + } - const order = await db.query.orders.findFirst({ - where: and(eq(orders.id, parseInt(orderId)), eq(orders.userId, userId)), - with: { - orderItems: { - with: { - product: true, - }, - }, - slot: true, - paymentInfo: true, - orderStatus: { - with: { - refundCoupon: true, - }, - }, - refunds: true, - }, - }); + const order = await userOrderDbService.getOrderWithDetailsById( + parseInt(orderId), + userId + ) if (!order) { throw new Error("Order not found"); } // Get coupon usage for this specific order using new orderId field - const couponUsageData = await db.query.couponUsage.findMany({ - where: eq(couponUsage.orderId, order.id), // Use new orderId field - with: { - coupon: true, - }, - }); + const couponUsageData = await userOrderDbService.getCouponUsagesByOrderId( + order.id + ) let couponData = null; if (couponUsageData.length > 0) { @@ -734,16 +638,14 @@ export const orderRouter = router({ ) .mutation(async ({ input, ctx }) => { try { - const userId = ctx.user.userId; + const userId = ctx.user?.userId + if (!userId) { + throw new ApiError('Unauthorized', 401) + } const { id, reason } = input; // Check if order exists and belongs to user - const order = await db.query.orders.findFirst({ - where: eq(orders.id, Number(id)), - with: { - orderStatus: true, - }, - }); + const order = await userOrderDbService.getOrderWithStatus(Number(id)) if (!order) { console.error("Order not found:", id); @@ -777,29 +679,17 @@ export const orderRouter = router({ } // Perform database operations in transaction - const result = await db.transaction(async (tx) => { - // Update order status - await tx - .update(orderStatus) - .set({ - isCancelled: true, - cancelReason: reason, - cancellationUserNotes: reason, - cancellationReviewed: false, - }) - .where(eq(orderStatus.id, status.id)); + // Determine refund status based on payment method + const refundStatus = order.isCod ? 'na' : 'pending' - // Determine refund status based on payment method - const refundStatus = order.isCod ? "na" : "pending"; + await userOrderDbService.cancelOrderTransaction({ + statusId: status.id, + reason, + orderId: order.id, + refundStatus, + }) - // Insert refund record - await tx.insert(refunds).values({ - orderId: order.id, - refundStatus, - }); - - return { orderId: order.id, userId }; - }); + const result = { orderId: order.id, userId } // Send notification outside transaction (idempotent operation) await sendOrderCancelledNotification( @@ -810,10 +700,10 @@ export const orderRouter = router({ // Publish to Redis for Telegram notification await publishCancellation(result.orderId, 'user', reason); - return { success: true, message: "Order cancelled successfully" }; + return { success: true, message: 'Order cancelled successfully' } } catch (e) { console.log(e); - throw new ApiError("failed to cancel order"); + throw new ApiError('failed to cancel order') } }), @@ -825,7 +715,10 @@ export const orderRouter = router({ }) ) .mutation(async ({ input, ctx }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId + if (!userId) { + throw new ApiError('Unauthorized', 401) + } const { id, userNotes } = input; // Extract readable ID from orderId (e.g., ORD001 -> 1) @@ -837,12 +730,7 @@ export const orderRouter = router({ // const readableId = parseInt(readableIdMatch[1]); // Check if order exists and belongs to user - const order = await db.query.orders.findFirst({ - where: eq(orders.id, Number(id)), - with: { - orderStatus: true, - }, - }); + const order = await userOrderDbService.getOrderWithStatus(Number(id)) if (!order) { console.error("Order not found:", id); @@ -876,14 +764,9 @@ export const orderRouter = router({ } // Update user notes - await db - .update(orders) - .set({ - userNotes: userNotes || null, - }) - .where(eq(orders.id, order.id)); + await userOrderDbService.updateOrderNotes(order.id, userNotes || null) - return { success: true, message: "Notes updated successfully" }; + return { success: true, message: 'Notes updated successfully' } }), getRecentlyOrderedProducts: protectedProcedure @@ -896,25 +779,20 @@ export const orderRouter = router({ ) .query(async ({ input, ctx }) => { const { limit = 20 } = input || {}; - const userId = ctx.user.userId; + const userId = ctx.user?.userId + if (!userId) { + throw new ApiError('Unauthorized', 401) + } // Get user's recent delivered orders (last 30 days) const thirtyDaysAgo = new Date(); thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30); - const recentOrders = await db - .select({ id: orders.id }) - .from(orders) - .innerJoin(orderStatus, eq(orders.id, orderStatus.orderId)) - .where( - and( - eq(orders.userId, userId), - eq(orderStatus.isDelivered, true), - gte(orders.createdAt, thirtyDaysAgo) - ) - ) - .orderBy(desc(orders.createdAt)) - .limit(10); // Get last 10 orders + const recentOrders = await userOrderDbService.getRecentDeliveredOrderIds( + userId, + thirtyDaysAgo, + 10 + ) if (recentOrders.length === 0) { return { success: true, products: [] }; @@ -923,10 +801,9 @@ export const orderRouter = router({ const orderIds = recentOrders.map((order) => order.id); // Get unique product IDs from recent orders - const orderItemsResult = await db - .select({ productId: orderItems.productId }) - .from(orderItems) - .where(inArray(orderItems.orderId, orderIds)); + const orderItemsResult = await userOrderDbService.getProductIdsByOrderIds( + orderIds + ) const productIds = [ ...new Set(orderItemsResult.map((item) => item.productId)), @@ -937,27 +814,10 @@ export const orderRouter = router({ } // Get product details - const productsWithUnits = await db - .select({ - id: productInfo.id, - name: productInfo.name, - shortDescription: productInfo.shortDescription, - price: productInfo.price, - images: productInfo.images, - isOutOfStock: productInfo.isOutOfStock, - unitShortNotation: units.shortNotation, - incrementStep: productInfo.incrementStep, - }) - .from(productInfo) - .innerJoin(units, eq(productInfo.unitId, units.id)) - .where( - and( - inArray(productInfo.id, productIds), - eq(productInfo.isSuspended, false) - ) - ) - .orderBy(desc(productInfo.createdAt)) - .limit(limit); + const productsWithUnits = await userOrderDbService.getProductsWithUnitsByIds( + productIds, + limit + ) // Generate signed URLs for product images const formattedProducts = await Promise.all( diff --git a/apps/backend/src/trpc/apis/user-apis/apis/payments.ts b/apps/backend/src/trpc/apis/user-apis/apis/payments.ts deleted file mode 100644 index 0adb0bd..0000000 --- a/apps/backend/src/trpc/apis/user-apis/apis/payments.ts +++ /dev/null @@ -1,158 +0,0 @@ - -import { router, protectedProcedure } from '@/src/trpc/trpc-index'; -import { z } from 'zod'; -import { db } from '@/src/db/db_index'; -import { orders, payments, orderStatus } from '@/src/db/schema'; -import { eq } from 'drizzle-orm'; -import { ApiError } from '@/src/lib/api-error'; -import crypto from 'crypto'; -import { razorpayId, razorpaySecret } from "@/src/lib/env-exporter"; -import { DiskPersistedSet } from "@/src/lib/disk-persisted-set"; -import { RazorpayPaymentService } from "@/src/lib/payments-utils"; - - - - -export const paymentRouter = router({ - createRazorpayOrder: protectedProcedure //either create a new payment order or return the existing one - .input(z.object({ - orderId: z.string(), - })) - .mutation(async ({ input, ctx }) => { - const userId = ctx.user.userId; - const { orderId } = input; - - // Validate order exists and belongs to user - const order = await db.query.orders.findFirst({ - where: eq(orders.id, parseInt(orderId)), - }); - - if (!order) { - throw new ApiError("Order not found", 404); - } - - if (order.userId !== userId) { - throw new ApiError("Order does not belong to user", 403); - } - - // Check for existing pending payment - const existingPayment = await db.query.payments.findFirst({ - where: eq(payments.orderId, parseInt(orderId)), - }); - - if (existingPayment && existingPayment.status === 'pending') { - return { - razorpayOrderId: existingPayment.merchantOrderId, - key: razorpayId, - }; - } - - // Create Razorpay order and insert payment record - const razorpayOrder = await RazorpayPaymentService.createOrder(parseInt(orderId), order.totalAmount); - await RazorpayPaymentService.insertPaymentRecord(parseInt(orderId), razorpayOrder); - - return { - razorpayOrderId: razorpayOrder.id, - key: razorpayId, - }; - }), - - - - verifyPayment: protectedProcedure - .input(z.object({ - razorpay_payment_id: z.string(), - razorpay_order_id: z.string(), - razorpay_signature: z.string(), - })) - .mutation(async ({ input, ctx }) => { - const { razorpay_payment_id, razorpay_order_id, razorpay_signature } = input; - - // Verify signature - const expectedSignature = crypto - .createHmac('sha256', razorpaySecret) - .update(razorpay_order_id + '|' + razorpay_payment_id) - .digest('hex'); - - if (expectedSignature !== razorpay_signature) { - throw new ApiError("Invalid payment signature", 400); - } - - // Get current payment record - const currentPayment = await db.query.payments.findFirst({ - where: eq(payments.merchantOrderId, razorpay_order_id), - }); - - if (!currentPayment) { - throw new ApiError("Payment record not found", 404); - } - - // Update payment status and payload - const updatedPayload = { - ...((currentPayment.payload as any) || {}), - payment_id: razorpay_payment_id, - signature: razorpay_signature, - }; - - const [updatedPayment] = await db - .update(payments) - .set({ - status: 'success', - payload: updatedPayload, - }) - .where(eq(payments.merchantOrderId, razorpay_order_id)) - .returning(); - - // Update order status to mark payment as processed - await db - .update(orderStatus) - .set({ - paymentStatus: 'success', - }) - .where(eq(orderStatus.orderId, updatedPayment.orderId)); - - return { - success: true, - message: "Payment verified successfully", - }; - }), - - markPaymentFailed: protectedProcedure - .input(z.object({ - merchantOrderId: z.string(), - })) - .mutation(async ({ input, ctx }) => { - const userId = ctx.user.userId; - const { merchantOrderId } = input; - - // Find payment by merchantOrderId - const payment = await db.query.payments.findFirst({ - where: eq(payments.merchantOrderId, merchantOrderId), - }); - - if (!payment) { - throw new ApiError("Payment not found", 404); - } - - // Check if payment belongs to user's order - const order = await db.query.orders.findFirst({ - where: eq(orders.id, payment.orderId), - }); - - if (!order || order.userId !== userId) { - throw new ApiError("Payment does not belong to user", 403); - } - - // Update payment status to failed - await db - .update(payments) - .set({ status: 'failed' }) - .where(eq(payments.id, payment.id)); - - return { - success: true, - message: "Payment marked as failed", - }; - }), - -}); diff --git a/apps/backend/src/trpc/apis/user-apis/apis/product.ts b/apps/backend/src/trpc/apis/user-apis/apis/product.ts index 0fc86ee..0d4ea47 100644 --- a/apps/backend/src/trpc/apis/user-apis/apis/product.ts +++ b/apps/backend/src/trpc/apis/user-apis/apis/product.ts @@ -1,12 +1,10 @@ import { router, publicProcedure, protectedProcedure } from '@/src/trpc/trpc-index'; import { z } from 'zod'; -import { db } from '@/src/db/db_index'; -import { productInfo, units, productSlots, deliverySlotInfo, specialDeals, storeInfo, productTagInfo, productTags, productReviews, users } from '@/src/db/schema'; import { claimUploadUrl, extractKeyFromPresignedUrl, scaffoldAssetUrl } from '@/src/lib/s3-client'; import { ApiError } from '@/src/lib/api-error'; -import { eq, and, gt, sql, inArray, desc } from 'drizzle-orm'; import { getProductById as getProductByIdFromCache, getAllProducts as getAllProductsFromCache } from '@/src/stores/product-store'; import dayjs from 'dayjs'; +import { userProductDbService } from '@/src/trpc/apis/user-apis/dataAccessors/main' // Uniform Product Type interface Product { @@ -60,75 +58,20 @@ export const productRouter = router({ } // If not in cache, fetch from database (fallback) - const productData = await db - .select({ - id: productInfo.id, - name: productInfo.name, - shortDescription: productInfo.shortDescription, - longDescription: productInfo.longDescription, - price: productInfo.price, - marketPrice: productInfo.marketPrice, - images: productInfo.images, - isOutOfStock: productInfo.isOutOfStock, - storeId: productInfo.storeId, - unitShortNotation: units.shortNotation, - incrementStep: productInfo.incrementStep, - productQuantity: productInfo.productQuantity, - isFlashAvailable: productInfo.isFlashAvailable, - flashPrice: productInfo.flashPrice, - }) - .from(productInfo) - .innerJoin(units, eq(productInfo.unitId, units.id)) - .where(eq(productInfo.id, productId)) - .limit(1); + const product = await userProductDbService.getProductById(productId) - if (productData.length === 0) { + if (!product) { throw new Error('Product not found'); } - const product = productData[0]; - // Fetch store info for this product - const storeData = product.storeId ? await db.query.storeInfo.findFirst({ - where: eq(storeInfo.id, product.storeId), - columns: { id: true, name: true, description: true }, - }) : null; + const storeData = product.storeId ? await userProductDbService.getStoreBasicById(product.storeId) : null // Fetch delivery slots for this product - const deliverySlotsData = await db - .select({ - id: deliverySlotInfo.id, - deliveryTime: deliverySlotInfo.deliveryTime, - freezeTime: deliverySlotInfo.freezeTime, - }) - .from(productSlots) - .innerJoin(deliverySlotInfo, eq(productSlots.slotId, deliverySlotInfo.id)) - .where( - and( - eq(productSlots.productId, productId), - eq(deliverySlotInfo.isActive, true), - eq(deliverySlotInfo.isCapacityFull, false), - gt(deliverySlotInfo.deliveryTime, sql`NOW()`), - gt(deliverySlotInfo.freezeTime, sql`NOW()`) - ) - ) - .orderBy(deliverySlotInfo.deliveryTime); + const deliverySlotsData = await userProductDbService.getDeliverySlotsForProduct(productId) // Fetch special deals for this product - const specialDealsData = await db - .select({ - quantity: specialDeals.quantity, - price: specialDeals.price, - validTill: specialDeals.validTill, - }) - .from(specialDeals) - .where( - and( - eq(specialDeals.productId, productId), - gt(specialDeals.validTill, sql`NOW()`) - ) - ) - .orderBy(specialDeals.quantity); + const specialDealsData = await userProductDbService.getSpecialDealsForProduct(productId) // Generate signed URLs for images const signedImages = scaffoldAssetUrl((product.images as string[]) || []); @@ -140,7 +83,7 @@ export const productRouter = router({ longDescription: product.longDescription, price: product.price.toString(), marketPrice: product.marketPrice?.toString() || null, - unitNotation: product.unitShortNotation, + unitNotation: product.unitShortNotation || '', images: signedImages, isOutOfStock: product.isOutOfStock, store: storeData ? { @@ -168,21 +111,7 @@ export const productRouter = router({ .query(async ({ input }) => { const { productId, limit, offset } = input; - const reviews = await db - .select({ - id: productReviews.id, - reviewBody: productReviews.reviewBody, - ratings: productReviews.ratings, - imageUrls: productReviews.imageUrls, - reviewTime: productReviews.reviewTime, - userName: users.name, - }) - .from(productReviews) - .innerJoin(users, eq(productReviews.userId, users.id)) - .where(eq(productReviews.productId, productId)) - .orderBy(desc(productReviews.reviewTime)) - .limit(limit) - .offset(offset); + const reviews = await userProductDbService.getProductReviews(productId, limit, offset) // Generate signed URLs for images const reviewsWithSignedUrls = await Promise.all( @@ -193,12 +122,7 @@ export const productRouter = router({ ); // Check if more reviews exist - const totalCountResult = await db - .select({ count: sql`count(*)` }) - .from(productReviews) - .where(eq(productReviews.productId, productId)); - - const totalCount = Number(totalCountResult[0].count); + const totalCount = await userProductDbService.getReviewCount(productId) const hasMore = offset + limit < totalCount; return { reviews: reviewsWithSignedUrls, hasMore }; @@ -214,24 +138,25 @@ export const productRouter = router({ })) .mutation(async ({ input, ctx }) => { const { productId, reviewBody, ratings, imageUrls, uploadUrls } = input; - const userId = ctx.user.userId; + const userId = ctx.user?.userId; + if (!userId) { + throw new ApiError('User not authenticated', 401) + } // Optional: Check if product exists - const product = await db.query.productInfo.findFirst({ - where: eq(productInfo.id, productId), - }); + const product = await userProductDbService.getProductById(productId) if (!product) { throw new ApiError('Product not found', 404); } // Insert review - const [newReview] = await db.insert(productReviews).values({ + const newReview = await userProductDbService.createReview({ userId, productId, reviewBody, ratings, imageUrls: uploadUrls.map(item => extractKeyFromPresignedUrl(item)), - }).returning(); + }) // Claim upload URLs if (uploadUrls && uploadUrls.length > 0) { diff --git a/apps/backend/src/trpc/apis/user-apis/apis/slots.ts b/apps/backend/src/trpc/apis/user-apis/apis/slots.ts index 9fdd268..429f3f0 100644 --- a/apps/backend/src/trpc/apis/user-apis/apis/slots.ts +++ b/apps/backend/src/trpc/apis/user-apis/apis/slots.ts @@ -1,15 +1,8 @@ import { router, publicProcedure } from "@/src/trpc/trpc-index"; import { z } from "zod"; -import { db } from "@/src/db/db_index"; -import { - deliverySlotInfo, - productSlots, - productInfo, - units, -} from "@/src/db/schema"; -import { eq, and, gt, asc } from "drizzle-orm"; import { getAllSlots as getAllSlotsFromCache, getSlotById as getSlotByIdFromCache } from "@/src/stores/slot-store"; import dayjs from 'dayjs'; +import { userSlotDbService } from '@/src/trpc/apis/user-apis/dataAccessors/main' // Helper method to get formatted slot data by ID async function getSlotData(slotId: number) { @@ -32,11 +25,37 @@ async function getSlotData(slotId: number) { }; } +export async function scaffoldSlotsWithProducts() { + const allSlots = await getAllSlotsFromCache(); + const currentTime = new Date(); + const validSlots = allSlots + .filter((slot) => { + return dayjs(slot.freezeTime).isAfter(currentTime) && + dayjs(slot.deliveryTime).isAfter(currentTime) && + !slot.isCapacityFull; + }) + .sort((a, b) => dayjs(a.deliveryTime).valueOf() - dayjs(b.deliveryTime).valueOf()); + + // Fetch all products for availability info + const allProducts = await userSlotDbService.getProductAvailability() + + const productAvailability = allProducts.map(product => ({ + id: product.id, + name: product.name, + isOutOfStock: product.isOutOfStock, + isFlashAvailable: product.isFlashAvailable, + })); + + return { + slots: validSlots, + productAvailability, + count: validSlots.length, + }; +} + export const slotsRouter = router({ getSlots: publicProcedure.query(async () => { - const slots = await db.query.deliverySlotInfo.findMany({ - where: eq(deliverySlotInfo.isActive, true), - }); + const slots = await userSlotDbService.getActiveSlots() return { slots, count: slots.length, @@ -44,40 +63,8 @@ export const slotsRouter = router({ }), getSlotsWithProducts: publicProcedure.query(async () => { - const allSlots = await getAllSlotsFromCache(); - const currentTime = new Date(); - const validSlots = allSlots - .filter((slot) => { - return dayjs(slot.freezeTime).isAfter(currentTime) && - dayjs(slot.deliveryTime).isAfter(currentTime) && - !slot.isCapacityFull; - }) - .sort((a, b) => dayjs(a.deliveryTime).valueOf() - dayjs(b.deliveryTime).valueOf()); - - return { - slots: validSlots, - count: validSlots.length, - }; - }), - - nextMajorDelivery: publicProcedure.query(async () => { - const now = new Date(); - - // Find the next upcoming active delivery slot ID - const nextSlot = await db.query.deliverySlotInfo.findFirst({ - where: and( - eq(deliverySlotInfo.isActive, true), - gt(deliverySlotInfo.deliveryTime, now), - ), - orderBy: asc(deliverySlotInfo.deliveryTime), - }); - - if (!nextSlot) { - return null; // No upcoming delivery slots - } - - // Get formatted data using helper method - return await getSlotData(nextSlot.id); + const response = await scaffoldSlotsWithProducts(); + return response; }), getSlotById: publicProcedure diff --git a/apps/backend/src/trpc/apis/user-apis/apis/stores.ts b/apps/backend/src/trpc/apis/user-apis/apis/stores.ts index a2989aa..c7464cb 100644 --- a/apps/backend/src/trpc/apis/user-apis/apis/stores.ts +++ b/apps/backend/src/trpc/apis/user-apis/apis/stores.ts @@ -1,71 +1,106 @@ import { router, publicProcedure } from '@/src/trpc/trpc-index'; import { z } from 'zod'; -import { db } from '@/src/db/db_index'; -import { storeInfo, productInfo, units } from '@/src/db/schema'; -import { eq, and, sql } from 'drizzle-orm'; import { scaffoldAssetUrl } from '@/src/lib/s3-client'; import { ApiError } from '@/src/lib/api-error'; +import { getTagsByStoreId } from '@/src/stores/product-tag-store'; +import { userStoreDbService } from '@/src/trpc/apis/user-apis/dataAccessors/main' -export const storesRouter = router({ - getStores: publicProcedure - .query(async () => { - const storesData = await db - .select({ - id: storeInfo.id, - name: storeInfo.name, - description: storeInfo.description, - imageUrl: storeInfo.imageUrl, - productCount: sql`count(${productInfo.id})`.as('productCount'), - }) - .from(storeInfo) - .leftJoin( - productInfo, - and(eq(productInfo.storeId, storeInfo.id), eq(productInfo.isSuspended, false)) - ) - .groupBy(storeInfo.id); +export async function scaffoldStores() { + const storesData = await userStoreDbService.getStoresWithProductCount() - // Generate signed URLs for store images and fetch sample products - const storesWithDetails = await Promise.all( - storesData.map(async (store) => { - const signedImageUrl = store.imageUrl ? scaffoldAssetUrl(store.imageUrl) : null; + // Generate signed URLs for store images and fetch sample products + const storesWithDetails = await Promise.all( + storesData.map(async (store) => { + const signedImageUrl = store.imageUrl ? scaffoldAssetUrl(store.imageUrl) : null; - // Fetch up to 3 products for this store - const sampleProducts = await db - .select({ - id: productInfo.id, - name: productInfo.name, - images: productInfo.images, - }) - .from(productInfo) - .where(and(eq(productInfo.storeId, store.id), eq(productInfo.isSuspended, false))) - .limit(3); - - // Generate signed URLs for product images - const productsWithSignedUrls = await Promise.all( - sampleProducts.map(async (product) => { - const images = product.images as string[]; - return { - id: product.id, - name: product.name, - signedImageUrl: (images && images.length > 0) ? scaffoldAssetUrl(images[0]) : null, - }; - }) - ); + // Fetch up to 3 products for this store + const sampleProducts = await userStoreDbService.getSampleProductsByStoreId(store.id, 3) + // Generate signed URLs for product images + const productsWithSignedUrls = await Promise.all( + sampleProducts.map(async (product) => { + const images = product.images as string[]; return { - id: store.id, - name: store.name, - description: store.description, - signedImageUrl, - productCount: store.productCount, - sampleProducts: productsWithSignedUrls, + id: product.id, + name: product.name, + signedImageUrl: (images && images.length > 0) ? scaffoldAssetUrl(images[0]) : null, }; }) ); return { - stores: storesWithDetails, + id: store.id, + name: store.name, + description: store.description, + signedImageUrl, + productCount: store.productCount, + sampleProducts: productsWithSignedUrls, }; + }) + ); + + return { + stores: storesWithDetails, + }; +} + +export async function scaffoldStoreWithProducts(storeId: number) { + // Fetch store info + const storeData = await userStoreDbService.getStoreById(storeId) + + if (!storeData) { + throw new ApiError('Store not found', 404); + } + + // Generate signed URL for store image + const signedImageUrl = storeData.imageUrl ? scaffoldAssetUrl(storeData.imageUrl) : null; + + // Fetch products for this store + const productsData = await userStoreDbService.getStoreProductsWithUnits(storeId) + + + // Generate signed URLs for product images + const productsWithSignedUrls = await Promise.all( + productsData.map(async (product) => ({ + id: product.id, + name: product.name, + shortDescription: product.shortDescription, + price: product.price, + marketPrice: product.marketPrice, + incrementStep: product.incrementStep, + unit: product.unitShortNotation, + unitNotation: product.unitNotation, + images: scaffoldAssetUrl((product.images as string[]) || []), + isOutOfStock: product.isOutOfStock, + productQuantity: product.productQuantity + })) + ); + + const tags = await getTagsByStoreId(storeId); + + return { + store: { + id: storeData.id, + name: storeData.name, + description: storeData.description, + signedImageUrl, + }, + products: productsWithSignedUrls, + tags: tags.map(tag => ({ + id: tag.id, + tagName: tag.tagName, + tagDescription: tag.tagDescription, + imageUrl: tag.imageUrl, + productIds: tag.productIds, + })), + }; +} + +export const storesRouter = router({ + getStores: publicProcedure + .query(async () => { + const response = await scaffoldStores(); + return response; }), getStoreWithProducts: publicProcedure @@ -74,70 +109,7 @@ export const storesRouter = router({ })) .query(async ({ input }) => { const { storeId } = input; - - // Fetch store info - const storeData = await db.query.storeInfo.findFirst({ - where: eq(storeInfo.id, storeId), - columns: { - id: true, - name: true, - description: true, - imageUrl: true, - }, - }); - - if (!storeData) { - throw new ApiError('Store not found', 404); - } - - // Generate signed URL for store image - const signedImageUrl = storeData.imageUrl ? scaffoldAssetUrl(storeData.imageUrl) : null; - - // Fetch products for this store - const productsData = await db - .select({ - id: productInfo.id, - name: productInfo.name, - shortDescription: productInfo.shortDescription, - price: productInfo.price, - marketPrice: productInfo.marketPrice, - images: productInfo.images, - isOutOfStock: productInfo.isOutOfStock, - incrementStep: productInfo.incrementStep, - unitShortNotation: units.shortNotation, - unitNotation: units.shortNotation, - productQuantity: productInfo.productQuantity, - }) - .from(productInfo) - .innerJoin(units, eq(productInfo.unitId, units.id)) - .where(and(eq(productInfo.storeId, storeId), eq(productInfo.isSuspended, false))); - - - // Generate signed URLs for product images - const productsWithSignedUrls = await Promise.all( - productsData.map(async (product) => ({ - id: product.id, - name: product.name, - shortDescription: product.shortDescription, - price: product.price, - marketPrice: product.marketPrice, - incrementStep: product.incrementStep, - unit: product.unitShortNotation, - unitNotation: product.unitNotation, - images: scaffoldAssetUrl((product.images as string[]) || []), - isOutOfStock: product.isOutOfStock, - productQuantity: product.productQuantity - })) - ); - - return { - store: { - id: storeData.id, - name: storeData.name, - description: storeData.description, - signedImageUrl, - }, - products: productsWithSignedUrls, - }; + const response = await scaffoldStoreWithProducts(storeId); + return response; }), }); diff --git a/apps/backend/src/trpc/apis/user-apis/apis/user-trpc-index.ts b/apps/backend/src/trpc/apis/user-apis/apis/user-trpc-index.ts index 52e6531..0b48629 100644 --- a/apps/backend/src/trpc/apis/user-apis/apis/user-trpc-index.ts +++ b/apps/backend/src/trpc/apis/user-apis/apis/user-trpc-index.ts @@ -9,7 +9,6 @@ import { productRouter } from '@/src/trpc/apis/user-apis/apis/product'; import { slotsRouter } from '@/src/trpc/apis/user-apis/apis/slots'; import { userRouter as userDataRouter } from '@/src/trpc/apis/user-apis/apis/user'; import { userCouponRouter } from '@/src/trpc/apis/user-apis/apis/coupon'; -import { paymentRouter } from '@/src/trpc/apis/user-apis/apis/payments'; import { storesRouter } from '@/src/trpc/apis/user-apis/apis/stores'; import { fileUploadRouter } from '@/src/trpc/apis/user-apis/apis/file-upload'; import { tagsRouter } from '@/src/trpc/apis/user-apis/apis/tags'; @@ -25,7 +24,6 @@ export const userRouter = router({ slots: slotsRouter, user: userDataRouter, coupon: userCouponRouter, - payment: paymentRouter, stores: storesRouter, fileUpload: fileUploadRouter, tags: tagsRouter, diff --git a/apps/backend/src/trpc/apis/user-apis/apis/user.ts b/apps/backend/src/trpc/apis/user-apis/apis/user.ts index 730c1af..b688330 100644 --- a/apps/backend/src/trpc/apis/user-apis/apis/user.ts +++ b/apps/backend/src/trpc/apis/user-apis/apis/user.ts @@ -1,12 +1,9 @@ import { router, protectedProcedure, publicProcedure } from '@/src/trpc/trpc-index'; -import jwt from 'jsonwebtoken'; -import { eq, and } from 'drizzle-orm'; import { z } from 'zod'; -import { db } from '@/src/db/db_index'; -import { users, userDetails, userCreds, notifCreds, unloggedUserTokens } from '@/src/db/schema'; import { ApiError } from '@/src/lib/api-error'; -import { jwtSecret } from '@/src/lib/env-exporter'; import { generateSignedUrlFromS3Url } from '@/src/lib/s3-client'; +import { signToken } from '@/src/lib/jwt-utils'; +import { userProfileDbService } from '@/src/trpc/apis/user-apis/dataAccessors/main' interface AuthResponse { token: string; @@ -23,40 +20,27 @@ interface AuthResponse { }; } -const generateToken = (userId: number): string => { - const secret = jwtSecret; - if (!secret) { - throw new ApiError('JWT secret not configured', 500); - } - - return jwt.sign({ userId }, secret, { expiresIn: '7d' }); +const generateToken = async (userId: number): Promise => { + return signToken({ userId }); }; export const userRouter = router({ getSelfData: protectedProcedure .query(async ({ ctx }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; if (!userId) { throw new ApiError('User not authenticated', 401); } - const [user] = await db - .select() - .from(users) - .where(eq(users.id, userId)) - .limit(1); + const user = await userProfileDbService.getUserById(userId) if (!user) { throw new ApiError('User not found', 404); } // Get user details for profile image - const [userDetail] = await db - .select() - .from(userDetails) - .where(eq(userDetails.userId, userId)) - .limit(1); + const userDetail = await userProfileDbService.getUserDetailByUserId(userId) // Generate signed URL for profile image if it exists const profileImageSignedUrl = userDetail?.profileImage @@ -85,24 +69,19 @@ export const userRouter = router({ checkProfileComplete: protectedProcedure .query(async ({ ctx }) => { - const userId = ctx.user.userId; + const userId = ctx.user?.userId; if (!userId) { throw new ApiError('User not authenticated', 401); } - const result = await db - .select() - .from(users) - .leftJoin(userCreds, eq(users.id, userCreds.userId)) - .where(eq(users.id, userId)) - .limit(1); + const result = await userProfileDbService.getUserWithCreds(userId) - if (result.length === 0) { + if (!result) { throw new ApiError('User not found', 404); } - const { users: user, user_creds: creds } = result[0]; + const { user, creds } = result return { isComplete: !!(user.name && user.email && creds), @@ -118,50 +97,28 @@ export const userRouter = router({ if (userId) { // AUTHENTICATED USER // Check if token exists in notif_creds for this user - const existing = await db.query.notifCreds.findFirst({ - where: and( - eq(notifCreds.userId, userId), - eq(notifCreds.token, token) - ), - }); + const existing = await userProfileDbService.getNotifCredByUserAndToken(userId, token) if (existing) { // Update lastVerified timestamp - await db - .update(notifCreds) - .set({ lastVerified: new Date() }) - .where(eq(notifCreds.id, existing.id)); + await userProfileDbService.updateNotifCredLastVerified(existing.id) } else { // Insert new token into notif_creds - await db.insert(notifCreds).values({ - userId, - token, - lastVerified: new Date(), - }); + await userProfileDbService.insertNotifCred(userId, token) } // Remove from unlogged_user_tokens if it exists - await db - .delete(unloggedUserTokens) - .where(eq(unloggedUserTokens.token, token)); + await userProfileDbService.deleteUnloggedToken(token) } else { // UNAUTHENTICATED USER // Save/update in unlogged_user_tokens - const existing = await db.query.unloggedUserTokens.findFirst({ - where: eq(unloggedUserTokens.token, token), - }); + const existing = await userProfileDbService.getUnloggedToken(token) if (existing) { - await db - .update(unloggedUserTokens) - .set({ lastVerified: new Date() }) - .where(eq(unloggedUserTokens.id, existing.id)); + await userProfileDbService.updateUnloggedTokenLastVerified(existing.id) } else { - await db.insert(unloggedUserTokens).values({ - token, - lastVerified: new Date(), - }); + await userProfileDbService.insertUnloggedToken(token) } } diff --git a/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-address-db-service.interface.ts b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-address-db-service.interface.ts new file mode 100644 index 0000000..32c7609 --- /dev/null +++ b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-address-db-service.interface.ts @@ -0,0 +1,15 @@ +import { addresses, orders, orderStatus, deliverySlotInfo } from '@/src/db/schema' + +export type Address = typeof addresses.$inferSelect +export type NewAddress = typeof addresses.$inferInsert + +export interface IUserAddressDbService { + getDefaultAddress(userId: number): Promise
+ getUserAddresses(userId: number): Promise + unsetDefaultForUser(userId: number): Promise + createAddress(data: NewAddress): Promise
+ getAddressByIdForUser(addressId: number, userId: number): Promise
+ updateAddressForUser(addressId: number, userId: number, data: Partial): Promise
+ deleteAddressForUser(addressId: number, userId: number): Promise + hasOngoingOrdersForAddress(addressId: number): Promise +} diff --git a/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-auth-db-service.interface.ts b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-auth-db-service.interface.ts new file mode 100644 index 0000000..a763432 --- /dev/null +++ b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-auth-db-service.interface.ts @@ -0,0 +1,23 @@ +import { users, userCreds, userDetails, addresses, cartItems, complaints, couponApplicableUsers, couponUsage, notifCreds, notifications, orderItems, orderStatus, orders, payments, refunds, productReviews, reservedCoupons } from '@/src/db/schema' + +export type User = typeof users.$inferSelect +export type UserCred = typeof userCreds.$inferSelect +export type UserDetail = typeof userDetails.$inferSelect + +export interface IUserAuthDbService { + getUserByEmail(email: string): Promise + getUserByMobile(mobile: string): Promise + getUserById(userId: number): Promise + getUserCredsByUserId(userId: number): Promise + getUserDetailsByUserId(userId: number): Promise + + createUserWithCredsAndDetails(data: { name: string | null; email: string | null; mobile: string; passwordHash: string; imageKey?: string | null }): Promise + createUser(data: { name: string | null; email: string | null; mobile: string }): Promise + + upsertUserCreds(userId: number, passwordHash: string): Promise + updateUserName(userId: number, name: string): Promise + updateUserEmail(userId: number, email: string): Promise + upsertUserDetails(userId: number, data: Partial): Promise + + deleteAccountByUserId(userId: number): Promise +} diff --git a/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-banner-db-service.interface.ts b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-banner-db-service.interface.ts new file mode 100644 index 0000000..53ba8a4 --- /dev/null +++ b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-banner-db-service.interface.ts @@ -0,0 +1,7 @@ +import { homeBanners } from '@/src/db/schema' + +export type UserBanner = typeof homeBanners.$inferSelect + +export interface IUserBannerDbService { + getActiveBanners(): Promise +} diff --git a/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-cart-db-service.interface.ts b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-cart-db-service.interface.ts new file mode 100644 index 0000000..8269e19 --- /dev/null +++ b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-cart-db-service.interface.ts @@ -0,0 +1,25 @@ +import { cartItems, productInfo, units } from '@/src/db/schema' + +export type CartItem = typeof cartItems.$inferSelect + +export interface IUserCartDbService { + getCartItemsWithProducts(userId: number): Promise> + getProductById(productId: number): Promise + getCartItemByUserAndProduct(userId: number, productId: number): Promise + incrementCartItemQuantity(cartItemId: number, quantity: number): Promise + createCartItem(userId: number, productId: number, quantity: number): Promise + updateCartItemQuantity(itemId: number, userId: number, quantity: number): Promise + deleteCartItem(itemId: number, userId: number): Promise + clearCart(userId: number): Promise +} diff --git a/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-complaint-db-service.interface.ts b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-complaint-db-service.interface.ts new file mode 100644 index 0000000..05c1ec8 --- /dev/null +++ b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-complaint-db-service.interface.ts @@ -0,0 +1,17 @@ +import { complaints } from '@/src/db/schema' + +export type Complaint = typeof complaints.$inferSelect +export type NewComplaint = typeof complaints.$inferInsert + +export interface IUserComplaintDbService { + getComplaintsByUserId(userId: number): Promise> + createComplaint(data: NewComplaint): Promise +} diff --git a/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-coupon-db-service.interface.ts b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-coupon-db-service.interface.ts new file mode 100644 index 0000000..308376e --- /dev/null +++ b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-coupon-db-service.interface.ts @@ -0,0 +1,20 @@ +import { coupons, couponUsage, couponApplicableUsers, couponApplicableProducts, reservedCoupons } from '@/src/db/schema' + +export type Coupon = typeof coupons.$inferSelect +export type CouponUsage = typeof couponUsage.$inferSelect +export type CouponApplicableUser = typeof couponApplicableUsers.$inferSelect +export type CouponApplicableProduct = typeof couponApplicableProducts.$inferSelect +export type ReservedCoupon = typeof reservedCoupons.$inferSelect + +export type CouponWithRelations = Coupon & { + usages: CouponUsage[] + applicableUsers: Array + applicableProducts: Array +} + +export interface IUserCouponDbService { + getActiveCouponsForUser(userId: number): Promise + getAllCouponsForUser(userId: number): Promise + getReservedCouponBySecretCode(secretCode: string): Promise + redeemReservedCoupon(userId: number, reservedCoupon: ReservedCoupon): Promise +} diff --git a/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-order-db-service.interface.ts b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-order-db-service.interface.ts new file mode 100644 index 0000000..302c212 --- /dev/null +++ b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-order-db-service.interface.ts @@ -0,0 +1,95 @@ +import { + orders, + orderItems, + orderStatus, + addresses, + productInfo, + paymentInfoTable, + coupons, + couponUsage, + refunds, + units, + userDetails, + deliverySlotInfo, +} from '@/src/db/schema' + +export type Order = typeof orders.$inferSelect +export type OrderInsert = typeof orders.$inferInsert +export type OrderItem = typeof orderItems.$inferSelect +export type OrderItemInsert = typeof orderItems.$inferInsert +export type OrderStatus = typeof orderStatus.$inferSelect +export type OrderStatusInsert = typeof orderStatus.$inferInsert +export type Address = typeof addresses.$inferSelect +export type Product = typeof productInfo.$inferSelect +export type PaymentInfo = typeof paymentInfoTable.$inferSelect +export type Coupon = typeof coupons.$inferSelect +export type CouponUsage = typeof couponUsage.$inferSelect +export type Refund = typeof refunds.$inferSelect +export type Unit = typeof units.$inferSelect +export type UserDetail = typeof userDetails.$inferSelect +export type Slot = typeof deliverySlotInfo.$inferSelect + +export type CouponWithUsages = Coupon & { + usages: CouponUsage[] +} + +export type OrderWithRelations = Order & { + orderItems: Array + slot: Slot | null + paymentInfo: PaymentInfo | null + orderStatus: OrderStatus[] + refunds: Refund[] +} + +export type OrderWithDetails = Order & { + orderItems: Array + slot: Slot | null + paymentInfo: PaymentInfo | null + orderStatus: Array + refunds: Refund[] +} + +export interface IUserOrderDbService { + getUserDetailByUserId(userId: number): Promise + getAddressByUserId(userId: number, addressId: number): Promise
+ getProductById(productId: number): Promise + getCouponWithUsage(couponId: number, userId: number): Promise + createOrdersWithItems(params: { + ordersData: Array<{ + order: Omit + orderItems: Omit[] + orderStatus: Omit + }> + paymentMethod: 'online' | 'cod' + }): Promise + deleteCartItemsByUserAndProductIds(userId: number, productIds: number[]): Promise + createCouponUsage(params: { + userId: number + couponId: number + orderId: number + }): Promise + getOrdersCount(userId: number): Promise + getOrdersWithRelations(userId: number, limit: number, offset: number): Promise + getOrderWithDetailsById(orderId: number, userId: number): Promise + getCouponUsagesByOrderId(orderId: number): Promise> + getOrderWithStatus(orderId: number): Promise<(Order & { orderStatus: OrderStatus[] }) | undefined> + cancelOrderTransaction(params: { + statusId: number + reason: string + orderId: number + refundStatus: string + }): Promise + updateOrderNotes(orderId: number, userNotes: string | null): Promise + getRecentDeliveredOrderIds(userId: number, since: Date, limit: number): Promise> + getProductIdsByOrderIds(orderIds: number[]): Promise> + getProductsWithUnitsByIds(productIds: number[], limit: number): Promise> +} diff --git a/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-product-db-service.interface.ts b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-product-db-service.interface.ts new file mode 100644 index 0000000..d4c0ec1 --- /dev/null +++ b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-product-db-service.interface.ts @@ -0,0 +1,32 @@ +import { productInfo, units, storeInfo, productSlots, deliverySlotInfo, specialDeals, productReviews, users } from '@/src/db/schema' + +export type Product = typeof productInfo.$inferSelect +export type Store = typeof storeInfo.$inferSelect +export type Review = typeof productReviews.$inferSelect + +export type ProductWithUnit = { + id: number + name: string + shortDescription: string | null + longDescription: string | null + price: string + marketPrice: string | null + images: unknown + isOutOfStock: boolean + storeId: number | null + unitShortNotation: string | null + incrementStep: number + productQuantity: number + isFlashAvailable: boolean + flashPrice: string | null +} + +export interface IUserProductDbService { + getProductById(productId: number): Promise + getStoreBasicById(storeId: number): Promise<{ id: number; name: string; description: string | null } | undefined> + getDeliverySlotsForProduct(productId: number): Promise> + getSpecialDealsForProduct(productId: number): Promise> + getProductReviews(productId: number, limit: number, offset: number): Promise> + getReviewCount(productId: number): Promise + createReview(data: { userId: number; productId: number; reviewBody: string; ratings: number; imageUrls: string[] }): Promise +} diff --git a/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-profile-db-service.interface.ts b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-profile-db-service.interface.ts new file mode 100644 index 0000000..e063bac --- /dev/null +++ b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-profile-db-service.interface.ts @@ -0,0 +1,22 @@ +import { users, userDetails, userCreds, notifCreds, unloggedUserTokens } from '@/src/db/schema' + +export type User = typeof users.$inferSelect +export type UserDetail = typeof userDetails.$inferSelect +export type UserCred = typeof userCreds.$inferSelect +export type NotifCred = typeof notifCreds.$inferSelect +export type UnloggedToken = typeof unloggedUserTokens.$inferSelect + +export interface IUserProfileDbService { + getUserById(userId: number): Promise + getUserDetailByUserId(userId: number): Promise + getUserWithCreds(userId: number): Promise<{ user: User; creds: UserCred | null } | undefined> + + getNotifCredByUserAndToken(userId: number, token: string): Promise + updateNotifCredLastVerified(id: number): Promise + insertNotifCred(userId: number, token: string): Promise + deleteUnloggedToken(token: string): Promise + + getUnloggedToken(token: string): Promise + updateUnloggedTokenLastVerified(id: number): Promise + insertUnloggedToken(token: string): Promise +} diff --git a/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-slot-db-service.interface.ts b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-slot-db-service.interface.ts new file mode 100644 index 0000000..f692d2b --- /dev/null +++ b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-slot-db-service.interface.ts @@ -0,0 +1,8 @@ +import { deliverySlotInfo, productInfo } from '@/src/db/schema' + +export type Slot = typeof deliverySlotInfo.$inferSelect + +export interface IUserSlotDbService { + getActiveSlots(): Promise + getProductAvailability(): Promise> +} diff --git a/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-store-db-service.interface.ts b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-store-db-service.interface.ts new file mode 100644 index 0000000..b846120 --- /dev/null +++ b/apps/backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-store-db-service.interface.ts @@ -0,0 +1,28 @@ +import { storeInfo } from '@/src/db/schema' + +export type Store = typeof storeInfo.$inferSelect +export type StoreBasic = { + id: number + name: string + description: string | null + imageUrl: string | null +} + +export interface IUserStoreDbService { + getStoresWithProductCount(): Promise> + getStoreById(storeId: number): Promise + getSampleProductsByStoreId(storeId: number, limit: number): Promise> + getStoreProductsWithUnits(storeId: number): Promise> +} diff --git a/apps/backend/src/trpc/apis/user-apis/dataAccessors/main.ts b/apps/backend/src/trpc/apis/user-apis/dataAccessors/main.ts new file mode 100644 index 0000000..dac3bf8 --- /dev/null +++ b/apps/backend/src/trpc/apis/user-apis/dataAccessors/main.ts @@ -0,0 +1,48 @@ +export type { IUserBannerDbService, UserBanner } from '@/src/trpc/apis/user-apis/dataAccessors/interfaces/user-banner-db-service.interface' +export type { IUserStoreDbService, Store as UserStore, StoreBasic } from '@/src/trpc/apis/user-apis/dataAccessors/interfaces/user-store-db-service.interface' +export type { IUserAddressDbService, Address, NewAddress } from '@/src/trpc/apis/user-apis/dataAccessors/interfaces/user-address-db-service.interface' +export type { IUserCartDbService, CartItem } from '@/src/trpc/apis/user-apis/dataAccessors/interfaces/user-cart-db-service.interface' +export type { IUserComplaintDbService, Complaint, NewComplaint } from '@/src/trpc/apis/user-apis/dataAccessors/interfaces/user-complaint-db-service.interface' +export type { IUserProductDbService, Product, Store as ProductStore, Review, ProductWithUnit } from '@/src/trpc/apis/user-apis/dataAccessors/interfaces/user-product-db-service.interface' +export type { IUserAuthDbService, User, UserCred, UserDetail } from '@/src/trpc/apis/user-apis/dataAccessors/interfaces/user-auth-db-service.interface' +export type { IUserProfileDbService, User as ProfileUser, UserDetail as ProfileUserDetail, UserCred as ProfileUserCred, NotifCred, UnloggedToken } from '@/src/trpc/apis/user-apis/dataAccessors/interfaces/user-profile-db-service.interface' +export type { IUserSlotDbService, Slot } from '@/src/trpc/apis/user-apis/dataAccessors/interfaces/user-slot-db-service.interface' +export type { IUserCouponDbService, Coupon, CouponWithRelations, ReservedCoupon } from '@/src/trpc/apis/user-apis/dataAccessors/interfaces/user-coupon-db-service.interface' +export type { IUserOrderDbService, Order, OrderInsert, OrderItemInsert, OrderStatusInsert, Coupon as OrderCoupon } from '@/src/trpc/apis/user-apis/dataAccessors/interfaces/user-order-db-service.interface' + +import { userBannerDbService as sqliteUserBannerDbService } from '@db-helper-sqlite/dataAccessors/user-apis/user-banner-queries' +import { userBannerDbService as postgresUserBannerDbService } from '@db-helper-postgres/dataAccessors/user-apis/user-banner-queries' +import { userStoreDbService as sqliteUserStoreDbService } from '@db-helper-sqlite/dataAccessors/user-apis/user-store-queries' +import { userStoreDbService as postgresUserStoreDbService } from '@db-helper-postgres/dataAccessors/user-apis/user-store-queries' +import { userAddressDbService as sqliteUserAddressDbService } from '@db-helper-sqlite/dataAccessors/user-apis/user-address-queries' +import { userAddressDbService as postgresUserAddressDbService } from '@db-helper-postgres/dataAccessors/user-apis/user-address-queries' +import { userCartDbService as sqliteUserCartDbService } from '@db-helper-sqlite/dataAccessors/user-apis/user-cart-queries' +import { userCartDbService as postgresUserCartDbService } from '@db-helper-postgres/dataAccessors/user-apis/user-cart-queries' +import { userComplaintDbService as sqliteUserComplaintDbService } from '@db-helper-sqlite/dataAccessors/user-apis/user-complaint-queries' +import { userComplaintDbService as postgresUserComplaintDbService } from '@db-helper-postgres/dataAccessors/user-apis/user-complaint-queries' +import { userProductDbService as sqliteUserProductDbService } from '@db-helper-sqlite/dataAccessors/user-apis/user-product-queries' +import { userProductDbService as postgresUserProductDbService } from '@db-helper-postgres/dataAccessors/user-apis/user-product-queries' +import { userAuthDbService as sqliteUserAuthDbService } from '@db-helper-sqlite/dataAccessors/user-apis/user-auth-queries' +import { userAuthDbService as postgresUserAuthDbService } from '@db-helper-postgres/dataAccessors/user-apis/user-auth-queries' +import { userProfileDbService as sqliteUserProfileDbService } from '@db-helper-sqlite/dataAccessors/user-apis/user-profile-queries' +import { userProfileDbService as postgresUserProfileDbService } from '@db-helper-postgres/dataAccessors/user-apis/user-profile-queries' +import { userSlotDbService as sqliteUserSlotDbService } from '@db-helper-sqlite/dataAccessors/user-apis/user-slot-queries' +import { userSlotDbService as postgresUserSlotDbService } from '@db-helper-postgres/dataAccessors/user-apis/user-slot-queries' +import { userCouponDbService as sqliteUserCouponDbService } from '@db-helper-sqlite/dataAccessors/user-apis/user-coupon-queries' +import { userCouponDbService as postgresUserCouponDbService } from '@db-helper-postgres/dataAccessors/user-apis/user-coupon-queries' +import { userOrderDbService as sqliteUserOrderDbService } from '@db-helper-sqlite/dataAccessors/user-apis/user-order-queries' +import { userOrderDbService as postgresUserOrderDbService } from '@db-helper-postgres/dataAccessors/user-apis/user-order-queries' + +const isSqlite = process.env.DB_DIALECT === 'sqlite' + +export const userBannerDbService = isSqlite ? sqliteUserBannerDbService : postgresUserBannerDbService +export const userStoreDbService = isSqlite ? sqliteUserStoreDbService : postgresUserStoreDbService +export const userAddressDbService = isSqlite ? sqliteUserAddressDbService : postgresUserAddressDbService +export const userCartDbService = isSqlite ? sqliteUserCartDbService : postgresUserCartDbService +export const userComplaintDbService = isSqlite ? sqliteUserComplaintDbService : postgresUserComplaintDbService +export const userProductDbService = isSqlite ? sqliteUserProductDbService : postgresUserProductDbService +export const userAuthDbService = isSqlite ? sqliteUserAuthDbService : postgresUserAuthDbService +export const userProfileDbService = isSqlite ? sqliteUserProfileDbService : postgresUserProfileDbService +export const userSlotDbService = isSqlite ? sqliteUserSlotDbService : postgresUserSlotDbService +export const userCouponDbService = isSqlite ? sqliteUserCouponDbService : postgresUserCouponDbService +export const userOrderDbService = isSqlite ? sqliteUserOrderDbService : postgresUserOrderDbService diff --git a/apps/backend/src/trpc/router.ts b/apps/backend/src/trpc/router.ts index 6d357ee..f7ccecc 100644 --- a/apps/backend/src/trpc/router.ts +++ b/apps/backend/src/trpc/router.ts @@ -3,6 +3,11 @@ import { z } from 'zod'; import { adminRouter } from '@/src/trpc/apis/admin-apis/apis/admin-trpc-index' import { userRouter } from '@/src/trpc/apis/user-apis/apis/user-trpc-index' import { commonApiRouter } from '@/src/trpc/apis/common-apis/common-trpc-index' +import { scaffoldProducts } from './apis/common-apis/common'; +import { scaffoldStores, scaffoldStoreWithProducts } from './apis/user-apis/apis/stores'; +import { scaffoldSlotsWithProducts } from './apis/user-apis/apis/slots'; +import { scaffoldEssentialConsts } from './apis/common-apis/common-trpc-index'; +import { scaffoldBanners } from './apis/user-apis/apis/banners'; // Create the main app router export const appRouter = router({ @@ -16,5 +21,13 @@ export const appRouter = router({ common: commonApiRouter, }); + // Export type definition of API -export type AppRouter = typeof appRouter; \ No newline at end of file +export type AppRouter = typeof appRouter; + +export type AllProductsApiType = Awaited>; +export type StoresApiType = Awaited>; +export type SlotsApiType = Awaited>; +export type EssentialConstsApiType = Awaited>; +export type BannersApiType = Awaited>; +export type StoreWithProductsApiType = Awaited>; diff --git a/apps/backend/src/trpc/trpc-index.ts b/apps/backend/src/trpc/trpc-index.ts index 85c5457..3e8db53 100644 --- a/apps/backend/src/trpc/trpc-index.ts +++ b/apps/backend/src/trpc/trpc-index.ts @@ -1,10 +1,14 @@ import { initTRPC, TRPCError } from '@trpc/server'; -import { type CreateExpressContextOptions } from '@trpc/server/adapters/express'; export interface Context { - req: CreateExpressContextOptions['req']; - res: CreateExpressContextOptions['res']; - user?: any; + req: Request; + res: Response; + user?: { + userId: number; + name: string; + email: string; + mobile: string; + } | null; staffUser?: { id: number; name: string; diff --git a/apps/backend/src/uv-apis/auth.controller.ts b/apps/backend/src/uv-apis/auth.controller.ts deleted file mode 100644 index 8cdc9c0..0000000 --- a/apps/backend/src/uv-apis/auth.controller.ts +++ /dev/null @@ -1,321 +0,0 @@ -import { Request, Response, NextFunction } from 'express'; -import bcrypt from 'bcryptjs'; -import jwt from 'jsonwebtoken'; -import { eq } from 'drizzle-orm'; -import { db } from '@/src/db/db_index' -import { users, userCreds, userDetails } from '@/src/db/schema' -import { ApiError } from '@/src/lib/api-error' -import catchAsync from '@/src/lib/catch-async' -import { jwtSecret } from '@/src/lib/env-exporter'; -import uploadHandler from '@/src/lib/upload-handler' -import { imageUploadS3, generateSignedUrlFromS3Url } from '@/src/lib/s3-client' - -interface RegisterRequest { - name: string; - email: string; - mobile: string; - password: string; - profileImage?: string; -} - -interface UpdateProfileRequest { - name?: string; - email?: string; - mobile?: string; - password?: string; - bio?: string; - dateOfBirth?: string; - gender?: string; - occupation?: string; -} - -interface AuthResponse { - token: string; - user: { - id: number; - name: string | null; - email: string | null; - mobile: string | null; - profileImage?: string | null; - bio?: string | null; - dateOfBirth?: string | null; - gender?: string | null; - occupation?: string | null; - }; -} - -const generateToken = (userId: number): string => { - const secret = jwtSecret; - if (!secret) { - throw new ApiError('JWT secret not configured', 500); - } - - return jwt.sign({ userId }, secret, { expiresIn: '7d' }); -}; - -export const register = catchAsync(async (req: Request, res: Response, next: NextFunction) => { - const { name, email, mobile, password }: RegisterRequest = req.body; - - // Handle profile image upload - let profileImageUrl: string | undefined; - if (req.file) { - const key = `profile-images/${Date.now()}-${req.file.originalname}`; - profileImageUrl = await imageUploadS3(req.file.buffer, req.file.mimetype, key); - } - - if (!name || !email || !mobile || !password) { - throw new ApiError('All fields are required', 400); - } - - // Validate email format - const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - if (!emailRegex.test(email)) { - throw new ApiError('Invalid email format', 400); - } - - // Validate mobile format (Indian mobile numbers) - const cleanMobile = mobile.replace(/\D/g, ''); - if (cleanMobile.length !== 10 || !/^[6-9]/.test(cleanMobile)) { - throw new ApiError('Invalid mobile number', 400); - } - - // Check if email already exists - const [existingEmail] = await db - .select() - .from(users) - .where(eq(users.email, email.toLowerCase())) - .limit(1); - - if (existingEmail) { - throw new ApiError('Email already registered', 409); - } - - // Check if mobile already exists - const [existingMobile] = await db - .select() - .from(users) - .where(eq(users.mobile, cleanMobile)) - .limit(1); - - if (existingMobile) { - throw new ApiError('Mobile number already registered', 409); - } - - // Hash password - const hashedPassword = await bcrypt.hash(password, 12); - - // Create user and credentials in a transaction - const newUser = await db.transaction(async (tx) => { - // Create user - const [user] = await tx - .insert(users) - .values({ - name: name.trim(), - email: email.toLowerCase().trim(), - mobile: cleanMobile, - }) - .returning(); - - // Create user credentials - await tx - .insert(userCreds) - .values({ - userId: user.id, - userPassword: hashedPassword, - }); - - // Create user details with profile image - await tx - .insert(userDetails) - .values({ - userId: user.id, - profileImage: profileImageUrl, - }); - - return user; - }); - - const token = generateToken(newUser.id); - - // Generate signed URL for profile image if it was uploaded - const profileImageSignedUrl = profileImageUrl - ? await generateSignedUrlFromS3Url(profileImageUrl) - : null; - - const response: AuthResponse = { - token, - user: { - id: newUser.id, - name: newUser.name, - email: newUser.email, - mobile: newUser.mobile, - profileImage: profileImageSignedUrl, - bio: null, - dateOfBirth: null, - gender: null, - occupation: null, - }, - }; - - res.status(201).json({ - success: true, - data: response, - }); -}); - -export const updateProfile = catchAsync(async (req: Request, res: Response, next: NextFunction) => { - const userId = req.user?.userId; - - if (!userId) { - throw new ApiError('User not authenticated', 401); - } - - const { name, email, mobile, password, bio, dateOfBirth, gender, occupation }: UpdateProfileRequest = req.body; - - // Handle profile image upload - let profileImageUrl: string | undefined; - if (req.file) { - const key = `profile-images/${Date.now()}-${req.file.originalname}`; - profileImageUrl = await imageUploadS3(req.file.buffer, req.file.mimetype, key); - } - - // Validate email format if provided - if (email) { - const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - if (!emailRegex.test(email)) { - throw new ApiError('Invalid email format', 400); - } - } - - // Validate mobile format if provided - if (mobile) { - const cleanMobile = mobile.replace(/\D/g, ''); - if (cleanMobile.length !== 10 || !/^[6-9]/.test(cleanMobile)) { - throw new ApiError('Invalid mobile number', 400); - } - } - - // Check if email already exists (if changing email) - if (email) { - const [existingEmail] = await db - .select() - .from(users) - .where(eq(users.email, email.toLowerCase())) - .limit(1); - - if (existingEmail && existingEmail.id !== userId) { - throw new ApiError('Email already registered', 409); - } - } - - // Check if mobile already exists (if changing mobile) - if (mobile) { - const cleanMobile = mobile.replace(/\D/g, ''); - const [existingMobile] = await db - .select() - .from(users) - .where(eq(users.mobile, cleanMobile)) - .limit(1); - - if (existingMobile && existingMobile.id !== userId) { - throw new ApiError('Mobile number already registered', 409); - } - } - - // Update user and user details in a transaction - const updatedUser = await db.transaction(async (tx) => { - // Update user table - const updateData: any = {}; - if (name) updateData.name = name.trim(); - if (email) updateData.email = email.toLowerCase().trim(); - if (mobile) updateData.mobile = mobile.replace(/\D/g, ''); - - if (Object.keys(updateData).length > 0) { - await tx - .update(users) - .set(updateData) - .where(eq(users.id, userId)); - } - - // Update password if provided - if (password) { - const hashedPassword = await bcrypt.hash(password, 12); - await tx - .update(userCreds) - .set({ userPassword: hashedPassword }) - .where(eq(userCreds.userId, userId)); - } - - // Update or insert user details - const userDetailsUpdate: any = {}; - if (bio !== undefined) userDetailsUpdate.bio = bio; - if (dateOfBirth !== undefined) userDetailsUpdate.dateOfBirth = dateOfBirth ? new Date(dateOfBirth) : null; - if (gender !== undefined) userDetailsUpdate.gender = gender; - if (occupation !== undefined) userDetailsUpdate.occupation = occupation; - if (profileImageUrl) userDetailsUpdate.profileImage = profileImageUrl; - userDetailsUpdate.updatedAt = new Date(); - - // Check if user details record exists - const [existingDetails] = await tx - .select() - .from(userDetails) - .where(eq(userDetails.userId, userId)) - .limit(1); - - if (existingDetails) { - // Update existing record - await tx - .update(userDetails) - .set(userDetailsUpdate) - .where(eq(userDetails.userId, userId)); - } else { - // Create new record - userDetailsUpdate.userId = userId; - userDetailsUpdate.createdAt = new Date(); - await tx - .insert(userDetails) - .values(userDetailsUpdate); - } - - // Return updated user data - const [user] = await tx - .select() - .from(users) - .where(eq(users.id, userId)) - .limit(1); - - return user; - }); - - // Get updated user details for response - const [userDetail] = await db - .select() - .from(userDetails) - .where(eq(userDetails.userId, userId)) - .limit(1); - - // Generate signed URL for profile image if it exists - const profileImageSignedUrl = userDetail?.profileImage - ? await generateSignedUrlFromS3Url(userDetail.profileImage) - : null; - - const response: AuthResponse = { - token: req.headers.authorization?.replace('Bearer ', '') || '', // Keep existing token - user: { - id: updatedUser.id, - name: updatedUser.name, - email: updatedUser.email, - mobile: updatedUser.mobile, - profileImage: profileImageSignedUrl, - bio: userDetail?.bio || null, - dateOfBirth: userDetail?.dateOfBirth || null, - gender: userDetail?.gender || null, - occupation: userDetail?.occupation || null, - }, - }; - - res.status(200).json({ - success: true, - data: response, - }); -}); diff --git a/apps/backend/src/uv-apis/auth.router.ts b/apps/backend/src/uv-apis/auth.router.ts deleted file mode 100644 index 63ceff5..0000000 --- a/apps/backend/src/uv-apis/auth.router.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Router } from 'express'; -import { register, updateProfile } from '@/src/uv-apis/auth.controller' -import { verifyToken } from '@/src/middleware/auth' -import uploadHandler from '@/src/lib/upload-handler' - -const router = Router(); - -router.post('/register', uploadHandler.single('profileImage'), register); -router.put('/profile', verifyToken, uploadHandler.single('profileImage'), updateProfile); - -const authRouter = router; -export default authRouter; \ No newline at end of file diff --git a/apps/backend/src/uv-apis/user-rest.controller.ts b/apps/backend/src/uv-apis/user-rest.controller.ts deleted file mode 100644 index 8fd02a1..0000000 --- a/apps/backend/src/uv-apis/user-rest.controller.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Request, Response, NextFunction } from 'express'; -import { db } from '@/src/db/db_index' -import { complaints } from '@/src/db/schema' -import { ApiError } from '@/src/lib/api-error' -import catchAsync from '@/src/lib/catch-async' -import { imageUploadS3 } from '@/src/lib/s3-client' - -interface RaiseComplaintRequest { - orderId?: string; - complaintBody: string; -} - -export const raiseComplaint = catchAsync(async (req: Request, res: Response, next: NextFunction) => { - console.log('raising complaint') - - const userId = req.user?.userId; - - if (!userId) { - throw new ApiError('User not authenticated', 401); - } - - const { orderId, complaintBody }: RaiseComplaintRequest = req.body; - - let orderIdNum: number | null = null; - - if (orderId) { - const readableIdMatch = orderId.match(/^ORD(\d+)$/); - if (readableIdMatch) { - orderIdNum = parseInt(readableIdMatch[1]); - } - } - - // Handle image uploads - const images = (req.files as Express.Multer.File[])?.filter(item => item.fieldname === 'images'); - let uploadedImageUrls: string[] = []; - - if (images && Array.isArray(images)) { - const imageUploadPromises = images.map((file, index) => { - const key = `complaint-images/${Date.now()}-${index}`; - return imageUploadS3(file.buffer, file.mimetype, key); - }); - - uploadedImageUrls = await Promise.all(imageUploadPromises); - } - - await db.insert(complaints).values({ - userId, - orderId: orderIdNum, - complaintBody: complaintBody.trim(), - images: uploadedImageUrls.length > 0 ? uploadedImageUrls : null, - }); - - res.status(200).json({ - success: true, - message: 'Complaint raised successfully' - }); -}); \ No newline at end of file diff --git a/apps/backend/src/uv-apis/uv-router.ts b/apps/backend/src/uv-apis/uv-router.ts deleted file mode 100644 index e205b76..0000000 --- a/apps/backend/src/uv-apis/uv-router.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Router } from "express"; -import authRouter from "@/src/uv-apis/auth.router" -import { raiseComplaint } from "@/src/uv-apis/user-rest.controller" -import uploadHandler from "@/src/lib/upload-handler"; - -const router = Router(); - -router.use("/auth", authRouter); -router.use("/complaints/raise", uploadHandler.array('images'),raiseComplaint) - -const uvRouter = router; -export default uvRouter; diff --git a/apps/backend/src/v1-router.ts b/apps/backend/src/v1-router.ts index 91a2e71..622f6a9 100644 --- a/apps/backend/src/v1-router.ts +++ b/apps/backend/src/v1-router.ts @@ -1,15 +1,9 @@ - import { Router } from "express"; - import avRouter from "@/src/apis/admin-apis/apis/av-router" - import commonRouter from "@/src/apis/common-apis/apis/common.router" - import uvRouter from "@/src/uv-apis/uv-router" +import { Hono } from 'hono' +import commonRouter from '@/src/apis/common-apis/apis/common.router' -const router = Router(); +const app = new Hono() - router.use('/av', avRouter); - router.use('/cm', commonRouter); - router.use('/uv', uvRouter); +// Mount common routes at /cm +app.route('/cm', commonRouter) - -const v1Router = router; - -export default v1Router; \ No newline at end of file +export default app diff --git a/apps/backend/tsconfig.json b/apps/backend/tsconfig.json index d522745..a323f4a 100755 --- a/apps/backend/tsconfig.json +++ b/apps/backend/tsconfig.json @@ -30,9 +30,15 @@ // "baseUrl": ".", "paths": { "@/*": ["./*"], + "@db-helper-postgres/*": ["../db-helper-postgres/src/*"], + "@db-helper-sqlite/*": ["../db-helper-sqlite/src/*"], "shared-types": ["../shared-types"], "@commonTypes": ["../../packages/ui/shared-types"], "@commonTypes/*": ["../../packages/ui/shared-types/*"], + "@packages/shared": ["../../packages/shared"], + "@packages/shared/*": ["../../packages/shared/*"], + "global-shared": ["../../packages/shared"], + "global-shared/*": ["../../packages/shared/*"] }, // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ // "typeRoots": [""], /* Specify multiple folders that act like './node_modules/@types'. */ @@ -116,6 +122,5 @@ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ "skipLibCheck": true /* Skip type checking all .d.ts files. */ }, - "include": ["src", "types", "index.ts", "../shared-types"] + "include": ["src", "types", "index.ts", "../shared-types", "../../packages/shared"] } - diff --git a/apps/backend/types/db-dialect.d.ts b/apps/backend/types/db-dialect.d.ts new file mode 100644 index 0000000..fbf1401 --- /dev/null +++ b/apps/backend/types/db-dialect.d.ts @@ -0,0 +1 @@ +declare const DB_DIALECT_TYPE: 'postgres' diff --git a/apps/db-helper-postgres/drizzle.config.ts b/apps/db-helper-postgres/drizzle.config.ts new file mode 100644 index 0000000..6622da0 --- /dev/null +++ b/apps/db-helper-postgres/drizzle.config.ts @@ -0,0 +1,11 @@ +import 'dotenv/config' +import { defineConfig } from 'drizzle-kit' + +export default defineConfig({ + out: './drizzle', + schema: './src/db/schema.ts', + dialect: 'postgresql', + dbCredentials: { + url: process.env.DATABASE_URL!, + }, +}) diff --git a/apps/db-helper-postgres/package.json b/apps/db-helper-postgres/package.json new file mode 100644 index 0000000..c5da9ce --- /dev/null +++ b/apps/db-helper-postgres/package.json @@ -0,0 +1,10 @@ +{ + "name": "db-helper-postgres", + "version": "0.1.0", + "private": true, + "type": "module", + "dependencies": { + "drizzle-orm": "^0.45.1", + "pg": "^8.16.3" + } +} diff --git a/apps/db-helper-postgres/src/apis/common-apis/common-product.ts b/apps/db-helper-postgres/src/apis/common-apis/common-product.ts new file mode 100644 index 0000000..70ab4f9 --- /dev/null +++ b/apps/db-helper-postgres/src/apis/common-apis/common-product.ts @@ -0,0 +1,84 @@ +import { and, eq, gt, inArray } from 'drizzle-orm' + +import { db } from '../../db/db_index' +import { deliverySlotInfo, productInfo, productSlots, productTags, units } from '../../db/schema' + +type ProductSummaryRow = { + id: number + name: string + shortDescription: string | null + price: string + marketPrice: string + images: unknown + isOutOfStock: boolean | null + unitShortNotation: string + productQuantity: number | null + nextDeliveryDate: Date | null +} + +const getNextDeliveryDate = async (productId: number): Promise => { + const result = await db + .select({ deliveryTime: deliverySlotInfo.deliveryTime }) + .from(productSlots) + .innerJoin(deliverySlotInfo, eq(productSlots.slotId, deliverySlotInfo.id)) + .where( + and( + eq(productSlots.productId, productId), + eq(deliverySlotInfo.isActive, true), + gt(deliverySlotInfo.deliveryTime, new Date()) + ) + ) + .orderBy(deliverySlotInfo.deliveryTime) + .limit(1) + + return result[0]?.deliveryTime || null +} + +export const getProductsSummaryData = async (tagId?: number | null): Promise => { + let productIds: number[] | null = null + + if (tagId) { + const taggedProducts = await db + .select({ productId: productTags.productId }) + .from(productTags) + .where(eq(productTags.tagId, tagId)) + + productIds = taggedProducts.map((taggedProduct) => taggedProduct.productId) + + if (productIds.length === 0) { + return [] + } + } + + const whereCondition = productIds && productIds.length > 0 + ? inArray(productInfo.id, productIds) + : undefined + + const productsWithUnits = await db + .select({ + id: productInfo.id, + name: productInfo.name, + shortDescription: productInfo.shortDescription, + price: productInfo.price, + marketPrice: productInfo.marketPrice, + images: productInfo.images, + isOutOfStock: productInfo.isOutOfStock, + unitShortNotation: units.shortNotation, + productQuantity: productInfo.productQuantity, + }) + .from(productInfo) + .innerJoin(units, eq(productInfo.unitId, units.id)) + .where(whereCondition) + + const productsWithDelivery = await Promise.all( + productsWithUnits.map(async (product) => { + const nextDeliveryDate = await getNextDeliveryDate(product.id) + return { + ...product, + nextDeliveryDate, + } + }) + ) + + return productsWithDelivery +} diff --git a/apps/db-helper-postgres/src/dataAccessors/admin-apis/banner-queries.ts b/apps/db-helper-postgres/src/dataAccessors/admin-apis/banner-queries.ts new file mode 100644 index 0000000..8e912fc --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/admin-apis/banner-queries.ts @@ -0,0 +1,38 @@ +import { db } from '../../db/db_index' +import { homeBanners } from '../../db/schema' +import { eq, desc } from 'drizzle-orm' +import { IBannerDbService, Banner, NewBanner } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/banner-db-service.interface' + +export class BannerDbService implements IBannerDbService { + async getAllBanners(): Promise { + return db.query.homeBanners.findMany({ + orderBy: desc(homeBanners.createdAt), + }) + } + + async getBannerById(id: number): Promise { + return db.query.homeBanners.findFirst({ + where: eq(homeBanners.id, id), + }) + } + + async createBanner(data: NewBanner): Promise { + const [banner] = await db.insert(homeBanners).values(data).returning() + return banner + } + + async updateBannerById(id: number, data: Partial): Promise { + const [banner] = await db + .update(homeBanners) + .set({ ...data, lastUpdated: new Date() }) + .where(eq(homeBanners.id, id)) + .returning() + return banner + } + + async deleteBannerById(id: number): Promise { + await db.delete(homeBanners).where(eq(homeBanners.id, id)) + } +} + +export const bannerDbService: IBannerDbService = new BannerDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/admin-apis/complaint-queries.ts b/apps/db-helper-postgres/src/dataAccessors/admin-apis/complaint-queries.ts new file mode 100644 index 0000000..f5b9fff --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/admin-apis/complaint-queries.ts @@ -0,0 +1,43 @@ +import { db } from '../../db/db_index' +import { complaints, users } from '../../db/schema' +import { eq, desc, lt } from 'drizzle-orm' +import { IComplaintDbService, Complaint, NewComplaint } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/complaint-db-service.interface' + +export class ComplaintDbService implements IComplaintDbService { + async getComplaints( + cursor?: number, + limit: number = 20 + ): Promise> { + let whereCondition = cursor ? lt(complaints.id, cursor) : undefined + + const complaintsData = await db + .select({ + id: complaints.id, + complaintBody: complaints.complaintBody, + userId: complaints.userId, + orderId: complaints.orderId, + isResolved: complaints.isResolved, + createdAt: complaints.createdAt, + response: complaints.response, + images: complaints.images, + userName: users.name, + userMobile: users.mobile, + }) + .from(complaints) + .leftJoin(users, eq(complaints.userId, users.id)) + .where(whereCondition) + .orderBy(desc(complaints.id)) + .limit(limit + 1) + + return complaintsData + } + + async resolveComplaint(id: number, response?: string): Promise { + await db + .update(complaints) + .set({ isResolved: true, response }) + .where(eq(complaints.id, id)) + } +} + +export const complaintDbService: IComplaintDbService = new ComplaintDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/admin-apis/constant-queries.ts b/apps/db-helper-postgres/src/dataAccessors/admin-apis/constant-queries.ts new file mode 100644 index 0000000..910c134 --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/admin-apis/constant-queries.ts @@ -0,0 +1,25 @@ +import { db } from '../../db/db_index' +import { keyValStore } from '../../db/schema' +import { IConstantDbService, Constant, NewConstant } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/constant-db-service.interface' + +export class ConstantDbService implements IConstantDbService { + async getAllConstants(): Promise { + return db.select().from(keyValStore) + } + + async upsertConstants(constants: { key: string; value: any }[]): Promise { + await db.transaction(async (tx) => { + for (const { key, value } of constants) { + await tx.insert(keyValStore) + .values({ key, value }) + .onConflictDoUpdate({ + target: keyValStore.key, + set: { value }, + }) + } + }) + return constants.length + } +} + +export const constantDbService: IConstantDbService = new ConstantDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/admin-apis/coupon-queries.ts b/apps/db-helper-postgres/src/dataAccessors/admin-apis/coupon-queries.ts new file mode 100644 index 0000000..ee23ab1 --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/admin-apis/coupon-queries.ts @@ -0,0 +1,191 @@ +import { db } from '../../db/db_index' +import { coupons, couponApplicableUsers, couponApplicableProducts, reservedCoupons, users, orders, orderStatus } from '../../db/schema' +import { eq, and, like, or, inArray, lt, asc } from 'drizzle-orm' +import { ICouponDbService, Coupon, NewCoupon, ReservedCoupon, NewReservedCoupon, CouponWithRelations } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/coupon-db-service.interface' + +export class CouponDbService implements ICouponDbService { + async createCoupon(data: NewCoupon): Promise { + const [coupon] = await db.insert(coupons).values(data).returning() + return coupon + } + + async getCouponById(id: number): Promise { + const result = await db.query.coupons.findFirst({ + where: eq(coupons.id, id), + with: { + creator: true, + applicableUsers: { with: { user: true } }, + applicableProducts: { with: { product: true } }, + }, + }) + if (!result) return undefined + return { + ...result, + productIds: (result.productIds as number[] | null) || null, + } as CouponWithRelations + } + + async getCouponByCode(code: string): Promise { + return db.query.coupons.findFirst({ + where: eq(coupons.couponCode, code), + }) + } + + async getAllCoupons(options: { cursor?: number; limit: number; search?: string }): Promise { + const { cursor, limit, search } = options + + let whereCondition = undefined + const conditions = [] + + if (cursor) { + conditions.push(lt(coupons.id, cursor)) + } + + if (search && search.trim()) { + conditions.push(like(coupons.couponCode, `%${search}%`)) + } + + if (conditions.length > 0) { + whereCondition = and(...conditions) + } + + const result = await db.query.coupons.findMany({ + where: whereCondition, + with: { + creator: true, + applicableUsers: { with: { user: true } }, + applicableProducts: { with: { product: true } }, + }, + orderBy: (coupons, { desc }) => [desc(coupons.createdAt)], + limit: limit + 1, + }) + + return result.map((coupon) => ({ + ...coupon, + productIds: (coupon.productIds as number[] | null) || null, + })) as CouponWithRelations[] + } + + async updateCoupon(id: number, data: Partial): Promise { + const [coupon] = await db.update(coupons).set(data).where(eq(coupons.id, id)).returning() + return coupon + } + + async invalidateCoupon(id: number): Promise { + const [coupon] = await db.update(coupons).set({ isInvalidated: true }).where(eq(coupons.id, id)).returning() + return coupon + } + + async addApplicableUsers(couponId: number, userIds: number[]): Promise { + await db.insert(couponApplicableUsers).values( + userIds.map(userId => ({ couponId, userId })) + ) + } + + async addApplicableProducts(couponId: number, productIds: number[]): Promise { + await db.insert(couponApplicableProducts).values( + productIds.map(productId => ({ couponId, productId })) + ) + } + + async removeAllApplicableUsers(couponId: number): Promise { + await db.delete(couponApplicableUsers).where(eq(couponApplicableUsers.couponId, couponId)) + } + + async removeAllApplicableProducts(couponId: number): Promise { + await db.delete(couponApplicableProducts).where(eq(couponApplicableProducts.couponId, couponId)) + } + + async countApplicableUsers(couponId: number): Promise { + return db.$count(couponApplicableUsers, eq(couponApplicableUsers.couponId, couponId)) + } + + async createReservedCoupon(data: NewReservedCoupon): Promise { + const [coupon] = await db.insert(reservedCoupons).values(data).returning() + return coupon + } + + async getReservedCoupons(options: { cursor?: number; limit: number; search?: string }): Promise { + const { cursor, limit, search } = options + + let whereCondition = undefined + const conditions = [] + + if (cursor) { + conditions.push(lt(reservedCoupons.id, cursor)) + } + + if (search && search.trim()) { + conditions.push(or( + like(reservedCoupons.secretCode, `%${search}%`), + like(reservedCoupons.couponCode, `%${search}%`) + )) + } + + if (conditions.length > 0) { + whereCondition = and(...conditions) + } + + return db.query.reservedCoupons.findMany({ + where: whereCondition, + with: { redeemedUser: true, creator: true }, + orderBy: (reservedCoupons, { desc }) => [desc(reservedCoupons.createdAt)], + limit: limit + 1, + }) + } + + async getUsersByIds(ids: number[]): Promise> { + return db.query.users.findMany({ + where: inArray(users.id, ids), + columns: { id: true, name: true, mobile: true }, + }) + } + + async getUsersBySearch(search: string, limit: number, offset: number): Promise> { + const whereCondition = or( + like(users.name, `%${search}%`), + like(users.mobile, `%${search}%`) + ) + + return db.query.users.findMany({ + where: whereCondition, + columns: { id: true, name: true, mobile: true }, + limit, + offset, + orderBy: (users, { asc }) => [asc(users.name)], + }) + } + + async createUser(data: Partial): Promise { + const [user] = await db.insert(users).values(data).returning() + return user + } + + async getUserByMobile(mobile: string): Promise { + return db.query.users.findFirst({ + where: eq(users.mobile, mobile), + }) + } + + async getOrderByIdWithUserAndStatus(id: number): Promise { + return db.query.orders.findFirst({ + where: eq(orders.id, id), + with: { + user: true, + orderStatus: true, + }, + }) + } + + async updateOrderStatusRefundCoupon(orderId: number, couponId: number): Promise { + await db.update(orderStatus) + .set({ refundCouponId: couponId }) + .where(eq(orderStatus.orderId, orderId)) + } + + async withTransaction(fn: (tx: any) => Promise): Promise { + return db.transaction(fn) + } +} + +export const couponDbService: ICouponDbService = new CouponDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/admin-apis/order-queries.ts b/apps/db-helper-postgres/src/dataAccessors/admin-apis/order-queries.ts new file mode 100644 index 0000000..7d2dc90 --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/admin-apis/order-queries.ts @@ -0,0 +1,334 @@ +import { db } from '../../db/db_index' +import { + orders, + orderItems, + orderStatus, + users, + addresses, + refunds, + coupons, + couponUsage, + complaints, + payments, + deliverySlotInfo, + productInfo, + units, + paymentInfoTable, +} from '../../db/schema' +import { eq, and, gte, lt, desc, inArray, SQL } from 'drizzle-orm' +import { + IOrderDbService, + Order, + OrderItem, + OrderStatus, + Address, + Refund, + OrderWithRelations, + OrderWithStatus, + OrderWithCouponUsages, +} from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/order-db-service.interface' + +export class OrderDbService implements IOrderDbService { + async updateOrderNotes(orderId: number, adminNotes: string | null): Promise { + const [updated] = await db + .update(orders) + .set({ adminNotes }) + .where(eq(orders.id, orderId)) + .returning() + return updated + } + + async removeDeliveryCharge(orderId: number, totalAmount: string): Promise { + await db + .update(orders) + .set({ deliveryCharge: '0', totalAmount }) + .where(eq(orders.id, orderId)) + } + + async getOrderById(orderId: number): Promise { + return db.query.orders.findFirst({ + where: eq(orders.id, orderId), + }) + } + + async getOrderWithRelations(orderId: number): Promise { + return db.query.orders.findFirst({ + where: eq(orders.id, orderId), + with: { + user: true, + address: true, + slot: true, + orderItems: { + with: { + product: { + with: { unit: true }, + }, + }, + }, + payment: true, + paymentInfo: true, + }, + }) as Promise + } + + async getOrderWithDetails(orderId: number): Promise { + return db.query.orders.findFirst({ + where: eq(orders.id, orderId), + with: { + user: true, + address: true, + slot: true, + orderItems: { + with: { + product: { + with: { unit: true }, + }, + }, + }, + payment: true, + paymentInfo: true, + orderStatus: true, + refunds: true, + }, + }) as Promise + } + + async getOrderWithStatus(orderId: number): Promise { + return db.query.orders.findFirst({ + where: eq(orders.id, orderId), + with: { + orderStatus: true, + }, + }) as Promise + } + + async getOrderStatusByOrderId(orderId: number): Promise { + return db.query.orderStatus.findFirst({ + where: eq(orderStatus.orderId, orderId), + }) + } + + async updateOrderStatusPackaged(orderId: number, isPackaged: boolean, isDelivered: boolean): Promise { + await db + .update(orderStatus) + .set({ isPackaged, isDelivered }) + .where(eq(orderStatus.orderId, orderId)) + } + + async updateOrderStatusDelivered(orderId: number, isDelivered: boolean): Promise { + await db + .update(orderStatus) + .set({ isDelivered }) + .where(eq(orderStatus.orderId, orderId)) + } + + async cancelOrderStatus(statusId: number, reason: string): Promise { + await db + .update(orderStatus) + .set({ + isCancelled: true, + isCancelledByAdmin: true, + cancelReason: reason, + cancellationAdminNotes: reason, + cancellationReviewed: true, + cancellationReviewedAt: new Date(), + }) + .where(eq(orderStatus.id, statusId)) + } + + async getRefundByOrderId(orderId: number): Promise { + return db.query.refunds.findFirst({ + where: eq(refunds.orderId, orderId), + }) + } + + async createRefund(orderId: number, refundStatus: string): Promise { + await db.insert(refunds).values({ orderId, refundStatus }) + } + + async getCouponUsageByOrderId(orderId: number): Promise> { + return db.query.couponUsage.findMany({ + where: eq(couponUsage.orderId, orderId), + with: { coupon: true }, + }) + } + + async getOrderItemById(orderItemId: number): Promise { + return db.query.orderItems.findFirst({ + where: eq(orderItems.id, orderItemId), + }) + } + + async updateOrderItem(orderItemId: number, data: Partial): Promise { + await db + .update(orderItems) + .set(data) + .where(eq(orderItems.id, orderItemId)) + } + + async updateOrderItemsPackaged(orderId: number, isPackaged: boolean): Promise { + await db + .update(orderItems) + .set({ is_packaged: isPackaged }) + .where(eq(orderItems.orderId, orderId)) + } + + async updateAddressCoords(addressId: number, latitude: number, longitude: number): Promise
{ + const [updated] = await db + .update(addresses) + .set({ adminLatitude: latitude, adminLongitude: longitude }) + .where(eq(addresses.id, addressId)) + .returning() + return updated + } + + async getOrdersBySlotId(slotId: number): Promise { + return db.query.orders.findMany({ + where: eq(orders.slotId, slotId), + with: { + user: true, + address: true, + slot: true, + orderItems: { + with: { + product: { with: { unit: true } }, + }, + }, + orderStatus: true, + }, + }) as Promise + } + + async getOrdersBySlotIds(slotIds: number[]): Promise { + return db.query.orders.findMany({ + where: inArray(orders.slotId, slotIds), + with: { + orderItems: { + with: { + product: true, + }, + }, + couponUsages: { + with: { coupon: true }, + }, + }, + }) as Promise + } + + async getOrdersByDateRange(start: Date, end: Date, slotId?: number): Promise { + let whereCondition = and(gte(orders.createdAt, start), lt(orders.createdAt, end)) + + if (slotId) { + whereCondition = and(whereCondition, eq(orders.slotId, slotId)) + } + + return db.query.orders.findMany({ + where: whereCondition, + with: { + user: true, + address: true, + slot: true, + orderItems: { + with: { + product: { with: { unit: true } }, + }, + }, + orderStatus: true, + }, + }) as Promise + } + + async getAllOrdersWithFilters(options: { + cursor?: number + limit: number + slotId?: number | null + packagedFilter: 'all' | 'packaged' | 'not_packaged' + deliveredFilter: 'all' | 'delivered' | 'not_delivered' + cancellationFilter: 'all' | 'cancelled' | 'not_cancelled' + flashDeliveryFilter: 'all' | 'flash' | 'regular' + }): Promise { + const { + cursor, + limit, + slotId, + packagedFilter, + deliveredFilter, + cancellationFilter, + flashDeliveryFilter, + } = options + + let whereCondition: SQL | undefined = eq(orders.id, orders.id) + + if (cursor) { + whereCondition = and(whereCondition, lt(orders.id, cursor)) + } + if (slotId) { + whereCondition = and(whereCondition, eq(orders.slotId, slotId)) + } + if (packagedFilter === 'packaged') { + whereCondition = and(whereCondition, eq(orderStatus.isPackaged, true)) + } else if (packagedFilter === 'not_packaged') { + whereCondition = and(whereCondition, eq(orderStatus.isPackaged, false)) + } + if (deliveredFilter === 'delivered') { + whereCondition = and(whereCondition, eq(orderStatus.isDelivered, true)) + } else if (deliveredFilter === 'not_delivered') { + whereCondition = and(whereCondition, eq(orderStatus.isDelivered, false)) + } + if (cancellationFilter === 'cancelled') { + whereCondition = and(whereCondition, eq(orderStatus.isCancelled, true)) + } else if (cancellationFilter === 'not_cancelled') { + whereCondition = and(whereCondition, eq(orderStatus.isCancelled, false)) + } + if (flashDeliveryFilter === 'flash') { + whereCondition = and(whereCondition, eq(orders.isFlashDelivery, true)) + } else if (flashDeliveryFilter === 'regular') { + whereCondition = and(whereCondition, eq(orders.isFlashDelivery, false)) + } + + return db.query.orders.findMany({ + where: whereCondition, + orderBy: desc(orders.createdAt), + limit: limit + 1, + with: { + user: true, + address: true, + slot: true, + orderItems: { + with: { + product: { with: { unit: true } }, + }, + }, + orderStatus: true, + }, + }) as Promise + } + + async updateOrdersAndItemsInTransaction( + data: Array<{ orderId: number; totalAmount: string; items: Array<{ id: number; price: string; discountedPrice: string }> }> + ): Promise { + await db.transaction(async (tx) => { + for (const entry of data) { + await tx.update(orders).set({ totalAmount: entry.totalAmount }).where(eq(orders.id, entry.orderId)) + + for (const item of entry.items) { + await tx.update(orderItems).set({ price: item.price, discountedPrice: item.discountedPrice }).where(eq(orderItems.id, item.id)) + } + } + }) + } + + async deleteOrderById(orderId: number): Promise { + await db.transaction(async (tx) => { + await tx.delete(orderItems).where(eq(orderItems.orderId, orderId)) + await tx.delete(orderStatus).where(eq(orderStatus.orderId, orderId)) + await tx.delete(payments).where(eq(payments.orderId, orderId)) + await tx.delete(refunds).where(eq(refunds.orderId, orderId)) + await tx.delete(couponUsage).where(eq(couponUsage.orderId, orderId)) + await tx.delete(complaints).where(eq(complaints.orderId, orderId)) + await tx.delete(orders).where(eq(orders.id, orderId)) + }) + } +} + +export const orderDbService: IOrderDbService = new OrderDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/admin-apis/product-queries.ts b/apps/db-helper-postgres/src/dataAccessors/admin-apis/product-queries.ts new file mode 100644 index 0000000..bdf314f --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/admin-apis/product-queries.ts @@ -0,0 +1,226 @@ +import { db } from '../../db/db_index' +import { productInfo, units, specialDeals, productSlots, productTags, productReviews, productGroupInfo, productGroupMembership, users } from '../../db/schema' +import { eq, and, inArray, desc, sql } from 'drizzle-orm' +import { IProductDbService, Product, NewProduct, ProductGroup, NewProductGroup } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/product-db-service.interface' + +export class ProductDbService implements IProductDbService { + async getAllProducts(): Promise { + return db.query.productInfo.findMany({ + orderBy: productInfo.name, + with: { + unit: true, + store: true, + }, + }) + } + + async getProductById(id: number): Promise { + return db.query.productInfo.findFirst({ + where: eq(productInfo.id, id), + with: { + unit: true, + }, + }) + } + + async createProduct(data: NewProduct): Promise { + const [product] = await db.insert(productInfo).values(data).returning() + return product + } + + async updateProduct(id: number, data: Partial): Promise { + const [product] = await db + .update(productInfo) + .set(data) + .where(eq(productInfo.id, id)) + .returning() + return product + } + + async deleteProduct(id: number): Promise { + const [product] = await db + .delete(productInfo) + .where(eq(productInfo.id, id)) + .returning() + return product + } + + async getDealsByProductId(productId: number): Promise { + return db.query.specialDeals.findMany({ + where: eq(specialDeals.productId, productId), + orderBy: specialDeals.quantity, + }) + } + + async createDeals(deals: Partial[]): Promise { + if (deals.length > 0) { + await db.insert(specialDeals).values(deals as any) + } + } + + async deleteDealsByProductId(productId: number): Promise { + await db.delete(specialDeals).where(eq(specialDeals.productId, productId)) + } + + async getTagsByProductId(productId: number): Promise> { + return db.query.productTags.findMany({ + where: eq(productTags.productId, productId), + with: { + tag: true, + }, + }) as any + } + + async createTagAssociations(associations: { productId: number; tagId: number }[]): Promise { + if (associations.length > 0) { + await db.insert(productTags).values(associations) + } + } + + async deleteTagAssociationsByProductId(productId: number): Promise { + await db.delete(productTags).where(eq(productTags.productId, productId)) + } + + async getProductSlotsBySlotId(slotId: number): Promise { + return db.query.productSlots.findMany({ + where: eq(productSlots.slotId, slotId), + }) + } + + async getProductSlotsBySlotIds(slotIds: number[]): Promise { + return db.query.productSlots.findMany({ + where: inArray(productSlots.slotId, slotIds), + columns: { slotId: true, productId: true }, + }) + } + + async createProductSlot(slotId: number, productId: number): Promise { + await db.insert(productSlots).values({ slotId, productId }) + } + + async deleteProductSlotsBySlotId(slotId: number): Promise { + await db.delete(productSlots).where(eq(productSlots.slotId, slotId)) + } + + async deleteProductSlot(slotId: number, productId: number): Promise { + await db + .delete(productSlots) + .where(and(eq(productSlots.slotId, slotId), eq(productSlots.productId, productId))) + } + + async getReviewsByProductId(productId: number, limit: number, offset: number): Promise<(typeof productReviews.$inferSelect & { userName: string | null })[]> { + const reviews = await db + .select({ + id: productReviews.id, + reviewBody: productReviews.reviewBody, + ratings: productReviews.ratings, + imageUrls: productReviews.imageUrls, + reviewTime: productReviews.reviewTime, + adminResponse: productReviews.adminResponse, + adminResponseImages: productReviews.adminResponseImages, + userName: users.name, + }) + .from(productReviews) + .innerJoin(users, eq(productReviews.userId, users.id)) + .where(eq(productReviews.productId, productId)) + .orderBy(desc(productReviews.reviewTime)) + .limit(limit) + .offset(offset) + + return reviews as any + } + + async getReviewCountByProductId(productId: number): Promise { + const result = await db + .select({ count: sql`count(*)` }) + .from(productReviews) + .where(eq(productReviews.productId, productId)) + return Number(result[0].count) + } + + async updateReview(reviewId: number, data: Partial): Promise { + const [review] = await db + .update(productReviews) + .set(data) + .where(eq(productReviews.id, reviewId)) + .returning() + return review + } + + async getAllGroups(): Promise { + return db.query.productGroupInfo.findMany({ + with: { + memberships: { + with: { + product: true, + }, + }, + }, + orderBy: desc(productGroupInfo.createdAt), + }) + } + + async getGroupById(id: number): Promise { + return db.query.productGroupInfo.findFirst({ + where: eq(productGroupInfo.id, id), + }) + } + + async createGroup(data: NewProductGroup): Promise { + const [group] = await db.insert(productGroupInfo).values(data).returning() + return group + } + + async updateGroup(id: number, data: Partial): Promise { + const [group] = await db + .update(productGroupInfo) + .set(data) + .where(eq(productGroupInfo.id, id)) + .returning() + return group + } + + async deleteGroup(id: number): Promise { + const [group] = await db + .delete(productGroupInfo) + .where(eq(productGroupInfo.id, id)) + .returning() + return group + } + + async deleteGroupMembershipsByGroupId(groupId: number): Promise { + await db.delete(productGroupMembership).where(eq(productGroupMembership.groupId, groupId)) + } + + async createGroupMemberships(memberships: { productId: number; groupId: number }[]): Promise { + if (memberships.length > 0) { + await db.insert(productGroupMembership).values(memberships) + } + } + + async getUnitById(id: number): Promise { + return db.query.units.findFirst({ + where: eq(units.id, id), + }) + } + + async validateProductIdsExist(productIds: number[]): Promise { + const products = await db.query.productInfo.findMany({ + where: inArray(productInfo.id, productIds), + columns: { id: true }, + }) + return products.length === productIds.length + } + + async batchUpdateProducts(updates: { productId: number; data: Partial }[]): Promise { + const promises = updates.map(update => + db + .update(productInfo) + .set(update.data) + .where(eq(productInfo.id, update.productId)) + ) + await Promise.all(promises) + } +} + +export const productDbService: IProductDbService = new ProductDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/admin-apis/refund-queries.ts b/apps/db-helper-postgres/src/dataAccessors/admin-apis/refund-queries.ts new file mode 100644 index 0000000..691722d --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/admin-apis/refund-queries.ts @@ -0,0 +1,49 @@ +import { db } from '../../db/db_index' +import { refunds, orders, orderStatus, payments } from '../../db/schema' +import { eq, and } from 'drizzle-orm' +import { IRefundDbService, Refund, NewRefund } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/refund-db-service.interface' + +export class RefundDbService implements IRefundDbService { + async createRefund(data: NewRefund): Promise { + const [refund] = await db.insert(refunds).values(data).returning() + return refund + } + + async updateRefund(id: number, data: Partial): Promise { + const [refund] = await db + .update(refunds) + .set(data) + .where(eq(refunds.id, id)) + .returning() + return refund + } + + async getRefundByOrderId(orderId: number): Promise { + return db.query.refunds.findFirst({ + where: eq(refunds.orderId, orderId), + }) + } + + async getOrderById(id: number): Promise { + return db.query.orders.findFirst({ + where: eq(orders.id, id), + }) + } + + async getOrderStatusByOrderId(orderId: number): Promise { + return db.query.orderStatus.findFirst({ + where: eq(orderStatus.orderId, orderId), + }) + } + + async getSuccessfulPaymentByOrderId(orderId: number): Promise { + return db.query.payments.findFirst({ + where: and( + eq(payments.orderId, orderId), + eq(payments.status, "success") + ), + }) + } +} + +export const refundDbService: IRefundDbService = new RefundDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/admin-apis/schedule-queries.ts b/apps/db-helper-postgres/src/dataAccessors/admin-apis/schedule-queries.ts new file mode 100644 index 0000000..6744a88 --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/admin-apis/schedule-queries.ts @@ -0,0 +1,48 @@ +import { db } from '../../db/db_index' +import { productAvailabilitySchedules } from '../../db/schema' +import { eq, desc } from 'drizzle-orm' +import { IScheduleDbService, Schedule, NewSchedule } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/schedule-db-service.interface' + +export class ScheduleDbService implements IScheduleDbService { + async createSchedule(data: NewSchedule): Promise { + const [schedule] = await db.insert(productAvailabilitySchedules).values(data).returning() + return schedule + } + + async getAllSchedules(): Promise { + return db.query.productAvailabilitySchedules.findMany({ + orderBy: desc(productAvailabilitySchedules.createdAt), + }) + } + + async getScheduleById(id: number): Promise { + return db.query.productAvailabilitySchedules.findFirst({ + where: eq(productAvailabilitySchedules.id, id), + }) + } + + async getScheduleByName(name: string): Promise { + return db.query.productAvailabilitySchedules.findFirst({ + where: eq(productAvailabilitySchedules.scheduleName, name), + }) + } + + async updateSchedule(id: number, data: Partial): Promise { + const [schedule] = await db + .update(productAvailabilitySchedules) + .set({ ...data, lastUpdated: new Date() }) + .where(eq(productAvailabilitySchedules.id, id)) + .returning() + return schedule + } + + async deleteSchedule(id: number): Promise { + const [schedule] = await db + .delete(productAvailabilitySchedules) + .where(eq(productAvailabilitySchedules.id, id)) + .returning() + return schedule + } +} + +export const scheduleDbService: IScheduleDbService = new ScheduleDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/admin-apis/slot-queries.ts b/apps/db-helper-postgres/src/dataAccessors/admin-apis/slot-queries.ts new file mode 100644 index 0000000..1154210 --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/admin-apis/slot-queries.ts @@ -0,0 +1,142 @@ +import { db } from '../../db/db_index' +import { deliverySlotInfo, productSlots, vendorSnippets, productInfo, productGroupInfo } from '../../db/schema' +import { eq, inArray, and, desc } from 'drizzle-orm' +import { ISlotDbService, Slot, NewSlot, ProductSlot, SlotWithRelations } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/slot-db-service.interface' + +export class SlotDbService implements ISlotDbService { + async getAllSlots(): Promise { + return db.query.deliverySlotInfo.findMany({ + orderBy: desc(deliverySlotInfo.deliveryTime), + with: { + productSlots: { + with: { + product: { + columns: { id: true, name: true, images: true }, + }, + }, + }, + }, + }) as Promise + } + + async getActiveSlots(): Promise { + return db.query.deliverySlotInfo.findMany({ + where: eq(deliverySlotInfo.isActive, true), + orderBy: desc(deliverySlotInfo.deliveryTime), + }) + } + + async getSlotById(id: number): Promise { + return db.query.deliverySlotInfo.findFirst({ + where: eq(deliverySlotInfo.id, id), + with: { + productSlots: { + with: { + product: { + columns: { id: true, name: true, images: true }, + }, + }, + }, + vendorSnippets: true, + }, + }) as Promise + } + + async createSlot(data: NewSlot): Promise { + const [slot] = await db.insert(deliverySlotInfo).values(data).returning() + return slot + } + + async updateSlot(id: number, data: Partial): Promise { + const [slot] = await db + .update(deliverySlotInfo) + .set(data) + .where(eq(deliverySlotInfo.id, id)) + .returning() + return slot + } + + async deactivateSlot(id: number): Promise { + const [slot] = await db + .update(deliverySlotInfo) + .set({ isActive: false }) + .where(eq(deliverySlotInfo.id, id)) + .returning() + return slot + } + + async getProductSlotsBySlotId(slotId: number): Promise { + return db.query.productSlots.findMany({ + where: eq(productSlots.slotId, slotId), + }) + } + + async getProductSlotsBySlotIds(slotIds: number[]): Promise { + return db.query.productSlots.findMany({ + where: inArray(productSlots.slotId, slotIds), + columns: { slotId: true, productId: true }, + }) + } + + async createProductSlot(slotId: number, productId: number): Promise { + await db.insert(productSlots).values({ slotId, productId }) + } + + async deleteProductSlot(slotId: number, productId: number): Promise { + await db + .delete(productSlots) + .where(and(eq(productSlots.slotId, slotId), eq(productSlots.productId, productId))) + } + + async deleteProductSlotsBySlotId(slotId: number): Promise { + await db.delete(productSlots).where(eq(productSlots.slotId, slotId)) + } + + async getVendorSnippetsBySlotId(slotId: number): Promise> { + return db.query.vendorSnippets.findMany({ + where: eq(vendorSnippets.slotId, slotId), + }) + } + + async createVendorSnippet(data: { snippetCode: string; slotId: number; productIds: number[]; validTill?: Date }): Promise<{ id: number; snippetCode: string; slotId: number | null; productIds: number[]; validTill: Date | null; createdAt: Date; isPermanent: boolean | null }> { + const [snippet] = await db.insert(vendorSnippets).values({ + snippetCode: data.snippetCode, + slotId: data.slotId, + productIds: data.productIds, + validTill: data.validTill || null, + }).returning() + return snippet + } + + async checkSnippetCodeExists(code: string): Promise { + const existing = await db.query.vendorSnippets.findFirst({ + where: eq(vendorSnippets.snippetCode, code), + }) + return !!existing + } + + async validateProductsExist(productIds: number[]): Promise { + const products = await db.query.productInfo.findMany({ + where: inArray(productInfo.id, productIds), + }) + return products.length === productIds.length + } + + async getProductsByIds(productIds: number[]): Promise { + return db.query.productInfo.findMany({ + where: inArray(productInfo.id, productIds), + }) + } + + async getGroupsByIds(groupIds: number[]): Promise> { + return db.query.productGroupInfo.findMany({ + where: inArray(productGroupInfo.id, groupIds), + }) + } + + async withTransaction(fn: (tx: any) => Promise): Promise { + return db.transaction(fn) + } +} + +export const slotDbService: ISlotDbService = new SlotDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/admin-apis/staff-user-queries.ts b/apps/db-helper-postgres/src/dataAccessors/admin-apis/staff-user-queries.ts new file mode 100644 index 0000000..de0da27 --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/admin-apis/staff-user-queries.ts @@ -0,0 +1,104 @@ +import { db } from '../../db/db_index' +import { staffUsers, staffRoles, users, userDetails, orders } from '../../db/schema' +import { eq, or, ilike, and, lt, desc } from 'drizzle-orm' +import { IStaffUserDbService, StaffUser, NewStaffUser, StaffRole } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/staff-user-db-service.interface' + +export class StaffUserDbService implements IStaffUserDbService { + async getStaffUserByName(name: string): Promise { + return db.query.staffUsers.findFirst({ + where: eq(staffUsers.name, name), + }) + } + + async getAllStaff(): Promise { + return db.query.staffUsers.findMany({ + columns: { id: true, name: true }, + with: { + role: { + with: { + rolePermissions: { + with: { permission: true }, + }, + }, + }, + }, + }) + } + + async createStaffUser(data: NewStaffUser): Promise { + const [user] = await db.insert(staffUsers).values(data).returning() + return user + } + + async getRoleById(id: number): Promise { + return db.query.staffRoles.findFirst({ + where: eq(staffRoles.id, id), + }) + } + + async getAllRoles(): Promise { + return db.query.staffRoles.findMany({ + columns: { id: true, roleName: true }, + }) + } + + async getUsers(options: { cursor?: number; limit: number; search?: string }): Promise { + const { cursor, limit, search } = options + + let whereCondition = undefined + + if (search) { + whereCondition = or( + ilike(users.name, `%${search}%`), + ilike(users.email, `%${search}%`), + ilike(users.mobile, `%${search}%`) + ) + } + + if (cursor) { + const cursorCondition = lt(users.id, cursor) + whereCondition = whereCondition ? and(whereCondition, cursorCondition) : cursorCondition + } + + return db.query.users.findMany({ + where: whereCondition, + with: { userDetails: true }, + orderBy: desc(users.id), + limit: limit + 1, + }) + } + + async getUserById(id: number): Promise { + return db.query.users.findFirst({ + where: eq(users.id, id), + with: { + userDetails: true, + orders: { + orderBy: desc(orders.createdAt), + limit: 1, + }, + }, + }) + } + + async upsertUserDetails(data: Partial & { userId: number }): Promise { + await db + .insert(userDetails) + .values(data) + .onConflictDoUpdate({ + target: userDetails.userId, + set: data, + }) + } + + async getLastOrderByUserId(userId: number): Promise { + const userOrders = await db.query.orders.findMany({ + where: eq(orders.userId, userId), + orderBy: desc(orders.createdAt), + limit: 1, + }) + return userOrders[0] + } +} + +export const staffUserDbService: IStaffUserDbService = new StaffUserDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/admin-apis/store-queries.ts b/apps/db-helper-postgres/src/dataAccessors/admin-apis/store-queries.ts new file mode 100644 index 0000000..e1cb55b --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/admin-apis/store-queries.ts @@ -0,0 +1,53 @@ +import { db } from '../../db/db_index' +import { storeInfo, productInfo } from '../../db/schema' +import { eq, inArray } from 'drizzle-orm' +import { IStoreDbService, Store, NewStore } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/store-db-service.interface' + +export class StoreDbService implements IStoreDbService { + async getAllStores(): Promise { + return db.query.storeInfo.findMany({ + with: { owner: true }, + }) + } + + async getStoreById(id: number): Promise { + return db.query.storeInfo.findFirst({ + where: eq(storeInfo.id, id), + with: { owner: true }, + }) + } + + async createStore(data: NewStore): Promise { + const [store] = await db.insert(storeInfo).values(data).returning() + return store + } + + async updateStore(id: number, data: Partial): Promise { + const [store] = await db + .update(storeInfo) + .set(data) + .where(eq(storeInfo.id, id)) + .returning() + return store + } + + async deleteStore(id: number): Promise { + await db.delete(storeInfo).where(eq(storeInfo.id, id)) + } + + async assignProductsToStore(storeId: number, productIds: number[]): Promise { + await db + .update(productInfo) + .set({ storeId }) + .where(inArray(productInfo.id, productIds)) + } + + async removeProductsFromStore(storeId: number): Promise { + await db + .update(productInfo) + .set({ storeId: null }) + .where(eq(productInfo.storeId, storeId)) + } +} + +export const storeDbService: IStoreDbService = new StoreDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/admin-apis/tag-queries.ts b/apps/db-helper-postgres/src/dataAccessors/admin-apis/tag-queries.ts new file mode 100644 index 0000000..5ac42fa --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/admin-apis/tag-queries.ts @@ -0,0 +1,42 @@ +import { db } from '../../db/db_index' +import { productTagInfo } from '../../db/schema' +import { eq } from 'drizzle-orm' +import { ITagDbService, Tag, NewTag } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/tag-db-service.interface' + +export class TagDbService implements ITagDbService { + async getAllTags(): Promise { + return db.select().from(productTagInfo).orderBy(productTagInfo.tagName) + } + + async getTagById(id: number): Promise { + return db.query.productTagInfo.findFirst({ + where: eq(productTagInfo.id, id), + }) + } + + async getTagByName(name: string): Promise { + return db.query.productTagInfo.findFirst({ + where: eq(productTagInfo.tagName, name.trim()), + }) + } + + async createTag(data: NewTag): Promise { + const [tag] = await db.insert(productTagInfo).values(data).returning() + return tag + } + + async updateTag(id: number, data: Partial): Promise { + const [tag] = await db + .update(productTagInfo) + .set(data) + .where(eq(productTagInfo.id, id)) + .returning() + return tag + } + + async deleteTag(id: number): Promise { + await db.delete(productTagInfo).where(eq(productTagInfo.id, id)) + } +} + +export const tagDbService: ITagDbService = new TagDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/admin-apis/user-queries.ts b/apps/db-helper-postgres/src/dataAccessors/admin-apis/user-queries.ts new file mode 100644 index 0000000..b360d18 --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/admin-apis/user-queries.ts @@ -0,0 +1,170 @@ +import { db } from '../../db/db_index' +import { users, userDetails, orders, orderItems, orderStatus, complaints, notifCreds, unloggedUserTokens, userIncidents } from '../../db/schema' +import { eq, sql, desc, asc, count, max, inArray } from 'drizzle-orm' +import { IUserDbService, User, NewUser, UserDetail } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/user-db-service.interface' + +export class UserDbService implements IUserDbService { + async getUserById(id: number): Promise { + return db.query.users.findFirst({ + where: eq(users.id, id), + }) + } + + async getUserByMobile(mobile: string): Promise { + return db.query.users.findFirst({ + where: eq(users.mobile, mobile), + }) + } + + async getUsers(options: { limit: number; cursor?: number; search?: string }): Promise { + const { limit, cursor, search } = options + + const whereConditions = [] + + if (search && search.trim()) { + whereConditions.push(sql`${users.mobile} ILIKE ${`%${search.trim()}%`}`) + } + + if (cursor) { + whereConditions.push(sql`${users.id} > ${cursor}`) + } + + return db + .select() + .from(users) + .where(whereConditions.length > 0 ? sql.join(whereConditions, sql` AND `) : undefined) + .orderBy(asc(users.id)) + .limit(limit + 1) + } + + async createUser(data: NewUser): Promise { + const [user] = await db.insert(users).values(data).returning() + return user + } + + async getUserDetailsByUserId(userId: number): Promise { + return db.query.userDetails.findFirst({ + where: eq(userDetails.userId, userId), + }) + } + + async upsertUserDetails(data: Partial & { userId: number }): Promise { + await db + .insert(userDetails) + .values(data) + .onConflictDoUpdate({ + target: userDetails.userId, + set: data, + }) + } + + async getOrdersByUserId(userId: number): Promise { + return db + .select() + .from(orders) + .where(eq(orders.userId, userId)) + .orderBy(desc(orders.createdAt)) + } + + async getLastOrderByUserId(userId: number): Promise { + const userOrders = await db + .select() + .from(orders) + .where(eq(orders.userId, userId)) + .orderBy(desc(orders.createdAt)) + .limit(1) + return userOrders[0] + } + + async getOrderCountByUserIds(userIds: number[]): Promise<{ userId: number; totalOrders: number }[]> { + if (userIds.length === 0) return [] + return db + .select({ + userId: orders.userId, + totalOrders: count(orders.id), + }) + .from(orders) + .where(sql`${orders.userId} IN (${sql.join(userIds, sql`, `)})`) + .groupBy(orders.userId) + } + + async getLastOrderDateByUserIds(userIds: number[]): Promise<{ userId: number; lastOrderDate: Date | null }[]> { + if (userIds.length === 0) return [] + return db + .select({ + userId: orders.userId, + lastOrderDate: max(orders.createdAt), + }) + .from(orders) + .where(sql`${orders.userId} IN (${sql.join(userIds, sql`, `)})`) + .groupBy(orders.userId) + } + + async getOrderStatusByOrderIds(orderIds: number[]): Promise<{ orderId: number; isDelivered: boolean; isCancelled: boolean }[]> { + if (orderIds.length === 0) return [] + return db + .select({ + orderId: orderStatus.orderId, + isDelivered: orderStatus.isDelivered, + isCancelled: orderStatus.isCancelled, + }) + .from(orderStatus) + .where(sql`${orderStatus.orderId} IN (${sql.join(orderIds, sql`, `)})`) + } + + async getOrderItemCountByOrderIds(orderIds: number[]): Promise<{ orderId: number; itemCount: number }[]> { + if (orderIds.length === 0) return [] + return db + .select({ + orderId: orderItems.orderId, + itemCount: count(orderItems.id), + }) + .from(orderItems) + .where(sql`${orderItems.orderId} IN (${sql.join(orderIds, sql`, `)})`) + .groupBy(orderItems.orderId) + } + + async getUnresolvedComplaintCount(): Promise { + return db.$count(complaints, eq(complaints.isResolved, false)) + } + + async getAllNotifTokens(): Promise { + const tokens = await db.select({ token: notifCreds.token }).from(notifCreds) + return tokens.map(t => t.token) + } + + async getNotifTokensByUserIds(userIds: number[]): Promise { + const tokens = await db + .select({ token: notifCreds.token }) + .from(notifCreds) + .where(inArray(notifCreds.userId, userIds)) + return tokens.map(t => t.token) + } + + async getUnloggedTokens(): Promise { + const tokens = await db.select({ token: unloggedUserTokens.token }).from(unloggedUserTokens) + return tokens.map(t => t.token) + } + + async getUserIncidentsByUserId(userId: number): Promise } | null; addedBy?: { name: string | null } | null }>> { + return db.query.userIncidents.findMany({ + where: eq(userIncidents.userId, userId), + with: { + order: { + with: { + orderStatus: true, + }, + }, + addedBy: true, + }, + orderBy: desc(userIncidents.dateAdded), + }) + } + + async createUserIncident(data: { userId: number; orderId?: number | null; adminComment?: string | null; addedBy: number; negativityScore?: number | null }): Promise { + const [incident] = await db.insert(userIncidents).values(data).returning() + return incident + } +} + +export const userDbService: IUserDbService = new UserDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/admin-apis/vendor-snippets-queries.ts b/apps/db-helper-postgres/src/dataAccessors/admin-apis/vendor-snippets-queries.ts new file mode 100644 index 0000000..df8af2e --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/admin-apis/vendor-snippets-queries.ts @@ -0,0 +1,132 @@ +import { db } from '../../db/db_index' +import { vendorSnippets, deliverySlotInfo, orders, orderItems, productInfo } from '../../db/schema' +import { eq, and, inArray, gt, asc, desc } from 'drizzle-orm' +import { IVendorSnippetDbService, VendorSnippet, NewVendorSnippet } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/vendor-snippet-db-service.interface' + +export class VendorSnippetDbService implements IVendorSnippetDbService { + async createSnippet(data: NewVendorSnippet): Promise { + const [snippet] = await db.insert(vendorSnippets).values(data).returning() + return snippet + } + + async getAllSnippets(): Promise { + return db.query.vendorSnippets.findMany({ + with: { slot: true }, + orderBy: desc(vendorSnippets.createdAt), + }) + } + + async getSnippetById(id: number): Promise { + return db.query.vendorSnippets.findFirst({ + where: eq(vendorSnippets.id, id), + with: { slot: true }, + }) + } + + async getSnippetByCode(code: string): Promise { + return db.query.vendorSnippets.findFirst({ + where: eq(vendorSnippets.snippetCode, code), + }) + } + + async updateSnippet(id: number, data: Partial): Promise { + const [snippet] = await db + .update(vendorSnippets) + .set(data) + .where(eq(vendorSnippets.id, id)) + .returning() + return snippet + } + + async deleteSnippet(id: number): Promise { + const [snippet] = await db + .delete(vendorSnippets) + .where(eq(vendorSnippets.id, id)) + .returning() + return snippet + } + + async checkSnippetCodeExists(code: string): Promise { + const existing = await db.query.vendorSnippets.findFirst({ + where: eq(vendorSnippets.snippetCode, code), + }) + return !!existing + } + + async getSlotById(id: number): Promise { + return db.query.deliverySlotInfo.findFirst({ + where: eq(deliverySlotInfo.id, id), + }) + } + + async getUpcomingSlots(since: Date): Promise { + return db.query.deliverySlotInfo.findMany({ + where: and( + eq(deliverySlotInfo.isActive, true), + gt(deliverySlotInfo.deliveryTime, since) + ), + orderBy: asc(deliverySlotInfo.deliveryTime), + }) + } + + async getProductsByIds(ids: number[]): Promise> { + return db.query.productInfo.findMany({ + where: inArray(productInfo.id, ids), + columns: { id: true, name: true }, + }) + } + + async validateProductsExist(ids: number[]): Promise { + const products = await db.query.productInfo.findMany({ + where: inArray(productInfo.id, ids), + }) + return products.length === ids.length + } + + async getOrdersBySlotId(slotId: number): Promise { + return db.query.orders.findMany({ + where: eq(orders.slotId, slotId), + with: { + orderItems: { + with: { + product: { + with: { unit: true }, + }, + }, + }, + orderStatus: true, + user: true, + slot: true, + }, + orderBy: desc(orders.createdAt), + }) + } + + async getOrderItemsByOrderIds(orderIds: number[]): Promise { + return db.query.orderItems.findMany({ + where: inArray(orderItems.orderId, orderIds), + }) + } + + async getOrderItemById(id: number): Promise { + return db.query.orderItems.findFirst({ + where: eq(orderItems.id, id), + }) + } + + async updateOrderItemPackaging(id: number, is_packaged: boolean): Promise { + await db + .update(orderItems) + .set({ is_packaged }) + .where(eq(orderItems.id, id)) + } + + async hasSnippetForSlot(slotId: number): Promise { + const snippet = await db.query.vendorSnippets.findFirst({ + where: eq(vendorSnippets.slotId, slotId), + }) + return !!snippet + } +} + +export const vendorSnippetDbService: IVendorSnippetDbService = new VendorSnippetDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/user-apis/user-address-queries.ts b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-address-queries.ts new file mode 100644 index 0000000..3a30b34 --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-address-queries.ts @@ -0,0 +1,71 @@ +import { db } from '../../db/db_index' +import { addresses, orders, orderStatus, deliverySlotInfo } from '../../db/schema' +import { eq, and, gte } from 'drizzle-orm' +import { IUserAddressDbService, Address, NewAddress } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-address-db-service.interface' + +export class UserAddressDbService implements IUserAddressDbService { + async getDefaultAddress(userId: number): Promise
{ + const [defaultAddress] = await db + .select() + .from(addresses) + .where(and(eq(addresses.userId, userId), eq(addresses.isDefault, true))) + .limit(1) + return defaultAddress + } + + async getUserAddresses(userId: number): Promise { + return db.select().from(addresses).where(eq(addresses.userId, userId)) + } + + async unsetDefaultForUser(userId: number): Promise { + await db.update(addresses).set({ isDefault: false }).where(eq(addresses.userId, userId)) + } + + async createAddress(data: NewAddress): Promise
{ + const [newAddress] = await db.insert(addresses).values(data).returning() + return newAddress + } + + async getAddressByIdForUser(addressId: number, userId: number): Promise
{ + const [address] = await db + .select() + .from(addresses) + .where(and(eq(addresses.id, addressId), eq(addresses.userId, userId))) + .limit(1) + return address + } + + async updateAddressForUser(addressId: number, userId: number, data: Partial): Promise
{ + const [updated] = await db + .update(addresses) + .set(data) + .where(and(eq(addresses.id, addressId), eq(addresses.userId, userId))) + .returning() + return updated + } + + async deleteAddressForUser(addressId: number, userId: number): Promise { + await db.delete(addresses).where(and(eq(addresses.id, addressId), eq(addresses.userId, userId))) + } + + async hasOngoingOrdersForAddress(addressId: number): Promise { + const ongoingOrders = await db + .select({ + orderId: orders.id, + }) + .from(orders) + .innerJoin(orderStatus, eq(orders.id, orderStatus.orderId)) + .innerJoin(deliverySlotInfo, eq(orders.slotId, deliverySlotInfo.id)) + .where( + and( + eq(orders.addressId, addressId), + eq(orderStatus.isCancelled, false), + gte(deliverySlotInfo.deliveryTime, new Date()) + ) + ) + .limit(1) + return ongoingOrders.length > 0 + } +} + +export const userAddressDbService: IUserAddressDbService = new UserAddressDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/user-apis/user-auth-queries.ts b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-auth-queries.ts new file mode 100644 index 0000000..8ccbc11 --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-auth-queries.ts @@ -0,0 +1,122 @@ +import { db } from '../../db/db_index' +import { users, userCreds, userDetails, addresses, cartItems, complaints, couponApplicableUsers, couponUsage, notifCreds, notifications, orderItems, orderStatus, orders, payments, refunds, productReviews, reservedCoupons } from '../../db/schema' +import { eq } from 'drizzle-orm' +import { IUserAuthDbService, User, UserCred, UserDetail } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-auth-db-service.interface' + +export class UserAuthDbService implements IUserAuthDbService { + async getUserByEmail(email: string): Promise { + const [user] = await db.select().from(users).where(eq(users.email, email)).limit(1) + return user + } + + async getUserByMobile(mobile: string): Promise { + const [user] = await db.select().from(users).where(eq(users.mobile, mobile)).limit(1) + return user + } + + async getUserById(userId: number): Promise { + const [user] = await db.select().from(users).where(eq(users.id, userId)).limit(1) + return user + } + + async getUserCredsByUserId(userId: number): Promise { + const [creds] = await db.select().from(userCreds).where(eq(userCreds.userId, userId)).limit(1) + return creds + } + + async getUserDetailsByUserId(userId: number): Promise { + const [detail] = await db.select().from(userDetails).where(eq(userDetails.userId, userId)).limit(1) + return detail + } + + async createUserWithCredsAndDetails(data: { name: string | null; email: string | null; mobile: string; passwordHash: string; imageKey?: string | null }): Promise { + const { name, email, mobile, passwordHash, imageKey } = data + return db.transaction(async (tx) => { + const [user] = await tx + .insert(users) + .values({ name, email, mobile }) + .returning() + + await tx + .insert(userCreds) + .values({ userId: user.id, userPassword: passwordHash }) + + if (imageKey) { + await tx.insert(userDetails).values({ userId: user.id, profileImage: imageKey }) + } + + return user + }) + } + + async createUser(data: { name: string | null; email: string | null; mobile: string }): Promise { + const [user] = await db.insert(users).values(data).returning() + return user + } + + async upsertUserCreds(userId: number, passwordHash: string): Promise { + await db + .insert(userCreds) + .values({ userId, userPassword: passwordHash }) + .onConflictDoUpdate({ + target: userCreds.userId, + set: { userPassword: passwordHash }, + }) + } + + async updateUserName(userId: number, name: string): Promise { + await db.update(users).set({ name }).where(eq(users.id, userId)) + } + + async updateUserEmail(userId: number, email: string): Promise { + await db.update(users).set({ email }).where(eq(users.id, userId)) + } + + async upsertUserDetails(userId: number, data: Partial): Promise { + await db + .insert(userDetails) + .values({ userId, ...data }) + .onConflictDoUpdate({ + target: userDetails.userId, + set: data, + }) + } + + async deleteAccountByUserId(userId: number): Promise { + await db.transaction(async (tx) => { + await tx.delete(notifCreds).where(eq(notifCreds.userId, userId)) + await tx.delete(couponApplicableUsers).where(eq(couponApplicableUsers.userId, userId)) + await tx.delete(couponUsage).where(eq(couponUsage.userId, userId)) + await tx.delete(complaints).where(eq(complaints.userId, userId)) + await tx.delete(cartItems).where(eq(cartItems.userId, userId)) + await tx.delete(notifications).where(eq(notifications.userId, userId)) + await tx.delete(productReviews).where(eq(productReviews.userId, userId)) + + await tx.update(reservedCoupons) + .set({ redeemedBy: null }) + .where(eq(reservedCoupons.redeemedBy, userId)) + + const userOrders = await tx + .select({ id: orders.id }) + .from(orders) + .where(eq(orders.userId, userId)) + + for (const order of userOrders) { + await tx.delete(orderItems).where(eq(orderItems.orderId, order.id)) + await tx.delete(orderStatus).where(eq(orderStatus.orderId, order.id)) + await tx.delete(payments).where(eq(payments.orderId, order.id)) + await tx.delete(refunds).where(eq(refunds.orderId, order.id)) + await tx.delete(couponUsage).where(eq(couponUsage.orderId, order.id)) + await tx.delete(complaints).where(eq(complaints.orderId, order.id)) + } + + await tx.delete(orders).where(eq(orders.userId, userId)) + await tx.delete(addresses).where(eq(addresses.userId, userId)) + await tx.delete(userDetails).where(eq(userDetails.userId, userId)) + await tx.delete(userCreds).where(eq(userCreds.userId, userId)) + await tx.delete(users).where(eq(users.id, userId)) + }) + } +} + +export const userAuthDbService: IUserAuthDbService = new UserAuthDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/user-apis/user-banner-queries.ts b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-banner-queries.ts new file mode 100644 index 0000000..553e841 --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-banner-queries.ts @@ -0,0 +1,15 @@ +import { db } from '../../db/db_index' +import { homeBanners } from '../../db/schema' +import { isNotNull, asc } from 'drizzle-orm' +import { IUserBannerDbService, UserBanner } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-banner-db-service.interface' + +export class UserBannerDbService implements IUserBannerDbService { + async getActiveBanners(): Promise { + return db.query.homeBanners.findMany({ + where: isNotNull(homeBanners.serialNum), + orderBy: asc(homeBanners.serialNum), + }) + } +} + +export const userBannerDbService: IUserBannerDbService = new UserBannerDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/user-apis/user-cart-queries.ts b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-cart-queries.ts new file mode 100644 index 0000000..267b13d --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-cart-queries.ts @@ -0,0 +1,75 @@ +import { db } from '../../db/db_index' +import { cartItems, productInfo, units } from '../../db/schema' +import { eq, and, sql } from 'drizzle-orm' +import { IUserCartDbService, CartItem } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-cart-db-service.interface' + +export class UserCartDbService implements IUserCartDbService { + async getCartItemsWithProducts(userId: number) { + return db + .select({ + cartId: cartItems.id, + productId: productInfo.id, + productName: productInfo.name, + productPrice: productInfo.price, + productImages: productInfo.images, + productQuantity: productInfo.productQuantity, + isOutOfStock: productInfo.isOutOfStock, + unitShortNotation: units.shortNotation, + quantity: cartItems.quantity, + addedAt: cartItems.addedAt, + }) + .from(cartItems) + .innerJoin(productInfo, eq(cartItems.productId, productInfo.id)) + .innerJoin(units, eq(productInfo.unitId, units.id)) + .where(eq(cartItems.userId, userId)) + } + + async getProductById(productId: number) { + return db.query.productInfo.findFirst({ + where: eq(productInfo.id, productId), + }) + } + + async getCartItemByUserAndProduct(userId: number, productId: number): Promise { + return db.query.cartItems.findFirst({ + where: and(eq(cartItems.userId, userId), eq(cartItems.productId, productId)), + }) + } + + async incrementCartItemQuantity(cartItemId: number, quantity: number): Promise { + await db.update(cartItems) + .set({ + quantity: sql`${cartItems.quantity} + ${quantity}`, + }) + .where(eq(cartItems.id, cartItemId)) + } + + async createCartItem(userId: number, productId: number, quantity: number): Promise { + await db.insert(cartItems).values({ + userId, + productId, + quantity: quantity.toString(), + }) + } + + async updateCartItemQuantity(itemId: number, userId: number, quantity: number): Promise { + const [updatedItem] = await db.update(cartItems) + .set({ quantity: quantity.toString() }) + .where(and(eq(cartItems.id, itemId), eq(cartItems.userId, userId))) + .returning() + return updatedItem + } + + async deleteCartItem(itemId: number, userId: number): Promise { + const [deletedItem] = await db.delete(cartItems) + .where(and(eq(cartItems.id, itemId), eq(cartItems.userId, userId))) + .returning() + return deletedItem + } + + async clearCart(userId: number): Promise { + await db.delete(cartItems).where(eq(cartItems.userId, userId)) + } +} + +export const userCartDbService: IUserCartDbService = new UserCartDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/user-apis/user-complaint-queries.ts b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-complaint-queries.ts new file mode 100644 index 0000000..a1f7157 --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-complaint-queries.ts @@ -0,0 +1,28 @@ +import { db } from '../../db/db_index' +import { complaints } from '../../db/schema' +import { eq, asc } from 'drizzle-orm' +import { IUserComplaintDbService } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-complaint-db-service.interface' + +export class UserComplaintDbService implements IUserComplaintDbService { + async getComplaintsByUserId(userId: number) { + return db + .select({ + id: complaints.id, + complaintBody: complaints.complaintBody, + response: complaints.response, + isResolved: complaints.isResolved, + createdAt: complaints.createdAt, + orderId: complaints.orderId, + images: complaints.images, + }) + .from(complaints) + .where(eq(complaints.userId, userId)) + .orderBy(asc(complaints.createdAt)) + } + + async createComplaint(data: { userId: number; orderId?: number | null; complaintBody: string; images: string[] }) { + await db.insert(complaints).values(data) + } +} + +export const userComplaintDbService: IUserComplaintDbService = new UserComplaintDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/user-apis/user-coupon-queries.ts b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-coupon-queries.ts new file mode 100644 index 0000000..6d1c665 --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-coupon-queries.ts @@ -0,0 +1,88 @@ +import { db } from '../../db/db_index' +import { coupons, couponUsage, couponApplicableUsers, couponApplicableProducts, reservedCoupons } from '../../db/schema' +import { eq, and, or, gt, isNull } from 'drizzle-orm' +import { IUserCouponDbService, Coupon, ReservedCoupon, CouponWithRelations } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-coupon-db-service.interface' + +export class UserCouponDbService implements IUserCouponDbService { + async getActiveCouponsForUser(userId: number): Promise { + return db.query.coupons.findMany({ + where: and( + eq(coupons.isInvalidated, false), + or( + isNull(coupons.validTill), + gt(coupons.validTill, new Date()) + ) + ), + with: { + usages: { + where: eq(couponUsage.userId, userId), + }, + applicableUsers: { + with: { user: true }, + }, + applicableProducts: { + with: { product: true }, + }, + }, + }) as Promise + } + + async getAllCouponsForUser(userId: number): Promise { + return db.query.coupons.findMany({ + with: { + usages: { + where: eq(couponUsage.userId, userId), + }, + applicableUsers: { + with: { user: true }, + }, + applicableProducts: { + with: { product: true }, + }, + }, + }) as Promise + } + + async getReservedCouponBySecretCode(secretCode: string): Promise { + return db.query.reservedCoupons.findFirst({ + where: and( + eq(reservedCoupons.secretCode, secretCode.toUpperCase()), + eq(reservedCoupons.isRedeemed, false) + ), + }) + } + + async redeemReservedCoupon(userId: number, reservedCoupon: ReservedCoupon): Promise { + return db.transaction(async (tx) => { + const [coupon] = await tx.insert(coupons).values({ + couponCode: reservedCoupon.couponCode, + isUserBased: true, + discountPercent: reservedCoupon.discountPercent, + flatDiscount: reservedCoupon.flatDiscount, + minOrder: reservedCoupon.minOrder, + productIds: reservedCoupon.productIds, + maxValue: reservedCoupon.maxValue, + isApplyForAll: false, + validTill: reservedCoupon.validTill, + maxLimitForUser: reservedCoupon.maxLimitForUser, + exclusiveApply: reservedCoupon.exclusiveApply, + createdBy: reservedCoupon.createdBy, + }).returning() + + await tx.insert(couponApplicableUsers).values({ + couponId: coupon.id, + userId, + }) + + await tx.update(reservedCoupons).set({ + isRedeemed: true, + redeemedBy: userId, + redeemedAt: new Date(), + }).where(eq(reservedCoupons.id, reservedCoupon.id)) + + return coupon + }) + } +} + +export const userCouponDbService: IUserCouponDbService = new UserCouponDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/user-apis/user-order-queries.ts b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-order-queries.ts new file mode 100644 index 0000000..64463a8 --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-order-queries.ts @@ -0,0 +1,265 @@ +import { db } from '../../db/db_index' +import { + orders, + orderItems, + orderStatus, + addresses, + productInfo, + paymentInfoTable, + coupons, + couponUsage, + cartItems, + refunds, + units, + userDetails, +} from '../../db/schema' +import { and, desc, eq, gte, inArray } from 'drizzle-orm' +import { + IUserOrderDbService, + Order, +} from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-order-db-service.interface' + +export class UserOrderDbService implements IUserOrderDbService { + async getUserDetailByUserId(userId: number) { + return db.query.userDetails.findFirst({ + where: eq(userDetails.userId, userId), + }) + } + + async getAddressByUserId(userId: number, addressId: number) { + return db.query.addresses.findFirst({ + where: and(eq(addresses.userId, userId), eq(addresses.id, addressId)), + }) + } + + async getProductById(productId: number) { + return db.query.productInfo.findFirst({ + where: eq(productInfo.id, productId), + }) + } + + async getCouponWithUsage(couponId: number, userId: number) { + return db.query.coupons.findFirst({ + where: eq(coupons.id, couponId), + with: { + usages: { where: eq(couponUsage.userId, userId) }, + }, + }) + } + + async createOrdersWithItems(params: { + ordersData: Array<{ + order: Omit + orderItems: Omit[] + orderStatus: Omit + }> + paymentMethod: 'online' | 'cod' + }): Promise { + const { ordersData, paymentMethod } = params + return db.transaction(async (tx) => { + let sharedPaymentInfoId: number | null = null + if (paymentMethod === 'online') { + const [paymentInfo] = await tx + .insert(paymentInfoTable) + .values({ + status: 'pending', + gateway: 'razorpay', + merchantOrderId: `multi_order_${Date.now()}`, + }) + .returning() + sharedPaymentInfoId = paymentInfo.id + } + + const ordersToInsert: Omit[] = ordersData.map( + (od) => ({ + ...od.order, + paymentInfoId: sharedPaymentInfoId, + }) + ) + + const insertedOrders = await tx.insert(orders).values(ordersToInsert).returning() + + const allOrderItems: Omit[] = [] + const allOrderStatuses: Omit[] = [] + + insertedOrders.forEach((order, index) => { + const od = ordersData[index] + od.orderItems.forEach((item) => { + allOrderItems.push({ ...item, orderId: order.id as number }) + }) + allOrderStatuses.push({ + ...od.orderStatus, + orderId: order.id as number, + }) + }) + + await tx.insert(orderItems).values(allOrderItems) + await tx.insert(orderStatus).values(allOrderStatuses) + + return insertedOrders + }) + } + + async deleteCartItemsByUserAndProductIds(userId: number, productIds: number[]) { + await db.delete(cartItems).where( + and(eq(cartItems.userId, userId), inArray(cartItems.productId, productIds)) + ) + } + + async createCouponUsage(params: { userId: number; couponId: number; orderId: number }) { + const { userId, couponId, orderId } = params + await db.insert(couponUsage).values({ + userId, + couponId, + orderId, + orderItemId: null, + usedAt: new Date(), + }) + } + + async getOrdersCount(userId: number) { + return db.$count(orders, eq(orders.userId, userId)) + } + + async getOrdersWithRelations(userId: number, limit: number, offset: number) { + return db.query.orders.findMany({ + where: eq(orders.userId, userId), + with: { + orderItems: { + with: { + product: true, + }, + }, + slot: true, + paymentInfo: true, + orderStatus: true, + refunds: true, + }, + orderBy: (ordersRef, { desc }) => [desc(ordersRef.createdAt)], + limit, + offset, + }) + } + + async getOrderWithDetailsById(orderId: number, userId: number) { + return db.query.orders.findFirst({ + where: and(eq(orders.id, orderId), eq(orders.userId, userId)), + with: { + orderItems: { + with: { + product: true, + }, + }, + slot: true, + paymentInfo: true, + orderStatus: { + with: { + refundCoupon: true, + }, + }, + refunds: true, + }, + }) + } + + async getCouponUsagesByOrderId(orderId: number) { + return db.query.couponUsage.findMany({ + where: eq(couponUsage.orderId, orderId), + with: { + coupon: true, + }, + }) + } + + async getOrderWithStatus(orderId: number) { + return db.query.orders.findFirst({ + where: eq(orders.id, orderId), + with: { + orderStatus: true, + }, + }) + } + + async cancelOrderTransaction(params: { + statusId: number + reason: string + orderId: number + refundStatus: string + }) { + const { statusId, reason, orderId, refundStatus } = params + await db.transaction(async (tx) => { + await tx + .update(orderStatus) + .set({ + isCancelled: true, + cancelReason: reason, + cancellationUserNotes: reason, + cancellationReviewed: false, + }) + .where(eq(orderStatus.id, statusId)) + + await tx.insert(refunds).values({ + orderId, + refundStatus, + }) + }) + } + + async updateOrderNotes(orderId: number, userNotes: string | null) { + await db + .update(orders) + .set({ + userNotes, + }) + .where(eq(orders.id, orderId)) + } + + async getRecentDeliveredOrderIds(userId: number, since: Date, limit: number) { + return db + .select({ id: orders.id }) + .from(orders) + .innerJoin(orderStatus, eq(orders.id, orderStatus.orderId)) + .where( + and( + eq(orders.userId, userId), + eq(orderStatus.isDelivered, true), + gte(orders.createdAt, since) + ) + ) + .orderBy(desc(orders.createdAt)) + .limit(limit) + } + + async getProductIdsByOrderIds(orderIds: number[]) { + return db + .select({ productId: orderItems.productId }) + .from(orderItems) + .where(inArray(orderItems.orderId, orderIds)) + } + + async getProductsWithUnitsByIds(productIds: number[], limit: number) { + return db + .select({ + id: productInfo.id, + name: productInfo.name, + shortDescription: productInfo.shortDescription, + price: productInfo.price, + images: productInfo.images, + isOutOfStock: productInfo.isOutOfStock, + unitShortNotation: units.shortNotation, + incrementStep: productInfo.incrementStep, + }) + .from(productInfo) + .innerJoin(units, eq(productInfo.unitId, units.id)) + .where( + and( + inArray(productInfo.id, productIds), + eq(productInfo.isSuspended, false) + ) + ) + .orderBy(desc(productInfo.createdAt)) + .limit(limit) + } +} + +export const userOrderDbService: IUserOrderDbService = new UserOrderDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/user-apis/user-product-queries.ts b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-product-queries.ts new file mode 100644 index 0000000..369d4fa --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-product-queries.ts @@ -0,0 +1,109 @@ +import { db } from '../../db/db_index' +import { productInfo, units, storeInfo, productSlots, deliverySlotInfo, specialDeals, productReviews, users } from '../../db/schema' +import { eq, and, gt, sql, desc } from 'drizzle-orm' +import { IUserProductDbService, Review } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-product-db-service.interface' + +export class UserProductDbService implements IUserProductDbService { + async getProductById(productId: number) { + const result = await db + .select({ + id: productInfo.id, + name: productInfo.name, + shortDescription: productInfo.shortDescription, + longDescription: productInfo.longDescription, + price: productInfo.price, + marketPrice: productInfo.marketPrice, + images: productInfo.images, + isOutOfStock: productInfo.isOutOfStock, + storeId: productInfo.storeId, + unitShortNotation: units.shortNotation, + incrementStep: productInfo.incrementStep, + productQuantity: productInfo.productQuantity, + isFlashAvailable: productInfo.isFlashAvailable, + flashPrice: productInfo.flashPrice, + }) + .from(productInfo) + .innerJoin(units, eq(productInfo.unitId, units.id)) + .where(eq(productInfo.id, productId)) + .limit(1) + return result[0] + } + + async getStoreBasicById(storeId: number) { + return db.query.storeInfo.findFirst({ + where: eq(storeInfo.id, storeId), + columns: { id: true, name: true, description: true }, + }) + } + + async getDeliverySlotsForProduct(productId: number) { + return db + .select({ + id: deliverySlotInfo.id, + deliveryTime: deliverySlotInfo.deliveryTime, + freezeTime: deliverySlotInfo.freezeTime, + }) + .from(productSlots) + .innerJoin(deliverySlotInfo, eq(productSlots.slotId, deliverySlotInfo.id)) + .where( + and( + eq(productSlots.productId, productId), + eq(deliverySlotInfo.isActive, true), + eq(deliverySlotInfo.isCapacityFull, false), + gt(deliverySlotInfo.deliveryTime, sql`NOW()`), + gt(deliverySlotInfo.freezeTime, sql`NOW()`) + ) + ) + .orderBy(deliverySlotInfo.deliveryTime) + } + + async getSpecialDealsForProduct(productId: number) { + return db + .select({ + quantity: specialDeals.quantity, + price: specialDeals.price, + validTill: specialDeals.validTill, + }) + .from(specialDeals) + .where( + and( + eq(specialDeals.productId, productId), + gt(specialDeals.validTill, sql`NOW()`) + ) + ) + .orderBy(specialDeals.quantity) + } + + async getProductReviews(productId: number, limit: number, offset: number) { + return db + .select({ + id: productReviews.id, + reviewBody: productReviews.reviewBody, + ratings: productReviews.ratings, + imageUrls: productReviews.imageUrls, + reviewTime: productReviews.reviewTime, + userName: users.name, + }) + .from(productReviews) + .innerJoin(users, eq(productReviews.userId, users.id)) + .where(eq(productReviews.productId, productId)) + .orderBy(desc(productReviews.reviewTime)) + .limit(limit) + .offset(offset) + } + + async getReviewCount(productId: number): Promise { + const result = await db + .select({ count: sql`count(*)` }) + .from(productReviews) + .where(eq(productReviews.productId, productId)) + return Number(result[0].count) + } + + async createReview(data: { userId: number; productId: number; reviewBody: string; ratings: number; imageUrls: string[] }): Promise { + const [newReview] = await db.insert(productReviews).values(data).returning() + return newReview + } +} + +export const userProductDbService: IUserProductDbService = new UserProductDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/user-apis/user-profile-queries.ts b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-profile-queries.ts new file mode 100644 index 0000000..4a0cd8b --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-profile-queries.ts @@ -0,0 +1,74 @@ +import { db } from '../../db/db_index' +import { users, userDetails, userCreds, notifCreds, unloggedUserTokens } from '../../db/schema' +import { eq, and } from 'drizzle-orm' +import { IUserProfileDbService, User, UserDetail, UserCred, NotifCred, UnloggedToken } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-profile-db-service.interface' + +export class UserProfileDbService implements IUserProfileDbService { + async getUserById(userId: number): Promise { + const [user] = await db.select().from(users).where(eq(users.id, userId)).limit(1) + return user + } + + async getUserDetailByUserId(userId: number): Promise { + const [detail] = await db.select().from(userDetails).where(eq(userDetails.userId, userId)).limit(1) + return detail + } + + async getUserWithCreds(userId: number): Promise<{ user: User; creds: UserCred | null } | undefined> { + const result = await db + .select() + .from(users) + .leftJoin(userCreds, eq(users.id, userCreds.userId)) + .where(eq(users.id, userId)) + .limit(1) + + if (result.length === 0) return undefined + + const row = result[0] as any + return { + user: row.users, + creds: row.user_creds || null, + } + } + + async getNotifCredByUserAndToken(userId: number, token: string): Promise { + return db.query.notifCreds.findFirst({ + where: and(eq(notifCreds.userId, userId), eq(notifCreds.token, token)), + }) + } + + async updateNotifCredLastVerified(id: number): Promise { + await db.update(notifCreds).set({ lastVerified: new Date() }).where(eq(notifCreds.id, id)) + } + + async insertNotifCred(userId: number, token: string): Promise { + await db.insert(notifCreds).values({ + userId, + token, + lastVerified: new Date(), + }) + } + + async deleteUnloggedToken(token: string): Promise { + await db.delete(unloggedUserTokens).where(eq(unloggedUserTokens.token, token)) + } + + async getUnloggedToken(token: string): Promise { + return db.query.unloggedUserTokens.findFirst({ + where: eq(unloggedUserTokens.token, token), + }) + } + + async updateUnloggedTokenLastVerified(id: number): Promise { + await db.update(unloggedUserTokens).set({ lastVerified: new Date() }).where(eq(unloggedUserTokens.id, id)) + } + + async insertUnloggedToken(token: string): Promise { + await db.insert(unloggedUserTokens).values({ + token, + lastVerified: new Date(), + }) + } +} + +export const userProfileDbService: IUserProfileDbService = new UserProfileDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/user-apis/user-slot-queries.ts b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-slot-queries.ts new file mode 100644 index 0000000..cca1c1a --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-slot-queries.ts @@ -0,0 +1,26 @@ +import { db } from '../../db/db_index' +import { deliverySlotInfo, productInfo } from '../../db/schema' +import { eq } from 'drizzle-orm' +import { IUserSlotDbService, Slot } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-slot-db-service.interface' + +export class UserSlotDbService implements IUserSlotDbService { + async getActiveSlots(): Promise { + return db.query.deliverySlotInfo.findMany({ + where: eq(deliverySlotInfo.isActive, true), + }) + } + + async getProductAvailability(): Promise> { + return db + .select({ + id: productInfo.id, + name: productInfo.name, + isOutOfStock: productInfo.isOutOfStock, + isFlashAvailable: productInfo.isFlashAvailable, + }) + .from(productInfo) + .where(eq(productInfo.isSuspended, false)) + } +} + +export const userSlotDbService: IUserSlotDbService = new UserSlotDbService() diff --git a/apps/db-helper-postgres/src/dataAccessors/user-apis/user-store-queries.ts b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-store-queries.ts new file mode 100644 index 0000000..3ab67e5 --- /dev/null +++ b/apps/db-helper-postgres/src/dataAccessors/user-apis/user-store-queries.ts @@ -0,0 +1,69 @@ +import { db } from '../../db/db_index' +import { storeInfo, productInfo, units } from '../../db/schema' +import { eq, and, sql } from 'drizzle-orm' +import { IUserStoreDbService } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-store-db-service.interface' + +export class UserStoreDbService implements IUserStoreDbService { + async getStoresWithProductCount(): Promise> { + return db + .select({ + id: storeInfo.id, + name: storeInfo.name, + description: storeInfo.description, + imageUrl: storeInfo.imageUrl, + productCount: sql`count(${productInfo.id})`.as('productCount'), + }) + .from(storeInfo) + .leftJoin( + productInfo, + and(eq(productInfo.storeId, storeInfo.id), eq(productInfo.isSuspended, false)) + ) + .groupBy(storeInfo.id) + } + + async getStoreById(storeId: number) { + return db.query.storeInfo.findFirst({ + where: eq(storeInfo.id, storeId), + columns: { + id: true, + name: true, + description: true, + imageUrl: true, + }, + }) + } + + async getSampleProductsByStoreId(storeId: number, limit: number) { + return db + .select({ + id: productInfo.id, + name: productInfo.name, + images: productInfo.images, + }) + .from(productInfo) + .where(and(eq(productInfo.storeId, storeId), eq(productInfo.isSuspended, false))) + .limit(limit) + } + + async getStoreProductsWithUnits(storeId: number) { + return db + .select({ + id: productInfo.id, + name: productInfo.name, + shortDescription: productInfo.shortDescription, + price: productInfo.price, + marketPrice: productInfo.marketPrice, + images: productInfo.images, + isOutOfStock: productInfo.isOutOfStock, + incrementStep: productInfo.incrementStep, + unitShortNotation: units.shortNotation, + unitNotation: units.shortNotation, + productQuantity: productInfo.productQuantity, + }) + .from(productInfo) + .innerJoin(units, eq(productInfo.unitId, units.id)) + .where(and(eq(productInfo.storeId, storeId), eq(productInfo.isSuspended, false))) + } +} + +export const userStoreDbService: IUserStoreDbService = new UserStoreDbService() diff --git a/apps/db-helper-postgres/src/db/db_index.ts b/apps/db-helper-postgres/src/db/db_index.ts new file mode 100644 index 0000000..5845263 --- /dev/null +++ b/apps/db-helper-postgres/src/db/db_index.ts @@ -0,0 +1,10 @@ +import { drizzle } from 'drizzle-orm/node-postgres' +import * as schema from './schema' + +const db = drizzle({ + connection: process.env.DATABASE_URL!, + casing: 'snake_case', + schema, +}) + +export { db } diff --git a/apps/backend/src/db/porter.ts b/apps/db-helper-postgres/src/db/porter.ts similarity index 98% rename from apps/backend/src/db/porter.ts rename to apps/db-helper-postgres/src/db/porter.ts index 4173d6f..8ea1a5d 100644 --- a/apps/backend/src/db/porter.ts +++ b/apps/db-helper-postgres/src/db/porter.ts @@ -2,13 +2,13 @@ * This was a one time script to change the composition of the signed urls */ -import { db } from '@/src/db/db_index' +import { db } from './db_index' import { userDetails, productInfo, productTagInfo, complaints -} from '@/src/db/schema'; +} from './schema'; import { eq, not, isNull } from 'drizzle-orm'; const S3_DOMAIN = 'https://s3.sgp.io.cloud.ovh.net'; diff --git a/apps/db-helper-postgres/src/db/schema.ts b/apps/db-helper-postgres/src/db/schema.ts new file mode 100644 index 0000000..939e04d --- /dev/null +++ b/apps/db-helper-postgres/src/db/schema.ts @@ -0,0 +1,706 @@ +import { pgTable, pgSchema, integer, varchar, date, boolean, timestamp, numeric, jsonb, pgEnum, unique, real, text, check, decimal } from "drizzle-orm/pg-core"; +import { relations, sql } from "drizzle-orm"; + +const mf = pgSchema('mf'); + + + +export const users = mf.table('users', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + name: varchar({ length: 255 }), + email: varchar({ length: 255 }), + mobile: varchar({ length: 255 }), + createdAt: timestamp('created_at').notNull().defaultNow(), +}, (t) => ({ + unq_email: unique('unique_email').on(t.email), +})); + +export const userDetails = mf.table('user_details', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + userId: integer('user_id').notNull().references(() => users.id).unique(), + bio: varchar('bio', { length: 500 }), + dateOfBirth: date('date_of_birth'), + gender: varchar('gender', { length: 20 }), + occupation: varchar('occupation', { length: 100 }), + profileImage: varchar('profile_image', { length: 500 }), + isSuspended: boolean('is_suspended').notNull().default(false), + createdAt: timestamp('created_at').notNull().defaultNow(), + updatedAt: timestamp('updated_at').notNull().defaultNow(), +}); + +export const userCreds = mf.table('user_creds', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + userId: integer('user_id').notNull().references(() => users.id), + userPassword: varchar('user_password', { length: 255 }).notNull(), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); + +export const addresses = mf.table('addresses', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + userId: integer('user_id').notNull().references(() => users.id), + name: varchar('name', { length: 255 }).notNull(), + phone: varchar('phone', { length: 15 }).notNull(), + addressLine1: varchar('address_line1', { length: 255 }).notNull(), + addressLine2: varchar('address_line2', { length: 255 }), + city: varchar('city', { length: 100 }).notNull(), + state: varchar('state', { length: 100 }).notNull(), + pincode: varchar('pincode', { length: 10 }).notNull(), + isDefault: boolean('is_default').notNull().default(false), + latitude: real('latitude'), + longitude: real('longitude'), + googleMapsUrl: varchar('google_maps_url', { length: 500 }), + adminLatitude: real('admin_latitude'), + adminLongitude: real('admin_longitude'), + zoneId: integer('zone_id').references(() => addressZones.id), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); + +export const addressZones = mf.table('address_zones', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + zoneName: varchar('zone_name', { length: 255 }).notNull(), + addedAt: timestamp('added_at').notNull().defaultNow(), +}); + +export const addressAreas = mf.table('address_areas', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + placeName: varchar('place_name', { length: 255 }).notNull(), + zoneId: integer('zone_id').references(() => addressZones.id), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); + +export const staffUsers = mf.table('staff_users', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + name: varchar({ length: 255 }).notNull(), + password: varchar({ length: 255 }).notNull(), + staffRoleId: integer('staff_role_id').references(() => staffRoles.id), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); + +export const storeInfo = mf.table('store_info', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + name: varchar({ length: 255 }).notNull(), + description: varchar({ length: 500 }), + imageUrl: varchar('image_url', { length: 500 }), + createdAt: timestamp('created_at').notNull().defaultNow(), + owner: integer('owner').notNull().references(() => staffUsers.id), +}); + +export const units = mf.table('units', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + shortNotation: varchar('short_notation', { length: 50 }).notNull(), + fullName: varchar('full_name', { length: 100 }).notNull(), +}, (t) => ({ + unq_short_notation: unique('unique_short_notation').on(t.shortNotation), +})); + +export const productAvailabilityActionEnum = pgEnum('product_availability_action', ['in', 'out']); + +export const productInfo = mf.table('product_info', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + name: varchar({ length: 255 }).notNull(), + shortDescription: varchar('short_description', { length: 500 }), + longDescription: varchar('long_description', { length: 1000 }), + unitId: integer('unit_id').notNull().references(() => units.id), + price: numeric({ precision: 10, scale: 2 }).notNull(), + marketPrice: numeric('market_price', { precision: 10, scale: 2 }), + images: jsonb('images'), + isOutOfStock: boolean('is_out_of_stock').notNull().default(false), + isSuspended: boolean('is_suspended').notNull().default(false), + isFlashAvailable: boolean('is_flash_available').notNull().default(false), + flashPrice: numeric('flash_price', { precision: 10, scale: 2 }), + createdAt: timestamp('created_at').notNull().defaultNow(), + incrementStep: real('increment_step').notNull().default(1), + productQuantity: real('product_quantity').notNull().default(1), + storeId: integer('store_id').references(() => storeInfo.id), + scheduledAvailability: boolean('scheduled_availability').notNull().default(true), +}); + +export const productAvailabilitySchedules = mf.table('product_availability_schedules', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + time: varchar('time', { length: 10 }).notNull(), + scheduleName: varchar('schedule_name', { length: 255 }).notNull().unique(), + action: productAvailabilityActionEnum('action').notNull(), + productIds: integer('product_ids').array().notNull().default([]), + groupIds: integer('group_ids').array().notNull().default([]), + createdAt: timestamp('created_at').notNull().defaultNow(), + lastUpdated: timestamp('last_updated').notNull().defaultNow(), +}); + +export const productGroupInfo = mf.table('product_group_info', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + groupName: varchar('group_name', { length: 255 }).notNull(), + description: varchar({ length: 500 }), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); + +export const productGroupMembership = mf.table('product_group_membership', { + productId: integer('product_id').notNull().references(() => productInfo.id), + groupId: integer('group_id').notNull().references(() => productGroupInfo.id), + addedAt: timestamp('added_at').notNull().defaultNow(), +}, (t) => ({ + pk: unique('product_group_membership_pk').on(t.productId, t.groupId), +})); + +export const homeBanners = mf.table('home_banners', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + name: varchar('name', { length: 255 }).notNull(), + imageUrl: varchar('image_url', { length: 500 }).notNull(), + description: varchar('description', { length: 500 }), + productIds: integer('product_ids').array(), + redirectUrl: varchar('redirect_url', { length: 500 }), + serialNum: integer('serial_num'), + isActive: boolean('is_active').notNull().default(false), + createdAt: timestamp('created_at').notNull().defaultNow(), + lastUpdated: timestamp('last_updated').notNull().defaultNow(), +}); + +export const productReviews = mf.table('product_reviews', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + userId: integer('user_id').notNull().references(() => users.id), + productId: integer('product_id').notNull().references(() => productInfo.id), + reviewBody: text('review_body').notNull(), + imageUrls: jsonb('image_urls').$defaultFn(() => []), + reviewTime: timestamp('review_time').notNull().defaultNow(), + ratings: real('ratings').notNull(), + adminResponse: text('admin_response'), + adminResponseImages: jsonb('admin_response_images').$defaultFn(() => []), +}, (t) => ({ + ratingCheck: check('rating_check', sql`${t.ratings} >= 1 AND ${t.ratings} <= 5`), +})); + +export const uploadStatusEnum = pgEnum('upload_status', ['pending', 'claimed']); + +export const staffRoleEnum = pgEnum('staff_role', ['super_admin', 'admin', 'marketer', 'delivery_staff']); + +export const staffPermissionEnum = pgEnum('staff_permission', ['crud_product', 'make_coupon', 'crud_staff_users']); + +export const uploadUrlStatus = mf.table('upload_url_status', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + createdAt: timestamp('created_at').notNull().defaultNow(), + key: varchar('key', { length: 500 }).notNull(), + status: uploadStatusEnum('status').notNull().default('pending'), +}); + +export const productTagInfo = mf.table('product_tag_info', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + tagName: varchar('tag_name', { length: 100 }).notNull().unique(), + tagDescription: varchar('tag_description', { length: 500 }), + imageUrl: varchar('image_url', { length: 500 }), + isDashboardTag: boolean('is_dashboard_tag').notNull().default(false), + relatedStores: jsonb('related_stores').$defaultFn(() => []), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); + +export const productTags = mf.table('product_tags', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + productId: integer('product_id').notNull().references(() => productInfo.id), + tagId: integer('tag_id').notNull().references(() => productTagInfo.id), + assignedAt: timestamp('assigned_at').notNull().defaultNow(), +}, (t) => ({ + unq_product_tag: unique('unique_product_tag').on(t.productId, t.tagId), +})); + +export const deliverySlotInfo = mf.table('delivery_slot_info', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + deliveryTime: timestamp('delivery_time').notNull(), + freezeTime: timestamp('freeze_time').notNull(), + isActive: boolean('is_active').notNull().default(true), + isFlash: boolean('is_flash').notNull().default(false), + isCapacityFull: boolean('is_capacity_full').notNull().default(false), + deliverySequence: jsonb('delivery_sequence').$defaultFn(() => {}), + groupIds: jsonb('group_ids').$defaultFn(() => []), +}); + +export const vendorSnippets = mf.table('vendor_snippets', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + snippetCode: varchar('snippet_code', { length: 255 }).notNull().unique(), + slotId: integer('slot_id').references(() => deliverySlotInfo.id), + isPermanent: boolean('is_permanent').notNull().default(false), + productIds: integer('product_ids').array().notNull(), + validTill: timestamp('valid_till'), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); + +export const vendorSnippetsRelations = relations(vendorSnippets, ({ one }) => ({ + slot: one(deliverySlotInfo, { fields: [vendorSnippets.slotId], references: [deliverySlotInfo.id] }), +})); + +export const productSlots = mf.table('product_slots', { + productId: integer('product_id').notNull().references(() => productInfo.id), + slotId: integer('slot_id').notNull().references(() => deliverySlotInfo.id), +}, (t) => ({ + pk: unique('product_slot_pk').on(t.productId, t.slotId), +})); + +export const specialDeals = mf.table('special_deals', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + productId: integer('product_id').notNull().references(() => productInfo.id), + quantity: numeric({ precision: 10, scale: 2 }).notNull(), + price: numeric({ precision: 10, scale: 2 }).notNull(), + validTill: timestamp('valid_till').notNull(), +}); + +export const orders = mf.table('orders', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + userId: integer('user_id').notNull().references(() => users.id), + addressId: integer('address_id').notNull().references(() => addresses.id), + slotId: integer('slot_id').references(() => deliverySlotInfo.id), + isCod: boolean('is_cod').notNull().default(false), + isOnlinePayment: boolean('is_online_payment').notNull().default(false), + paymentInfoId: integer('payment_info_id').references(() => paymentInfoTable.id), + totalAmount: numeric('total_amount', { precision: 10, scale: 2 }).notNull(), + deliveryCharge: numeric('delivery_charge', { precision: 10, scale: 2 }).notNull().default('0'), + readableId: integer('readable_id').notNull(), + adminNotes: text('admin_notes'), + userNotes: text('user_notes'), + orderGroupId: varchar('order_group_id', { length: 255 }), + orderGroupProportion: decimal('order_group_proportion', { precision: 10, scale: 4 }), + isFlashDelivery: boolean('is_flash_delivery').notNull().default(false), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); + +export const orderItems = mf.table('order_items', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + orderId: integer('order_id').notNull().references(() => orders.id), + productId: integer('product_id').notNull().references(() => productInfo.id), + quantity: varchar('quantity', { length: 50 }).notNull(), + price: numeric({ precision: 10, scale: 2 }).notNull(), + discountedPrice: numeric('discounted_price', { precision: 10, scale: 2 }), + is_packaged: boolean('is_packaged').notNull().default(false), + is_package_verified: boolean('is_package_verified').notNull().default(false), +}); + +export const paymentStatusEnum = pgEnum('payment_status', ['pending', 'success', 'cod', 'failed']); + +export const orderStatus = mf.table('order_status', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + orderTime: timestamp('order_time').notNull().defaultNow(), + userId: integer('user_id').notNull().references(() => users.id), + orderId: integer('order_id').notNull().references(() => orders.id), + isPackaged: boolean('is_packaged').notNull().default(false), + isDelivered: boolean('is_delivered').notNull().default(false), + isCancelled: boolean('is_cancelled').notNull().default(false), + cancelReason: varchar('cancel_reason', { length: 255 }), + isCancelledByAdmin: boolean('is_cancelled_by_admin'), + paymentStatus: paymentStatusEnum('payment_state').notNull().default('pending'), + cancellationUserNotes: text('cancellation_user_notes'), + cancellationAdminNotes: text('cancellation_admin_notes'), + cancellationReviewed: boolean('cancellation_reviewed').notNull().default(false), + cancellationReviewedAt: timestamp('cancellation_reviewed_at'), + refundCouponId: integer('refund_coupon_id').references(() => coupons.id), +}); + +export const paymentInfoTable = mf.table('payment_info', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + status: varchar({ length: 50 }).notNull(), + gateway: varchar({ length: 50 }).notNull(), + orderId: varchar('order_id', { length: 500 }), + token: varchar({ length: 500 }), + merchantOrderId: varchar('merchant_order_id', { length: 255 }).notNull().unique(), + payload: jsonb('payload'), +}); + +export const payments = mf.table('payments', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + status: varchar({ length: 50 }).notNull(), + gateway: varchar({ length: 50 }).notNull(), + orderId: integer('order_id').notNull().references(() => orders.id), + token: varchar({ length: 500 }), + merchantOrderId: varchar('merchant_order_id', { length: 255 }).notNull().unique(), + payload: jsonb('payload'), +}); + +export const refunds = mf.table('refunds', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + orderId: integer('order_id').notNull().references(() => orders.id), + refundAmount: numeric('refund_amount', { precision: 10, scale: 2 }), + refundStatus: varchar('refund_status', { length: 50 }).default('none'), + merchantRefundId: varchar('merchant_refund_id', { length: 255 }), + refundProcessedAt: timestamp('refund_processed_at'), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); + +export const keyValStore = mf.table('key_val_store', { + key: varchar('key', { length: 255 }).primaryKey(), + value: jsonb('value'), +}); + +export const notifications = mf.table('notifications', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + userId: integer('user_id').notNull().references(() => users.id), + title: varchar({ length: 255 }).notNull(), + body: varchar({ length: 512 }).notNull(), + type: varchar({ length: 50 }), + isRead: boolean('is_read').notNull().default(false), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); + +export const productCategories = mf.table('product_categories', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + name: varchar({ length: 255 }).notNull(), + description: varchar({ length: 500 }), +}); + +export const cartItems = mf.table('cart_items', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + userId: integer('user_id').notNull().references(() => users.id), + productId: integer('product_id').notNull().references(() => productInfo.id), + quantity: numeric({ precision: 10, scale: 2 }).notNull(), + addedAt: timestamp('added_at').notNull().defaultNow(), +}, (t) => ({ + unq_user_product: unique('unique_user_product').on(t.userId, t.productId), +})); + +export const complaints = mf.table('complaints', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + userId: integer('user_id').notNull().references(() => users.id), + orderId: integer('order_id').references(() => orders.id), + complaintBody: varchar('complaint_body', { length: 1000 }).notNull(), + images: jsonb('images'), + response: varchar('response', { length: 1000 }), + isResolved: boolean('is_resolved').notNull().default(false), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); + +export const coupons = mf.table('coupons', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + couponCode: varchar('coupon_code', { length: 50 }).notNull().unique('unique_coupon_code'), + isUserBased: boolean('is_user_based').notNull().default(false), + discountPercent: numeric('discount_percent', { precision: 5, scale: 2 }), + flatDiscount: numeric('flat_discount', { precision: 10, scale: 2 }), + minOrder: numeric('min_order', { precision: 10, scale: 2 }), + productIds: jsonb('product_ids'), + createdBy: integer('created_by').references(() => staffUsers.id), + maxValue: numeric('max_value', { precision: 10, scale: 2 }), + isApplyForAll: boolean('is_apply_for_all').notNull().default(false), + validTill: timestamp('valid_till'), + maxLimitForUser: integer('max_limit_for_user'), + isInvalidated: boolean('is_invalidated').notNull().default(false), + exclusiveApply: boolean('exclusive_apply').notNull().default(false), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); + +export const couponUsage = mf.table('coupon_usage', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + userId: integer('user_id').notNull().references(() => users.id), + couponId: integer('coupon_id').notNull().references(() => coupons.id), + orderId: integer('order_id').references(() => orders.id), + orderItemId: integer('order_item_id').references(() => orderItems.id), + usedAt: timestamp('used_at').notNull().defaultNow(), +}); + +export const couponApplicableUsers = mf.table('coupon_applicable_users', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + couponId: integer('coupon_id').notNull().references(() => coupons.id), + userId: integer('user_id').notNull().references(() => users.id), +}, (t) => ({ + unq_coupon_user: unique('unique_coupon_user').on(t.couponId, t.userId), +})); + +export const couponApplicableProducts = mf.table('coupon_applicable_products', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + couponId: integer('coupon_id').notNull().references(() => coupons.id), + productId: integer('product_id').notNull().references(() => productInfo.id), +}, (t) => ({ + unq_coupon_product: unique('unique_coupon_product').on(t.couponId, t.productId), +})); + +export const userIncidents = mf.table('user_incidents', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + userId: integer('user_id').notNull().references(() => users.id), + orderId: integer('order_id').references(() => orders.id), + dateAdded: timestamp('date_added').notNull().defaultNow(), + adminComment: text('admin_comment'), + addedBy: integer('added_by').references(() => staffUsers.id), + negativityScore: integer('negativity_score'), +}); + +export const reservedCoupons = mf.table('reserved_coupons', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + secretCode: varchar('secret_code', { length: 50 }).notNull().unique(), + couponCode: varchar('coupon_code', { length: 50 }).notNull(), + discountPercent: numeric('discount_percent', { precision: 5, scale: 2 }), + flatDiscount: numeric('flat_discount', { precision: 10, scale: 2 }), + minOrder: numeric('min_order', { precision: 10, scale: 2 }), + productIds: jsonb('product_ids'), + maxValue: numeric('max_value', { precision: 10, scale: 2 }), + validTill: timestamp('valid_till'), + maxLimitForUser: integer('max_limit_for_user'), + exclusiveApply: boolean('exclusive_apply').notNull().default(false), + isRedeemed: boolean('is_redeemed').notNull().default(false), + redeemedBy: integer('redeemed_by').references(() => users.id), + redeemedAt: timestamp('redeemed_at'), + createdBy: integer('created_by').notNull().references(() => staffUsers.id), + createdAt: timestamp('created_at').notNull().defaultNow(), +}, (t) => ({ + unq_secret_code: unique('unique_secret_code').on(t.secretCode), +})); + +export const notifCreds = mf.table('notif_creds', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + token: varchar({ length: 500 }).notNull().unique(), + addedAt: timestamp('added_at').notNull().defaultNow(), + userId: integer('user_id').notNull().references(() => users.id), + lastVerified: timestamp('last_verified'), +}); + +export const unloggedUserTokens = mf.table('unlogged_user_tokens', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + token: varchar({ length: 500 }).notNull().unique(), + addedAt: timestamp('added_at').notNull().defaultNow(), + lastVerified: timestamp('last_verified'), +}); + +export const userNotifications = mf.table('user_notifications', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + title: varchar('title', { length: 255 }).notNull(), + imageUrl: varchar('image_url', { length: 500 }), + createdAt: timestamp('created_at').notNull().defaultNow(), + body: text('body').notNull(), + applicableUsers: jsonb('applicable_users'), +}); + +export const staffRoles = mf.table('staff_roles', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + roleName: staffRoleEnum('role_name').notNull(), + createdAt: timestamp('created_at').notNull().defaultNow(), +}, (t) => ({ + unq_role_name: unique('unique_role_name').on(t.roleName), +})); + +export const staffPermissions = mf.table('staff_permissions', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + permissionName: staffPermissionEnum('permission_name').notNull(), + createdAt: timestamp('created_at').notNull().defaultNow(), +}, (t) => ({ + unq_permission_name: unique('unique_permission_name').on(t.permissionName), +})); + +export const staffRolePermissions = mf.table('staff_role_permissions', { + id: integer().primaryKey().generatedAlwaysAsIdentity(), + staffRoleId: integer('staff_role_id').notNull().references(() => staffRoles.id), + staffPermissionId: integer('staff_permission_id').notNull().references(() => staffPermissions.id), + createdAt: timestamp('created_at').notNull().defaultNow(), +}, (t) => ({ + unq_role_permission: unique('unique_role_permission').on(t.staffRoleId, t.staffPermissionId), +})); + +// Relations +export const usersRelations = relations(users, ({ many, one }) => ({ + addresses: many(addresses), + orders: many(orders), + notifications: many(notifications), + cartItems: many(cartItems), + userCreds: one(userCreds), + coupons: many(coupons), + couponUsages: many(couponUsage), + applicableCoupons: many(couponApplicableUsers), + userDetails: one(userDetails), + notifCreds: many(notifCreds), + userIncidents: many(userIncidents), +})); + +export const userCredsRelations = relations(userCreds, ({ one }) => ({ + user: one(users, { fields: [userCreds.userId], references: [users.id] }), +})); + +export const staffUsersRelations = relations(staffUsers, ({ one, many }) => ({ + role: one(staffRoles, { fields: [staffUsers.staffRoleId], references: [staffRoles.id] }), + coupons: many(coupons), + stores: many(storeInfo), +})); + +export const addressesRelations = relations(addresses, ({ one, many }) => ({ + user: one(users, { fields: [addresses.userId], references: [users.id] }), + orders: many(orders), + zone: one(addressZones, { fields: [addresses.zoneId], references: [addressZones.id] }), +})); + +export const unitsRelations = relations(units, ({ many }) => ({ + products: many(productInfo), +})); + +export const productInfoRelations = relations(productInfo, ({ one, many }) => ({ + unit: one(units, { fields: [productInfo.unitId], references: [units.id] }), + store: one(storeInfo, { fields: [productInfo.storeId], references: [storeInfo.id] }), + productSlots: many(productSlots), + specialDeals: many(specialDeals), + orderItems: many(orderItems), + cartItems: many(cartItems), + tags: many(productTags), + applicableCoupons: many(couponApplicableProducts), + reviews: many(productReviews), + groups: many(productGroupMembership), +})); + +export const productTagInfoRelations = relations(productTagInfo, ({ many }) => ({ + products: many(productTags), +})); + +export const productTagsRelations = relations(productTags, ({ one }) => ({ + product: one(productInfo, { fields: [productTags.productId], references: [productInfo.id] }), + tag: one(productTagInfo, { fields: [productTags.tagId], references: [productTagInfo.id] }), +})); + +export const deliverySlotInfoRelations = relations(deliverySlotInfo, ({ many }) => ({ + productSlots: many(productSlots), + orders: many(orders), + vendorSnippets: many(vendorSnippets), +})); + +export const productSlotsRelations = relations(productSlots, ({ one }) => ({ + product: one(productInfo, { fields: [productSlots.productId], references: [productInfo.id] }), + slot: one(deliverySlotInfo, { fields: [productSlots.slotId], references: [deliverySlotInfo.id] }), +})); + +export const specialDealsRelations = relations(specialDeals, ({ one }) => ({ + product: one(productInfo, { fields: [specialDeals.productId], references: [productInfo.id] }), +})); + +export const ordersRelations = relations(orders, ({ one, many }) => ({ + user: one(users, { fields: [orders.userId], references: [users.id] }), + address: one(addresses, { fields: [orders.addressId], references: [addresses.id] }), + slot: one(deliverySlotInfo, { fields: [orders.slotId], references: [deliverySlotInfo.id] }), + orderItems: many(orderItems), + payment: one(payments), + paymentInfo: one(paymentInfoTable, { fields: [orders.paymentInfoId], references: [paymentInfoTable.id] }), + orderStatus: many(orderStatus), + refunds: many(refunds), + couponUsages: many(couponUsage), + userIncidents: many(userIncidents), +})); + +export const orderItemsRelations = relations(orderItems, ({ one }) => ({ + order: one(orders, { fields: [orderItems.orderId], references: [orders.id] }), + product: one(productInfo, { fields: [orderItems.productId], references: [productInfo.id] }), +})); + +export const orderStatusRelations = relations(orderStatus, ({ one }) => ({ + order: one(orders, { fields: [orderStatus.orderId], references: [orders.id] }), + user: one(users, { fields: [orderStatus.userId], references: [users.id] }), + refundCoupon: one(coupons, { fields: [orderStatus.refundCouponId], references: [coupons.id] }), +})); + +export const paymentInfoRelations = relations(paymentInfoTable, ({ one }) => ({ + order: one(orders, { fields: [paymentInfoTable.id], references: [orders.paymentInfoId] }), +})); + +export const paymentsRelations = relations(payments, ({ one }) => ({ + order: one(orders, { fields: [payments.orderId], references: [orders.id] }), +})); + +export const refundsRelations = relations(refunds, ({ one }) => ({ + order: one(orders, { fields: [refunds.orderId], references: [orders.id] }), +})); + +export const notificationsRelations = relations(notifications, ({ one }) => ({ + user: one(users, { fields: [notifications.userId], references: [users.id] }), +})); + +export const productCategoriesRelations = relations(productCategories, ({}) => ({})); + +export const cartItemsRelations = relations(cartItems, ({ one }) => ({ + user: one(users, { fields: [cartItems.userId], references: [users.id] }), + product: one(productInfo, { fields: [cartItems.productId], references: [productInfo.id] }), +})); + +export const complaintsRelations = relations(complaints, ({ one }) => ({ + user: one(users, { fields: [complaints.userId], references: [users.id] }), + order: one(orders, { fields: [complaints.orderId], references: [orders.id] }), +})); + +export const couponsRelations = relations(coupons, ({ one, many }) => ({ + creator: one(staffUsers, { fields: [coupons.createdBy], references: [staffUsers.id] }), + usages: many(couponUsage), + applicableUsers: many(couponApplicableUsers), + applicableProducts: many(couponApplicableProducts), +})); + +export const couponUsageRelations = relations(couponUsage, ({ one }) => ({ + user: one(users, { fields: [couponUsage.userId], references: [users.id] }), + coupon: one(coupons, { fields: [couponUsage.couponId], references: [coupons.id] }), + order: one(orders, { fields: [couponUsage.orderId], references: [orders.id] }), + orderItem: one(orderItems, { fields: [couponUsage.orderItemId], references: [orderItems.id] }), +})); + +export const userDetailsRelations = relations(userDetails, ({ one }) => ({ + user: one(users, { fields: [userDetails.userId], references: [users.id] }), +})); + +export const notifCredsRelations = relations(notifCreds, ({ one }) => ({ + user: one(users, { fields: [notifCreds.userId], references: [users.id] }), +})); + +export const userNotificationsRelations = relations(userNotifications, ({}) => ({ + // No relations needed for now +})); + +export const storeInfoRelations = relations(storeInfo, ({ one, many }) => ({ + owner: one(staffUsers, { fields: [storeInfo.owner], references: [staffUsers.id] }), + products: many(productInfo), +})); + +export const couponApplicableUsersRelations = relations(couponApplicableUsers, ({ one }) => ({ + coupon: one(coupons, { fields: [couponApplicableUsers.couponId], references: [coupons.id] }), + user: one(users, { fields: [couponApplicableUsers.userId], references: [users.id] }), +})); + +export const couponApplicableProductsRelations = relations(couponApplicableProducts, ({ one }) => ({ + coupon: one(coupons, { fields: [couponApplicableProducts.couponId], references: [coupons.id] }), + product: one(productInfo, { fields: [couponApplicableProducts.productId], references: [productInfo.id] }), +})); + +export const reservedCouponsRelations = relations(reservedCoupons, ({ one }) => ({ + redeemedUser: one(users, { fields: [reservedCoupons.redeemedBy], references: [users.id] }), + creator: one(staffUsers, { fields: [reservedCoupons.createdBy], references: [staffUsers.id] }), +})); + +export const productReviewsRelations = relations(productReviews, ({ one }) => ({ + user: one(users, { fields: [productReviews.userId], references: [users.id] }), + product: one(productInfo, { fields: [productReviews.productId], references: [productInfo.id] }), +})); + +export const addressZonesRelations = relations(addressZones, ({ many }) => ({ + addresses: many(addresses), + areas: many(addressAreas), +})); + +export const addressAreasRelations = relations(addressAreas, ({ one }) => ({ + zone: one(addressZones, { fields: [addressAreas.zoneId], references: [addressZones.id] }), +})); + +export const productGroupInfoRelations = relations(productGroupInfo, ({ many }) => ({ + memberships: many(productGroupMembership), +})); + +export const productGroupMembershipRelations = relations(productGroupMembership, ({ one }) => ({ + product: one(productInfo, { fields: [productGroupMembership.productId], references: [productInfo.id] }), + group: one(productGroupInfo, { fields: [productGroupMembership.groupId], references: [productGroupInfo.id] }), +})); + +export const homeBannersRelations = relations(homeBanners, ({}) => ({ + // Relations for productIds array would be more complex, skipping for now +})); + +export const staffRolesRelations = relations(staffRoles, ({ many }) => ({ + staffUsers: many(staffUsers), + rolePermissions: many(staffRolePermissions), +})); + +export const staffPermissionsRelations = relations(staffPermissions, ({ many }) => ({ + rolePermissions: many(staffRolePermissions), +})); + +export const staffRolePermissionsRelations = relations(staffRolePermissions, ({ one }) => ({ + role: one(staffRoles, { fields: [staffRolePermissions.staffRoleId], references: [staffRoles.id] }), + permission: one(staffPermissions, { fields: [staffRolePermissions.staffPermissionId], references: [staffPermissions.id] }), +})); + +export const userIncidentsRelations = relations(userIncidents, ({ one }) => ({ + user: one(users, { fields: [userIncidents.userId], references: [users.id] }), + order: one(orders, { fields: [userIncidents.orderId], references: [orders.id] }), + addedBy: one(staffUsers, { fields: [userIncidents.addedBy], references: [staffUsers.id] }), +})); + +export const productAvailabilitySchedulesRelations = relations(productAvailabilitySchedules, ({}) => ({ +})); diff --git a/apps/db-helper-postgres/src/db/seed.ts b/apps/db-helper-postgres/src/db/seed.ts new file mode 100644 index 0000000..91578cb --- /dev/null +++ b/apps/db-helper-postgres/src/db/seed.ts @@ -0,0 +1,153 @@ +import { eq } from 'drizzle-orm' + +import { CONST_KEYS } from '../../../backend/src/lib/const-keys' +import { deliveryCharge, minOrderValue } from '../../../backend/src/lib/env-exporter' + +import { db } from './db_index' +import { keyValStore, staffPermissions, staffRolePermissions, staffRoles, units } from './schema' + +export async function seed() { + console.log('Seeding database...') + + const unitsToSeed = [ + { shortNotation: 'Kg', fullName: 'Kilogram' }, + { shortNotation: 'L', fullName: 'Litre' }, + { shortNotation: 'Dz', fullName: 'Dozen' }, + { shortNotation: 'Pc', fullName: 'Unit Piece' }, + ] + + for (const unit of unitsToSeed) { + const existingUnit = await db.query.units.findFirst({ + where: eq(units.shortNotation, unit.shortNotation), + }) + if (!existingUnit) { + await db.insert(units).values(unit) + } + } + + const rolesToSeed = ['super_admin', 'admin', 'marketer', 'delivery_staff'] as const + + for (const roleName of rolesToSeed) { + const existingRole = await db.query.staffRoles.findFirst({ + where: eq(staffRoles.roleName, roleName), + }) + if (!existingRole) { + await db.insert(staffRoles).values({ roleName }) + } + } + + const permissionsToSeed = ['crud_product', 'make_coupon', 'crud_staff_users'] as const + + for (const permissionName of permissionsToSeed) { + const existingPermission = await db.query.staffPermissions.findFirst({ + where: eq(staffPermissions.permissionName, permissionName), + }) + if (!existingPermission) { + await db.insert(staffPermissions).values({ permissionName }) + } + } + + await db.transaction(async (tx) => { + const superAdminRole = await tx.query.staffRoles.findFirst({ + where: eq(staffRoles.roleName, 'super_admin'), + }) + const adminRole = await tx.query.staffRoles.findFirst({ + where: eq(staffRoles.roleName, 'admin'), + }) + const marketerRole = await tx.query.staffRoles.findFirst({ + where: eq(staffRoles.roleName, 'marketer'), + }) + + const crudProductPerm = await tx.query.staffPermissions.findFirst({ + where: eq(staffPermissions.permissionName, 'crud_product'), + }) + const makeCouponPerm = await tx.query.staffPermissions.findFirst({ + where: eq(staffPermissions.permissionName, 'make_coupon'), + }) + const crudStaffUsersPerm = await tx.query.staffPermissions.findFirst({ + where: eq(staffPermissions.permissionName, 'crud_staff_users'), + }) + + await Promise.all( + [crudProductPerm, makeCouponPerm, crudStaffUsersPerm].map(async (perm) => { + if (!superAdminRole || !perm) { + return + } + + const existingSuperAdminPerm = await tx.query.staffRolePermissions.findFirst({ + where: eq(staffRolePermissions.staffRoleId, superAdminRole.id) + && eq(staffRolePermissions.staffPermissionId, perm.id), + }) + if (!existingSuperAdminPerm) { + await tx.insert(staffRolePermissions).values({ + staffRoleId: superAdminRole.id, + staffPermissionId: perm.id, + }) + } + }) + ) + + await Promise.all( + [crudProductPerm, makeCouponPerm].map(async (perm) => { + if (!adminRole || !perm) { + return + } + + const existingAdminPerm = await tx.query.staffRolePermissions.findFirst({ + where: eq(staffRolePermissions.staffRoleId, adminRole.id) + && eq(staffRolePermissions.staffPermissionId, perm.id), + }) + if (!existingAdminPerm) { + await tx.insert(staffRolePermissions).values({ + staffRoleId: adminRole.id, + staffPermissionId: perm.id, + }) + } + }) + ) + + if (marketerRole && makeCouponPerm) { + const existingMarketerCoupon = await tx.query.staffRolePermissions.findFirst({ + where: eq(staffRolePermissions.staffRoleId, marketerRole.id) + && eq(staffRolePermissions.staffPermissionId, makeCouponPerm.id), + }) + if (!existingMarketerCoupon) { + await tx.insert(staffRolePermissions).values({ + staffRoleId: marketerRole.id, + staffPermissionId: makeCouponPerm.id, + }) + } + } + }) + + const constantsToSeed = [ + { key: CONST_KEYS.readableOrderId, value: 0 }, + { key: CONST_KEYS.minRegularOrderValue, value: minOrderValue }, + { key: CONST_KEYS.freeDeliveryThreshold, value: minOrderValue }, + { key: CONST_KEYS.deliveryCharge, value: deliveryCharge }, + { key: CONST_KEYS.flashFreeDeliveryThreshold, value: 500 }, + { key: CONST_KEYS.flashDeliveryCharge, value: 69 }, + { key: CONST_KEYS.popularItems, value: [] }, + { key: CONST_KEYS.allItemsOrder, value: [] }, + { key: CONST_KEYS.versionNum, value: '1.1.0' }, + { key: CONST_KEYS.playStoreUrl, value: 'https://play.google.com/store/apps/details?id=in.freshyo.app' }, + { key: CONST_KEYS.appStoreUrl, value: 'https://apps.apple.com/in/app/freshyo/id6756889077' }, + { key: CONST_KEYS.isFlashDeliveryEnabled, value: false }, + { key: CONST_KEYS.supportMobile, value: '8688182552' }, + { key: CONST_KEYS.supportEmail, value: 'qushammohd@gmail.com' }, + ] + + for (const constant of constantsToSeed) { + const existing = await db.query.keyValStore.findFirst({ + where: eq(keyValStore.key, constant.key), + }) + if (!existing) { + await db.insert(keyValStore).values({ + key: constant.key, + value: constant.value, + }) + } + } + + console.log('Seeding completed.') +} diff --git a/apps/db-helper-postgres/src/db/types.ts b/apps/db-helper-postgres/src/db/types.ts new file mode 100644 index 0000000..902b5c0 --- /dev/null +++ b/apps/db-helper-postgres/src/db/types.ts @@ -0,0 +1,47 @@ +import type { InferSelectModel } from 'drizzle-orm' + +import type { + users, + addresses, + units, + productInfo, + deliverySlotInfo, + productSlots, + specialDeals, + orders, + orderItems, + payments, + notifications, + productCategories, + cartItems, + coupons, +} from './schema' + +export type User = InferSelectModel +export type Address = InferSelectModel +export type Unit = InferSelectModel +export type ProductInfo = InferSelectModel +export type DeliverySlotInfo = InferSelectModel +export type ProductSlot = InferSelectModel +export type SpecialDeal = InferSelectModel +export type Order = InferSelectModel +export type OrderItem = InferSelectModel +export type Payment = InferSelectModel +export type Notification = InferSelectModel +export type ProductCategory = InferSelectModel +export type CartItem = InferSelectModel +export type Coupon = InferSelectModel + +export type ProductWithUnit = ProductInfo & { + unit: Unit +} + +export type OrderWithItems = Order & { + items: (OrderItem & { product: ProductInfo })[] + address: Address + slot: DeliverySlotInfo +} + +export type CartItemWithProduct = CartItem & { + product: ProductInfo +} diff --git a/apps/db-helper-postgres/src/lib/automatedJobs.ts b/apps/db-helper-postgres/src/lib/automatedJobs.ts new file mode 100644 index 0000000..c2cee0d --- /dev/null +++ b/apps/db-helper-postgres/src/lib/automatedJobs.ts @@ -0,0 +1,109 @@ +import * as cron from 'node-cron'; +import { db } from '../db/db_index' +import { productInfo, productAvailabilitySchedules } from '../db/schema' +import { inArray } from 'drizzle-orm'; +import { initializeAllStores } from '../stores/store-initializer'; + +// Module-level storage for cron jobs +const scheduleJobs: Map = new Map(); + +// Stop all existing schedule-based jobs +const stopAllScheduleJobs = () => { + for (const [time, job] of scheduleJobs) { + job.stop(); + console.log(`Stopped cron job for ${time}`); + } + scheduleJobs.clear(); +}; + +// Main function to refresh jobs (called on init and after schedule changes) +export const refreshScheduleJobs = async (): Promise => { + // Stop existing jobs + stopAllScheduleJobs(); + + // Fetch all schedules from DB + const schedules = await db.query.productAvailabilitySchedules.findMany(); + + if (schedules.length === 0) { + console.log('No schedules found, no jobs created'); + return; + } + + // Group schedules by time + const schedulesByTime = new Map(); + + for (const schedule of schedules) { + if (!schedulesByTime.has(schedule.time)) { + schedulesByTime.set(schedule.time, []); + } + schedulesByTime.get(schedule.time)!.push(schedule); + } + + // For each time slot, resolve conflicts and create job + for (const [time, timeSchedules] of schedulesByTime) { + // Sort by ID descending (highest ID = latest = wins in conflicts) + const sortedSchedules = timeSchedules.sort((a, b) => b.id - a.id); + + // Build final product states (later schedules override earlier ones) + const productStates = new Map(); + + for (const schedule of sortedSchedules) { + for (const productId of schedule.productIds) { + if (!productStates.has(productId)) { + productStates.set(productId, schedule.action); + } + } + } + + // Separate into in-stock and out-of-stock lists + const toTurnOn: number[] = []; + const toTurnOff: number[] = []; + + for (const [productId, action] of productStates) { + if (action === 'in') { + toTurnOn.push(productId); + } else { + toTurnOff.push(productId); + } + } + + // Create cron schedule from time (HH:mm to cron format) + const [hours, minutes] = time.split(':'); + const cronExpression = `${minutes} ${hours} * * *`; + + // Create and store the job + const job = cron.schedule(cronExpression, async () => { + console.log(`Running scheduled availability job for ${time}`); + + // Batch update in single queries + if (toTurnOn.length > 0) { + await db.update(productInfo) + .set({ isOutOfStock: false }) + .where(inArray(productInfo.id, toTurnOn)); + console.log(`[${time}] Turned ON ${toTurnOn.length} products`); + } + + if (toTurnOff.length > 0) { + await db.update(productInfo) + .set({ isOutOfStock: true }) + .where(inArray(productInfo.id, toTurnOff)); + console.log(`[${time}] Turned OFF ${toTurnOff.length} products`); + } + + initializeAllStores(); + }); + + scheduleJobs.set(time, job); + console.log(`Created cron job for ${time} (${toTurnOn.length} ON, ${toTurnOff.length} OFF)`); + } +}; + +// Initialize all automated jobs +export const startAutomatedJobs = () => { + // Only schedule-based jobs (flash delivery jobs removed) + refreshScheduleJobs().catch(err => { + console.error('Failed to initialize schedule jobs:', err); + }); + + console.log('Automated jobs scheduled'); +}; diff --git a/apps/db-helper-postgres/src/lib/cloud_cache.ts b/apps/db-helper-postgres/src/lib/cloud_cache.ts new file mode 100644 index 0000000..ea0215a --- /dev/null +++ b/apps/db-helper-postgres/src/lib/cloud_cache.ts @@ -0,0 +1,376 @@ +import axios from 'axios' +import { scaffoldProducts } from '@/src/trpc/apis/common-apis/common' +import { scaffoldEssentialConsts } from '@/src/trpc/apis/common-apis/common-trpc-index' +import { scaffoldStores } from '@/src/trpc/apis/user-apis/apis/stores' +import { scaffoldSlotsWithProducts } from '@/src/trpc/apis/user-apis/apis/slots' +import { scaffoldBanners } from '@/src/trpc/apis/user-apis/apis/banners' +import { scaffoldStoreWithProducts } from '@/src/trpc/apis/user-apis/apis/stores' +import { storeInfo } from '../db/schema' +import { db } from '../db/db_index' +import { imageUploadS3 } from '@/src/lib/s3-client' +import { apiCacheKey, cloudflareApiToken, cloudflareZoneId, assetsDomain } from '@/src/lib/env-exporter' +import { CACHE_FILENAMES } from '@packages/shared' +import { retryWithExponentialBackoff } from '@/src/lib/retry' + +function constructCacheUrl(path: string): string { + return `${assetsDomain}${apiCacheKey}/${path}` +} + +export async function createProductsFile(): Promise { + // Get products data from the API method + const productsData = await scaffoldProducts() + + // Convert to JSON string with pretty formatting + const jsonContent = JSON.stringify(productsData, null, 2) + + // Convert to Buffer for S3 upload + const buffer = Buffer.from(jsonContent, 'utf-8') + + // Upload to S3 at the specified path using apiCacheKey + const s3Key = await imageUploadS3(buffer, 'application/json', `${apiCacheKey}/${CACHE_FILENAMES.products}`) + + // Purge cache with retry + const url = constructCacheUrl(CACHE_FILENAMES.products) + try { + await retryWithExponentialBackoff(() => clearUrlCache([url])) + console.log(`Cache purged for ${url}`) + } catch (error) { + console.error(`Failed to purge cache for ${url} after 3 retries:`, error) + } + + return s3Key +} + +export async function createEssentialConstsFile(): Promise { + // Get essential consts data from the API method + const essentialConstsData = await scaffoldEssentialConsts() + + // Convert to JSON string with pretty formatting + const jsonContent = JSON.stringify(essentialConstsData, null, 2) + + // Convert to Buffer for S3 upload + const buffer = Buffer.from(jsonContent, 'utf-8') + + // Upload to S3 at the specified path using apiCacheKey + const s3Key = await imageUploadS3(buffer, 'application/json', `${apiCacheKey}/${CACHE_FILENAMES.essentialConsts}`) + + // Purge cache with retry + const url = constructCacheUrl(CACHE_FILENAMES.essentialConsts) + try { + await retryWithExponentialBackoff(() => clearUrlCache([url])) + console.log(`Cache purged for ${url}`) + } catch (error) { + console.error(`Failed to purge cache for ${url} after 3 retries:`, error) + } + + return s3Key +} + +export async function createStoresFile(): Promise { + // Get stores data from the API method + const storesData = await scaffoldStores() + + // Convert to JSON string with pretty formatting + const jsonContent = JSON.stringify(storesData, null, 2) + + // Convert to Buffer for S3 upload + const buffer = Buffer.from(jsonContent, 'utf-8') + + // Upload to S3 at the specified path using apiCacheKey + const s3Key = await imageUploadS3(buffer, 'application/json', `${apiCacheKey}/${CACHE_FILENAMES.stores}`) + + // Purge cache with retry + const url = constructCacheUrl(CACHE_FILENAMES.stores) + try { + await retryWithExponentialBackoff(() => clearUrlCache([url])) + console.log(`Cache purged for ${url}`) + } catch (error) { + console.error(`Failed to purge cache for ${url} after 3 retries:`, error) + } + + return s3Key +} + +export async function createSlotsFile(): Promise { + // Get slots data from the API method + const slotsData = await scaffoldSlotsWithProducts() + + // Convert to JSON string with pretty formatting + const jsonContent = JSON.stringify(slotsData, null, 2) + + // Convert to Buffer for S3 upload + const buffer = Buffer.from(jsonContent, 'utf-8') + + // Upload to S3 at the specified path using apiCacheKey + const s3Key = await imageUploadS3(buffer, 'application/json', `${apiCacheKey}/${CACHE_FILENAMES.slots}`) + + // Purge cache with retry + const url = constructCacheUrl(CACHE_FILENAMES.slots) + try { + await retryWithExponentialBackoff(() => clearUrlCache([url])) + console.log(`Cache purged for ${url}`) + } catch (error) { + console.error(`Failed to purge cache for ${url} after 3 retries:`, error) + } + + return s3Key +} + +export async function createBannersFile(): Promise { + // Get banners data from the API method + const bannersData = await scaffoldBanners() + + // Convert to JSON string with pretty formatting + const jsonContent = JSON.stringify(bannersData, null, 2) + + // Convert to Buffer for S3 upload + const buffer = Buffer.from(jsonContent, 'utf-8') + + // Upload to S3 at the specified path using apiCacheKey + const s3Key = await imageUploadS3(buffer, 'application/json', `${apiCacheKey}/${CACHE_FILENAMES.banners}`) + + // Purge cache with retry + const url = constructCacheUrl(CACHE_FILENAMES.banners) + try { + await retryWithExponentialBackoff(() => clearUrlCache([url])) + console.log(`Cache purged for ${url}`) + } catch (error) { + console.error(`Failed to purge cache for ${url} after 3 retries:`, error) + } + + return s3Key +} + +export async function createStoreFile(storeId: number): Promise { + // Get store data from the API method + const storeData = await scaffoldStoreWithProducts(storeId) + + // Convert to JSON string with pretty formatting + const jsonContent = JSON.stringify(storeData, null, 2) + + // Convert to Buffer for S3 upload + const buffer = Buffer.from(jsonContent, 'utf-8') + + // Upload to S3 at the specified path using apiCacheKey + const s3Key = await imageUploadS3(buffer, 'application/json', `${apiCacheKey}/stores/${storeId}.json`) + + // Purge cache with retry + const url = constructCacheUrl(`stores/${storeId}.json`) + try { + await retryWithExponentialBackoff(() => clearUrlCache([url])) + console.log(`Cache purged for ${url}`) + } catch (error) { + console.error(`Failed to purge cache for ${url} after 3 retries:`, error) + } + + return s3Key +} + +export async function createAllStoresFiles(): Promise { + // Fetch all store IDs from database + const stores = await db.select({ id: storeInfo.id }).from(storeInfo) + + // Create cache files for all stores and collect URLs + const results: string[] = [] + const urls: string[] = [] + + for (const store of stores) { + const s3Key = await createStoreFile(store.id) + results.push(s3Key) + urls.push(constructCacheUrl(`stores/${store.id}.json`)) + } + + console.log(`Created ${results.length} store cache files`) + + // Purge all store caches in one batch with retry + try { + await retryWithExponentialBackoff(() => clearUrlCache(urls)) + console.log(`Cache purged for ${urls.length} store files`) + } catch (error) { + console.error(`Failed to purge cache for store files after 3 retries. URLs: ${urls.join(', ')}`, error) + } + + return results +} + +export interface CreateAllCacheFilesResult { + products: string + essentialConsts: string + stores: string + slots: string + banners: string + individualStores: string[] +} + +export async function createAllCacheFiles(): Promise { + console.log('Starting creation of all cache files...') + + // Create all global cache files in parallel + const [ + productsKey, + essentialConstsKey, + storesKey, + slotsKey, + bannersKey, + individualStoreKeys, + ] = await Promise.all([ + createProductsFileInternal(), + createEssentialConstsFileInternal(), + createStoresFileInternal(), + createSlotsFileInternal(), + createBannersFileInternal(), + createAllStoresFilesInternal(), + ]) + + // Collect all URLs for batch cache purge + const urls = [ + constructCacheUrl(CACHE_FILENAMES.products), + constructCacheUrl(CACHE_FILENAMES.essentialConsts), + constructCacheUrl(CACHE_FILENAMES.stores), + constructCacheUrl(CACHE_FILENAMES.slots), + constructCacheUrl(CACHE_FILENAMES.banners), + ...individualStoreKeys.map((_, index) => constructCacheUrl(`stores/${index + 1}.json`)), + ] + + // Purge all caches in one batch with retry + try { + await retryWithExponentialBackoff(() => clearUrlCache(urls)) + console.log(`Cache purged for all ${urls.length} files`) + } catch (error) { + console.error(`Failed to purge cache for all files after 3 retries`, error) + } + + console.log('All cache files created successfully') + + return { + products: productsKey, + essentialConsts: essentialConstsKey, + stores: storesKey, + slots: slotsKey, + banners: bannersKey, + individualStores: individualStoreKeys, + } +} + +// Internal versions that skip cache purging (for batch operations) +async function createProductsFileInternal(): Promise { + const productsData = await scaffoldProducts() + const jsonContent = JSON.stringify(productsData, null, 2) + const buffer = Buffer.from(jsonContent, 'utf-8') + return await imageUploadS3(buffer, 'application/json', `${apiCacheKey}/${CACHE_FILENAMES.products}`) +} + +async function createEssentialConstsFileInternal(): Promise { + const essentialConstsData = await scaffoldEssentialConsts() + const jsonContent = JSON.stringify(essentialConstsData, null, 2) + const buffer = Buffer.from(jsonContent, 'utf-8') + return await imageUploadS3(buffer, 'application/json', `${apiCacheKey}/${CACHE_FILENAMES.essentialConsts}`) +} + +async function createStoresFileInternal(): Promise { + const storesData = await scaffoldStores() + const jsonContent = JSON.stringify(storesData, null, 2) + const buffer = Buffer.from(jsonContent, 'utf-8') + return await imageUploadS3(buffer, 'application/json', `${apiCacheKey}/${CACHE_FILENAMES.stores}`) +} + +async function createSlotsFileInternal(): Promise { + const slotsData = await scaffoldSlotsWithProducts() + const jsonContent = JSON.stringify(slotsData, null, 2) + const buffer = Buffer.from(jsonContent, 'utf-8') + return await imageUploadS3(buffer, 'application/json', `${apiCacheKey}/${CACHE_FILENAMES.slots}`) +} + +async function createBannersFileInternal(): Promise { + const bannersData = await scaffoldBanners() + const jsonContent = JSON.stringify(bannersData, null, 2) + const buffer = Buffer.from(jsonContent, 'utf-8') + return await imageUploadS3(buffer, 'application/json', `${apiCacheKey}/${CACHE_FILENAMES.banners}`) +} + +async function createAllStoresFilesInternal(): Promise { + const stores = await db.select({ id: storeInfo.id }).from(storeInfo) + const results: string[] = [] + + for (const store of stores) { + const storeData = await scaffoldStoreWithProducts(store.id) + const jsonContent = JSON.stringify(storeData, null, 2) + const buffer = Buffer.from(jsonContent, 'utf-8') + const s3Key = await imageUploadS3(buffer, 'application/json', `${apiCacheKey}/stores/${store.id}.json`) + results.push(s3Key) + } + + console.log(`Created ${results.length} store cache files`) + return results +} + +export async function clearUrlCache(urls: string[]): Promise<{ success: boolean; errors?: string[] }> { + if (!cloudflareApiToken || !cloudflareZoneId) { + console.warn('Cloudflare credentials not configured, skipping cache clear') + return { success: false, errors: ['Cloudflare credentials not configured'] } + } + + try { + const response = await axios.post( + `https://api.cloudflare.com/client/v4/zones/${cloudflareZoneId}/purge_cache`, + { files: urls }, + { + headers: { + 'Authorization': `Bearer ${cloudflareApiToken}`, + 'Content-Type': 'application/json', + }, + } + ) + + const result = response.data as { success: boolean; errors?: { message: string }[] } + + if (!result.success) { + const errorMessages = result.errors?.map(e => e.message) || ['Unknown error'] + console.error(`Cloudflare cache purge failed for URLs: ${urls.join(', ')}`, errorMessages) + return { success: false, errors: errorMessages } + } + + console.log(`Successfully purged ${urls.length} URLs from Cloudflare cache: ${urls.join(', ')}`) + return { success: true } + } catch (error) { + console.log(error) + const errorMessage = error instanceof Error ? error.message : 'Unknown error' + console.error(`Error clearing Cloudflare cache for URLs: ${urls.join(', ')}`, errorMessage) + return { success: false, errors: [errorMessage] } + } +} + +export async function clearAllCache(): Promise<{ success: boolean; errors?: string[] }> { + if (!cloudflareApiToken || !cloudflareZoneId) { + console.warn('Cloudflare credentials not configured, skipping cache clear') + return { success: false, errors: ['Cloudflare credentials not configured'] } + } + + try { + const response = await axios.post( + `https://api.cloudflare.com/client/v4/zones/${cloudflareZoneId}/purge_cache`, + { purge_everything: true }, + { + headers: { + 'Authorization': `Bearer ${cloudflareApiToken}`, + 'Content-Type': 'application/json', + }, + } + ) + + const result = response.data as { success: boolean; errors?: { message: string }[] } + + if (!result.success) { + const errorMessages = result.errors?.map(e => e.message) || ['Unknown error'] + console.error('Cloudflare cache purge failed:', errorMessages) + return { success: false, errors: errorMessages } + } + + console.log('Successfully purged all cache from Cloudflare') + return { success: true } + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error' + console.error('Error clearing Cloudflare cache:', errorMessage) + return { success: false, errors: [errorMessage] } + } +} diff --git a/apps/backend/src/lib/const-store.ts b/apps/db-helper-postgres/src/lib/const-store.ts similarity index 95% rename from apps/backend/src/lib/const-store.ts rename to apps/db-helper-postgres/src/lib/const-store.ts index c16609e..25d1142 100644 --- a/apps/backend/src/lib/const-store.ts +++ b/apps/db-helper-postgres/src/lib/const-store.ts @@ -1,5 +1,5 @@ -import { db } from '@/src/db/db_index' -import { keyValStore } from '@/src/db/schema' +import { db } from '../db/db_index' +import { keyValStore } from '../db/schema' import redisClient from '@/src/lib/redis-client' import { CONST_KEYS, CONST_KEYS_ARRAY, type ConstKey } from '@/src/lib/const-keys' diff --git a/apps/backend/src/lib/delete-orders.ts b/apps/db-helper-postgres/src/lib/delete-orders.ts similarity index 94% rename from apps/backend/src/lib/delete-orders.ts rename to apps/db-helper-postgres/src/lib/delete-orders.ts index 4fb9516..4321bb9 100644 --- a/apps/backend/src/lib/delete-orders.ts +++ b/apps/db-helper-postgres/src/lib/delete-orders.ts @@ -1,5 +1,5 @@ -import { db } from '@/src/db/db_index' -import { orders, orderItems, orderStatus, payments, refunds, couponUsage, complaints } from '@/src/db/schema' +import { db } from '../db/db_index' +import { orders, orderItems, orderStatus, payments, refunds, couponUsage, complaints } from '../db/schema' import { eq, inArray } from 'drizzle-orm'; /** diff --git a/apps/db-helper-postgres/src/lib/manage-scheduled-availability.ts b/apps/db-helper-postgres/src/lib/manage-scheduled-availability.ts new file mode 100644 index 0000000..ce4779b --- /dev/null +++ b/apps/db-helper-postgres/src/lib/manage-scheduled-availability.ts @@ -0,0 +1,129 @@ +import { db } from '../db/db_index' +import { productInfo, productAvailabilitySchedules } from '../db/schema' +import { eq, inArray } from 'drizzle-orm'; +import { initializeAllStores } from '@/src/stores/store-initializer'; +import dayjs from 'dayjs'; + +/** + * Get all products that should be in stock or out of stock based on current schedules + * Only processes products that are actually involved in availability schedules + * Automatically updates products that need to change their availability status + * @returns Promise<{ inStock: number[], outOfStock: number[], changed: number[] }> + */ +export async function verifyProductsAvailabilityBySchedule(reInitialize:boolean = false): Promise<{ + inStock: number[]; + outOfStock: number[]; + changed: number[]; +}> { + // Get all schedules + const allSchedules = await db.query.productAvailabilitySchedules.findMany(); + + // Extract all unique product IDs from all schedules + const allScheduledProductIds = new Set(); + for (const schedule of allSchedules) { + for (const productId of schedule.productIds) { + allScheduledProductIds.add(productId); + } + } + + // If no products are in any schedule, return empty arrays + if (allScheduledProductIds.size === 0) { + return { inStock: [], outOfStock: [], changed: [] }; + } + + // Get current time + const currentTime = dayjs().format('HH:mm'); + + const computedInStock: number[] = []; + const computedOutOfStock: number[] = []; + + // Process each product that is involved in schedules + for (const productId of allScheduledProductIds) { + // Find applicable schedules for this product + const applicableSchedules = allSchedules.filter(schedule => { + return schedule.productIds.includes(productId); + }); + + // Filter active schedules (time <= current time) + const activeSchedules = applicableSchedules.filter(schedule => + schedule.time <= currentTime + ); + + if (activeSchedules.length === 0) { + // No active schedule applies - skip this product + // (we only care about products with active schedule rules) + continue; + } + + // Get most recent schedule + const mostRecentSchedule = activeSchedules.sort((a, b) => { + if (a.time !== b.time) { + return b.time.localeCompare(a.time); + } + return b.id - a.id; + })[0]; + + // Categorize based on schedule action + if (mostRecentSchedule.action === 'in') { + computedInStock.push(productId); + } else { + computedOutOfStock.push(productId); + } + } + + // Query products to check current availability status + const allProductIds = [...computedInStock, ...computedOutOfStock]; + + if (allProductIds.length === 0) { + return { inStock: [], outOfStock: [], changed: [] }; + } + + const products = await db.query.productInfo.findMany({ + where: inArray(productInfo.id, allProductIds), + }); + + // Find products that need to change + const toMarkInStock: number[] = []; + const toMarkOutOfStock: number[] = []; + const changed: number[] = []; + + for (const product of products) { + const shouldBeInStock = computedInStock.includes(product.id); + const currentlyOutOfStock = product.isOutOfStock; + + if (shouldBeInStock && currentlyOutOfStock) { + // Should be in stock but currently out of stock - needs change + toMarkInStock.push(product.id); + changed.push(product.id); + } else if (!shouldBeInStock && !currentlyOutOfStock) { + // Should be out of stock but currently in stock - needs change + toMarkOutOfStock.push(product.id); + changed.push(product.id); + } + } + + // Batch update products in a single query + if (toMarkInStock.length > 0) { + await db.update(productInfo) + .set({ isOutOfStock: false }) + .where(inArray(productInfo.id, toMarkInStock)); + } + + if (toMarkOutOfStock.length > 0) { + await db.update(productInfo) + .set({ isOutOfStock: true }) + .where(inArray(productInfo.id, toMarkOutOfStock)); + } + + // Reinitialize stores if any products changed + if (changed.length > 0 && reInitialize) { + console.log(`Reinitializing stores after availability changes for ${changed.length} products`); + await initializeAllStores(); + } + + return { + inStock: computedInStock, + outOfStock: computedOutOfStock, + changed + }; +} diff --git a/apps/backend/src/lib/notif-job.ts b/apps/db-helper-postgres/src/lib/notif-job.ts similarity index 99% rename from apps/backend/src/lib/notif-job.ts rename to apps/db-helper-postgres/src/lib/notif-job.ts index c0c18f9..489e696 100644 --- a/apps/backend/src/lib/notif-job.ts +++ b/apps/db-helper-postgres/src/lib/notif-job.ts @@ -1,7 +1,7 @@ import { Queue, Worker } from 'bullmq'; import { Expo } from 'expo-server-sdk'; import { redisUrl } from '@/src/lib/env-exporter' -import { db } from '@/src/db/db_index' +import { db } from '../db/db_index' import { generateSignedUrlFromS3Url } from '@/src/lib/s3-client' import { NOTIFS_QUEUE, diff --git a/apps/backend/src/lib/post-order-handler.ts b/apps/db-helper-postgres/src/lib/post-order-handler.ts similarity index 98% rename from apps/backend/src/lib/post-order-handler.ts rename to apps/db-helper-postgres/src/lib/post-order-handler.ts index f29f940..2245bbb 100644 --- a/apps/backend/src/lib/post-order-handler.ts +++ b/apps/db-helper-postgres/src/lib/post-order-handler.ts @@ -1,5 +1,5 @@ -import { db } from '@/src/db/db_index' -import { orders, orderStatus } from '@/src/db/schema' +import { db } from '../db/db_index' +import { orders, orderStatus } from '../db/schema' import redisClient from '@/src/lib/redis-client' import { sendTelegramMessage } from '@/src/lib/telegram-service' import { inArray, eq } from 'drizzle-orm'; diff --git a/apps/db-helper-postgres/src/lib/upload-url.ts b/apps/db-helper-postgres/src/lib/upload-url.ts new file mode 100644 index 0000000..9f263c9 --- /dev/null +++ b/apps/db-helper-postgres/src/lib/upload-url.ts @@ -0,0 +1,23 @@ +import { and, eq } from 'drizzle-orm' + +import { db } from '../db/db_index' +import { uploadUrlStatus } from '../db/schema' + +export const createUploadUrlStatus = async (key: string): Promise => { + await db.insert(uploadUrlStatus).values({ + key, + status: 'pending', + }) +} + +export const claimUploadUrlStatus = async (key: string): Promise => { + const result = await db + .update(uploadUrlStatus) + .set({ status: 'claimed' }) + .where(and(eq(uploadUrlStatus.key, key), eq(uploadUrlStatus.status, 'pending'))) + .returning() + + if (result.length === 0) { + throw new Error('Upload URL not found or already claimed') + } +} diff --git a/apps/db-helper-postgres/src/middleware/auth.middleware.ts b/apps/db-helper-postgres/src/middleware/auth.middleware.ts new file mode 100644 index 0000000..f0ec185 --- /dev/null +++ b/apps/db-helper-postgres/src/middleware/auth.middleware.ts @@ -0,0 +1,78 @@ +import { createMiddleware } from 'hono/factory' +import { db } from '../db/db_index' +import { staffUsers, userDetails } from '../db/schema' +import { eq } from 'drizzle-orm' +import { ApiError } from '@/src/lib/api-error' +import { verifyToken, UserJWTPayload, StaffJWTPayload } from '@/src/lib/jwt-utils' + +// Type for Hono context variables +type Variables = { + user?: { + userId: number; + name?: string; + email?: string; + mobile?: string; + }; + staffUser?: { + id: number; + name: string; + }; +} + +/** + * Hono middleware to authenticate user or staff from JWT token + */ +export const authenticateUser = createMiddleware<{ Variables: Variables }>(async (c, next) => { + try { + const authHeader = c.req.header('authorization') + + if (!authHeader?.startsWith('Bearer ')) { + throw new ApiError('Authorization token required', 401) + } + + const token = authHeader.substring(7) + console.log(c.req.header) + + const decoded = await verifyToken(token) + + // Check if this is a staff token (has staffId) + if ('staffId' in decoded) { + const staffPayload = decoded as StaffJWTPayload + // This is a staff token, verify staff exists + const staff = await db.query.staffUsers.findFirst({ + where: eq(staffUsers.id, staffPayload.staffId), + }) + + if (!staff) { + throw new ApiError('Invalid staff token', 401) + } + + c.set('staffUser', { + id: staff.id, + name: staff.name, + }) + } else { + const userPayload = decoded as UserJWTPayload + // This is a regular user token + c.set('user', { + userId: userPayload.userId, + name: userPayload.name, + email: userPayload.email, + mobile: userPayload.mobile, + }) + + // Check if user is suspended + const details = await db.query.userDetails.findFirst({ + where: eq(userDetails.userId, userPayload.userId), + }) + + if (details?.isSuspended) { + throw new ApiError('Account suspended', 403) + } + } + + await next() + } catch (error) { + throw error + } +}) diff --git a/apps/backend/src/middleware/staff-auth.ts b/apps/db-helper-postgres/src/middleware/staff-auth.ts similarity index 55% rename from apps/backend/src/middleware/staff-auth.ts rename to apps/db-helper-postgres/src/middleware/staff-auth.ts index 2215f5d..5a76e5c 100644 --- a/apps/backend/src/middleware/staff-auth.ts +++ b/apps/db-helper-postgres/src/middleware/staff-auth.ts @@ -1,40 +1,37 @@ -import { Request, Response, NextFunction } from 'express'; -import jwt from 'jsonwebtoken'; -import { db } from '@/src/db/db_index' -import { staffUsers } from '@/src/db/schema' +import { createMiddleware } from 'hono/factory' +import { db } from '../db/db_index' +import { staffUsers } from '../db/schema' import { eq } from 'drizzle-orm'; import { ApiError } from '@/src/lib/api-error' +import { verifyToken, StaffJWTPayload } from '@/src/lib/jwt-utils' -// Extend Request interface to include staffUser -declare global { - namespace Express { - interface Request { - staffUser?: { - id: number; - name: string; - }; - } - } +// Type for Hono context variables +type Variables = { + staffUser?: { + id: number; + name: string; + }; } /** * Verify JWT token and extract payload */ -const verifyStaffToken = (token: string) => { +const verifyStaffToken = async (token: string): Promise => { try { - return jwt.verify(token, process.env.JWT_SECRET || 'default-secret'); + const payload = await verifyToken(token); + return payload as StaffJWTPayload; } catch (error) { throw new ApiError('Access denied. Invalid auth credentials', 401); } }; /** - * Middleware to authenticate staff users and attach staffUser to request + * Hono middleware to authenticate staff users and attach staffUser to context */ -export const authenticateStaff = async (req: Request, res: Response, next: NextFunction) => { +export const authenticateStaff = createMiddleware<{ Variables: Variables }>(async (c, next) => { try { // Extract token from Authorization header - const authHeader = req.headers.authorization; + const authHeader = c.req.header('authorization'); if (!authHeader || !authHeader.startsWith('Bearer ')) { throw new ApiError('Staff authentication required', 401); @@ -47,7 +44,7 @@ export const authenticateStaff = async (req: Request, res: Response, next: NextF } // Verify token and extract payload - const decoded = verifyStaffToken(token) as any; + const decoded = await verifyStaffToken(token); // Verify staffId exists in token if (!decoded.staffId) { @@ -63,14 +60,14 @@ export const authenticateStaff = async (req: Request, res: Response, next: NextF throw new ApiError('Staff user not found', 401); } - // Attach staff user to request - req.staffUser = { + // Attach staff user to context + c.set('staffUser', { id: staff.id, name: staff.name, - }; + }); - next(); + await next(); } catch (error) { - next(error); + throw error; } -}; \ No newline at end of file +}); diff --git a/apps/backend/src/services/user/product-service.ts b/apps/db-helper-postgres/src/services/user/product-service.ts similarity index 93% rename from apps/backend/src/services/user/product-service.ts rename to apps/db-helper-postgres/src/services/user/product-service.ts index 0f214d9..01040e0 100644 --- a/apps/backend/src/services/user/product-service.ts +++ b/apps/db-helper-postgres/src/services/user/product-service.ts @@ -1,5 +1,5 @@ -import { db } from '@/src/db/db_index' -import { productInfo, units, productSlots, deliverySlotInfo, specialDeals, storeInfo, productReviews, users } from '@/src/db/schema' +import { db } from '../../db/db_index' +import { productInfo, units, productSlots, deliverySlotInfo, specialDeals, storeInfo, productReviews, users } from '../../db/schema' import { eq, and, gt, sql, desc } from 'drizzle-orm' /** @@ -55,8 +55,8 @@ export async function getProductDeliverySlots(productId: number) { and( eq(productSlots.productId, productId), eq(deliverySlotInfo.isActive, true), - gt(deliverySlotInfo.deliveryTime, sql`NOW()`), - gt(deliverySlotInfo.freezeTime, sql`NOW()`) + gt(deliverySlotInfo.deliveryTime, new Date()), + gt(deliverySlotInfo.freezeTime, new Date()) ) ) .orderBy(deliverySlotInfo.deliveryTime) @@ -76,7 +76,7 @@ export async function getProductSpecialDeals(productId: number) { .where( and( eq(specialDeals.productId, productId), - gt(specialDeals.validTill, sql`NOW()`) + gt(specialDeals.validTill, new Date()) ) ) .orderBy(specialDeals.quantity) diff --git a/apps/backend/src/stores/banner-store.ts b/apps/db-helper-postgres/src/stores/banner-store.ts similarity index 96% rename from apps/backend/src/stores/banner-store.ts rename to apps/db-helper-postgres/src/stores/banner-store.ts index 7fbd6f1..a9b79c6 100644 --- a/apps/backend/src/stores/banner-store.ts +++ b/apps/db-helper-postgres/src/stores/banner-store.ts @@ -1,7 +1,7 @@ // import redisClient from '@/src/stores/redis-client'; import redisClient from '@/src/lib/redis-client'; -import { db } from '@/src/db/db_index' -import { homeBanners } from '@/src/db/schema' +import { db } from '../db/db_index' +import { homeBanners } from '../db/schema' import { isNotNull, asc } from 'drizzle-orm'; import { scaffoldAssetUrl } from '@/src/lib/s3-client'; diff --git a/apps/backend/src/stores/product-store.ts b/apps/db-helper-postgres/src/stores/product-store.ts similarity index 96% rename from apps/backend/src/stores/product-store.ts rename to apps/db-helper-postgres/src/stores/product-store.ts index d4cf3a2..beed758 100644 --- a/apps/backend/src/stores/product-store.ts +++ b/apps/db-helper-postgres/src/stores/product-store.ts @@ -1,7 +1,7 @@ // import redisClient from '@/src/stores/redis-client'; import redisClient from '@/src/lib/redis-client'; -import { db } from '@/src/db/db_index' -import { productInfo, units, productSlots, deliverySlotInfo, specialDeals, storeInfo, productTags, productTagInfo } from '@/src/db/schema' +import { db } from '../db/db_index' +import { productInfo, units, productSlots, deliverySlotInfo, specialDeals, storeInfo, productTags, productTagInfo } from '../db/schema' import { eq, and, gt, sql } from 'drizzle-orm'; import { generateSignedUrlsFromS3Urls, scaffoldAssetUrl } from '@/src/lib/s3-client'; @@ -72,7 +72,7 @@ export async function initializeProducts(): Promise { and( eq(deliverySlotInfo.isActive, true), eq(deliverySlotInfo.isCapacityFull, false), - gt(deliverySlotInfo.deliveryTime, sql`NOW()`) + gt(deliverySlotInfo.deliveryTime, new Date()) ) ); const deliverySlotsMap = new Map(); @@ -90,7 +90,7 @@ export async function initializeProducts(): Promise { validTill: specialDeals.validTill, }) .from(specialDeals) - .where(gt(specialDeals.validTill, sql`NOW()`)); + .where(gt(specialDeals.validTill, new Date())); const specialDealsMap = new Map(); for (const deal of allSpecialDeals) { if (!specialDealsMap.has(deal.productId)) specialDealsMap.set(deal.productId, []); diff --git a/apps/backend/src/stores/product-tag-store.ts b/apps/db-helper-postgres/src/stores/product-tag-store.ts similarity index 97% rename from apps/backend/src/stores/product-tag-store.ts rename to apps/db-helper-postgres/src/stores/product-tag-store.ts index f6a3175..58a4999 100644 --- a/apps/backend/src/stores/product-tag-store.ts +++ b/apps/db-helper-postgres/src/stores/product-tag-store.ts @@ -1,7 +1,7 @@ // import redisClient from '@/src/stores/redis-client'; import redisClient from '@/src/lib/redis-client'; -import { db } from '@/src/db/db_index' -import { productTagInfo, productTags } from '@/src/db/schema' +import { db } from '../db/db_index' +import { productTagInfo, productTags } from '../db/schema' import { eq, inArray } from 'drizzle-orm'; import { generateSignedUrlFromS3Url } from '@/src/lib/s3-client'; diff --git a/apps/backend/src/stores/slot-store.ts b/apps/db-helper-postgres/src/stores/slot-store.ts similarity index 99% rename from apps/backend/src/stores/slot-store.ts rename to apps/db-helper-postgres/src/stores/slot-store.ts index 3a3ed68..1c29998 100644 --- a/apps/backend/src/stores/slot-store.ts +++ b/apps/db-helper-postgres/src/stores/slot-store.ts @@ -1,6 +1,6 @@ import redisClient from '@/src/lib/redis-client'; -import { db } from '@/src/db/db_index' -import { deliverySlotInfo, productSlots, productInfo, units } from '@/src/db/schema' +import { db } from '../db/db_index' +import { deliverySlotInfo, productSlots, productInfo, units } from '../db/schema' import { eq, and, gt, asc } from 'drizzle-orm'; import { generateSignedUrlsFromS3Urls, scaffoldAssetUrl } from '@/src/lib/s3-client'; import dayjs from 'dayjs'; diff --git a/apps/backend/src/stores/user-negativity-store.ts b/apps/db-helper-postgres/src/stores/user-negativity-store.ts similarity index 97% rename from apps/backend/src/stores/user-negativity-store.ts rename to apps/db-helper-postgres/src/stores/user-negativity-store.ts index d518435..56db6d8 100644 --- a/apps/backend/src/stores/user-negativity-store.ts +++ b/apps/db-helper-postgres/src/stores/user-negativity-store.ts @@ -1,6 +1,6 @@ import redisClient from '@/src/lib/redis-client'; -import { db } from '@/src/db/db_index' -import { userIncidents } from '@/src/db/schema' +import { db } from '../db/db_index' +import { userIncidents } from '../db/schema' import { eq, sum } from 'drizzle-orm'; export async function initializeUserNegativityStore(): Promise { diff --git a/apps/backend/src/trpc/apis/common-apis/common-trpc-index.ts b/apps/db-helper-postgres/src/trpc/apis/common-apis/common-trpc-index.ts similarity index 65% rename from apps/backend/src/trpc/apis/common-apis/common-trpc-index.ts rename to apps/db-helper-postgres/src/trpc/apis/common-apis/common-trpc-index.ts index 5be1569..783b0e6 100644 --- a/apps/backend/src/trpc/apis/common-apis/common-trpc-index.ts +++ b/apps/db-helper-postgres/src/trpc/apis/common-apis/common-trpc-index.ts @@ -1,7 +1,7 @@ import { router, publicProcedure, protectedProcedure } from '@/src/trpc/trpc-index' import { commonRouter } from '@/src/trpc/apis/common-apis/common' -import { db } from '@/src/db/db_index' -import { keyValStore, productInfo, storeInfo } from '@/src/db/schema' +import { db } from '../../../db/db_index' +import { keyValStore, productInfo, storeInfo } from '../../../db/schema' import * as turf from '@turf/turf'; import { z } from 'zod'; import { mbnrGeoJson } from '@/src/lib/mbnr-geojson' @@ -9,9 +9,32 @@ import { generateUploadUrl } from '@/src/lib/s3-client' import { ApiError } from '@/src/lib/api-error' import { getAllConstValues } from '@/src/lib/const-store' import { CONST_KEYS } from '@/src/lib/const-keys' +import { assetsDomain, apiCacheKey } from '@/src/lib/env-exporter' const polygon = turf.polygon(mbnrGeoJson.features[0].geometry.coordinates); +export async function scaffoldEssentialConsts() { + const consts = await getAllConstValues(); + + return { + freeDeliveryThreshold: consts[CONST_KEYS.freeDeliveryThreshold] ?? 200, + deliveryCharge: consts[CONST_KEYS.deliveryCharge] ?? 0, + flashFreeDeliveryThreshold: consts[CONST_KEYS.flashFreeDeliveryThreshold] ?? 500, + flashDeliveryCharge: consts[CONST_KEYS.flashDeliveryCharge] ?? 69, + popularItems: consts[CONST_KEYS.popularItems] ?? '5,3,2,4,1', + versionNum: consts[CONST_KEYS.versionNum] ?? '1.1.0', + playStoreUrl: consts[CONST_KEYS.playStoreUrl] ?? 'https://play.google.com/store/apps/details?id=in.freshyo.app', + appStoreUrl: consts[CONST_KEYS.appStoreUrl] ?? 'https://apps.apple.com/in/app/freshyo/id6756889077', + webViewHtml: null, + isWebviewClosable: true, + isFlashDeliveryEnabled: consts[CONST_KEYS.isFlashDeliveryEnabled] ?? true, + supportMobile: consts[CONST_KEYS.supportMobile] ?? '', + supportEmail: consts[CONST_KEYS.supportEmail] ?? '', + assetsDomain, + apiCacheKey, + }; +} + export const commonApiRouter = router({ product: commonRouter, getStoresSummary: publicProcedure @@ -46,7 +69,7 @@ export const commonApiRouter = router({ generateUploadUrls: protectedProcedure .input(z.object({ - contextString: z.enum(['review', 'product_info', 'store']), + contextString: z.enum(['review', 'product_info', 'store', 'notification', 'profile', 'complaint']), mimeTypes: z.array(z.string()), })) .mutation(async ({ input }): Promise<{ uploadUrls: string[] }> => { @@ -64,9 +87,16 @@ export const commonApiRouter = router({ folder = 'product-images'; } else if (contextString === 'store') { folder = 'store-images'; - } else if (contextString === 'review_response') { - folder = 'review-response-images'; - } else { + } else if (contextString === 'profile') { + folder = 'profile-images'; + } else if (contextString === 'complaint') { + folder = 'complaint-images'; + } + // else if (contextString === 'review_response') { + // + // folder = 'review-response-images'; + // } + else { folder = ''; } @@ -99,23 +129,8 @@ export const commonApiRouter = router({ }), essentialConsts: publicProcedure .query(async () => { - const consts = await getAllConstValues(); - - return { - freeDeliveryThreshold: consts[CONST_KEYS.freeDeliveryThreshold] ?? 200, - deliveryCharge: consts[CONST_KEYS.deliveryCharge] ?? 0, - flashFreeDeliveryThreshold: consts[CONST_KEYS.flashFreeDeliveryThreshold] ?? 500, - flashDeliveryCharge: consts[CONST_KEYS.flashDeliveryCharge] ?? 69, - popularItems: consts[CONST_KEYS.popularItems] ?? '5,3,2,4,1', - versionNum: consts[CONST_KEYS.versionNum] ?? '1.1.0', - playStoreUrl: consts[CONST_KEYS.playStoreUrl] ?? 'https://play.google.com/store/apps/details?id=in.freshyo.app', - appStoreUrl: consts[CONST_KEYS.appStoreUrl] ?? 'https://apps.apple.com/in/app/freshyo/id6756889077', - webViewHtml: null, - isWebviewClosable: true, - isFlashDeliveryEnabled: consts[CONST_KEYS.isFlashDeliveryEnabled] ?? true, - supportMobile: consts[CONST_KEYS.supportMobile] ?? '', - supportEmail: consts[CONST_KEYS.supportEmail] ?? '', - }; + const response = await scaffoldEssentialConsts(); + return response; }), }); diff --git a/apps/db-helper-postgres/src/trpc/apis/common-apis/common.ts b/apps/db-helper-postgres/src/trpc/apis/common-apis/common.ts new file mode 100644 index 0000000..7a2f355 --- /dev/null +++ b/apps/db-helper-postgres/src/trpc/apis/common-apis/common.ts @@ -0,0 +1,116 @@ +import { router, publicProcedure } from '@/src/trpc/trpc-index' +import { db } from '../../../db/db_index' +import { productInfo, units, productSlots, deliverySlotInfo, storeInfo } from '../../../db/schema' +import { eq, gt, and, sql, inArray } from 'drizzle-orm'; +import { generateSignedUrlsFromS3Urls, generateSignedUrlFromS3Url } from '@/src/lib/s3-client' +import { getAllProducts as getAllProductsFromCache } from '@/src/stores/product-store' +import { getDashboardTags as getDashboardTagsFromCache } from '@/src/stores/product-tag-store' + +export const getNextDeliveryDate = async (productId: number): Promise => { + const result = await db + .select({ deliveryTime: deliverySlotInfo.deliveryTime }) + .from(productSlots) + .innerJoin(deliverySlotInfo, eq(productSlots.slotId, deliverySlotInfo.id)) + .where( + and( + eq(productSlots.productId, productId), + eq(deliverySlotInfo.isActive, true), + eq(deliverySlotInfo.isCapacityFull, false), + gt(deliverySlotInfo.deliveryTime, new Date()) + ) + ) + .orderBy(deliverySlotInfo.deliveryTime) + .limit(1); + + + return result[0]?.deliveryTime || null; +}; + +export async function scaffoldProducts() { + // Get all products from cache + let products = await getAllProductsFromCache(); + products = products.filter(item => Boolean(item.id)) + + // Get suspended product IDs to filter them out + const suspendedProducts = await db + .select({ id: productInfo.id }) + .from(productInfo) + .where(eq(productInfo.isSuspended, true)); + + const suspendedProductIds = new Set(suspendedProducts.map(sp => sp.id)); + + // Filter out suspended products + products = products.filter(product => !suspendedProductIds.has(product.id)); + + // Format products to match the expected response structure + const formattedProducts = await Promise.all( + products.map(async (product) => { + const nextDeliveryDate = await getNextDeliveryDate(product.id); + return { + id: product.id, + name: product.name, + shortDescription: product.shortDescription, + price: parseFloat(product.price), + marketPrice: product.marketPrice ? parseFloat(product.marketPrice) : null, + unit: product.unitNotation, + unitNotation: product.unitNotation, + incrementStep: product.incrementStep, + productQuantity: product.productQuantity, + storeId: product.store?.id || null, + isOutOfStock: product.isOutOfStock, + isFlashAvailable: product.isFlashAvailable, + nextDeliveryDate: nextDeliveryDate ? nextDeliveryDate.toISOString() : null, + images: product.images, + flashPrice: product.flashPrice + }; + }) + ); + + return { + products: formattedProducts, + count: formattedProducts.length, + }; +} + +export const commonRouter = router({ + getDashboardTags: publicProcedure + .query(async () => { + // Get dashboard tags from cache + const tags = await getDashboardTagsFromCache(); + + return { + tags: tags, + }; + }), + + getAllProductsSummary: publicProcedure + .query(async () => { + const response = await scaffoldProducts(); + return response; + }), + + getStoresSummary: publicProcedure + .query(async () => { + const stores = await db.query.storeInfo.findMany({ + columns: { + id: true, + name: true, + description: true, + }, + }); + + return { + stores, + }; + }), + + healthCheck: publicProcedure + .query(async () => { + // Test DB connection by selecting product names + await db.select({ name: productInfo.name }).from(productInfo).limit(1); + + return { + status: "ok", + }; + }), +}); diff --git a/apps/db-helper-postgres/tsconfig.json b/apps/db-helper-postgres/tsconfig.json new file mode 100644 index 0000000..3b1e847 --- /dev/null +++ b/apps/db-helper-postgres/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/src/db/*": ["./src/db/*"], + "@/src/*": ["../backend/src/*"], + "@/src/trpc/*": ["../backend/src/trpc/*"], + "@/src/lib/*": ["../backend/src/lib/*"], + "@/src/stores/*": ["../backend/src/stores/*"] + } + } +} diff --git a/apps/db-helper-sqlite/drizzle.config.ts b/apps/db-helper-sqlite/drizzle.config.ts new file mode 100644 index 0000000..dcf78e6 --- /dev/null +++ b/apps/db-helper-sqlite/drizzle.config.ts @@ -0,0 +1,11 @@ +import 'dotenv/config' +import { defineConfig } from 'drizzle-kit' + +export default defineConfig({ + out: './drizzle', + schema: './src/db/schema.ts', + dialect: 'sqlite', + dbCredentials: { + url: process.env.SQLITE_DB_PATH!, + }, +}) diff --git a/apps/db-helper-sqlite/package.json b/apps/db-helper-sqlite/package.json new file mode 100644 index 0000000..2a9562c --- /dev/null +++ b/apps/db-helper-sqlite/package.json @@ -0,0 +1,9 @@ +{ + "name": "db-helper-sqlite", + "version": "0.1.0", + "private": true, + "type": "module", + "dependencies": { + "drizzle-orm": "^0.45.1" + } +} diff --git a/apps/db-helper-sqlite/src/apis/common-apis/common-product.ts b/apps/db-helper-sqlite/src/apis/common-apis/common-product.ts new file mode 100644 index 0000000..2978537 --- /dev/null +++ b/apps/db-helper-sqlite/src/apis/common-apis/common-product.ts @@ -0,0 +1,102 @@ +import { and, eq, gt, inArray } from 'drizzle-orm' + +import { db } from '../../db/db_index' +import { deliverySlotInfo, productInfo, productSlots, productTags, units } from '../../db/schema' + +type ProductSummaryRow = { + id: number + name: string + shortDescription: string | null + price: string + marketPrice: string + images: string[] + isOutOfStock: boolean | null + unitShortNotation: string + productQuantity: number | null + nextDeliveryDate: Date | null +} + +const normalizeImages = (images: string | null): string[] => { + if (!images) { + return [] + } + + try { + const parsed = JSON.parse(images) + if (Array.isArray(parsed)) { + return parsed.filter((value) => typeof value === 'string') + } + } catch (error) { + console.error('Failed to parse product images', error) + } + + return [] +} + +const getNextDeliveryDate = async (productId: number): Promise => { + const result = await db + .select({ deliveryTime: deliverySlotInfo.deliveryTime }) + .from(productSlots) + .innerJoin(deliverySlotInfo, eq(productSlots.slotId, deliverySlotInfo.id)) + .where( + and( + eq(productSlots.productId, productId), + eq(deliverySlotInfo.isActive, true), + gt(deliverySlotInfo.deliveryTime, new Date()) + ) + ) + .orderBy(deliverySlotInfo.deliveryTime) + .limit(1) + + return result[0]?.deliveryTime || null +} + +export const getProductsSummaryData = async (tagId?: number | null): Promise => { + let productIds: number[] | null = null + + if (tagId) { + const taggedProducts = await db + .select({ productId: productTags.productId }) + .from(productTags) + .where(eq(productTags.tagId, tagId)) + + productIds = taggedProducts.map((taggedProduct) => taggedProduct.productId) + + if (productIds.length === 0) { + return [] + } + } + + const whereCondition = productIds && productIds.length > 0 + ? inArray(productInfo.id, productIds) + : undefined + + const productsWithUnits = await db + .select({ + id: productInfo.id, + name: productInfo.name, + shortDescription: productInfo.shortDescription, + price: productInfo.price, + marketPrice: productInfo.marketPrice, + images: productInfo.images, + isOutOfStock: productInfo.isOutOfStock, + unitShortNotation: units.shortNotation, + productQuantity: productInfo.productQuantity, + }) + .from(productInfo) + .innerJoin(units, eq(productInfo.unitId, units.id)) + .where(whereCondition) + + const productsWithDelivery = await Promise.all( + productsWithUnits.map(async (product) => { + const nextDeliveryDate = await getNextDeliveryDate(product.id) + return { + ...product, + images: normalizeImages(product.images), + nextDeliveryDate, + } + }) + ) + + return productsWithDelivery +} diff --git a/apps/db-helper-sqlite/src/dataAccessors/admin-apis/banner-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/banner-queries.ts new file mode 100644 index 0000000..6105745 --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/banner-queries.ts @@ -0,0 +1,48 @@ +import { db } from '../../db/db_index' +import { homeBanners } from '../../db/schema' +import { eq, desc } from 'drizzle-orm' +import { IBannerDbService, Banner, NewBanner } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/banner-db-service.interface' +import { toJsonString } from '../../db/sqlite-casts' + +export class BannerDbService implements IBannerDbService { + async getAllBanners(): Promise { + return db.query.homeBanners.findMany({ + orderBy: desc(homeBanners.createdAt), + }) + } + + async getBannerById(id: number): Promise { + return db.query.homeBanners.findFirst({ + where: eq(homeBanners.id, id), + }) + } + + async createBanner(data: NewBanner): Promise { + const normalized = { + ...data, + productIds: data.productIds ? toJsonString(data.productIds, '[]') : data.productIds, + } + const [banner] = await db.insert(homeBanners).values(normalized).returning() + return banner + } + + async updateBannerById(id: number, data: Partial): Promise { + const normalized = { + ...data, + productIds: data.productIds ? toJsonString(data.productIds, '[]') : data.productIds, + lastUpdated: new Date(), + } + const [banner] = await db + .update(homeBanners) + .set(normalized) + .where(eq(homeBanners.id, id)) + .returning() + return banner + } + + async deleteBannerById(id: number): Promise { + await db.delete(homeBanners).where(eq(homeBanners.id, id)) + } +} + +export const bannerDbService: IBannerDbService = new BannerDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/admin-apis/complaint-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/complaint-queries.ts new file mode 100644 index 0000000..f5b9fff --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/complaint-queries.ts @@ -0,0 +1,43 @@ +import { db } from '../../db/db_index' +import { complaints, users } from '../../db/schema' +import { eq, desc, lt } from 'drizzle-orm' +import { IComplaintDbService, Complaint, NewComplaint } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/complaint-db-service.interface' + +export class ComplaintDbService implements IComplaintDbService { + async getComplaints( + cursor?: number, + limit: number = 20 + ): Promise> { + let whereCondition = cursor ? lt(complaints.id, cursor) : undefined + + const complaintsData = await db + .select({ + id: complaints.id, + complaintBody: complaints.complaintBody, + userId: complaints.userId, + orderId: complaints.orderId, + isResolved: complaints.isResolved, + createdAt: complaints.createdAt, + response: complaints.response, + images: complaints.images, + userName: users.name, + userMobile: users.mobile, + }) + .from(complaints) + .leftJoin(users, eq(complaints.userId, users.id)) + .where(whereCondition) + .orderBy(desc(complaints.id)) + .limit(limit + 1) + + return complaintsData + } + + async resolveComplaint(id: number, response?: string): Promise { + await db + .update(complaints) + .set({ isResolved: true, response }) + .where(eq(complaints.id, id)) + } +} + +export const complaintDbService: IComplaintDbService = new ComplaintDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/admin-apis/constant-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/constant-queries.ts new file mode 100644 index 0000000..d665265 --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/constant-queries.ts @@ -0,0 +1,26 @@ +import { db } from '../../db/db_index' +import { keyValStore } from '../../db/schema' +import { IConstantDbService, Constant, NewConstant } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/constant-db-service.interface' +import { toJsonString } from '../../db/sqlite-casts' + +export class ConstantDbService implements IConstantDbService { + async getAllConstants(): Promise { + return db.select().from(keyValStore) + } + + async upsertConstants(constants: { key: string; value: any }[]): Promise { + await db.transaction(async (tx) => { + for (const { key, value } of constants) { + await tx.insert(keyValStore) + .values({ key, value: toJsonString(value, 'null') }) + .onConflictDoUpdate({ + target: keyValStore.key, + set: { value: toJsonString(value, 'null') }, + }) + } + }) + return constants.length + } +} + +export const constantDbService: IConstantDbService = new ConstantDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/admin-apis/coupon-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/coupon-queries.ts new file mode 100644 index 0000000..6f148f6 --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/coupon-queries.ts @@ -0,0 +1,204 @@ +import { db } from '../../db/db_index' +import { coupons, couponApplicableUsers, couponApplicableProducts, reservedCoupons, users, orders, orderStatus } from '../../db/schema' +import { eq, and, like, or, inArray, lt, asc } from 'drizzle-orm' +import { ICouponDbService, Coupon, NewCoupon, ReservedCoupon, NewReservedCoupon, CouponWithRelations } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/coupon-db-service.interface' +import { parseNumberArray, toJsonString } from '../../db/sqlite-casts' + +export class CouponDbService implements ICouponDbService { + async createCoupon(data: NewCoupon): Promise { + const normalized = { + ...data, + productIds: data.productIds ? toJsonString(data.productIds, '[]') : data.productIds, + } + const [coupon] = await db.insert(coupons).values(normalized).returning() + return coupon + } + + async getCouponById(id: number): Promise { + const result = await db.query.coupons.findFirst({ + where: eq(coupons.id, id), + with: { + creator: true, + applicableUsers: { with: { user: true } }, + applicableProducts: { with: { product: true } }, + }, + }) + if (!result) return undefined + return { + ...result, + productIds: parseNumberArray(result.productIds), + } as CouponWithRelations + } + + async getCouponByCode(code: string): Promise { + return db.query.coupons.findFirst({ + where: eq(coupons.couponCode, code), + }) + } + + async getAllCoupons(options: { cursor?: number; limit: number; search?: string }): Promise { + const { cursor, limit, search } = options + + let whereCondition = undefined + const conditions = [] + + if (cursor) { + conditions.push(lt(coupons.id, cursor)) + } + + if (search && search.trim()) { + conditions.push(like(coupons.couponCode, `%${search}%`)) + } + + if (conditions.length > 0) { + whereCondition = and(...conditions) + } + + const result = await db.query.coupons.findMany({ + where: whereCondition, + with: { + creator: true, + applicableUsers: { with: { user: true } }, + applicableProducts: { with: { product: true } }, + }, + orderBy: (couponsRef, { desc }) => [desc(couponsRef.createdAt)], + limit: limit + 1, + }) + + return result.map((coupon) => ({ + ...coupon, + productIds: parseNumberArray(coupon.productIds), + })) as CouponWithRelations[] + } + + async updateCoupon(id: number, data: Partial): Promise { + const normalized = { + ...data, + productIds: data.productIds ? toJsonString(data.productIds, '[]') : data.productIds, + } + const [coupon] = await db.update(coupons).set(normalized).where(eq(coupons.id, id)).returning() + return coupon + } + + async invalidateCoupon(id: number): Promise { + const [coupon] = await db.update(coupons).set({ isInvalidated: true }).where(eq(coupons.id, id)).returning() + return coupon + } + + async addApplicableUsers(couponId: number, userIds: number[]): Promise { + await db.insert(couponApplicableUsers).values( + userIds.map(userId => ({ couponId, userId })) + ) + } + + async addApplicableProducts(couponId: number, productIds: number[]): Promise { + await db.insert(couponApplicableProducts).values( + productIds.map(productId => ({ couponId, productId })) + ) + } + + async removeAllApplicableUsers(couponId: number): Promise { + await db.delete(couponApplicableUsers).where(eq(couponApplicableUsers.couponId, couponId)) + } + + async removeAllApplicableProducts(couponId: number): Promise { + await db.delete(couponApplicableProducts).where(eq(couponApplicableProducts.couponId, couponId)) + } + + async countApplicableUsers(couponId: number): Promise { + return db.$count(couponApplicableUsers, eq(couponApplicableUsers.couponId, couponId)) + } + + async createReservedCoupon(data: NewReservedCoupon): Promise { + const normalized = { + ...data, + productIds: data.productIds ? toJsonString(data.productIds, '[]') : data.productIds, + } + const [coupon] = await db.insert(reservedCoupons).values(normalized).returning() + return coupon + } + + async getReservedCoupons(options: { cursor?: number; limit: number; search?: string }): Promise { + const { cursor, limit, search } = options + + let whereCondition = undefined + const conditions = [] + + if (cursor) { + conditions.push(lt(reservedCoupons.id, cursor)) + } + + if (search && search.trim()) { + conditions.push(or( + like(reservedCoupons.secretCode, `%${search}%`), + like(reservedCoupons.couponCode, `%${search}%`) + )) + } + + if (conditions.length > 0) { + whereCondition = and(...conditions) + } + + return db.query.reservedCoupons.findMany({ + where: whereCondition, + with: { redeemedUser: true, creator: true }, + orderBy: (reservedCouponsRef, { desc }) => [desc(reservedCouponsRef.createdAt)], + limit: limit + 1, + }) + } + + async getUsersByIds(ids: number[]): Promise> { + return db.query.users.findMany({ + where: inArray(users.id, ids), + columns: { id: true, name: true, mobile: true }, + }) + } + + async getUsersBySearch(search: string, limit: number, offset: number): Promise> { + const whereCondition = or( + like(users.name, `%${search}%`), + like(users.mobile, `%${search}%`) + ) + + return db.query.users.findMany({ + where: whereCondition, + columns: { id: true, name: true, mobile: true }, + limit, + offset, + orderBy: (usersRef, { asc }) => [asc(usersRef.name)], + }) + } + + async createUser(data: Partial): Promise { + const [user] = await db.insert(users).values(data).returning() + return user + } + + async getUserByMobile(mobile: string): Promise { + return db.query.users.findFirst({ + where: eq(users.mobile, mobile), + }) + } + + async getOrderByIdWithUserAndStatus(id: number): Promise { + return db.query.orders.findFirst({ + where: eq(orders.id, id), + with: { + user: true, + orderStatus: true, + }, + }) + } + + async updateOrderStatusRefundCoupon(orderId: number, couponId: number): Promise { + await db.update(orderStatus) + .set({ refundCouponId: couponId }) + .where(eq(orderStatus.orderId, orderId)) + } + + async withTransaction(fn: (tx: any) => Promise): Promise { + return db.transaction(fn) + } +} + +export const couponDbService: ICouponDbService = new CouponDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/admin-apis/order-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/order-queries.ts new file mode 100644 index 0000000..e9c3b28 --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/order-queries.ts @@ -0,0 +1,332 @@ +import { db } from '../../db/db_index' +import { + orders, + orderItems, + orderStatus, + users, + addresses, + refunds, + coupons, + couponUsage, + complaints, + payments, + deliverySlotInfo, + productInfo, + units, + paymentInfoTable, +} from '../../db/schema' +import { eq, and, gte, lt, desc, inArray, SQL } from 'drizzle-orm' +import { + IOrderDbService, + Order, + OrderItem, + OrderStatus, + Address, + Refund, + OrderWithRelations, + OrderWithStatus, + OrderWithCouponUsages, +} from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/order-db-service.interface' + +export class OrderDbService implements IOrderDbService { + async updateOrderNotes(orderId: number, adminNotes: string | null): Promise { + const [updated] = await db + .update(orders) + .set({ adminNotes }) + .where(eq(orders.id, orderId)) + .returning() + return updated + } + + async removeDeliveryCharge(orderId: number, totalAmount: string): Promise { + await db + .update(orders) + .set({ deliveryCharge: '0', totalAmount }) + .where(eq(orders.id, orderId)) + } + + async getOrderById(orderId: number): Promise { + return db.query.orders.findFirst({ + where: eq(orders.id, orderId), + }) + } + + async getOrderWithRelations(orderId: number): Promise { + return db.query.orders.findFirst({ + where: eq(orders.id, orderId), + with: { + user: true, + address: true, + slot: true, + orderItems: { + with: { + product: { + with: { unit: true }, + }, + }, + }, + payment: true, + paymentInfo: true, + }, + }) as Promise + } + + async getOrderWithDetails(orderId: number): Promise { + return db.query.orders.findFirst({ + where: eq(orders.id, orderId), + with: { + user: true, + address: true, + slot: true, + orderItems: { + with: { + product: { + with: { unit: true }, + }, + }, + }, + payment: true, + paymentInfo: true, + orderStatus: true, + refunds: true, + }, + }) as Promise + } + + async getOrderWithStatus(orderId: number): Promise { + return db.query.orders.findFirst({ + where: eq(orders.id, orderId), + with: { + orderStatus: true, + }, + }) as Promise + } + + async getOrderStatusByOrderId(orderId: number): Promise { + return db.query.orderStatus.findFirst({ + where: eq(orderStatus.orderId, orderId), + }) + } + + async updateOrderStatusPackaged(orderId: number, isPackaged: boolean, isDelivered: boolean): Promise { + await db + .update(orderStatus) + .set({ isPackaged, isDelivered }) + .where(eq(orderStatus.orderId, orderId)) + } + + async updateOrderStatusDelivered(orderId: number, isDelivered: boolean): Promise { + await db + .update(orderStatus) + .set({ isDelivered }) + .where(eq(orderStatus.orderId, orderId)) + } + + async cancelOrderStatus(statusId: number, reason: string): Promise { + await db + .update(orderStatus) + .set({ + isCancelled: true, + isCancelledByAdmin: true, + cancelReason: reason, + cancellationAdminNotes: reason, + cancellationReviewed: true, + cancellationReviewedAt: new Date(), + }) + .where(eq(orderStatus.id, statusId)) + } + + async getRefundByOrderId(orderId: number): Promise { + return db.query.refunds.findFirst({ + where: eq(refunds.orderId, orderId), + }) + } + + async createRefund(orderId: number, refundStatus: string): Promise { + await db.insert(refunds).values({ orderId, refundStatus }) + } + + async getCouponUsageByOrderId(orderId: number): Promise> { + return db.query.couponUsage.findMany({ + where: eq(couponUsage.orderId, orderId), + with: { coupon: true }, + }) + } + + async getOrderItemById(orderItemId: number): Promise { + return db.query.orderItems.findFirst({ + where: eq(orderItems.id, orderItemId), + }) + } + + async updateOrderItem(orderItemId: number, data: Partial): Promise { + await db + .update(orderItems) + .set(data) + .where(eq(orderItems.id, orderItemId)) + } + + async updateOrderItemsPackaged(orderId: number, isPackaged: boolean): Promise { + await db + .update(orderItems) + .set({ is_packaged: isPackaged }) + .where(eq(orderItems.orderId, orderId)) + } + + async updateAddressCoords(addressId: number, latitude: number, longitude: number): Promise
{ + const [updated] = await db + .update(addresses) + .set({ adminLatitude: latitude, adminLongitude: longitude }) + .where(eq(addresses.id, addressId)) + .returning() + return updated + } + + async getOrdersBySlotId(slotId: number): Promise { + return db.query.orders.findMany({ + where: eq(orders.slotId, slotId), + with: { + user: true, + address: true, + slot: true, + orderItems: { + with: { + product: { with: { unit: true } }, + }, + }, + orderStatus: true, + }, + }) as Promise + } + + async getOrdersBySlotIds(slotIds: number[]): Promise { + return db.query.orders.findMany({ + where: inArray(orders.slotId, slotIds), + with: { + orderItems: { with: { product: true } }, + couponUsages: { with: { coupon: true } }, + }, + }) as Promise + } + + async getOrdersByDateRange(start: Date, end: Date, slotId?: number): Promise { + const conditions: Array = [ + gte(orders.createdAt, start), + lt(orders.createdAt, end), + ] + + if (slotId !== undefined) { + conditions.push(eq(orders.slotId, slotId)) + } + + return db.query.orders.findMany({ + where: and(...conditions), + with: { + user: true, + address: true, + slot: true, + orderItems: { + with: { + product: { with: { unit: true } }, + }, + }, + orderStatus: true, + }, + }) as Promise + } + + async getAllOrdersWithFilters(options: { + cursor?: number + limit: number + slotId?: number | null + packagedFilter: 'all' | 'packaged' | 'not_packaged' + deliveredFilter: 'all' | 'delivered' | 'not_delivered' + cancellationFilter: 'all' | 'cancelled' | 'not_cancelled' + flashDeliveryFilter: 'all' | 'flash' | 'regular' + }): Promise { + const { cursor, limit, slotId, packagedFilter, deliveredFilter, cancellationFilter, flashDeliveryFilter } = options + + const conditions: Array = [] + + if (cursor) { + conditions.push(lt(orders.id, cursor)) + } + + if (slotId !== undefined && slotId !== null) { + conditions.push(eq(orders.slotId, slotId)) + } + + if (packagedFilter === 'packaged') { + conditions.push(eq(orderStatus.isPackaged, true)) + } else if (packagedFilter === 'not_packaged') { + conditions.push(eq(orderStatus.isPackaged, false)) + } + + if (deliveredFilter === 'delivered') { + conditions.push(eq(orderStatus.isDelivered, true)) + } else if (deliveredFilter === 'not_delivered') { + conditions.push(eq(orderStatus.isDelivered, false)) + } + + if (cancellationFilter === 'cancelled') { + conditions.push(eq(orderStatus.isCancelled, true)) + } else if (cancellationFilter === 'not_cancelled') { + conditions.push(eq(orderStatus.isCancelled, false)) + } + + if (flashDeliveryFilter === 'flash') { + conditions.push(eq(orders.isFlashDelivery, true)) + } else if (flashDeliveryFilter === 'regular') { + conditions.push(eq(orders.isFlashDelivery, false)) + } + + const whereCondition = conditions.length > 0 ? and(...conditions) : undefined + + return db.query.orders.findMany({ + where: whereCondition, + with: { + user: true, + address: true, + slot: true, + orderItems: { + with: { + product: { with: { unit: true } }, + }, + }, + orderStatus: true, + }, + orderBy: (ordersRef, { desc }) => [desc(ordersRef.createdAt)], + limit: limit + 1, + }) as Promise + } + + async updateOrdersAndItemsInTransaction(data: Array<{ orderId: number; totalAmount: string; items: Array<{ id: number; price: string; discountedPrice: string }> }>): Promise { + await db.transaction(async (tx) => { + for (const order of data) { + await tx.update(orders) + .set({ totalAmount: order.totalAmount }) + .where(eq(orders.id, order.orderId)) + + for (const item of order.items) { + await tx.update(orderItems) + .set({ price: item.price, discountedPrice: item.discountedPrice }) + .where(eq(orderItems.id, item.id)) + } + } + }) + } + + async deleteOrderById(orderId: number): Promise { + await db.transaction(async (tx) => { + await tx.delete(couponUsage).where(eq(couponUsage.orderId, orderId)) + await tx.delete(orderStatus).where(eq(orderStatus.orderId, orderId)) + await tx.delete(orderItems).where(eq(orderItems.orderId, orderId)) + await tx.delete(refunds).where(eq(refunds.orderId, orderId)) + await tx.delete(payments).where(eq(payments.orderId, orderId)) + await tx.delete(complaints).where(eq(complaints.orderId, orderId)) + await tx.delete(orders).where(eq(orders.id, orderId)) + }) + } +} + +export const orderDbService: IOrderDbService = new OrderDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/admin-apis/product-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/product-queries.ts new file mode 100644 index 0000000..7da83c2 --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/product-queries.ts @@ -0,0 +1,244 @@ +import { db } from '../../db/db_index' +import { productInfo, units, specialDeals, productSlots, productTags, productReviews, productGroupInfo, productGroupMembership, users } from '../../db/schema' +import { eq, and, inArray, desc, sql } from 'drizzle-orm' +import { IProductDbService, Product, NewProduct, ProductGroup, NewProductGroup } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/product-db-service.interface' +import { toJsonString } from '../../db/sqlite-casts' + +export class ProductDbService implements IProductDbService { + async getAllProducts(): Promise { + return db.query.productInfo.findMany({ + orderBy: productInfo.name, + with: { + unit: true, + store: true, + }, + }) + } + + async getProductById(id: number): Promise { + return db.query.productInfo.findFirst({ + where: eq(productInfo.id, id), + with: { + unit: true, + }, + }) + } + + async createProduct(data: NewProduct): Promise { + const normalized = { + ...data, + images: data.images ? toJsonString(data.images, '[]') : data.images, + } + const [product] = await db.insert(productInfo).values(normalized).returning() + return product + } + + async updateProduct(id: number, data: Partial): Promise { + const normalized = { + ...data, + images: data.images ? toJsonString(data.images, '[]') : data.images, + } + const [product] = await db + .update(productInfo) + .set(normalized) + .where(eq(productInfo.id, id)) + .returning() + return product + } + + async deleteProduct(id: number): Promise { + const [product] = await db + .delete(productInfo) + .where(eq(productInfo.id, id)) + .returning() + return product + } + + async getDealsByProductId(productId: number): Promise { + return db.query.specialDeals.findMany({ + where: eq(specialDeals.productId, productId), + orderBy: specialDeals.quantity, + }) + } + + async createDeals(deals: Partial[]): Promise { + if (deals.length > 0) { + await db.insert(specialDeals).values(deals as any) + } + } + + async deleteDealsByProductId(productId: number): Promise { + await db.delete(specialDeals).where(eq(specialDeals.productId, productId)) + } + + async getTagsByProductId(productId: number): Promise> { + return db.query.productTags.findMany({ + where: eq(productTags.productId, productId), + with: { + tag: true, + }, + }) as any + } + + async createTagAssociations(associations: { productId: number; tagId: number }[]): Promise { + if (associations.length > 0) { + await db.insert(productTags).values(associations) + } + } + + async deleteTagAssociationsByProductId(productId: number): Promise { + await db.delete(productTags).where(eq(productTags.productId, productId)) + } + + async getProductSlotsBySlotId(slotId: number): Promise { + return db.query.productSlots.findMany({ + where: eq(productSlots.slotId, slotId), + }) + } + + async getProductSlotsBySlotIds(slotIds: number[]): Promise { + return db.query.productSlots.findMany({ + where: inArray(productSlots.slotId, slotIds), + columns: { slotId: true, productId: true }, + }) + } + + async createProductSlot(slotId: number, productId: number): Promise { + await db.insert(productSlots).values({ slotId, productId }) + } + + async deleteProductSlotsBySlotId(slotId: number): Promise { + await db.delete(productSlots).where(eq(productSlots.slotId, slotId)) + } + + async deleteProductSlot(slotId: number, productId: number): Promise { + await db + .delete(productSlots) + .where(and(eq(productSlots.slotId, slotId), eq(productSlots.productId, productId))) + } + + async getReviewsByProductId(productId: number, limit: number, offset: number): Promise<(typeof productReviews.$inferSelect & { userName: string | null })[]> { + const reviews = await db + .select({ + id: productReviews.id, + reviewBody: productReviews.reviewBody, + ratings: productReviews.ratings, + imageUrls: productReviews.imageUrls, + reviewTime: productReviews.reviewTime, + adminResponse: productReviews.adminResponse, + adminResponseImages: productReviews.adminResponseImages, + userName: users.name, + }) + .from(productReviews) + .innerJoin(users, eq(productReviews.userId, users.id)) + .where(eq(productReviews.productId, productId)) + .orderBy(desc(productReviews.reviewTime)) + .limit(limit) + .offset(offset) + + return reviews as any + } + + async getReviewCountByProductId(productId: number): Promise { + const result = await db + .select({ count: sql`count(*)` }) + .from(productReviews) + .where(eq(productReviews.productId, productId)) + return Number(result[0].count) + } + + async updateReview(reviewId: number, data: Partial): Promise { + const normalized = { + ...data, + imageUrls: data.imageUrls ? toJsonString(data.imageUrls, '[]') : data.imageUrls, + adminResponseImages: data.adminResponseImages ? toJsonString(data.adminResponseImages, '[]') : data.adminResponseImages, + } + const [review] = await db + .update(productReviews) + .set(normalized) + .where(eq(productReviews.id, reviewId)) + .returning() + return review + } + + async getAllGroups(): Promise { + return db.query.productGroupInfo.findMany({ + with: { + memberships: { + with: { + product: true, + }, + }, + }, + orderBy: desc(productGroupInfo.createdAt), + }) + } + + async getGroupById(id: number): Promise { + return db.query.productGroupInfo.findFirst({ + where: eq(productGroupInfo.id, id), + }) + } + + async createGroup(data: NewProductGroup): Promise { + const [group] = await db.insert(productGroupInfo).values(data).returning() + return group + } + + async updateGroup(id: number, data: Partial): Promise { + const [group] = await db + .update(productGroupInfo) + .set(data) + .where(eq(productGroupInfo.id, id)) + .returning() + return group + } + + async deleteGroup(id: number): Promise { + const [group] = await db + .delete(productGroupInfo) + .where(eq(productGroupInfo.id, id)) + .returning() + return group + } + + async deleteGroupMembershipsByGroupId(groupId: number): Promise { + await db.delete(productGroupMembership).where(eq(productGroupMembership.groupId, groupId)) + } + + async createGroupMemberships(memberships: { productId: number; groupId: number }[]): Promise { + if (memberships.length > 0) { + await db.insert(productGroupMembership).values(memberships) + } + } + + async getUnitById(id: number): Promise { + return db.query.units.findFirst({ + where: eq(units.id, id), + }) + } + + async validateProductIdsExist(productIds: number[]): Promise { + const products = await db.query.productInfo.findMany({ + where: inArray(productInfo.id, productIds), + columns: { id: true }, + }) + return products.length === productIds.length + } + + async batchUpdateProducts(updates: { productId: number; data: Partial }[]): Promise { + const promises = updates.map(update => { + const normalized = { + ...update.data, + images: update.data.images ? toJsonString(update.data.images, '[]') : update.data.images, + } + return db + .update(productInfo) + .set(normalized) + .where(eq(productInfo.id, update.productId)) + }) + await Promise.all(promises) + } +} + +export const productDbService: IProductDbService = new ProductDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/admin-apis/refund-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/refund-queries.ts new file mode 100644 index 0000000..5fe737a --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/refund-queries.ts @@ -0,0 +1,49 @@ +import { db } from '../../db/db_index' +import { refunds, orders, orderStatus, payments } from '../../db/schema' +import { eq, and } from 'drizzle-orm' +import { IRefundDbService, Refund, NewRefund } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/refund-db-service.interface' + +export class RefundDbService implements IRefundDbService { + async createRefund(data: NewRefund): Promise { + const [refund] = await db.insert(refunds).values(data).returning() + return refund + } + + async updateRefund(id: number, data: Partial): Promise { + const [refund] = await db + .update(refunds) + .set(data) + .where(eq(refunds.id, id)) + .returning() + return refund + } + + async getRefundByOrderId(orderId: number): Promise { + return db.query.refunds.findFirst({ + where: eq(refunds.orderId, orderId), + }) + } + + async getOrderById(id: number): Promise { + return db.query.orders.findFirst({ + where: eq(orders.id, id), + }) + } + + async getOrderStatusByOrderId(orderId: number): Promise { + return db.query.orderStatus.findFirst({ + where: eq(orderStatus.orderId, orderId), + }) + } + + async getSuccessfulPaymentByOrderId(orderId: number): Promise { + return db.query.payments.findFirst({ + where: and( + eq(payments.orderId, orderId), + eq(payments.status, 'success') + ), + }) + } +} + +export const refundDbService: IRefundDbService = new RefundDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/admin-apis/schedule-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/schedule-queries.ts new file mode 100644 index 0000000..21e86eb --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/schedule-queries.ts @@ -0,0 +1,60 @@ +import { db } from '../../db/db_index' +import { productAvailabilitySchedules } from '../../db/schema' +import { eq, desc } from 'drizzle-orm' +import { IScheduleDbService, Schedule, NewSchedule } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/schedule-db-service.interface' +import { toJsonString } from '../../db/sqlite-casts' + +export class ScheduleDbService implements IScheduleDbService { + async createSchedule(data: NewSchedule): Promise { + const normalized = { + ...data, + productIds: data.productIds ? toJsonString(data.productIds, '[]') : data.productIds, + groupIds: data.groupIds ? toJsonString(data.groupIds, '[]') : data.groupIds, + } + const [schedule] = await db.insert(productAvailabilitySchedules).values(normalized).returning() + return schedule + } + + async getAllSchedules(): Promise { + return db.query.productAvailabilitySchedules.findMany({ + orderBy: desc(productAvailabilitySchedules.createdAt), + }) + } + + async getScheduleById(id: number): Promise { + return db.query.productAvailabilitySchedules.findFirst({ + where: eq(productAvailabilitySchedules.id, id), + }) + } + + async getScheduleByName(name: string): Promise { + return db.query.productAvailabilitySchedules.findFirst({ + where: eq(productAvailabilitySchedules.scheduleName, name), + }) + } + + async updateSchedule(id: number, data: Partial): Promise { + const normalized = { + ...data, + productIds: data.productIds ? toJsonString(data.productIds, '[]') : data.productIds, + groupIds: data.groupIds ? toJsonString(data.groupIds, '[]') : data.groupIds, + lastUpdated: new Date(), + } + const [schedule] = await db + .update(productAvailabilitySchedules) + .set(normalized) + .where(eq(productAvailabilitySchedules.id, id)) + .returning() + return schedule + } + + async deleteSchedule(id: number): Promise { + const [schedule] = await db + .delete(productAvailabilitySchedules) + .where(eq(productAvailabilitySchedules.id, id)) + .returning() + return schedule + } +} + +export const scheduleDbService: IScheduleDbService = new ScheduleDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/admin-apis/slot-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/slot-queries.ts new file mode 100644 index 0000000..5d8044c --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/slot-queries.ts @@ -0,0 +1,161 @@ +import { db } from '../../db/db_index' +import { deliverySlotInfo, productSlots, vendorSnippets, productInfo, productGroupInfo } from '../../db/schema' +import { eq, inArray, and, desc } from 'drizzle-orm' +import { ISlotDbService, Slot, NewSlot, ProductSlot, SlotWithRelations } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/slot-db-service.interface' +import { parseNumberArray, toJsonString } from '../../db/sqlite-casts' + +export class SlotDbService implements ISlotDbService { + async getAllSlots(): Promise { + return db.query.deliverySlotInfo.findMany({ + orderBy: desc(deliverySlotInfo.deliveryTime), + with: { + productSlots: { + with: { + product: { + columns: { id: true, name: true, images: true }, + }, + }, + }, + }, + }) as Promise + } + + async getActiveSlots(): Promise { + return db.query.deliverySlotInfo.findMany({ + where: eq(deliverySlotInfo.isActive, true), + orderBy: desc(deliverySlotInfo.deliveryTime), + }) + } + + async getSlotById(id: number): Promise { + return db.query.deliverySlotInfo.findFirst({ + where: eq(deliverySlotInfo.id, id), + with: { + productSlots: { + with: { + product: { + columns: { id: true, name: true, images: true }, + }, + }, + }, + vendorSnippets: true, + }, + }) as Promise + } + + async createSlot(data: NewSlot): Promise { + const normalized = { + ...data, + deliverySequence: data.deliverySequence ? toJsonString(data.deliverySequence, '{}') : data.deliverySequence, + groupIds: data.groupIds ? toJsonString(data.groupIds, '[]') : data.groupIds, + } + const [slot] = await db.insert(deliverySlotInfo).values(normalized).returning() + return slot + } + + async updateSlot(id: number, data: Partial): Promise { + const normalized = { + ...data, + deliverySequence: data.deliverySequence ? toJsonString(data.deliverySequence, '{}') : data.deliverySequence, + groupIds: data.groupIds ? toJsonString(data.groupIds, '[]') : data.groupIds, + } + const [slot] = await db + .update(deliverySlotInfo) + .set(normalized) + .where(eq(deliverySlotInfo.id, id)) + .returning() + return slot + } + + async deactivateSlot(id: number): Promise { + const [slot] = await db + .update(deliverySlotInfo) + .set({ isActive: false }) + .where(eq(deliverySlotInfo.id, id)) + .returning() + return slot + } + + async getProductSlotsBySlotId(slotId: number): Promise { + return db.query.productSlots.findMany({ + where: eq(productSlots.slotId, slotId), + }) + } + + async getProductSlotsBySlotIds(slotIds: number[]): Promise { + return db.query.productSlots.findMany({ + where: inArray(productSlots.slotId, slotIds), + columns: { slotId: true, productId: true }, + }) + } + + async createProductSlot(slotId: number, productId: number): Promise { + await db.insert(productSlots).values({ slotId, productId }) + } + + async deleteProductSlot(slotId: number, productId: number): Promise { + await db + .delete(productSlots) + .where(and(eq(productSlots.slotId, slotId), eq(productSlots.productId, productId))) + } + + async deleteProductSlotsBySlotId(slotId: number): Promise { + await db.delete(productSlots).where(eq(productSlots.slotId, slotId)) + } + + async getVendorSnippetsBySlotId(slotId: number): Promise> { + const snippets = await db.query.vendorSnippets.findMany({ + where: eq(vendorSnippets.slotId, slotId), + }) + + return snippets.map((snippet) => ({ + ...snippet, + productIds: parseNumberArray(snippet.productIds), + })) as Array<{ id: number; snippetCode: string; slotId: number | null; productIds: number[]; validTill: Date | null; createdAt: Date; isPermanent: boolean | null }> + } + + async createVendorSnippet(data: { snippetCode: string; slotId: number; productIds: number[]; validTill?: Date }): Promise<{ id: number; snippetCode: string; slotId: number | null; productIds: number[]; validTill: Date | null; createdAt: Date; isPermanent: boolean | null }> { + const [snippet] = await db.insert(vendorSnippets).values({ + snippetCode: data.snippetCode, + slotId: data.slotId, + productIds: toJsonString(data.productIds, '[]'), + validTill: data.validTill || null, + }).returning() + return { + ...snippet, + productIds: parseNumberArray(snippet.productIds), + } + } + + async checkSnippetCodeExists(code: string): Promise { + const existing = await db.query.vendorSnippets.findFirst({ + where: eq(vendorSnippets.snippetCode, code), + }) + return !!existing + } + + async validateProductsExist(productIds: number[]): Promise { + const products = await db.query.productInfo.findMany({ + where: inArray(productInfo.id, productIds), + }) + return products.length === productIds.length + } + + async getProductsByIds(productIds: number[]): Promise { + return db.query.productInfo.findMany({ + where: inArray(productInfo.id, productIds), + }) + } + + async getGroupsByIds(groupIds: number[]): Promise> { + return db.query.productGroupInfo.findMany({ + where: inArray(productGroupInfo.id, groupIds), + }) + } + + async withTransaction(fn: (tx: any) => Promise): Promise { + return db.transaction(fn) + } +} + +export const slotDbService: ISlotDbService = new SlotDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/admin-apis/staff-user-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/staff-user-queries.ts new file mode 100644 index 0000000..a28d8a3 --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/staff-user-queries.ts @@ -0,0 +1,104 @@ +import { db } from '../../db/db_index' +import { staffUsers, staffRoles, users, userDetails, orders } from '../../db/schema' +import { eq, or, like, and, lt, desc } from 'drizzle-orm' +import { IStaffUserDbService, StaffUser, NewStaffUser, StaffRole, StaffUserWithRole } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/staff-user-db-service.interface' + +export class StaffUserDbService implements IStaffUserDbService { + async getStaffUserByName(name: string): Promise { + return db.query.staffUsers.findFirst({ + where: eq(staffUsers.name, name), + }) + } + + async getAllStaff(): Promise { + return db.query.staffUsers.findMany({ + columns: { id: true, name: true }, + with: { + role: { + with: { + rolePermissions: { + with: { permission: true }, + }, + }, + }, + }, + }) + } + + async createStaffUser(data: NewStaffUser): Promise { + const [user] = await db.insert(staffUsers).values(data).returning() + return user + } + + async getRoleById(id: number): Promise { + return db.query.staffRoles.findFirst({ + where: eq(staffRoles.id, id), + }) + } + + async getAllRoles(): Promise> { + return db.query.staffRoles.findMany({ + columns: { id: true, roleName: true }, + }) + } + + async getUsers(options: { cursor?: number; limit: number; search?: string }): Promise { + const { cursor, limit, search } = options + + let whereCondition = undefined + + if (search) { + whereCondition = or( + like(users.name, `%${search}%`), + like(users.email, `%${search}%`), + like(users.mobile, `%${search}%`) + ) + } + + if (cursor) { + const cursorCondition = lt(users.id, cursor) + whereCondition = whereCondition ? and(whereCondition, cursorCondition) : cursorCondition + } + + return db.query.users.findMany({ + where: whereCondition, + with: { userDetails: true }, + orderBy: desc(users.id), + limit: limit + 1, + }) + } + + async getUserById(id: number): Promise { + return db.query.users.findFirst({ + where: eq(users.id, id), + with: { + userDetails: true, + orders: { + orderBy: desc(orders.createdAt), + limit: 1, + }, + }, + }) + } + + async upsertUserDetails(data: Partial & { userId: number }): Promise { + await db + .insert(userDetails) + .values(data) + .onConflictDoUpdate({ + target: userDetails.userId, + set: data, + }) + } + + async getLastOrderByUserId(userId: number): Promise { + const userOrders = await db.query.orders.findMany({ + where: eq(orders.userId, userId), + orderBy: desc(orders.createdAt), + limit: 1, + }) + return userOrders[0] + } +} + +export const staffUserDbService: IStaffUserDbService = new StaffUserDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/admin-apis/store-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/store-queries.ts new file mode 100644 index 0000000..e1cb55b --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/store-queries.ts @@ -0,0 +1,53 @@ +import { db } from '../../db/db_index' +import { storeInfo, productInfo } from '../../db/schema' +import { eq, inArray } from 'drizzle-orm' +import { IStoreDbService, Store, NewStore } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/store-db-service.interface' + +export class StoreDbService implements IStoreDbService { + async getAllStores(): Promise { + return db.query.storeInfo.findMany({ + with: { owner: true }, + }) + } + + async getStoreById(id: number): Promise { + return db.query.storeInfo.findFirst({ + where: eq(storeInfo.id, id), + with: { owner: true }, + }) + } + + async createStore(data: NewStore): Promise { + const [store] = await db.insert(storeInfo).values(data).returning() + return store + } + + async updateStore(id: number, data: Partial): Promise { + const [store] = await db + .update(storeInfo) + .set(data) + .where(eq(storeInfo.id, id)) + .returning() + return store + } + + async deleteStore(id: number): Promise { + await db.delete(storeInfo).where(eq(storeInfo.id, id)) + } + + async assignProductsToStore(storeId: number, productIds: number[]): Promise { + await db + .update(productInfo) + .set({ storeId }) + .where(inArray(productInfo.id, productIds)) + } + + async removeProductsFromStore(storeId: number): Promise { + await db + .update(productInfo) + .set({ storeId: null }) + .where(eq(productInfo.storeId, storeId)) + } +} + +export const storeDbService: IStoreDbService = new StoreDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/admin-apis/tag-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/tag-queries.ts new file mode 100644 index 0000000..c3a5163 --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/tag-queries.ts @@ -0,0 +1,51 @@ +import { db } from '../../db/db_index' +import { productTagInfo } from '../../db/schema' +import { eq } from 'drizzle-orm' +import { ITagDbService, Tag, NewTag } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/tag-db-service.interface' +import { toJsonString } from '../../db/sqlite-casts' + +export class TagDbService implements ITagDbService { + async getAllTags(): Promise { + return db.select().from(productTagInfo).orderBy(productTagInfo.tagName) + } + + async getTagById(id: number): Promise { + return db.query.productTagInfo.findFirst({ + where: eq(productTagInfo.id, id), + }) + } + + async getTagByName(name: string): Promise { + return db.query.productTagInfo.findFirst({ + where: eq(productTagInfo.tagName, name.trim()), + }) + } + + async createTag(data: NewTag): Promise { + const normalized = { + ...data, + relatedStores: data.relatedStores ? toJsonString(data.relatedStores, '[]') : data.relatedStores, + } + const [tag] = await db.insert(productTagInfo).values(normalized).returning() + return tag + } + + async updateTag(id: number, data: Partial): Promise { + const normalized = { + ...data, + relatedStores: data.relatedStores ? toJsonString(data.relatedStores, '[]') : data.relatedStores, + } + const [tag] = await db + .update(productTagInfo) + .set(normalized) + .where(eq(productTagInfo.id, id)) + .returning() + return tag + } + + async deleteTag(id: number): Promise { + await db.delete(productTagInfo).where(eq(productTagInfo.id, id)) + } +} + +export const tagDbService: ITagDbService = new TagDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/admin-apis/user-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/user-queries.ts new file mode 100644 index 0000000..5e75809 --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/user-queries.ts @@ -0,0 +1,172 @@ +import { db } from '../../db/db_index' +import { users, userDetails, orders, orderItems, orderStatus, complaints, notifCreds, unloggedUserTokens, userIncidents } from '../../db/schema' +import { eq, desc, asc, count, max, inArray, and, like, gt } from 'drizzle-orm' +import { IUserDbService, User, NewUser, UserDetail } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/user-db-service.interface' + +export class UserDbService implements IUserDbService { + async getUserById(id: number): Promise { + return db.query.users.findFirst({ + where: eq(users.id, id), + }) + } + + async getUserByMobile(mobile: string): Promise { + return db.query.users.findFirst({ + where: eq(users.mobile, mobile), + }) + } + + async getUsers(options: { limit: number; cursor?: number; search?: string }): Promise { + const { limit, cursor, search } = options + + const conditions = [] + + if (search && search.trim()) { + conditions.push(like(users.mobile, `%${search.trim()}%`)) + } + + if (cursor) { + conditions.push(gt(users.id, cursor)) + } + + const whereCondition = conditions.length > 0 ? and(...conditions) : undefined + + return db + .select() + .from(users) + .where(whereCondition) + .orderBy(asc(users.id)) + .limit(limit + 1) + } + + async createUser(data: NewUser): Promise { + const [user] = await db.insert(users).values(data).returning() + return user + } + + async getUserDetailsByUserId(userId: number): Promise { + return db.query.userDetails.findFirst({ + where: eq(userDetails.userId, userId), + }) + } + + async upsertUserDetails(data: Partial & { userId: number }): Promise { + await db + .insert(userDetails) + .values(data) + .onConflictDoUpdate({ + target: userDetails.userId, + set: data, + }) + } + + async getOrdersByUserId(userId: number): Promise { + return db + .select() + .from(orders) + .where(eq(orders.userId, userId)) + .orderBy(desc(orders.createdAt)) + } + + async getLastOrderByUserId(userId: number): Promise { + const userOrders = await db + .select() + .from(orders) + .where(eq(orders.userId, userId)) + .orderBy(desc(orders.createdAt)) + .limit(1) + return userOrders[0] + } + + async getOrderCountByUserIds(userIds: number[]): Promise<{ userId: number; totalOrders: number }[]> { + if (userIds.length === 0) return [] + return db + .select({ + userId: orders.userId, + totalOrders: count(orders.id), + }) + .from(orders) + .where(inArray(orders.userId, userIds)) + .groupBy(orders.userId) + } + + async getLastOrderDateByUserIds(userIds: number[]): Promise<{ userId: number; lastOrderDate: Date | null }[]> { + if (userIds.length === 0) return [] + return db + .select({ + userId: orders.userId, + lastOrderDate: max(orders.createdAt), + }) + .from(orders) + .where(inArray(orders.userId, userIds)) + .groupBy(orders.userId) + } + + async getOrderStatusByOrderIds(orderIds: number[]): Promise<{ orderId: number; isDelivered: boolean; isCancelled: boolean }[]> { + if (orderIds.length === 0) return [] + return db + .select({ + orderId: orderStatus.orderId, + isDelivered: orderStatus.isDelivered, + isCancelled: orderStatus.isCancelled, + }) + .from(orderStatus) + .where(inArray(orderStatus.orderId, orderIds)) + } + + async getOrderItemCountByOrderIds(orderIds: number[]): Promise<{ orderId: number; itemCount: number }[]> { + if (orderIds.length === 0) return [] + return db + .select({ + orderId: orderItems.orderId, + itemCount: count(orderItems.id), + }) + .from(orderItems) + .where(inArray(orderItems.orderId, orderIds)) + .groupBy(orderItems.orderId) + } + + async getUnresolvedComplaintCount(): Promise { + return db.$count(complaints, eq(complaints.isResolved, false)) + } + + async getAllNotifTokens(): Promise { + const tokens = await db.select({ token: notifCreds.token }).from(notifCreds) + return tokens.map(t => t.token) + } + + async getNotifTokensByUserIds(userIds: number[]): Promise { + const tokens = await db + .select({ token: notifCreds.token }) + .from(notifCreds) + .where(inArray(notifCreds.userId, userIds)) + return tokens.map(t => t.token) + } + + async getUnloggedTokens(): Promise { + const tokens = await db.select({ token: unloggedUserTokens.token }).from(unloggedUserTokens) + return tokens.map(t => t.token) + } + + async getUserIncidentsByUserId(userId: number): Promise } | null; addedBy?: { name: string | null } | null }>> { + return db.query.userIncidents.findMany({ + where: eq(userIncidents.userId, userId), + with: { + order: { + with: { + orderStatus: true, + }, + }, + addedBy: true, + }, + orderBy: desc(userIncidents.dateAdded), + }) + } + + async createUserIncident(data: { userId: number; orderId?: number | null; adminComment?: string | null; addedBy: number; negativityScore?: number | null }): Promise { + const [incident] = await db.insert(userIncidents).values(data).returning() + return incident + } +} + +export const userDbService: IUserDbService = new UserDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/admin-apis/vendor-snippets-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/vendor-snippets-queries.ts new file mode 100644 index 0000000..39ea40c --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/admin-apis/vendor-snippets-queries.ts @@ -0,0 +1,141 @@ +import { db } from '../../db/db_index' +import { vendorSnippets, deliverySlotInfo, orders, orderItems, productInfo } from '../../db/schema' +import { eq, and, inArray, gt, asc, desc } from 'drizzle-orm' +import { IVendorSnippetDbService, VendorSnippet, NewVendorSnippet } from '../../../../backend/src/trpc/apis/admin-apis/dataAccessors/interfaces/vendor-snippet-db-service.interface' +import { toJsonString } from '../../db/sqlite-casts' + +export class VendorSnippetDbService implements IVendorSnippetDbService { + async createSnippet(data: NewVendorSnippet): Promise { + const normalized = { + ...data, + productIds: data.productIds ? toJsonString(data.productIds, '[]') : data.productIds, + } + const [snippet] = await db.insert(vendorSnippets).values(normalized).returning() + return snippet + } + + async getAllSnippets(): Promise { + return db.query.vendorSnippets.findMany({ + with: { slot: true }, + orderBy: desc(vendorSnippets.createdAt), + }) + } + + async getSnippetById(id: number): Promise { + return db.query.vendorSnippets.findFirst({ + where: eq(vendorSnippets.id, id), + with: { slot: true }, + }) + } + + async getSnippetByCode(code: string): Promise { + return db.query.vendorSnippets.findFirst({ + where: eq(vendorSnippets.snippetCode, code), + }) + } + + async updateSnippet(id: number, data: Partial): Promise { + const normalized = { + ...data, + productIds: data.productIds ? toJsonString(data.productIds, '[]') : data.productIds, + } + const [snippet] = await db + .update(vendorSnippets) + .set(normalized) + .where(eq(vendorSnippets.id, id)) + .returning() + return snippet + } + + async deleteSnippet(id: number): Promise { + const [snippet] = await db + .delete(vendorSnippets) + .where(eq(vendorSnippets.id, id)) + .returning() + return snippet + } + + async checkSnippetCodeExists(code: string): Promise { + const existing = await db.query.vendorSnippets.findFirst({ + where: eq(vendorSnippets.snippetCode, code), + }) + return !!existing + } + + async getSlotById(id: number): Promise { + return db.query.deliverySlotInfo.findFirst({ + where: eq(deliverySlotInfo.id, id), + }) + } + + async getUpcomingSlots(since: Date): Promise { + return db.query.deliverySlotInfo.findMany({ + where: and( + eq(deliverySlotInfo.isActive, true), + gt(deliverySlotInfo.deliveryTime, since) + ), + orderBy: asc(deliverySlotInfo.deliveryTime), + }) + } + + async getProductsByIds(ids: number[]): Promise> { + return db.query.productInfo.findMany({ + where: inArray(productInfo.id, ids), + columns: { id: true, name: true }, + }) + } + + async validateProductsExist(ids: number[]): Promise { + const products = await db.query.productInfo.findMany({ + where: inArray(productInfo.id, ids), + }) + return products.length === ids.length + } + + async getOrdersBySlotId(slotId: number): Promise { + return db.query.orders.findMany({ + where: eq(orders.slotId, slotId), + with: { + orderItems: { + with: { + product: { + with: { unit: true }, + }, + }, + }, + orderStatus: true, + user: true, + slot: true, + }, + orderBy: desc(orders.createdAt), + }) + } + + async getOrderItemsByOrderIds(orderIds: number[]): Promise { + return db.query.orderItems.findMany({ + where: inArray(orderItems.orderId, orderIds), + }) + } + + async getOrderItemById(id: number): Promise { + return db.query.orderItems.findFirst({ + where: eq(orderItems.id, id), + }) + } + + async updateOrderItemPackaging(id: number, is_packaged: boolean): Promise { + await db + .update(orderItems) + .set({ is_packaged }) + .where(eq(orderItems.id, id)) + } + + async hasSnippetForSlot(slotId: number): Promise { + const snippet = await db.query.vendorSnippets.findFirst({ + where: eq(vendorSnippets.slotId, slotId), + }) + return !!snippet + } +} + +export const vendorSnippetDbService: IVendorSnippetDbService = new VendorSnippetDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-address-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-address-queries.ts new file mode 100644 index 0000000..3a30b34 --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-address-queries.ts @@ -0,0 +1,71 @@ +import { db } from '../../db/db_index' +import { addresses, orders, orderStatus, deliverySlotInfo } from '../../db/schema' +import { eq, and, gte } from 'drizzle-orm' +import { IUserAddressDbService, Address, NewAddress } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-address-db-service.interface' + +export class UserAddressDbService implements IUserAddressDbService { + async getDefaultAddress(userId: number): Promise
{ + const [defaultAddress] = await db + .select() + .from(addresses) + .where(and(eq(addresses.userId, userId), eq(addresses.isDefault, true))) + .limit(1) + return defaultAddress + } + + async getUserAddresses(userId: number): Promise { + return db.select().from(addresses).where(eq(addresses.userId, userId)) + } + + async unsetDefaultForUser(userId: number): Promise { + await db.update(addresses).set({ isDefault: false }).where(eq(addresses.userId, userId)) + } + + async createAddress(data: NewAddress): Promise
{ + const [newAddress] = await db.insert(addresses).values(data).returning() + return newAddress + } + + async getAddressByIdForUser(addressId: number, userId: number): Promise
{ + const [address] = await db + .select() + .from(addresses) + .where(and(eq(addresses.id, addressId), eq(addresses.userId, userId))) + .limit(1) + return address + } + + async updateAddressForUser(addressId: number, userId: number, data: Partial): Promise
{ + const [updated] = await db + .update(addresses) + .set(data) + .where(and(eq(addresses.id, addressId), eq(addresses.userId, userId))) + .returning() + return updated + } + + async deleteAddressForUser(addressId: number, userId: number): Promise { + await db.delete(addresses).where(and(eq(addresses.id, addressId), eq(addresses.userId, userId))) + } + + async hasOngoingOrdersForAddress(addressId: number): Promise { + const ongoingOrders = await db + .select({ + orderId: orders.id, + }) + .from(orders) + .innerJoin(orderStatus, eq(orders.id, orderStatus.orderId)) + .innerJoin(deliverySlotInfo, eq(orders.slotId, deliverySlotInfo.id)) + .where( + and( + eq(orders.addressId, addressId), + eq(orderStatus.isCancelled, false), + gte(deliverySlotInfo.deliveryTime, new Date()) + ) + ) + .limit(1) + return ongoingOrders.length > 0 + } +} + +export const userAddressDbService: IUserAddressDbService = new UserAddressDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-auth-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-auth-queries.ts new file mode 100644 index 0000000..8ccbc11 --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-auth-queries.ts @@ -0,0 +1,122 @@ +import { db } from '../../db/db_index' +import { users, userCreds, userDetails, addresses, cartItems, complaints, couponApplicableUsers, couponUsage, notifCreds, notifications, orderItems, orderStatus, orders, payments, refunds, productReviews, reservedCoupons } from '../../db/schema' +import { eq } from 'drizzle-orm' +import { IUserAuthDbService, User, UserCred, UserDetail } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-auth-db-service.interface' + +export class UserAuthDbService implements IUserAuthDbService { + async getUserByEmail(email: string): Promise { + const [user] = await db.select().from(users).where(eq(users.email, email)).limit(1) + return user + } + + async getUserByMobile(mobile: string): Promise { + const [user] = await db.select().from(users).where(eq(users.mobile, mobile)).limit(1) + return user + } + + async getUserById(userId: number): Promise { + const [user] = await db.select().from(users).where(eq(users.id, userId)).limit(1) + return user + } + + async getUserCredsByUserId(userId: number): Promise { + const [creds] = await db.select().from(userCreds).where(eq(userCreds.userId, userId)).limit(1) + return creds + } + + async getUserDetailsByUserId(userId: number): Promise { + const [detail] = await db.select().from(userDetails).where(eq(userDetails.userId, userId)).limit(1) + return detail + } + + async createUserWithCredsAndDetails(data: { name: string | null; email: string | null; mobile: string; passwordHash: string; imageKey?: string | null }): Promise { + const { name, email, mobile, passwordHash, imageKey } = data + return db.transaction(async (tx) => { + const [user] = await tx + .insert(users) + .values({ name, email, mobile }) + .returning() + + await tx + .insert(userCreds) + .values({ userId: user.id, userPassword: passwordHash }) + + if (imageKey) { + await tx.insert(userDetails).values({ userId: user.id, profileImage: imageKey }) + } + + return user + }) + } + + async createUser(data: { name: string | null; email: string | null; mobile: string }): Promise { + const [user] = await db.insert(users).values(data).returning() + return user + } + + async upsertUserCreds(userId: number, passwordHash: string): Promise { + await db + .insert(userCreds) + .values({ userId, userPassword: passwordHash }) + .onConflictDoUpdate({ + target: userCreds.userId, + set: { userPassword: passwordHash }, + }) + } + + async updateUserName(userId: number, name: string): Promise { + await db.update(users).set({ name }).where(eq(users.id, userId)) + } + + async updateUserEmail(userId: number, email: string): Promise { + await db.update(users).set({ email }).where(eq(users.id, userId)) + } + + async upsertUserDetails(userId: number, data: Partial): Promise { + await db + .insert(userDetails) + .values({ userId, ...data }) + .onConflictDoUpdate({ + target: userDetails.userId, + set: data, + }) + } + + async deleteAccountByUserId(userId: number): Promise { + await db.transaction(async (tx) => { + await tx.delete(notifCreds).where(eq(notifCreds.userId, userId)) + await tx.delete(couponApplicableUsers).where(eq(couponApplicableUsers.userId, userId)) + await tx.delete(couponUsage).where(eq(couponUsage.userId, userId)) + await tx.delete(complaints).where(eq(complaints.userId, userId)) + await tx.delete(cartItems).where(eq(cartItems.userId, userId)) + await tx.delete(notifications).where(eq(notifications.userId, userId)) + await tx.delete(productReviews).where(eq(productReviews.userId, userId)) + + await tx.update(reservedCoupons) + .set({ redeemedBy: null }) + .where(eq(reservedCoupons.redeemedBy, userId)) + + const userOrders = await tx + .select({ id: orders.id }) + .from(orders) + .where(eq(orders.userId, userId)) + + for (const order of userOrders) { + await tx.delete(orderItems).where(eq(orderItems.orderId, order.id)) + await tx.delete(orderStatus).where(eq(orderStatus.orderId, order.id)) + await tx.delete(payments).where(eq(payments.orderId, order.id)) + await tx.delete(refunds).where(eq(refunds.orderId, order.id)) + await tx.delete(couponUsage).where(eq(couponUsage.orderId, order.id)) + await tx.delete(complaints).where(eq(complaints.orderId, order.id)) + } + + await tx.delete(orders).where(eq(orders.userId, userId)) + await tx.delete(addresses).where(eq(addresses.userId, userId)) + await tx.delete(userDetails).where(eq(userDetails.userId, userId)) + await tx.delete(userCreds).where(eq(userCreds.userId, userId)) + await tx.delete(users).where(eq(users.id, userId)) + }) + } +} + +export const userAuthDbService: IUserAuthDbService = new UserAuthDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-banner-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-banner-queries.ts new file mode 100644 index 0000000..553e841 --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-banner-queries.ts @@ -0,0 +1,15 @@ +import { db } from '../../db/db_index' +import { homeBanners } from '../../db/schema' +import { isNotNull, asc } from 'drizzle-orm' +import { IUserBannerDbService, UserBanner } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-banner-db-service.interface' + +export class UserBannerDbService implements IUserBannerDbService { + async getActiveBanners(): Promise { + return db.query.homeBanners.findMany({ + where: isNotNull(homeBanners.serialNum), + orderBy: asc(homeBanners.serialNum), + }) + } +} + +export const userBannerDbService: IUserBannerDbService = new UserBannerDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-cart-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-cart-queries.ts new file mode 100644 index 0000000..267b13d --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-cart-queries.ts @@ -0,0 +1,75 @@ +import { db } from '../../db/db_index' +import { cartItems, productInfo, units } from '../../db/schema' +import { eq, and, sql } from 'drizzle-orm' +import { IUserCartDbService, CartItem } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-cart-db-service.interface' + +export class UserCartDbService implements IUserCartDbService { + async getCartItemsWithProducts(userId: number) { + return db + .select({ + cartId: cartItems.id, + productId: productInfo.id, + productName: productInfo.name, + productPrice: productInfo.price, + productImages: productInfo.images, + productQuantity: productInfo.productQuantity, + isOutOfStock: productInfo.isOutOfStock, + unitShortNotation: units.shortNotation, + quantity: cartItems.quantity, + addedAt: cartItems.addedAt, + }) + .from(cartItems) + .innerJoin(productInfo, eq(cartItems.productId, productInfo.id)) + .innerJoin(units, eq(productInfo.unitId, units.id)) + .where(eq(cartItems.userId, userId)) + } + + async getProductById(productId: number) { + return db.query.productInfo.findFirst({ + where: eq(productInfo.id, productId), + }) + } + + async getCartItemByUserAndProduct(userId: number, productId: number): Promise { + return db.query.cartItems.findFirst({ + where: and(eq(cartItems.userId, userId), eq(cartItems.productId, productId)), + }) + } + + async incrementCartItemQuantity(cartItemId: number, quantity: number): Promise { + await db.update(cartItems) + .set({ + quantity: sql`${cartItems.quantity} + ${quantity}`, + }) + .where(eq(cartItems.id, cartItemId)) + } + + async createCartItem(userId: number, productId: number, quantity: number): Promise { + await db.insert(cartItems).values({ + userId, + productId, + quantity: quantity.toString(), + }) + } + + async updateCartItemQuantity(itemId: number, userId: number, quantity: number): Promise { + const [updatedItem] = await db.update(cartItems) + .set({ quantity: quantity.toString() }) + .where(and(eq(cartItems.id, itemId), eq(cartItems.userId, userId))) + .returning() + return updatedItem + } + + async deleteCartItem(itemId: number, userId: number): Promise { + const [deletedItem] = await db.delete(cartItems) + .where(and(eq(cartItems.id, itemId), eq(cartItems.userId, userId))) + .returning() + return deletedItem + } + + async clearCart(userId: number): Promise { + await db.delete(cartItems).where(eq(cartItems.userId, userId)) + } +} + +export const userCartDbService: IUserCartDbService = new UserCartDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-complaint-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-complaint-queries.ts new file mode 100644 index 0000000..fdd176d --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-complaint-queries.ts @@ -0,0 +1,33 @@ +import { db } from '../../db/db_index' +import { complaints } from '../../db/schema' +import { eq, asc } from 'drizzle-orm' +import { IUserComplaintDbService, NewComplaint } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-complaint-db-service.interface' +import { toJsonString } from '../../db/sqlite-casts' + +export class UserComplaintDbService implements IUserComplaintDbService { + async getComplaintsByUserId(userId: number) { + return db + .select({ + id: complaints.id, + complaintBody: complaints.complaintBody, + response: complaints.response, + isResolved: complaints.isResolved, + createdAt: complaints.createdAt, + orderId: complaints.orderId, + images: complaints.images, + }) + .from(complaints) + .where(eq(complaints.userId, userId)) + .orderBy(asc(complaints.createdAt)) + } + + async createComplaint(data: NewComplaint) { + const normalized = { + ...data, + images: data.images ? toJsonString(data.images, '[]') : data.images, + } + await db.insert(complaints).values(normalized) + } +} + +export const userComplaintDbService: IUserComplaintDbService = new UserComplaintDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-coupon-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-coupon-queries.ts new file mode 100644 index 0000000..6d1c665 --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-coupon-queries.ts @@ -0,0 +1,88 @@ +import { db } from '../../db/db_index' +import { coupons, couponUsage, couponApplicableUsers, couponApplicableProducts, reservedCoupons } from '../../db/schema' +import { eq, and, or, gt, isNull } from 'drizzle-orm' +import { IUserCouponDbService, Coupon, ReservedCoupon, CouponWithRelations } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-coupon-db-service.interface' + +export class UserCouponDbService implements IUserCouponDbService { + async getActiveCouponsForUser(userId: number): Promise { + return db.query.coupons.findMany({ + where: and( + eq(coupons.isInvalidated, false), + or( + isNull(coupons.validTill), + gt(coupons.validTill, new Date()) + ) + ), + with: { + usages: { + where: eq(couponUsage.userId, userId), + }, + applicableUsers: { + with: { user: true }, + }, + applicableProducts: { + with: { product: true }, + }, + }, + }) as Promise + } + + async getAllCouponsForUser(userId: number): Promise { + return db.query.coupons.findMany({ + with: { + usages: { + where: eq(couponUsage.userId, userId), + }, + applicableUsers: { + with: { user: true }, + }, + applicableProducts: { + with: { product: true }, + }, + }, + }) as Promise + } + + async getReservedCouponBySecretCode(secretCode: string): Promise { + return db.query.reservedCoupons.findFirst({ + where: and( + eq(reservedCoupons.secretCode, secretCode.toUpperCase()), + eq(reservedCoupons.isRedeemed, false) + ), + }) + } + + async redeemReservedCoupon(userId: number, reservedCoupon: ReservedCoupon): Promise { + return db.transaction(async (tx) => { + const [coupon] = await tx.insert(coupons).values({ + couponCode: reservedCoupon.couponCode, + isUserBased: true, + discountPercent: reservedCoupon.discountPercent, + flatDiscount: reservedCoupon.flatDiscount, + minOrder: reservedCoupon.minOrder, + productIds: reservedCoupon.productIds, + maxValue: reservedCoupon.maxValue, + isApplyForAll: false, + validTill: reservedCoupon.validTill, + maxLimitForUser: reservedCoupon.maxLimitForUser, + exclusiveApply: reservedCoupon.exclusiveApply, + createdBy: reservedCoupon.createdBy, + }).returning() + + await tx.insert(couponApplicableUsers).values({ + couponId: coupon.id, + userId, + }) + + await tx.update(reservedCoupons).set({ + isRedeemed: true, + redeemedBy: userId, + redeemedAt: new Date(), + }).where(eq(reservedCoupons.id, reservedCoupon.id)) + + return coupon + }) + } +} + +export const userCouponDbService: IUserCouponDbService = new UserCouponDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-order-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-order-queries.ts new file mode 100644 index 0000000..64463a8 --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-order-queries.ts @@ -0,0 +1,265 @@ +import { db } from '../../db/db_index' +import { + orders, + orderItems, + orderStatus, + addresses, + productInfo, + paymentInfoTable, + coupons, + couponUsage, + cartItems, + refunds, + units, + userDetails, +} from '../../db/schema' +import { and, desc, eq, gte, inArray } from 'drizzle-orm' +import { + IUserOrderDbService, + Order, +} from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-order-db-service.interface' + +export class UserOrderDbService implements IUserOrderDbService { + async getUserDetailByUserId(userId: number) { + return db.query.userDetails.findFirst({ + where: eq(userDetails.userId, userId), + }) + } + + async getAddressByUserId(userId: number, addressId: number) { + return db.query.addresses.findFirst({ + where: and(eq(addresses.userId, userId), eq(addresses.id, addressId)), + }) + } + + async getProductById(productId: number) { + return db.query.productInfo.findFirst({ + where: eq(productInfo.id, productId), + }) + } + + async getCouponWithUsage(couponId: number, userId: number) { + return db.query.coupons.findFirst({ + where: eq(coupons.id, couponId), + with: { + usages: { where: eq(couponUsage.userId, userId) }, + }, + }) + } + + async createOrdersWithItems(params: { + ordersData: Array<{ + order: Omit + orderItems: Omit[] + orderStatus: Omit + }> + paymentMethod: 'online' | 'cod' + }): Promise { + const { ordersData, paymentMethod } = params + return db.transaction(async (tx) => { + let sharedPaymentInfoId: number | null = null + if (paymentMethod === 'online') { + const [paymentInfo] = await tx + .insert(paymentInfoTable) + .values({ + status: 'pending', + gateway: 'razorpay', + merchantOrderId: `multi_order_${Date.now()}`, + }) + .returning() + sharedPaymentInfoId = paymentInfo.id + } + + const ordersToInsert: Omit[] = ordersData.map( + (od) => ({ + ...od.order, + paymentInfoId: sharedPaymentInfoId, + }) + ) + + const insertedOrders = await tx.insert(orders).values(ordersToInsert).returning() + + const allOrderItems: Omit[] = [] + const allOrderStatuses: Omit[] = [] + + insertedOrders.forEach((order, index) => { + const od = ordersData[index] + od.orderItems.forEach((item) => { + allOrderItems.push({ ...item, orderId: order.id as number }) + }) + allOrderStatuses.push({ + ...od.orderStatus, + orderId: order.id as number, + }) + }) + + await tx.insert(orderItems).values(allOrderItems) + await tx.insert(orderStatus).values(allOrderStatuses) + + return insertedOrders + }) + } + + async deleteCartItemsByUserAndProductIds(userId: number, productIds: number[]) { + await db.delete(cartItems).where( + and(eq(cartItems.userId, userId), inArray(cartItems.productId, productIds)) + ) + } + + async createCouponUsage(params: { userId: number; couponId: number; orderId: number }) { + const { userId, couponId, orderId } = params + await db.insert(couponUsage).values({ + userId, + couponId, + orderId, + orderItemId: null, + usedAt: new Date(), + }) + } + + async getOrdersCount(userId: number) { + return db.$count(orders, eq(orders.userId, userId)) + } + + async getOrdersWithRelations(userId: number, limit: number, offset: number) { + return db.query.orders.findMany({ + where: eq(orders.userId, userId), + with: { + orderItems: { + with: { + product: true, + }, + }, + slot: true, + paymentInfo: true, + orderStatus: true, + refunds: true, + }, + orderBy: (ordersRef, { desc }) => [desc(ordersRef.createdAt)], + limit, + offset, + }) + } + + async getOrderWithDetailsById(orderId: number, userId: number) { + return db.query.orders.findFirst({ + where: and(eq(orders.id, orderId), eq(orders.userId, userId)), + with: { + orderItems: { + with: { + product: true, + }, + }, + slot: true, + paymentInfo: true, + orderStatus: { + with: { + refundCoupon: true, + }, + }, + refunds: true, + }, + }) + } + + async getCouponUsagesByOrderId(orderId: number) { + return db.query.couponUsage.findMany({ + where: eq(couponUsage.orderId, orderId), + with: { + coupon: true, + }, + }) + } + + async getOrderWithStatus(orderId: number) { + return db.query.orders.findFirst({ + where: eq(orders.id, orderId), + with: { + orderStatus: true, + }, + }) + } + + async cancelOrderTransaction(params: { + statusId: number + reason: string + orderId: number + refundStatus: string + }) { + const { statusId, reason, orderId, refundStatus } = params + await db.transaction(async (tx) => { + await tx + .update(orderStatus) + .set({ + isCancelled: true, + cancelReason: reason, + cancellationUserNotes: reason, + cancellationReviewed: false, + }) + .where(eq(orderStatus.id, statusId)) + + await tx.insert(refunds).values({ + orderId, + refundStatus, + }) + }) + } + + async updateOrderNotes(orderId: number, userNotes: string | null) { + await db + .update(orders) + .set({ + userNotes, + }) + .where(eq(orders.id, orderId)) + } + + async getRecentDeliveredOrderIds(userId: number, since: Date, limit: number) { + return db + .select({ id: orders.id }) + .from(orders) + .innerJoin(orderStatus, eq(orders.id, orderStatus.orderId)) + .where( + and( + eq(orders.userId, userId), + eq(orderStatus.isDelivered, true), + gte(orders.createdAt, since) + ) + ) + .orderBy(desc(orders.createdAt)) + .limit(limit) + } + + async getProductIdsByOrderIds(orderIds: number[]) { + return db + .select({ productId: orderItems.productId }) + .from(orderItems) + .where(inArray(orderItems.orderId, orderIds)) + } + + async getProductsWithUnitsByIds(productIds: number[], limit: number) { + return db + .select({ + id: productInfo.id, + name: productInfo.name, + shortDescription: productInfo.shortDescription, + price: productInfo.price, + images: productInfo.images, + isOutOfStock: productInfo.isOutOfStock, + unitShortNotation: units.shortNotation, + incrementStep: productInfo.incrementStep, + }) + .from(productInfo) + .innerJoin(units, eq(productInfo.unitId, units.id)) + .where( + and( + inArray(productInfo.id, productIds), + eq(productInfo.isSuspended, false) + ) + ) + .orderBy(desc(productInfo.createdAt)) + .limit(limit) + } +} + +export const userOrderDbService: IUserOrderDbService = new UserOrderDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-product-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-product-queries.ts new file mode 100644 index 0000000..eb9e726 --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-product-queries.ts @@ -0,0 +1,116 @@ +import { db } from '../../db/db_index' +import { productInfo, units, storeInfo, productSlots, deliverySlotInfo, specialDeals, productReviews, users } from '../../db/schema' +import { eq, and, gt, sql, desc } from 'drizzle-orm' +import { toJsonString } from '../../db/sqlite-casts' +import { IUserProductDbService, Review } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-product-db-service.interface' + +export class UserProductDbService implements IUserProductDbService { + async getProductById(productId: number) { + const result = await db + .select({ + id: productInfo.id, + name: productInfo.name, + shortDescription: productInfo.shortDescription, + longDescription: productInfo.longDescription, + price: productInfo.price, + marketPrice: productInfo.marketPrice, + images: productInfo.images, + isOutOfStock: productInfo.isOutOfStock, + storeId: productInfo.storeId, + unitShortNotation: units.shortNotation, + incrementStep: productInfo.incrementStep, + productQuantity: productInfo.productQuantity, + isFlashAvailable: productInfo.isFlashAvailable, + flashPrice: productInfo.flashPrice, + }) + .from(productInfo) + .innerJoin(units, eq(productInfo.unitId, units.id)) + .where(eq(productInfo.id, productId)) + .limit(1) + return result[0] + } + + async getStoreBasicById(storeId: number) { + return db.query.storeInfo.findFirst({ + where: eq(storeInfo.id, storeId), + columns: { id: true, name: true, description: true }, + }) + } + + async getDeliverySlotsForProduct(productId: number) { + const now = new Date() + return db + .select({ + id: deliverySlotInfo.id, + deliveryTime: deliverySlotInfo.deliveryTime, + freezeTime: deliverySlotInfo.freezeTime, + }) + .from(productSlots) + .innerJoin(deliverySlotInfo, eq(productSlots.slotId, deliverySlotInfo.id)) + .where( + and( + eq(productSlots.productId, productId), + eq(deliverySlotInfo.isActive, true), + eq(deliverySlotInfo.isCapacityFull, false), + gt(deliverySlotInfo.deliveryTime, now), + gt(deliverySlotInfo.freezeTime, now) + ) + ) + .orderBy(deliverySlotInfo.deliveryTime) + } + + async getSpecialDealsForProduct(productId: number) { + const now = new Date() + return db + .select({ + quantity: specialDeals.quantity, + price: specialDeals.price, + validTill: specialDeals.validTill, + }) + .from(specialDeals) + .where( + and( + eq(specialDeals.productId, productId), + gt(specialDeals.validTill, now) + ) + ) + .orderBy(specialDeals.quantity) + } + + async getProductReviews(productId: number, limit: number, offset: number) { + return db + .select({ + id: productReviews.id, + reviewBody: productReviews.reviewBody, + ratings: productReviews.ratings, + imageUrls: productReviews.imageUrls, + reviewTime: productReviews.reviewTime, + userName: users.name, + }) + .from(productReviews) + .innerJoin(users, eq(productReviews.userId, users.id)) + .where(eq(productReviews.productId, productId)) + .orderBy(desc(productReviews.reviewTime)) + .limit(limit) + .offset(offset) + } + + async getReviewCount(productId: number): Promise { + const result = await db + .select({ count: sql`count(*)` }) + .from(productReviews) + .where(eq(productReviews.productId, productId)) + return Number(result[0].count) + } + + async createReview(data: { userId: number; productId: number; reviewBody: string; ratings: number; imageUrls: string[] }): Promise { + const normalized = { + ...data, + imageUrls: toJsonString(data.imageUrls, '[]'), + } + const [newReview] = await db.insert(productReviews).values(normalized).returning() + return newReview + } +} + +export const userProductDbService: IUserProductDbService = new UserProductDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-profile-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-profile-queries.ts new file mode 100644 index 0000000..4a0cd8b --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-profile-queries.ts @@ -0,0 +1,74 @@ +import { db } from '../../db/db_index' +import { users, userDetails, userCreds, notifCreds, unloggedUserTokens } from '../../db/schema' +import { eq, and } from 'drizzle-orm' +import { IUserProfileDbService, User, UserDetail, UserCred, NotifCred, UnloggedToken } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-profile-db-service.interface' + +export class UserProfileDbService implements IUserProfileDbService { + async getUserById(userId: number): Promise { + const [user] = await db.select().from(users).where(eq(users.id, userId)).limit(1) + return user + } + + async getUserDetailByUserId(userId: number): Promise { + const [detail] = await db.select().from(userDetails).where(eq(userDetails.userId, userId)).limit(1) + return detail + } + + async getUserWithCreds(userId: number): Promise<{ user: User; creds: UserCred | null } | undefined> { + const result = await db + .select() + .from(users) + .leftJoin(userCreds, eq(users.id, userCreds.userId)) + .where(eq(users.id, userId)) + .limit(1) + + if (result.length === 0) return undefined + + const row = result[0] as any + return { + user: row.users, + creds: row.user_creds || null, + } + } + + async getNotifCredByUserAndToken(userId: number, token: string): Promise { + return db.query.notifCreds.findFirst({ + where: and(eq(notifCreds.userId, userId), eq(notifCreds.token, token)), + }) + } + + async updateNotifCredLastVerified(id: number): Promise { + await db.update(notifCreds).set({ lastVerified: new Date() }).where(eq(notifCreds.id, id)) + } + + async insertNotifCred(userId: number, token: string): Promise { + await db.insert(notifCreds).values({ + userId, + token, + lastVerified: new Date(), + }) + } + + async deleteUnloggedToken(token: string): Promise { + await db.delete(unloggedUserTokens).where(eq(unloggedUserTokens.token, token)) + } + + async getUnloggedToken(token: string): Promise { + return db.query.unloggedUserTokens.findFirst({ + where: eq(unloggedUserTokens.token, token), + }) + } + + async updateUnloggedTokenLastVerified(id: number): Promise { + await db.update(unloggedUserTokens).set({ lastVerified: new Date() }).where(eq(unloggedUserTokens.id, id)) + } + + async insertUnloggedToken(token: string): Promise { + await db.insert(unloggedUserTokens).values({ + token, + lastVerified: new Date(), + }) + } +} + +export const userProfileDbService: IUserProfileDbService = new UserProfileDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-slot-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-slot-queries.ts new file mode 100644 index 0000000..cca1c1a --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-slot-queries.ts @@ -0,0 +1,26 @@ +import { db } from '../../db/db_index' +import { deliverySlotInfo, productInfo } from '../../db/schema' +import { eq } from 'drizzle-orm' +import { IUserSlotDbService, Slot } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-slot-db-service.interface' + +export class UserSlotDbService implements IUserSlotDbService { + async getActiveSlots(): Promise { + return db.query.deliverySlotInfo.findMany({ + where: eq(deliverySlotInfo.isActive, true), + }) + } + + async getProductAvailability(): Promise> { + return db + .select({ + id: productInfo.id, + name: productInfo.name, + isOutOfStock: productInfo.isOutOfStock, + isFlashAvailable: productInfo.isFlashAvailable, + }) + .from(productInfo) + .where(eq(productInfo.isSuspended, false)) + } +} + +export const userSlotDbService: IUserSlotDbService = new UserSlotDbService() diff --git a/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-store-queries.ts b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-store-queries.ts new file mode 100644 index 0000000..3ab67e5 --- /dev/null +++ b/apps/db-helper-sqlite/src/dataAccessors/user-apis/user-store-queries.ts @@ -0,0 +1,69 @@ +import { db } from '../../db/db_index' +import { storeInfo, productInfo, units } from '../../db/schema' +import { eq, and, sql } from 'drizzle-orm' +import { IUserStoreDbService } from '../../../../backend/src/trpc/apis/user-apis/dataAccessors/interfaces/user-store-db-service.interface' + +export class UserStoreDbService implements IUserStoreDbService { + async getStoresWithProductCount(): Promise> { + return db + .select({ + id: storeInfo.id, + name: storeInfo.name, + description: storeInfo.description, + imageUrl: storeInfo.imageUrl, + productCount: sql`count(${productInfo.id})`.as('productCount'), + }) + .from(storeInfo) + .leftJoin( + productInfo, + and(eq(productInfo.storeId, storeInfo.id), eq(productInfo.isSuspended, false)) + ) + .groupBy(storeInfo.id) + } + + async getStoreById(storeId: number) { + return db.query.storeInfo.findFirst({ + where: eq(storeInfo.id, storeId), + columns: { + id: true, + name: true, + description: true, + imageUrl: true, + }, + }) + } + + async getSampleProductsByStoreId(storeId: number, limit: number) { + return db + .select({ + id: productInfo.id, + name: productInfo.name, + images: productInfo.images, + }) + .from(productInfo) + .where(and(eq(productInfo.storeId, storeId), eq(productInfo.isSuspended, false))) + .limit(limit) + } + + async getStoreProductsWithUnits(storeId: number) { + return db + .select({ + id: productInfo.id, + name: productInfo.name, + shortDescription: productInfo.shortDescription, + price: productInfo.price, + marketPrice: productInfo.marketPrice, + images: productInfo.images, + isOutOfStock: productInfo.isOutOfStock, + incrementStep: productInfo.incrementStep, + unitShortNotation: units.shortNotation, + unitNotation: units.shortNotation, + productQuantity: productInfo.productQuantity, + }) + .from(productInfo) + .innerJoin(units, eq(productInfo.unitId, units.id)) + .where(and(eq(productInfo.storeId, storeId), eq(productInfo.isSuspended, false))) + } +} + +export const userStoreDbService: IUserStoreDbService = new UserStoreDbService() diff --git a/apps/db-helper-sqlite/src/db/db_index.ts b/apps/db-helper-sqlite/src/db/db_index.ts new file mode 100644 index 0000000..efd1a06 --- /dev/null +++ b/apps/db-helper-sqlite/src/db/db_index.ts @@ -0,0 +1,7 @@ +import { drizzle } from 'drizzle-orm/bun-sqlite' +import { Database } from 'bun:sqlite' +import * as schema from './schema' + +const db = drizzle(new Database(process.env.SQLITE_DB_PATH || 'sqlite.db'), { schema }) + +export { db } diff --git a/apps/db-helper-sqlite/src/db/schema.ts b/apps/db-helper-sqlite/src/db/schema.ts new file mode 100644 index 0000000..568653d --- /dev/null +++ b/apps/db-helper-sqlite/src/db/schema.ts @@ -0,0 +1,735 @@ +import { + sqliteTable, + integer, + text, + real, + unique, + check, +} from 'drizzle-orm/sqlite-core' +import { relations, sql } from 'drizzle-orm' + +const epochSeconds = sql`(strftime('%s','now'))` + +const sqliteEnum = ( + _name: string, + values: T +) => (columnName: string) => text(columnName, { enum: values }) + +export const users = sqliteTable('users', { + id: integer('id').primaryKey({ autoIncrement: true }), + name: text('name'), + email: text('email'), + mobile: text('mobile'), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}, (t) => ({ + unq_email: unique('unique_email').on(t.email), +})) + +export const userDetails = sqliteTable('user_details', { + id: integer('id').primaryKey({ autoIncrement: true }), + userId: integer('user_id').notNull().references(() => users.id).unique(), + bio: text('bio'), + dateOfBirth: integer('date_of_birth', { mode: 'timestamp' }), + gender: text('gender'), + occupation: text('occupation'), + profileImage: text('profile_image'), + isSuspended: integer('is_suspended', { mode: 'boolean' }).notNull().default(false), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), + updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const userCreds = sqliteTable('user_creds', { + id: integer('id').primaryKey({ autoIncrement: true }), + userId: integer('user_id').notNull().references(() => users.id), + userPassword: text('user_password').notNull(), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const addressZones = sqliteTable('address_zones', { + id: integer('id').primaryKey({ autoIncrement: true }), + zoneName: text('zone_name').notNull(), + addedAt: integer('added_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const addresses = sqliteTable('addresses', { + id: integer('id').primaryKey({ autoIncrement: true }), + userId: integer('user_id').notNull().references(() => users.id), + name: text('name').notNull(), + phone: text('phone').notNull(), + addressLine1: text('address_line1').notNull(), + addressLine2: text('address_line2'), + city: text('city').notNull(), + state: text('state').notNull(), + pincode: text('pincode').notNull(), + isDefault: integer('is_default', { mode: 'boolean' }).notNull().default(false), + latitude: real('latitude'), + longitude: real('longitude'), + googleMapsUrl: text('google_maps_url'), + adminLatitude: real('admin_latitude'), + adminLongitude: real('admin_longitude'), + zoneId: integer('zone_id').references(() => addressZones.id), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const addressAreas = sqliteTable('address_areas', { + id: integer('id').primaryKey({ autoIncrement: true }), + placeName: text('place_name').notNull(), + zoneId: integer('zone_id').references(() => addressZones.id), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const staffRoleEnum = sqliteEnum('staff_role', [ + 'super_admin', + 'admin', + 'marketer', + 'delivery_staff', +]) + +export const staffPermissionEnum = sqliteEnum('staff_permission', [ + 'crud_product', + 'make_coupon', + 'crud_staff_users', +]) + +export const staffRoles = sqliteTable('staff_roles', { + id: integer('id').primaryKey({ autoIncrement: true }), + roleName: staffRoleEnum('role_name').notNull(), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}, (t) => ({ + unq_role_name: unique('unique_role_name').on(t.roleName), +})) + +export const staffPermissions = sqliteTable('staff_permissions', { + id: integer('id').primaryKey({ autoIncrement: true }), + permissionName: staffPermissionEnum('permission_name').notNull(), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}, (t) => ({ + unq_permission_name: unique('unique_permission_name').on(t.permissionName), +})) + +export const staffRolePermissions = sqliteTable('staff_role_permissions', { + id: integer('id').primaryKey({ autoIncrement: true }), + staffRoleId: integer('staff_role_id').notNull().references(() => staffRoles.id), + staffPermissionId: integer('staff_permission_id').notNull().references(() => staffPermissions.id), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}, (t) => ({ + unq_role_permission: unique('unique_role_permission').on( + t.staffRoleId, + t.staffPermissionId + ), +})) + +export const staffUsers = sqliteTable('staff_users', { + id: integer('id').primaryKey({ autoIncrement: true }), + name: text('name').notNull(), + password: text('password').notNull(), + staffRoleId: integer('staff_role_id').references(() => staffRoles.id), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const storeInfo = sqliteTable('store_info', { + id: integer('id').primaryKey({ autoIncrement: true }), + name: text('name').notNull(), + description: text('description'), + imageUrl: text('image_url'), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), + owner: integer('owner').notNull().references(() => staffUsers.id), +}) + +export const units = sqliteTable('units', { + id: integer('id').primaryKey({ autoIncrement: true }), + shortNotation: text('short_notation').notNull(), + fullName: text('full_name').notNull(), +}, (t) => ({ + unq_short_notation: unique('unique_short_notation').on(t.shortNotation), +})) + +export const productAvailabilityActionEnum = sqliteEnum( + 'product_availability_action', + ['in', 'out'] +) + +export const productInfo = sqliteTable('product_info', { + id: integer('id').primaryKey({ autoIncrement: true }), + name: text('name').notNull(), + shortDescription: text('short_description'), + longDescription: text('long_description'), + unitId: integer('unit_id').notNull().references(() => units.id), + price: text('price').notNull(), + marketPrice: text('market_price'), + images: text('images'), + isOutOfStock: integer('is_out_of_stock', { mode: 'boolean' }).notNull().default(false), + isSuspended: integer('is_suspended', { mode: 'boolean' }).notNull().default(false), + isFlashAvailable: integer('is_flash_available', { mode: 'boolean' }).notNull().default(false), + flashPrice: text('flash_price'), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), + incrementStep: real('increment_step').notNull().default(1), + productQuantity: real('product_quantity').notNull().default(1), + storeId: integer('store_id').references(() => storeInfo.id), + scheduledAvailability: integer('scheduled_availability', { mode: 'boolean' }).notNull().default(true), +}) + +export const productAvailabilitySchedules = sqliteTable('product_availability_schedules', { + id: integer('id').primaryKey({ autoIncrement: true }), + time: text('time').notNull(), + scheduleName: text('schedule_name').notNull().unique(), + action: productAvailabilityActionEnum('action').notNull(), + productIds: text('product_ids').notNull().default('[]'), + groupIds: text('group_ids').notNull().default('[]'), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), + lastUpdated: integer('last_updated', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const productGroupInfo = sqliteTable('product_group_info', { + id: integer('id').primaryKey({ autoIncrement: true }), + groupName: text('group_name').notNull(), + description: text('description'), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const productGroupMembership = sqliteTable('product_group_membership', { + productId: integer('product_id').notNull().references(() => productInfo.id), + groupId: integer('group_id').notNull().references(() => productGroupInfo.id), + addedAt: integer('added_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}, (t) => ({ + pk: unique('product_group_membership_pk').on(t.productId, t.groupId), +})) + +export const homeBanners = sqliteTable('home_banners', { + id: integer('id').primaryKey({ autoIncrement: true }), + name: text('name').notNull(), + imageUrl: text('image_url').notNull(), + description: text('description'), + productIds: text('product_ids'), + redirectUrl: text('redirect_url'), + serialNum: integer('serial_num'), + isActive: integer('is_active', { mode: 'boolean' }).notNull().default(false), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), + lastUpdated: integer('last_updated', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const productReviews = sqliteTable('product_reviews', { + id: integer('id').primaryKey({ autoIncrement: true }), + userId: integer('user_id').notNull().references(() => users.id), + productId: integer('product_id').notNull().references(() => productInfo.id), + reviewBody: text('review_body').notNull(), + imageUrls: text('image_urls').default('[]'), + reviewTime: integer('review_time', { mode: 'timestamp' }).notNull().default(epochSeconds), + ratings: real('ratings').notNull(), + adminResponse: text('admin_response'), + adminResponseImages: text('admin_response_images').default('[]'), +}, (t) => ({ + ratingCheck: check('rating_check', sql`${t.ratings} >= 1 AND ${t.ratings} <= 5`), +})) + +export const uploadStatusEnum = sqliteEnum('upload_status', ['pending', 'claimed']) + +export const uploadUrlStatus = sqliteTable('upload_url_status', { + id: integer('id').primaryKey({ autoIncrement: true }), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), + key: text('key').notNull(), + status: uploadStatusEnum('status').notNull().default('pending'), +}) + +export const productTagInfo = sqliteTable('product_tag_info', { + id: integer('id').primaryKey({ autoIncrement: true }), + tagName: text('tag_name').notNull().unique(), + tagDescription: text('tag_description'), + imageUrl: text('image_url'), + isDashboardTag: integer('is_dashboard_tag', { mode: 'boolean' }).notNull().default(false), + relatedStores: text('related_stores').default('[]'), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const productTags = sqliteTable('product_tags', { + id: integer('id').primaryKey({ autoIncrement: true }), + productId: integer('product_id').notNull().references(() => productInfo.id), + tagId: integer('tag_id').notNull().references(() => productTagInfo.id), + assignedAt: integer('assigned_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}, (t) => ({ + unq_product_tag: unique('unique_product_tag').on(t.productId, t.tagId), +})) + +export const deliverySlotInfo = sqliteTable('delivery_slot_info', { + id: integer('id').primaryKey({ autoIncrement: true }), + deliveryTime: integer('delivery_time', { mode: 'timestamp' }).notNull(), + freezeTime: integer('freeze_time', { mode: 'timestamp' }).notNull(), + isActive: integer('is_active', { mode: 'boolean' }).notNull().default(true), + isFlash: integer('is_flash', { mode: 'boolean' }).notNull().default(false), + isCapacityFull: integer('is_capacity_full', { mode: 'boolean' }).notNull().default(false), + deliverySequence: text('delivery_sequence').default('{}'), + groupIds: text('group_ids').default('[]'), +}) + +export const vendorSnippets = sqliteTable('vendor_snippets', { + id: integer('id').primaryKey({ autoIncrement: true }), + snippetCode: text('snippet_code').notNull().unique(), + slotId: integer('slot_id').references(() => deliverySlotInfo.id), + isPermanent: integer('is_permanent', { mode: 'boolean' }).notNull().default(false), + productIds: text('product_ids').notNull(), + validTill: integer('valid_till', { mode: 'timestamp' }), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const productSlots = sqliteTable('product_slots', { + productId: integer('product_id').notNull().references(() => productInfo.id), + slotId: integer('slot_id').notNull().references(() => deliverySlotInfo.id), +}, (t) => ({ + pk: unique('product_slot_pk').on(t.productId, t.slotId), +})) + +export const specialDeals = sqliteTable('special_deals', { + id: integer('id').primaryKey({ autoIncrement: true }), + productId: integer('product_id').notNull().references(() => productInfo.id), + quantity: text('quantity').notNull(), + price: text('price').notNull(), + validTill: integer('valid_till', { mode: 'timestamp' }).notNull(), +}) + +export const paymentInfoTable = sqliteTable('payment_info', { + id: integer('id').primaryKey({ autoIncrement: true }), + status: text('status').notNull(), + gateway: text('gateway').notNull(), + orderId: text('order_id'), + token: text('token'), + merchantOrderId: text('merchant_order_id').notNull().unique(), + payload: text('payload'), +}) + +export const orders = sqliteTable('orders', { + id: integer('id').primaryKey({ autoIncrement: true }), + userId: integer('user_id').notNull().references(() => users.id), + addressId: integer('address_id').notNull().references(() => addresses.id), + slotId: integer('slot_id').references(() => deliverySlotInfo.id), + isCod: integer('is_cod', { mode: 'boolean' }).notNull().default(false), + isOnlinePayment: integer('is_online_payment', { mode: 'boolean' }).notNull().default(false), + paymentInfoId: integer('payment_info_id').references(() => paymentInfoTable.id), + totalAmount: text('total_amount').notNull(), + deliveryCharge: text('delivery_charge').notNull().default('0'), + readableId: integer('readable_id').notNull(), + adminNotes: text('admin_notes'), + userNotes: text('user_notes'), + orderGroupId: text('order_group_id'), + orderGroupProportion: text('order_group_proportion'), + isFlashDelivery: integer('is_flash_delivery', { mode: 'boolean' }).notNull().default(false), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const orderItems = sqliteTable('order_items', { + id: integer('id').primaryKey({ autoIncrement: true }), + orderId: integer('order_id').notNull().references(() => orders.id), + productId: integer('product_id').notNull().references(() => productInfo.id), + quantity: text('quantity').notNull(), + price: text('price').notNull(), + discountedPrice: text('discounted_price'), + is_packaged: integer('is_packaged', { mode: 'boolean' }).notNull().default(false), + is_package_verified: integer('is_package_verified', { mode: 'boolean' }).notNull().default(false), +}) + +export const paymentStatusEnum = sqliteEnum('payment_status', [ + 'pending', + 'success', + 'cod', + 'failed', +]) + +export const orderStatus = sqliteTable('order_status', { + id: integer('id').primaryKey({ autoIncrement: true }), + orderTime: integer('order_time', { mode: 'timestamp' }).notNull().default(epochSeconds), + userId: integer('user_id').notNull().references(() => users.id), + orderId: integer('order_id').notNull().references(() => orders.id), + isPackaged: integer('is_packaged', { mode: 'boolean' }).notNull().default(false), + isDelivered: integer('is_delivered', { mode: 'boolean' }).notNull().default(false), + isCancelled: integer('is_cancelled', { mode: 'boolean' }).notNull().default(false), + cancelReason: text('cancel_reason'), + isCancelledByAdmin: integer('is_cancelled_by_admin', { mode: 'boolean' }), + paymentStatus: paymentStatusEnum('payment_state').notNull().default('pending'), + cancellationUserNotes: text('cancellation_user_notes'), + cancellationAdminNotes: text('cancellation_admin_notes'), + cancellationReviewed: integer('cancellation_reviewed', { mode: 'boolean' }).notNull().default(false), + cancellationReviewedAt: integer('cancellation_reviewed_at', { mode: 'timestamp' }), + refundCouponId: integer('refund_coupon_id').references(() => coupons.id), +}) + +export const payments = sqliteTable('payments', { + id: integer('id').primaryKey({ autoIncrement: true }), + status: text('status').notNull(), + gateway: text('gateway').notNull(), + orderId: integer('order_id').notNull().references(() => orders.id), + token: text('token'), + merchantOrderId: text('merchant_order_id').notNull().unique(), + payload: text('payload'), +}) + +export const refunds = sqliteTable('refunds', { + id: integer('id').primaryKey({ autoIncrement: true }), + orderId: integer('order_id').notNull().references(() => orders.id), + refundAmount: text('refund_amount'), + refundStatus: text('refund_status').default('none'), + merchantRefundId: text('merchant_refund_id'), + refundProcessedAt: integer('refund_processed_at', { mode: 'timestamp' }), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const keyValStore = sqliteTable('key_val_store', { + key: text('key').primaryKey(), + value: text('value'), +}) + +export const notifications = sqliteTable('notifications', { + id: integer('id').primaryKey({ autoIncrement: true }), + userId: integer('user_id').notNull().references(() => users.id), + title: text('title').notNull(), + body: text('body').notNull(), + type: text('type'), + isRead: integer('is_read', { mode: 'boolean' }).notNull().default(false), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const productCategories = sqliteTable('product_categories', { + id: integer('id').primaryKey({ autoIncrement: true }), + name: text('name').notNull(), + description: text('description'), +}) + +export const cartItems = sqliteTable('cart_items', { + id: integer('id').primaryKey({ autoIncrement: true }), + userId: integer('user_id').notNull().references(() => users.id), + productId: integer('product_id').notNull().references(() => productInfo.id), + quantity: text('quantity').notNull(), + addedAt: integer('added_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}, (t) => ({ + unq_user_product: unique('unique_user_product').on(t.userId, t.productId), +})) + +export const complaints = sqliteTable('complaints', { + id: integer('id').primaryKey({ autoIncrement: true }), + userId: integer('user_id').notNull().references(() => users.id), + orderId: integer('order_id').references(() => orders.id), + complaintBody: text('complaint_body').notNull(), + images: text('images'), + response: text('response'), + isResolved: integer('is_resolved', { mode: 'boolean' }).notNull().default(false), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const coupons = sqliteTable('coupons', { + id: integer('id').primaryKey({ autoIncrement: true }), + couponCode: text('coupon_code').notNull().unique('unique_coupon_code'), + isUserBased: integer('is_user_based', { mode: 'boolean' }).notNull().default(false), + discountPercent: text('discount_percent'), + flatDiscount: text('flat_discount'), + minOrder: text('min_order'), + productIds: text('product_ids'), + createdBy: integer('created_by').references(() => staffUsers.id), + maxValue: text('max_value'), + isApplyForAll: integer('is_apply_for_all', { mode: 'boolean' }).notNull().default(false), + validTill: integer('valid_till', { mode: 'timestamp' }), + maxLimitForUser: integer('max_limit_for_user'), + isInvalidated: integer('is_invalidated', { mode: 'boolean' }).notNull().default(false), + exclusiveApply: integer('exclusive_apply', { mode: 'boolean' }).notNull().default(false), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const couponUsage = sqliteTable('coupon_usage', { + id: integer('id').primaryKey({ autoIncrement: true }), + userId: integer('user_id').notNull().references(() => users.id), + couponId: integer('coupon_id').notNull().references(() => coupons.id), + orderId: integer('order_id').references(() => orders.id), + orderItemId: integer('order_item_id').references(() => orderItems.id), + usedAt: integer('used_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}) + +export const couponApplicableUsers = sqliteTable('coupon_applicable_users', { + id: integer('id').primaryKey({ autoIncrement: true }), + couponId: integer('coupon_id').notNull().references(() => coupons.id), + userId: integer('user_id').notNull().references(() => users.id), +}, (t) => ({ + unq_coupon_user: unique('unique_coupon_user').on(t.couponId, t.userId), +})) + +export const couponApplicableProducts = sqliteTable('coupon_applicable_products', { + id: integer('id').primaryKey({ autoIncrement: true }), + couponId: integer('coupon_id').notNull().references(() => coupons.id), + productId: integer('product_id').notNull().references(() => productInfo.id), +}, (t) => ({ + unq_coupon_product: unique('unique_coupon_product').on(t.couponId, t.productId), +})) + +export const userIncidents = sqliteTable('user_incidents', { + id: integer('id').primaryKey({ autoIncrement: true }), + userId: integer('user_id').notNull().references(() => users.id), + orderId: integer('order_id').references(() => orders.id), + dateAdded: integer('date_added', { mode: 'timestamp' }).notNull().default(epochSeconds), + adminComment: text('admin_comment'), + addedBy: integer('added_by').references(() => staffUsers.id), + negativityScore: integer('negativity_score'), +}) + +export const reservedCoupons = sqliteTable('reserved_coupons', { + id: integer('id').primaryKey({ autoIncrement: true }), + secretCode: text('secret_code').notNull().unique(), + couponCode: text('coupon_code').notNull(), + discountPercent: text('discount_percent'), + flatDiscount: text('flat_discount'), + minOrder: text('min_order'), + productIds: text('product_ids'), + maxValue: text('max_value'), + validTill: integer('valid_till', { mode: 'timestamp' }), + maxLimitForUser: integer('max_limit_for_user'), + exclusiveApply: integer('exclusive_apply', { mode: 'boolean' }).notNull().default(false), + isRedeemed: integer('is_redeemed', { mode: 'boolean' }).notNull().default(false), + redeemedBy: integer('redeemed_by').references(() => users.id), + redeemedAt: integer('redeemed_at', { mode: 'timestamp' }), + createdBy: integer('created_by').notNull().references(() => staffUsers.id), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), +}, (t) => ({ + unq_secret_code: unique('unique_secret_code').on(t.secretCode), +})) + +export const notifCreds = sqliteTable('notif_creds', { + id: integer('id').primaryKey({ autoIncrement: true }), + token: text('token').notNull().unique(), + addedAt: integer('added_at', { mode: 'timestamp' }).notNull().default(epochSeconds), + userId: integer('user_id').notNull().references(() => users.id), + lastVerified: integer('last_verified', { mode: 'timestamp' }), +}) + +export const unloggedUserTokens = sqliteTable('unlogged_user_tokens', { + id: integer('id').primaryKey({ autoIncrement: true }), + token: text('token').notNull().unique(), + addedAt: integer('added_at', { mode: 'timestamp' }).notNull().default(epochSeconds), + lastVerified: integer('last_verified', { mode: 'timestamp' }), +}) + +export const userNotifications = sqliteTable('user_notifications', { + id: integer('id').primaryKey({ autoIncrement: true }), + title: text('title').notNull(), + imageUrl: text('image_url'), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(epochSeconds), + body: text('body').notNull(), + applicableUsers: text('applicable_users'), +}) + +export const uploadUrlStatusRelations = relations(uploadUrlStatus, ({}) => ({})) + +export const userCredsRelations = relations(userCreds, ({ one }) => ({ + user: one(users, { fields: [userCreds.userId], references: [users.id] }), +})) + +export const staffUsersRelations = relations(staffUsers, ({ one, many }) => ({ + role: one(staffRoles, { fields: [staffUsers.staffRoleId], references: [staffRoles.id] }), + coupons: many(coupons), + stores: many(storeInfo), +})) + +export const addressesRelations = relations(addresses, ({ one, many }) => ({ + user: one(users, { fields: [addresses.userId], references: [users.id] }), + orders: many(orders), + zone: one(addressZones, { fields: [addresses.zoneId], references: [addressZones.id] }), +})) + +export const unitsRelations = relations(units, ({ many }) => ({ + products: many(productInfo), +})) + +export const productInfoRelations = relations(productInfo, ({ one, many }) => ({ + unit: one(units, { fields: [productInfo.unitId], references: [units.id] }), + store: one(storeInfo, { fields: [productInfo.storeId], references: [storeInfo.id] }), + productSlots: many(productSlots), + specialDeals: many(specialDeals), + orderItems: many(orderItems), + cartItems: many(cartItems), + tags: many(productTags), + applicableCoupons: many(couponApplicableProducts), + reviews: many(productReviews), + groups: many(productGroupMembership), +})) + +export const productTagInfoRelations = relations(productTagInfo, ({ many }) => ({ + products: many(productTags), +})) + +export const productTagsRelations = relations(productTags, ({ one }) => ({ + product: one(productInfo, { fields: [productTags.productId], references: [productInfo.id] }), + tag: one(productTagInfo, { fields: [productTags.tagId], references: [productTagInfo.id] }), +})) + +export const deliverySlotInfoRelations = relations(deliverySlotInfo, ({ many }) => ({ + productSlots: many(productSlots), + orders: many(orders), + vendorSnippets: many(vendorSnippets), +})) + +export const vendorSnippetsRelations = relations(vendorSnippets, ({ one }) => ({ + slot: one(deliverySlotInfo, { fields: [vendorSnippets.slotId], references: [deliverySlotInfo.id] }), +})) + +export const productSlotsRelations = relations(productSlots, ({ one }) => ({ + product: one(productInfo, { fields: [productSlots.productId], references: [productInfo.id] }), + slot: one(deliverySlotInfo, { fields: [productSlots.slotId], references: [deliverySlotInfo.id] }), +})) + +export const specialDealsRelations = relations(specialDeals, ({ one }) => ({ + product: one(productInfo, { fields: [specialDeals.productId], references: [productInfo.id] }), +})) + +export const ordersRelations = relations(orders, ({ one, many }) => ({ + user: one(users, { fields: [orders.userId], references: [users.id] }), + address: one(addresses, { fields: [orders.addressId], references: [addresses.id] }), + slot: one(deliverySlotInfo, { fields: [orders.slotId], references: [deliverySlotInfo.id] }), + orderItems: many(orderItems), + payment: one(payments), + paymentInfo: one(paymentInfoTable, { fields: [orders.paymentInfoId], references: [paymentInfoTable.id] }), + orderStatus: many(orderStatus), + refunds: many(refunds), + couponUsages: many(couponUsage), + userIncidents: many(userIncidents), +})) + +export const orderItemsRelations = relations(orderItems, ({ one }) => ({ + order: one(orders, { fields: [orderItems.orderId], references: [orders.id] }), + product: one(productInfo, { fields: [orderItems.productId], references: [productInfo.id] }), +})) + +export const orderStatusRelations = relations(orderStatus, ({ one }) => ({ + order: one(orders, { fields: [orderStatus.orderId], references: [orders.id] }), + user: one(users, { fields: [orderStatus.userId], references: [users.id] }), + refundCoupon: one(coupons, { fields: [orderStatus.refundCouponId], references: [coupons.id] }), +})) + +export const paymentInfoRelations = relations(paymentInfoTable, ({ one }) => ({ + order: one(orders, { fields: [paymentInfoTable.id], references: [orders.paymentInfoId] }), +})) + +export const paymentsRelations = relations(payments, ({ one }) => ({ + order: one(orders, { fields: [payments.orderId], references: [orders.id] }), +})) + +export const refundsRelations = relations(refunds, ({ one }) => ({ + order: one(orders, { fields: [refunds.orderId], references: [orders.id] }), +})) + +export const notificationsRelations = relations(notifications, ({ one }) => ({ + user: one(users, { fields: [notifications.userId], references: [users.id] }), +})) + +export const productCategoriesRelations = relations(productCategories, ({}) => ({})) + +export const cartItemsRelations = relations(cartItems, ({ one }) => ({ + user: one(users, { fields: [cartItems.userId], references: [users.id] }), + product: one(productInfo, { fields: [cartItems.productId], references: [productInfo.id] }), +})) + +export const complaintsRelations = relations(complaints, ({ one }) => ({ + user: one(users, { fields: [complaints.userId], references: [users.id] }), + order: one(orders, { fields: [complaints.orderId], references: [orders.id] }), +})) + +export const couponsRelations = relations(coupons, ({ one, many }) => ({ + creator: one(staffUsers, { fields: [coupons.createdBy], references: [staffUsers.id] }), + usages: many(couponUsage), + applicableUsers: many(couponApplicableUsers), + applicableProducts: many(couponApplicableProducts), +})) + +export const couponUsageRelations = relations(couponUsage, ({ one }) => ({ + user: one(users, { fields: [couponUsage.userId], references: [users.id] }), + coupon: one(coupons, { fields: [couponUsage.couponId], references: [coupons.id] }), + order: one(orders, { fields: [couponUsage.orderId], references: [orders.id] }), + orderItem: one(orderItems, { fields: [couponUsage.orderItemId], references: [orderItems.id] }), +})) + +export const userDetailsRelations = relations(userDetails, ({ one }) => ({ + user: one(users, { fields: [userDetails.userId], references: [users.id] }), +})) + +export const notifCredsRelations = relations(notifCreds, ({ one }) => ({ + user: one(users, { fields: [notifCreds.userId], references: [users.id] }), +})) + +export const userNotificationsRelations = relations(userNotifications, ({}) => ({})) + +export const storeInfoRelations = relations(storeInfo, ({ one, many }) => ({ + owner: one(staffUsers, { fields: [storeInfo.owner], references: [staffUsers.id] }), + products: many(productInfo), +})) + +export const couponApplicableUsersRelations = relations(couponApplicableUsers, ({ one }) => ({ + coupon: one(coupons, { fields: [couponApplicableUsers.couponId], references: [coupons.id] }), + user: one(users, { fields: [couponApplicableUsers.userId], references: [users.id] }), +})) + +export const couponApplicableProductsRelations = relations(couponApplicableProducts, ({ one }) => ({ + coupon: one(coupons, { fields: [couponApplicableProducts.couponId], references: [coupons.id] }), + product: one(productInfo, { fields: [couponApplicableProducts.productId], references: [productInfo.id] }), +})) + +export const reservedCouponsRelations = relations(reservedCoupons, ({ one }) => ({ + redeemedUser: one(users, { fields: [reservedCoupons.redeemedBy], references: [users.id] }), + creator: one(staffUsers, { fields: [reservedCoupons.createdBy], references: [staffUsers.id] }), +})) + +export const productReviewsRelations = relations(productReviews, ({ one }) => ({ + user: one(users, { fields: [productReviews.userId], references: [users.id] }), + product: one(productInfo, { fields: [productReviews.productId], references: [productInfo.id] }), +})) + +export const addressZonesRelations = relations(addressZones, ({ many }) => ({ + addresses: many(addresses), + areas: many(addressAreas), +})) + +export const addressAreasRelations = relations(addressAreas, ({ one }) => ({ + zone: one(addressZones, { fields: [addressAreas.zoneId], references: [addressZones.id] }), +})) + +export const productGroupInfoRelations = relations(productGroupInfo, ({ many }) => ({ + memberships: many(productGroupMembership), +})) + +export const productGroupMembershipRelations = relations(productGroupMembership, ({ one }) => ({ + product: one(productInfo, { fields: [productGroupMembership.productId], references: [productInfo.id] }), + group: one(productGroupInfo, { fields: [productGroupMembership.groupId], references: [productGroupInfo.id] }), +})) + +export const homeBannersRelations = relations(homeBanners, ({}) => ({})) + +export const staffRolesRelations = relations(staffRoles, ({ many }) => ({ + staffUsers: many(staffUsers), + rolePermissions: many(staffRolePermissions), +})) + +export const staffPermissionsRelations = relations(staffPermissions, ({ many }) => ({ + rolePermissions: many(staffRolePermissions), +})) + +export const staffRolePermissionsRelations = relations(staffRolePermissions, ({ one }) => ({ + role: one(staffRoles, { fields: [staffRolePermissions.staffRoleId], references: [staffRoles.id] }), + permission: one(staffPermissions, { fields: [staffRolePermissions.staffPermissionId], references: [staffPermissions.id] }), +})) + +export const userIncidentsRelations = relations(userIncidents, ({ one }) => ({ + user: one(users, { fields: [userIncidents.userId], references: [users.id] }), + order: one(orders, { fields: [userIncidents.orderId], references: [orders.id] }), + addedBy: one(staffUsers, { fields: [userIncidents.addedBy], references: [staffUsers.id] }), +})) + +export const productAvailabilitySchedulesRelations = relations( + productAvailabilitySchedules, + ({}) => ({}) +) + +export const usersRelations = relations(users, ({ many, one }) => ({ + addresses: many(addresses), + orders: many(orders), + notifications: many(notifications), + cartItems: many(cartItems), + userCreds: one(userCreds), + coupons: many(coupons), + couponUsages: many(couponUsage), + applicableCoupons: many(couponApplicableUsers), + userDetails: one(userDetails), + notifCreds: many(notifCreds), + userIncidents: many(userIncidents), +})) diff --git a/apps/db-helper-sqlite/src/db/seed.ts b/apps/db-helper-sqlite/src/db/seed.ts new file mode 100644 index 0000000..df48d68 --- /dev/null +++ b/apps/db-helper-sqlite/src/db/seed.ts @@ -0,0 +1,154 @@ +import { eq } from 'drizzle-orm' + +import { CONST_KEYS } from '../../../backend/src/lib/const-keys' +import { deliveryCharge, minOrderValue } from '../../../backend/src/lib/env-exporter' + +import { db } from './db_index' +import { keyValStore, staffPermissions, staffRolePermissions, staffRoles, units } from './schema' +import { toJsonString } from './sqlite-casts' + +export async function seed() { + console.log('Seeding database...') + + const unitsToSeed = [ + { shortNotation: 'Kg', fullName: 'Kilogram' }, + { shortNotation: 'L', fullName: 'Litre' }, + { shortNotation: 'Dz', fullName: 'Dozen' }, + { shortNotation: 'Pc', fullName: 'Unit Piece' }, + ] + + for (const unit of unitsToSeed) { + const existingUnit = await db.query.units.findFirst({ + where: eq(units.shortNotation, unit.shortNotation), + }) + if (!existingUnit) { + await db.insert(units).values(unit) + } + } + + const rolesToSeed = ['super_admin', 'admin', 'marketer', 'delivery_staff'] as const + + for (const roleName of rolesToSeed) { + const existingRole = await db.query.staffRoles.findFirst({ + where: eq(staffRoles.roleName, roleName), + }) + if (!existingRole) { + await db.insert(staffRoles).values({ roleName }) + } + } + + const permissionsToSeed = ['crud_product', 'make_coupon', 'crud_staff_users'] as const + + for (const permissionName of permissionsToSeed) { + const existingPermission = await db.query.staffPermissions.findFirst({ + where: eq(staffPermissions.permissionName, permissionName), + }) + if (!existingPermission) { + await db.insert(staffPermissions).values({ permissionName }) + } + } + + await db.transaction(async (tx) => { + const superAdminRole = await tx.query.staffRoles.findFirst({ + where: eq(staffRoles.roleName, 'super_admin'), + }) + const adminRole = await tx.query.staffRoles.findFirst({ + where: eq(staffRoles.roleName, 'admin'), + }) + const marketerRole = await tx.query.staffRoles.findFirst({ + where: eq(staffRoles.roleName, 'marketer'), + }) + + const crudProductPerm = await tx.query.staffPermissions.findFirst({ + where: eq(staffPermissions.permissionName, 'crud_product'), + }) + const makeCouponPerm = await tx.query.staffPermissions.findFirst({ + where: eq(staffPermissions.permissionName, 'make_coupon'), + }) + const crudStaffUsersPerm = await tx.query.staffPermissions.findFirst({ + where: eq(staffPermissions.permissionName, 'crud_staff_users'), + }) + + await Promise.all( + [crudProductPerm, makeCouponPerm, crudStaffUsersPerm].map(async (perm) => { + if (!superAdminRole || !perm) { + return + } + + const existingSuperAdminPerm = await tx.query.staffRolePermissions.findFirst({ + where: eq(staffRolePermissions.staffRoleId, superAdminRole.id) + && eq(staffRolePermissions.staffPermissionId, perm.id), + }) + if (!existingSuperAdminPerm) { + await tx.insert(staffRolePermissions).values({ + staffRoleId: superAdminRole.id, + staffPermissionId: perm.id, + }) + } + }) + ) + + await Promise.all( + [crudProductPerm, makeCouponPerm].map(async (perm) => { + if (!adminRole || !perm) { + return + } + + const existingAdminPerm = await tx.query.staffRolePermissions.findFirst({ + where: eq(staffRolePermissions.staffRoleId, adminRole.id) + && eq(staffRolePermissions.staffPermissionId, perm.id), + }) + if (!existingAdminPerm) { + await tx.insert(staffRolePermissions).values({ + staffRoleId: adminRole.id, + staffPermissionId: perm.id, + }) + } + }) + ) + + if (marketerRole && makeCouponPerm) { + const existingMarketerCoupon = await tx.query.staffRolePermissions.findFirst({ + where: eq(staffRolePermissions.staffRoleId, marketerRole.id) + && eq(staffRolePermissions.staffPermissionId, makeCouponPerm.id), + }) + if (!existingMarketerCoupon) { + await tx.insert(staffRolePermissions).values({ + staffRoleId: marketerRole.id, + staffPermissionId: makeCouponPerm.id, + }) + } + } + }) + + const constantsToSeed = [ + { key: CONST_KEYS.readableOrderId, value: 0 }, + { key: CONST_KEYS.minRegularOrderValue, value: minOrderValue }, + { key: CONST_KEYS.freeDeliveryThreshold, value: minOrderValue }, + { key: CONST_KEYS.deliveryCharge, value: deliveryCharge }, + { key: CONST_KEYS.flashFreeDeliveryThreshold, value: 500 }, + { key: CONST_KEYS.flashDeliveryCharge, value: 69 }, + { key: CONST_KEYS.popularItems, value: [] }, + { key: CONST_KEYS.allItemsOrder, value: [] }, + { key: CONST_KEYS.versionNum, value: '1.1.0' }, + { key: CONST_KEYS.playStoreUrl, value: 'https://play.google.com/store/apps/details?id=in.freshyo.app' }, + { key: CONST_KEYS.appStoreUrl, value: 'https://apps.apple.com/in/app/freshyo/id6756889077' }, + { key: CONST_KEYS.isFlashDeliveryEnabled, value: false }, + { key: CONST_KEYS.supportMobile, value: '8688182552' }, + { key: CONST_KEYS.supportEmail, value: 'qushammohd@gmail.com' }, + ] + + for (const constant of constantsToSeed) { + const existing = await db.query.keyValStore.findFirst({ + where: eq(keyValStore.key, constant.key), + }) + if (!existing) { + await db.insert(keyValStore).values({ + key: constant.key, + value: toJsonString(constant.value, 'null'), + }) + } + } + + console.log('Seeding completed.') +} diff --git a/apps/db-helper-sqlite/src/db/sqlite-casts.ts b/apps/db-helper-sqlite/src/db/sqlite-casts.ts new file mode 100644 index 0000000..e59d9cf --- /dev/null +++ b/apps/db-helper-sqlite/src/db/sqlite-casts.ts @@ -0,0 +1,34 @@ +export const parseJsonValue = (value: unknown, fallback: T): T => { + if (value === null || value === undefined) return fallback + if (typeof value === 'string') { + try { + return JSON.parse(value) as T + } catch { + return fallback + } + } + return value as T +} + +export const parseNumberArray = (value: unknown): number[] => { + const parsed = parseJsonValue(value, []) + return parsed + .map((item) => Number(item)) + .filter((item) => !Number.isNaN(item)) +} + +export const toJsonString = (value: unknown, fallback: string): string => { + if (value === null || value === undefined) return fallback + if (typeof value === 'string') return value + return JSON.stringify(value) +} + +export const toEpochSeconds = (value: Date | number): number => { + if (typeof value === 'number') return value + return Math.floor(value.getTime() / 1000) +} + +export const fromEpochSeconds = (value: number | null | undefined): Date | null => { + if (value === null || value === undefined) return null + return new Date(value * 1000) +} diff --git a/apps/db-helper-sqlite/src/db/types.ts b/apps/db-helper-sqlite/src/db/types.ts new file mode 100644 index 0000000..902b5c0 --- /dev/null +++ b/apps/db-helper-sqlite/src/db/types.ts @@ -0,0 +1,47 @@ +import type { InferSelectModel } from 'drizzle-orm' + +import type { + users, + addresses, + units, + productInfo, + deliverySlotInfo, + productSlots, + specialDeals, + orders, + orderItems, + payments, + notifications, + productCategories, + cartItems, + coupons, +} from './schema' + +export type User = InferSelectModel +export type Address = InferSelectModel +export type Unit = InferSelectModel +export type ProductInfo = InferSelectModel +export type DeliverySlotInfo = InferSelectModel +export type ProductSlot = InferSelectModel +export type SpecialDeal = InferSelectModel +export type Order = InferSelectModel +export type OrderItem = InferSelectModel +export type Payment = InferSelectModel +export type Notification = InferSelectModel +export type ProductCategory = InferSelectModel +export type CartItem = InferSelectModel +export type Coupon = InferSelectModel + +export type ProductWithUnit = ProductInfo & { + unit: Unit +} + +export type OrderWithItems = Order & { + items: (OrderItem & { product: ProductInfo })[] + address: Address + slot: DeliverySlotInfo +} + +export type CartItemWithProduct = CartItem & { + product: ProductInfo +} diff --git a/apps/db-helper-sqlite/src/lib/upload-url.ts b/apps/db-helper-sqlite/src/lib/upload-url.ts new file mode 100644 index 0000000..9f263c9 --- /dev/null +++ b/apps/db-helper-sqlite/src/lib/upload-url.ts @@ -0,0 +1,23 @@ +import { and, eq } from 'drizzle-orm' + +import { db } from '../db/db_index' +import { uploadUrlStatus } from '../db/schema' + +export const createUploadUrlStatus = async (key: string): Promise => { + await db.insert(uploadUrlStatus).values({ + key, + status: 'pending', + }) +} + +export const claimUploadUrlStatus = async (key: string): Promise => { + const result = await db + .update(uploadUrlStatus) + .set({ status: 'claimed' }) + .where(and(eq(uploadUrlStatus.key, key), eq(uploadUrlStatus.status, 'pending'))) + .returning() + + if (result.length === 0) { + throw new Error('Upload URL not found or already claimed') + } +} diff --git a/apps/db-helper-sqlite/src/services/user/product-service.ts b/apps/db-helper-sqlite/src/services/user/product-service.ts new file mode 100644 index 0000000..f94d26c --- /dev/null +++ b/apps/db-helper-sqlite/src/services/user/product-service.ts @@ -0,0 +1,143 @@ +import { db } from '../../db/db_index' +import { productInfo, units, productSlots, deliverySlotInfo, specialDeals, storeInfo, productReviews, users } from '../../db/schema' +import { eq, and, gt, sql, desc } from 'drizzle-orm' +import { toJsonString } from '../../db/sqlite-casts' + +/** + * Get product basic info with unit + */ +export async function getProductWithUnit(productId: number) { + return db + .select({ + id: productInfo.id, + name: productInfo.name, + shortDescription: productInfo.shortDescription, + longDescription: productInfo.longDescription, + price: productInfo.price, + marketPrice: productInfo.marketPrice, + images: productInfo.images, + isOutOfStock: productInfo.isOutOfStock, + storeId: productInfo.storeId, + unitShortNotation: units.shortNotation, + incrementStep: productInfo.incrementStep, + productQuantity: productInfo.productQuantity, + isFlashAvailable: productInfo.isFlashAvailable, + flashPrice: productInfo.flashPrice, + }) + .from(productInfo) + .innerJoin(units, eq(productInfo.unitId, units.id)) + .where(eq(productInfo.id, productId)) + .limit(1) +} + +/** + * Get store info by ID + */ +export async function getStoreById(storeId: number) { + return db.query.storeInfo.findFirst({ + where: eq(storeInfo.id, storeId), + columns: { id: true, name: true, description: true }, + }) +} + +/** + * Get delivery slots for product + */ +export async function getProductDeliverySlots(productId: number) { + return db + .select({ + id: deliverySlotInfo.id, + deliveryTime: deliverySlotInfo.deliveryTime, + freezeTime: deliverySlotInfo.freezeTime, + }) + .from(productSlots) + .innerJoin(deliverySlotInfo, eq(productSlots.slotId, deliverySlotInfo.id)) + .where( + and( + eq(productSlots.productId, productId), + eq(deliverySlotInfo.isActive, true), + gt(deliverySlotInfo.deliveryTime, new Date()), + gt(deliverySlotInfo.freezeTime, new Date()) + ) + ) + .orderBy(deliverySlotInfo.deliveryTime) +} + +/** + * Get special deals for product + */ +export async function getProductSpecialDeals(productId: number) { + return db + .select({ + quantity: specialDeals.quantity, + price: specialDeals.price, + validTill: specialDeals.validTill, + }) + .from(specialDeals) + .where( + and( + eq(specialDeals.productId, productId), + gt(specialDeals.validTill, new Date()) + ) + ) + .orderBy(specialDeals.quantity) +} + +/** + * Get product reviews with user info + */ +export async function getProductReviews(productId: number, limit: number, offset: number) { + return db + .select({ + id: productReviews.id, + reviewBody: productReviews.reviewBody, + ratings: productReviews.ratings, + imageUrls: productReviews.imageUrls, + reviewTime: productReviews.reviewTime, + userName: users.name, + }) + .from(productReviews) + .innerJoin(users, eq(productReviews.userId, users.id)) + .where(eq(productReviews.productId, productId)) + .orderBy(desc(productReviews.reviewTime)) + .limit(limit) + .offset(offset) +} + +/** + * Count reviews for product + */ +export async function countProductReviews(productId: number) { + const result = await db + .select({ count: sql`count(*)` }) + .from(productReviews) + .where(eq(productReviews.productId, productId)) + + return Number(result[0].count) +} + +/** + * Check if product exists + */ +export async function checkProductExists(productId: number) { + return db.query.productInfo.findFirst({ + where: eq(productInfo.id, productId), + }) +} + +/** + * Insert new review + */ +export async function insertReview(data: { + userId: number + productId: number + reviewBody: string + ratings: number + imageUrls: string[] +}) { + const normalized = { + ...data, + imageUrls: toJsonString(data.imageUrls, '[]'), + } + return db.insert(productReviews).values(normalized).returning() +} diff --git a/apps/db-helper-sqlite/src/stores/product-store.ts b/apps/db-helper-sqlite/src/stores/product-store.ts new file mode 100644 index 0000000..beed758 --- /dev/null +++ b/apps/db-helper-sqlite/src/stores/product-store.ts @@ -0,0 +1,188 @@ +// import redisClient from '@/src/stores/redis-client'; +import redisClient from '@/src/lib/redis-client'; +import { db } from '../db/db_index' +import { productInfo, units, productSlots, deliverySlotInfo, specialDeals, storeInfo, productTags, productTagInfo } from '../db/schema' +import { eq, and, gt, sql } from 'drizzle-orm'; +import { generateSignedUrlsFromS3Urls, scaffoldAssetUrl } from '@/src/lib/s3-client'; + +// Uniform Product Type (matches getProductDetails return) +interface Product { + id: number; + name: string; + shortDescription: string | null; + longDescription: string | null; + price: string; + marketPrice: string | null; + unitNotation: string; + images: string[]; + isOutOfStock: boolean; + store: { id: number; name: string; description: string | null } | null; + incrementStep: number; + productQuantity: number; + isFlashAvailable: boolean; + flashPrice: string | null; + deliverySlots: Array<{ id: number; deliveryTime: Date; freezeTime: Date; isCapacityFull: boolean }>; + specialDeals: Array<{ quantity: string; price: string; validTill: Date }>; + productTags: string[]; +} + +export async function initializeProducts(): Promise { + try { + console.log('Initializing product store in Redis...'); + + // Fetch all products with full details (similar to productMega logic) + const productsData = await db + .select({ + id: productInfo.id, + name: productInfo.name, + shortDescription: productInfo.shortDescription, + longDescription: productInfo.longDescription, + price: productInfo.price, + marketPrice: productInfo.marketPrice, + images: productInfo.images, + isOutOfStock: productInfo.isOutOfStock, + storeId: productInfo.storeId, + unitShortNotation: units.shortNotation, + incrementStep: productInfo.incrementStep, + productQuantity: productInfo.productQuantity, + isFlashAvailable: productInfo.isFlashAvailable, + flashPrice: productInfo.flashPrice, + }) + .from(productInfo) + .innerJoin(units, eq(productInfo.unitId, units.id)); + + // Fetch all stores + const allStores = await db.query.storeInfo.findMany({ + columns: { id: true, name: true, description: true }, + }); + const storeMap = new Map(allStores.map(s => [s.id, s])); + + // Fetch all delivery slots (excluding full capacity slots) + const allDeliverySlots = await db + .select({ + productId: productSlots.productId, + id: deliverySlotInfo.id, + deliveryTime: deliverySlotInfo.deliveryTime, + freezeTime: deliverySlotInfo.freezeTime, + isCapacityFull: deliverySlotInfo.isCapacityFull, + }) + .from(productSlots) + .innerJoin(deliverySlotInfo, eq(productSlots.slotId, deliverySlotInfo.id)) + .where( + and( + eq(deliverySlotInfo.isActive, true), + eq(deliverySlotInfo.isCapacityFull, false), + gt(deliverySlotInfo.deliveryTime, new Date()) + ) + ); + const deliverySlotsMap = new Map(); + for (const slot of allDeliverySlots) { + if (!deliverySlotsMap.has(slot.productId)) deliverySlotsMap.set(slot.productId, []); + deliverySlotsMap.get(slot.productId)!.push(slot); + } + + // Fetch all special deals + const allSpecialDeals = await db + .select({ + productId: specialDeals.productId, + quantity: specialDeals.quantity, + price: specialDeals.price, + validTill: specialDeals.validTill, + }) + .from(specialDeals) + .where(gt(specialDeals.validTill, new Date())); + const specialDealsMap = new Map(); + for (const deal of allSpecialDeals) { + if (!specialDealsMap.has(deal.productId)) specialDealsMap.set(deal.productId, []); + specialDealsMap.get(deal.productId)!.push(deal); + } + + // Fetch all product tags + const allProductTags = await db + .select({ + productId: productTags.productId, + tagName: productTagInfo.tagName, + }) + .from(productTags) + .innerJoin(productTagInfo, eq(productTags.tagId, productTagInfo.id)); + const productTagsMap = new Map(); + for (const tag of allProductTags) { + if (!productTagsMap.has(tag.productId)) productTagsMap.set(tag.productId, []); + productTagsMap.get(tag.productId)!.push(tag.tagName); + } + + // Store each product in Redis + for (const product of productsData) { + const signedImages = scaffoldAssetUrl((product.images as string[]) || []); + const store = product.storeId ? storeMap.get(product.storeId) || null : null; + const deliverySlots = deliverySlotsMap.get(product.id) || []; + const specialDeals = specialDealsMap.get(product.id) || []; + const productTags = productTagsMap.get(product.id) || []; + + const productObj: Product = { + id: product.id, + name: product.name, + shortDescription: product.shortDescription, + longDescription: product.longDescription, + price: product.price.toString(), + marketPrice: product.marketPrice?.toString() || null, + unitNotation: product.unitShortNotation, + images: signedImages, + isOutOfStock: product.isOutOfStock, + store: store ? { id: store.id, name: store.name, description: store.description } : null, + incrementStep: product.incrementStep, + productQuantity: product.productQuantity, + isFlashAvailable: product.isFlashAvailable, + flashPrice: product.flashPrice?.toString() || null, + deliverySlots: deliverySlots.map(s => ({ id: s.id, deliveryTime: s.deliveryTime, freezeTime: s.freezeTime, isCapacityFull: s.isCapacityFull })), + specialDeals: specialDeals.map(d => ({ quantity: d.quantity.toString(), price: d.price.toString(), validTill: d.validTill })), + productTags: productTags, + }; + + + await redisClient.set(`product:${product.id}`, JSON.stringify(productObj)); + } + + console.log('Product store initialized successfully'); + } catch (error) { + console.error('Error initializing product store:', error); + } +} + +export async function getProductById(id: number): Promise { + try { + const key = `product:${id}`; + const data = await redisClient.get(key); + if (!data) return null; + return JSON.parse(data) as Product; + } catch (error) { + console.error(`Error getting product ${id}:`, error); + return null; + } +} + +export async function getAllProducts(): Promise { + try { + // Get all keys matching the pattern "product:*" + const keys = await redisClient.KEYS('product:*'); + + if (keys.length === 0) { + return []; + } + + // Get all products using MGET for better performance + const productsData = await redisClient.MGET(keys); + + const products: Product[] = []; + for (const productData of productsData) { + if (productData) { + products.push(JSON.parse(productData) as Product); + } + } + + return products; + } catch (error) { + console.error('Error getting all products:', error); + return []; + } +} diff --git a/apps/db-helper-sqlite/src/trpc/apis/common-apis/common-trpc-index.ts b/apps/db-helper-sqlite/src/trpc/apis/common-apis/common-trpc-index.ts new file mode 100644 index 0000000..783b0e6 --- /dev/null +++ b/apps/db-helper-sqlite/src/trpc/apis/common-apis/common-trpc-index.ts @@ -0,0 +1,137 @@ +import { router, publicProcedure, protectedProcedure } from '@/src/trpc/trpc-index' +import { commonRouter } from '@/src/trpc/apis/common-apis/common' +import { db } from '../../../db/db_index' +import { keyValStore, productInfo, storeInfo } from '../../../db/schema' +import * as turf from '@turf/turf'; +import { z } from 'zod'; +import { mbnrGeoJson } from '@/src/lib/mbnr-geojson' +import { generateUploadUrl } from '@/src/lib/s3-client' +import { ApiError } from '@/src/lib/api-error' +import { getAllConstValues } from '@/src/lib/const-store' +import { CONST_KEYS } from '@/src/lib/const-keys' +import { assetsDomain, apiCacheKey } from '@/src/lib/env-exporter' + +const polygon = turf.polygon(mbnrGeoJson.features[0].geometry.coordinates); + +export async function scaffoldEssentialConsts() { + const consts = await getAllConstValues(); + + return { + freeDeliveryThreshold: consts[CONST_KEYS.freeDeliveryThreshold] ?? 200, + deliveryCharge: consts[CONST_KEYS.deliveryCharge] ?? 0, + flashFreeDeliveryThreshold: consts[CONST_KEYS.flashFreeDeliveryThreshold] ?? 500, + flashDeliveryCharge: consts[CONST_KEYS.flashDeliveryCharge] ?? 69, + popularItems: consts[CONST_KEYS.popularItems] ?? '5,3,2,4,1', + versionNum: consts[CONST_KEYS.versionNum] ?? '1.1.0', + playStoreUrl: consts[CONST_KEYS.playStoreUrl] ?? 'https://play.google.com/store/apps/details?id=in.freshyo.app', + appStoreUrl: consts[CONST_KEYS.appStoreUrl] ?? 'https://apps.apple.com/in/app/freshyo/id6756889077', + webViewHtml: null, + isWebviewClosable: true, + isFlashDeliveryEnabled: consts[CONST_KEYS.isFlashDeliveryEnabled] ?? true, + supportMobile: consts[CONST_KEYS.supportMobile] ?? '', + supportEmail: consts[CONST_KEYS.supportEmail] ?? '', + assetsDomain, + apiCacheKey, + }; +} + +export const commonApiRouter = router({ + product: commonRouter, + getStoresSummary: publicProcedure + .query(async () => { + const stores = await db.query.storeInfo.findMany({ + columns: { + id: true, + name: true, + description: true, + }, + }); + + return { + stores, + }; + }), + checkLocationInPolygon: publicProcedure + .input(z.object({ + lat: z.number().min(-90).max(90), + lng: z.number().min(-180).max(180), + })) + .query(({ input }) => { + try { + const { lat, lng } = input; + const point = turf.point([lng, lat]); // GeoJSON: [longitude, latitude] + const isInside = turf.booleanPointInPolygon(point, polygon); + return { isInside }; + } catch (error) { + throw new Error('Invalid coordinates or polygon data'); + } + }), + + generateUploadUrls: protectedProcedure + .input(z.object({ + contextString: z.enum(['review', 'product_info', 'store', 'notification', 'profile', 'complaint']), + mimeTypes: z.array(z.string()), + })) + .mutation(async ({ input }): Promise<{ uploadUrls: string[] }> => { + const { contextString, mimeTypes } = input; + + const uploadUrls: string[] = []; + const keys: string[] = []; + + for (const mimeType of mimeTypes) { + // Generate key based on context and mime type + let folder: string; + if (contextString === 'review') { + folder = 'review-images'; + } else if (contextString === 'product_info') { + folder = 'product-images'; + } else if (contextString === 'store') { + folder = 'store-images'; + } else if (contextString === 'profile') { + folder = 'profile-images'; + } else if (contextString === 'complaint') { + folder = 'complaint-images'; + } + // else if (contextString === 'review_response') { + // + // folder = 'review-response-images'; + // } + else { + folder = ''; + } + + const extension = mimeType === 'image/jpeg' ? '.jpg' : + mimeType === 'image/png' ? '.png' : + mimeType === 'image/gif' ? '.gif' : '.jpg'; + const key = `${folder}/${Date.now()}${extension}`; + + try { + const uploadUrl = await generateUploadUrl(key, mimeType); + uploadUrls.push(uploadUrl); + keys.push(key); + + } catch (error) { + console.error('Error generating upload URL:', error); + throw new ApiError('Failed to generate upload URL', 500); + } + } + return { uploadUrls }; + }), + healthCheck: publicProcedure + .query(async () => { + // Test DB connection by selecting product names + // await db.select({ name: productInfo.name }).from(productInfo).limit(1); + await db.select({ key: keyValStore.key }).from(keyValStore).limit(1); + + return { + status: "ok", + }; + }), + essentialConsts: publicProcedure + .query(async () => { + const response = await scaffoldEssentialConsts(); + return response; + }), +}); + +export type CommonApiRouter = typeof commonApiRouter; diff --git a/apps/db-helper-sqlite/src/trpc/apis/common-apis/common.ts b/apps/db-helper-sqlite/src/trpc/apis/common-apis/common.ts new file mode 100644 index 0000000..7a2f355 --- /dev/null +++ b/apps/db-helper-sqlite/src/trpc/apis/common-apis/common.ts @@ -0,0 +1,116 @@ +import { router, publicProcedure } from '@/src/trpc/trpc-index' +import { db } from '../../../db/db_index' +import { productInfo, units, productSlots, deliverySlotInfo, storeInfo } from '../../../db/schema' +import { eq, gt, and, sql, inArray } from 'drizzle-orm'; +import { generateSignedUrlsFromS3Urls, generateSignedUrlFromS3Url } from '@/src/lib/s3-client' +import { getAllProducts as getAllProductsFromCache } from '@/src/stores/product-store' +import { getDashboardTags as getDashboardTagsFromCache } from '@/src/stores/product-tag-store' + +export const getNextDeliveryDate = async (productId: number): Promise => { + const result = await db + .select({ deliveryTime: deliverySlotInfo.deliveryTime }) + .from(productSlots) + .innerJoin(deliverySlotInfo, eq(productSlots.slotId, deliverySlotInfo.id)) + .where( + and( + eq(productSlots.productId, productId), + eq(deliverySlotInfo.isActive, true), + eq(deliverySlotInfo.isCapacityFull, false), + gt(deliverySlotInfo.deliveryTime, new Date()) + ) + ) + .orderBy(deliverySlotInfo.deliveryTime) + .limit(1); + + + return result[0]?.deliveryTime || null; +}; + +export async function scaffoldProducts() { + // Get all products from cache + let products = await getAllProductsFromCache(); + products = products.filter(item => Boolean(item.id)) + + // Get suspended product IDs to filter them out + const suspendedProducts = await db + .select({ id: productInfo.id }) + .from(productInfo) + .where(eq(productInfo.isSuspended, true)); + + const suspendedProductIds = new Set(suspendedProducts.map(sp => sp.id)); + + // Filter out suspended products + products = products.filter(product => !suspendedProductIds.has(product.id)); + + // Format products to match the expected response structure + const formattedProducts = await Promise.all( + products.map(async (product) => { + const nextDeliveryDate = await getNextDeliveryDate(product.id); + return { + id: product.id, + name: product.name, + shortDescription: product.shortDescription, + price: parseFloat(product.price), + marketPrice: product.marketPrice ? parseFloat(product.marketPrice) : null, + unit: product.unitNotation, + unitNotation: product.unitNotation, + incrementStep: product.incrementStep, + productQuantity: product.productQuantity, + storeId: product.store?.id || null, + isOutOfStock: product.isOutOfStock, + isFlashAvailable: product.isFlashAvailable, + nextDeliveryDate: nextDeliveryDate ? nextDeliveryDate.toISOString() : null, + images: product.images, + flashPrice: product.flashPrice + }; + }) + ); + + return { + products: formattedProducts, + count: formattedProducts.length, + }; +} + +export const commonRouter = router({ + getDashboardTags: publicProcedure + .query(async () => { + // Get dashboard tags from cache + const tags = await getDashboardTagsFromCache(); + + return { + tags: tags, + }; + }), + + getAllProductsSummary: publicProcedure + .query(async () => { + const response = await scaffoldProducts(); + return response; + }), + + getStoresSummary: publicProcedure + .query(async () => { + const stores = await db.query.storeInfo.findMany({ + columns: { + id: true, + name: true, + description: true, + }, + }); + + return { + stores, + }; + }), + + healthCheck: publicProcedure + .query(async () => { + // Test DB connection by selecting product names + await db.select({ name: productInfo.name }).from(productInfo).limit(1); + + return { + status: "ok", + }; + }), +}); diff --git a/apps/db-helper-sqlite/tsconfig.json b/apps/db-helper-sqlite/tsconfig.json new file mode 100644 index 0000000..3b1e847 --- /dev/null +++ b/apps/db-helper-sqlite/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/src/db/*": ["./src/db/*"], + "@/src/*": ["../backend/src/*"], + "@/src/trpc/*": ["../backend/src/trpc/*"], + "@/src/lib/*": ["../backend/src/lib/*"], + "@/src/stores/*": ["../backend/src/stores/*"] + } + } +} diff --git a/apps/fallback-ui/tsconfig.json b/apps/fallback-ui/tsconfig.json index 946c301..7ccdc15 100644 --- a/apps/fallback-ui/tsconfig.json +++ b/apps/fallback-ui/tsconfig.json @@ -24,12 +24,6 @@ "@/*": [ "./src/*" ], - "common-ui": [ - "../../packages/ui" - ], - "common-ui/*": [ - "../../packages/ui/*" - ] }, "types": [ "node" diff --git a/apps/migrator/README.md b/apps/migrator/README.md new file mode 100644 index 0000000..09a8832 --- /dev/null +++ b/apps/migrator/README.md @@ -0,0 +1,59 @@ +# Migrator + +Data-only migration tool between Postgres and SQLite using Drizzle. + +## What it does + +- Copies data from source to target +- Does NOT create or alter tables +- Overwrites target data if any rows exist (via `DELETE FROM` in dependency-safe order) + +## Requirements + +- Tables must already exist on the target database +- Schema must match the backend Drizzle schemas + +## Usage + +Run from repo root: + +1) Edit the TypeScript config file: + +`apps/migrator/migrator.config.ts` + +2) Run migration: + +```bash +bun --cwd apps/migrator run migrate +``` + +### Config fields (`apps/migrator/migrator.config.ts`) + +- `from`: `postgres` or `sqlite` +- `to`: `postgres` or `sqlite` +- `source`: Postgres connection string or SQLite file path +- `target`: Postgres connection string or SQLite file path +- `batchSize`: optional batch size (default: `500`) + +## Examples + +```bash +Update `apps/migrator/migrator.config.ts` and run: + +```bash +bun --cwd apps/migrator run migrate +``` +``` + +```bash +Update `apps/migrator/migrator.config.ts` and run: + +```bash +bun --cwd apps/migrator run migrate +``` +``` + +## Notes + +- IDs are copied as-is to preserve relationships. +- For Postgres targets, sequences may need manual reset after import. diff --git a/apps/migrator/migrator.config.ts b/apps/migrator/migrator.config.ts new file mode 100644 index 0000000..fccdd96 --- /dev/null +++ b/apps/migrator/migrator.config.ts @@ -0,0 +1,11 @@ +import type { MigrationConfig } from './src/lib/types' + +const config: MigrationConfig = { + from: 'postgres', + to: 'sqlite', + source: 'postgresql://postgres:meatfarmer_master_password@57.128.212.174:7447/meatfarmer' , + target: './sqlite.db', + batchSize: 500, +} + +export default config diff --git a/apps/migrator/mydatabase.db b/apps/migrator/mydatabase.db new file mode 100644 index 0000000..e69de29 diff --git a/apps/migrator/package.json b/apps/migrator/package.json new file mode 100644 index 0000000..dbd5e57 --- /dev/null +++ b/apps/migrator/package.json @@ -0,0 +1,13 @@ +{ + "name": "migrator", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "migrate": "bun src/index.ts" + }, + "dependencies": { + "drizzle-orm": "^0.45.1", + "pg": "^8.11.3" + } +} diff --git a/apps/migrator/sqlite.db b/apps/migrator/sqlite.db new file mode 100644 index 0000000..c2eb574 Binary files /dev/null and b/apps/migrator/sqlite.db differ diff --git a/apps/migrator/src/index.ts b/apps/migrator/src/index.ts new file mode 100644 index 0000000..42db74c --- /dev/null +++ b/apps/migrator/src/index.ts @@ -0,0 +1,16 @@ +import { runPostgresToSqlite } from './postgres_to_sqlite' +import { runSqliteToPostgres } from './sqlite_to_postgres' +import config from '../migrator.config' + +const args = { + ...config, + batchSize: config.batchSize ?? 500, +} + +if (args.from === 'postgres' && args.to === 'sqlite') { + await runPostgresToSqlite(args) +} else if (args.from === 'sqlite' && args.to === 'postgres') { + await runSqliteToPostgres(args) +} else { + throw new Error('Unsupported migration direction. Use --from postgres --to sqlite or --from sqlite --to postgres.') +} diff --git a/apps/migrator/src/lib/casts.ts b/apps/migrator/src/lib/casts.ts new file mode 100644 index 0000000..65834d2 --- /dev/null +++ b/apps/migrator/src/lib/casts.ts @@ -0,0 +1,35 @@ +export const parseJsonValue = (value: unknown, fallback: T): T => { + if (value === null || value === undefined) return fallback + if (typeof value === 'string') { + try { + return JSON.parse(value) as T + } catch { + return fallback + } + } + return value as T +} + +export const toJsonString = (value: unknown, fallback: string): string => { + if (value === null || value === undefined) return fallback + if (typeof value === 'string') return value + return JSON.stringify(value) +} + +export const toEpochSeconds = (value: Date | number): number => { + if (typeof value === 'number') return value + return Math.floor(value.getTime() / 1000) +} + +export const toDate = (value: number | Date | null | undefined): Date | null => { + if (value === null || value === undefined) return null + if (value instanceof Date) return value + return new Date(value * 1000) +} + +export const toBoolean = (value: unknown): boolean => { + if (typeof value === 'boolean') return value + if (typeof value === 'number') return value !== 0 + if (typeof value === 'string') return value === 'true' || value === '1' + return false +} diff --git a/apps/migrator/src/lib/column-maps.ts b/apps/migrator/src/lib/column-maps.ts new file mode 100644 index 0000000..359ae74 --- /dev/null +++ b/apps/migrator/src/lib/column-maps.ts @@ -0,0 +1,92 @@ +import type { TableName } from './table-order' + +export const jsonColumns: Partial> = { + productInfo: ['images'], + productAvailabilitySchedules: ['productIds', 'groupIds'], + homeBanners: ['productIds'], + productReviews: ['imageUrls', 'adminResponseImages'], + deliverySlotInfo: ['deliverySequence', 'groupIds'], + vendorSnippets: ['productIds'], + paymentInfoTable: ['payload'], + payments: ['payload'], + keyValStore: ['value'], + complaints: ['images'], + coupons: ['productIds'], + reservedCoupons: ['productIds'], + userNotifications: ['applicableUsers'], + productTagInfo: ['relatedStores'], +} + +export const jsonArrayColumns: Partial> = { + productInfo: ['images'], + productAvailabilitySchedules: ['productIds', 'groupIds'], + homeBanners: ['productIds'], + productReviews: ['imageUrls', 'adminResponseImages'], + deliverySlotInfo: ['groupIds'], + vendorSnippets: ['productIds'], + complaints: ['images'], + coupons: ['productIds'], + reservedCoupons: ['productIds'], + userNotifications: ['applicableUsers'], + productTagInfo: ['relatedStores'], +} + +export const jsonObjectColumns: Partial> = { + deliverySlotInfo: ['deliverySequence'], + paymentInfoTable: ['payload'], + payments: ['payload'], + keyValStore: ['value'], +} + +export const timestampColumns: Partial> = { + users: ['createdAt'], + userDetails: ['createdAt', 'updatedAt', 'dateOfBirth'], + userCreds: ['createdAt'], + addresses: ['createdAt'], + addressZones: ['addedAt'], + addressAreas: ['createdAt'], + staffUsers: ['createdAt'], + storeInfo: ['createdAt'], + productInfo: ['createdAt'], + productAvailabilitySchedules: ['createdAt', 'lastUpdated'], + productGroupInfo: ['createdAt'], + productGroupMembership: ['addedAt'], + homeBanners: ['createdAt', 'lastUpdated'], + productReviews: ['reviewTime'], + uploadUrlStatus: ['createdAt'], + productTagInfo: ['createdAt'], + productTags: ['assignedAt'], + deliverySlotInfo: ['deliveryTime', 'freezeTime'], + vendorSnippets: ['validTill', 'createdAt'], + specialDeals: ['validTill'], + orders: ['createdAt'], + orderStatus: ['orderTime', 'cancellationReviewedAt'], + refunds: ['refundProcessedAt', 'createdAt'], + notifications: ['createdAt'], + cartItems: ['addedAt'], + complaints: ['createdAt'], + coupons: ['validTill', 'createdAt'], + couponUsage: ['usedAt'], + userIncidents: ['dateAdded'], + reservedCoupons: ['validTill', 'redeemedAt', 'createdAt'], + notifCreds: ['addedAt', 'lastVerified'], + unloggedUserTokens: ['addedAt', 'lastVerified'], + userNotifications: ['createdAt'], +} + +export const booleanColumns: Partial> = { + userDetails: ['isSuspended'], + addresses: ['isDefault'], + productInfo: ['isOutOfStock', 'isSuspended', 'isFlashAvailable', 'scheduledAvailability'], + homeBanners: ['isActive'], + productTagInfo: ['isDashboardTag'], + deliverySlotInfo: ['isActive', 'isFlash', 'isCapacityFull'], + vendorSnippets: ['isPermanent'], + orders: ['isCod', 'isOnlinePayment', 'isFlashDelivery'], + orderItems: ['is_packaged', 'is_package_verified'], + orderStatus: ['isPackaged', 'isDelivered', 'isCancelled', 'isCancelledByAdmin', 'cancellationReviewed'], + notifications: ['isRead'], + complaints: ['isResolved'], + coupons: ['isUserBased', 'isApplyForAll', 'isInvalidated', 'exclusiveApply'], + reservedCoupons: ['exclusiveApply', 'isRedeemed'], +} diff --git a/apps/migrator/src/lib/db.ts b/apps/migrator/src/lib/db.ts new file mode 100644 index 0000000..d08296a --- /dev/null +++ b/apps/migrator/src/lib/db.ts @@ -0,0 +1,18 @@ +import { drizzle as drizzlePostgres } from 'drizzle-orm/node-postgres' +import { drizzle as drizzleSqlite } from 'drizzle-orm/bun-sqlite' +import { Pool } from 'pg' +import { Database } from 'bun:sqlite' +import * as postgresSchema from '../../../backend/src/db/schema-postgres' +import * as sqliteSchema from '../../../backend/src/db/schema-sqlite' + +export const createPostgresDb = (connectionString: string) => { + const pool = new Pool({ connectionString }) + const db = drizzlePostgres(pool, { schema: postgresSchema }) + return { db, pool } +} + +export const createSqliteDb = (filePath: string) => { + const sqlite = new Database(filePath) + const db = drizzleSqlite(sqlite, { schema: sqliteSchema }) + return { db, sqlite } +} diff --git a/apps/migrator/src/lib/migrate.ts b/apps/migrator/src/lib/migrate.ts new file mode 100644 index 0000000..bf4d4d9 --- /dev/null +++ b/apps/migrator/src/lib/migrate.ts @@ -0,0 +1,139 @@ +import { sql, asc } from 'drizzle-orm' +import type { TableName } from './table-order' +import { tableOrder } from './table-order' +import { postgresTables, sqliteTables, type TableMap } from './schema-maps' +import { booleanColumns, jsonArrayColumns, jsonColumns, jsonObjectColumns, timestampColumns } from './column-maps' +import { parseJsonValue, toBoolean, toDate, toJsonString } from './casts' + +export type Dialect = 'postgres' | 'sqlite' + +type MigrationContext = { + from: Dialect + to: Dialect + sourceDb: any + targetDb: any + batchSize: number +} + +const getTables = (dialect: Dialect): TableMap => (dialect === 'postgres' ? postgresTables : sqliteTables) + +const getOrderById = (table: any) => { + const idColumn = table?.id + if (!idColumn) return undefined + return asc(idColumn) +} + +const getRowCount = async (db: any, table: any): Promise => { + const result = await db.select({ count: sql`count(*)` }).from(table) + const count = result[0]?.count + return Number(count || 0) +} + +const shouldOverwriteTarget = async (db: any, tables: TableMap): Promise => { + for (const name of tableOrder) { + const count = await getRowCount(db, tables[name]) + if (count > 0) return true + } + return false +} + +const clearTarget = async (db: any, tables: TableMap) => { + const reversed = [...tableOrder].reverse() + for (const name of reversed) { + await db.delete(tables[name]) + } +} + +const normalizeJson = (value: unknown, tableName: TableName, column: string, toDialect: Dialect) => { + const isArray = jsonArrayColumns[tableName]?.includes(column) + const isObject = jsonObjectColumns[tableName]?.includes(column) + const fallback = isArray ? [] : isObject ? {} : null + + if (toDialect === 'sqlite') { + if (value === null || value === undefined) { + return isArray ? '[]' : isObject ? '{}' : null + } + return toJsonString(value, isArray ? '[]' : isObject ? '{}' : 'null') + } + + return parseJsonValue(value, fallback) +} + +const normalizeTimestamps = (value: unknown) => { + if (value === null || value === undefined) return value + return toDate(value as number | Date) +} + +const normalizeBoolean = (value: unknown, toDialect: Dialect) => { + if (toDialect === 'postgres') { + return toBoolean(value) + } + return value +} + +const transformRow = (row: Record, tableName: TableName, toDialect: Dialect) => { + const jsonCols = jsonColumns[tableName] || [] + const timeCols = timestampColumns[tableName] || [] + const boolCols = booleanColumns[tableName] || [] + + const output: Record = { ...row } + + jsonCols.forEach((column) => { + output[column] = normalizeJson(output[column], tableName, column, toDialect) + }) + + timeCols.forEach((column) => { + output[column] = normalizeTimestamps(output[column]) + }) + + boolCols.forEach((column) => { + output[column] = normalizeBoolean(output[column], toDialect) + }) + + return output +} + +const copyTable = async (context: MigrationContext, tableName: TableName) => { + const fromTables = getTables(context.from) + const toTables = getTables(context.to) + + const fromTable = fromTables[tableName] + const toTable = toTables[tableName] + + const total = await getRowCount(context.sourceDb, fromTable) + if (total === 0) return + + let offset = 0 + while (offset < total) { + let query = context.sourceDb.select().from(fromTable) + const orderBy = getOrderById(fromTable) + if (orderBy) { + query = query.orderBy(orderBy) + } + + const batch = await query.limit(context.batchSize).offset(offset) + + const normalized = batch.map((row: Record) => + transformRow(row, tableName, context.to) + ) + + if (normalized.length > 0) { + await context.targetDb.insert(toTable).values(normalized) + } + + offset += context.batchSize + } +} + +export const runMigration = async (context: MigrationContext) => { + const targetTables = getTables(context.to) + + const overwrite = await shouldOverwriteTarget(context.targetDb, targetTables) + if (overwrite) { + await clearTarget(context.targetDb, targetTables) + } + + for (const tableName of tableOrder) { + await copyTable(context, tableName) + } +} diff --git a/apps/migrator/src/lib/schema-maps.ts b/apps/migrator/src/lib/schema-maps.ts new file mode 100644 index 0000000..36954e4 --- /dev/null +++ b/apps/migrator/src/lib/schema-maps.ts @@ -0,0 +1,21 @@ +import type { TableName } from './table-order' +import * as postgresSchema from '../../../backend/src/db/schema-postgres' +import * as sqliteSchema from '../../../backend/src/db/schema-sqlite' +import { tableOrder } from './table-order' + +export type TableMap = Record + +const buildMap = (schema: Record): TableMap => { + const map = {} as TableMap + tableOrder.forEach((name) => { + const table = schema[name] + if (!table) { + throw new Error(`Missing table export for ${name}`) + } + map[name] = table + }) + return map +} + +export const postgresTables = buildMap(postgresSchema as Record) +export const sqliteTables = buildMap(sqliteSchema as Record) diff --git a/apps/migrator/src/lib/table-order.ts b/apps/migrator/src/lib/table-order.ts new file mode 100644 index 0000000..e238423 --- /dev/null +++ b/apps/migrator/src/lib/table-order.ts @@ -0,0 +1,48 @@ +export const tableOrder = [ + 'users', + 'staffRoles', + 'staffPermissions', + 'staffRolePermissions', + 'staffUsers', + 'storeInfo', + 'units', + 'productInfo', + 'productGroupInfo', + 'productGroupMembership', + 'productTagInfo', + 'productTags', + 'addressZones', + 'addressAreas', + 'addresses', + 'deliverySlotInfo', + 'productSlots', + 'productAvailabilitySchedules', + 'homeBanners', + 'vendorSnippets', + 'specialDeals', + 'coupons', + 'couponApplicableUsers', + 'couponApplicableProducts', + 'reservedCoupons', + 'paymentInfoTable', + 'orders', + 'payments', + 'orderItems', + 'orderStatus', + 'refunds', + 'complaints', + 'couponUsage', + 'userDetails', + 'userCreds', + 'notifications', + 'cartItems', + 'keyValStore', + 'notifCreds', + 'unloggedUserTokens', + 'userNotifications', + 'productReviews', + 'uploadUrlStatus', + 'userIncidents', +] as const + +export type TableName = typeof tableOrder[number] diff --git a/apps/migrator/src/lib/types.ts b/apps/migrator/src/lib/types.ts new file mode 100644 index 0000000..c9c914b --- /dev/null +++ b/apps/migrator/src/lib/types.ts @@ -0,0 +1,7 @@ +export type MigrationConfig = { + from: 'postgres' | 'sqlite' + to: 'postgres' | 'sqlite' + source: string + target: string + batchSize?: number +} diff --git a/apps/migrator/src/postgres_to_sqlite/index.ts b/apps/migrator/src/postgres_to_sqlite/index.ts new file mode 100644 index 0000000..8ed80c7 --- /dev/null +++ b/apps/migrator/src/postgres_to_sqlite/index.ts @@ -0,0 +1,21 @@ +import type { MigrationConfig } from '../lib/types' +import { createPostgresDb, createSqliteDb } from '../lib/db' +import { runMigration } from '../lib/migrate' + +export const runPostgresToSqlite = async (args: MigrationConfig & { batchSize: number }) => { + const { db: sourceDb, pool } = createPostgresDb(args.source) + const { db: targetDb, sqlite } = createSqliteDb(args.target) + + try { + await runMigration({ + from: 'postgres', + to: 'sqlite', + sourceDb, + targetDb, + batchSize: args.batchSize, + }) + } finally { + await pool.end() + sqlite.close() + } +} diff --git a/apps/migrator/src/postgres_to_sqlite/sqlite.db b/apps/migrator/src/postgres_to_sqlite/sqlite.db new file mode 100644 index 0000000..d296495 Binary files /dev/null and b/apps/migrator/src/postgres_to_sqlite/sqlite.db differ diff --git a/apps/migrator/src/sqlite_to_postgres/index.ts b/apps/migrator/src/sqlite_to_postgres/index.ts new file mode 100644 index 0000000..70acd77 --- /dev/null +++ b/apps/migrator/src/sqlite_to_postgres/index.ts @@ -0,0 +1,21 @@ +import type { MigrationConfig } from '../lib/types' +import { createPostgresDb, createSqliteDb } from '../lib/db' +import { runMigration } from '../lib/migrate' + +export const runSqliteToPostgres = async (args: MigrationConfig & { batchSize: number }) => { + const { db: sourceDb, sqlite } = createSqliteDb(args.source) + const { db: targetDb, pool } = createPostgresDb(args.target) + + try { + await runMigration({ + from: 'sqlite', + to: 'postgres', + sourceDb, + targetDb, + batchSize: args.batchSize, + }) + } finally { + sqlite.close() + await pool.end() + } +} diff --git a/apps/user-ui/app/(auth)/register.tsx b/apps/user-ui/app/(auth)/register.tsx index 157e069..bb61e9e 100644 --- a/apps/user-ui/app/(auth)/register.tsx +++ b/apps/user-ui/app/(auth)/register.tsx @@ -11,10 +11,16 @@ function Register() { const { register } = useAuth(); const [isLoading, setIsLoading] = useState(false); - const handleRegister = async (formData: FormData) => { + const handleRegister = async (data: { + name: string; + email: string; + mobile: string; + password: string; + imageKey?: string; + }) => { setIsLoading(true); try { - await register(formData); + await register(data); // Auth context will handle navigation on successful registration } catch (error: any) { Alert.alert( @@ -45,8 +51,7 @@ function Register() { Already have an account? - router.push('/(auth)/login')}> - + router.push('/(auth)/login')}> Sign in @@ -56,4 +61,4 @@ function Register() { ); } -export default Register; \ No newline at end of file +export default Register; diff --git a/apps/user-ui/app/(drawer)/(tabs)/flash-delivery/_layout.tsx b/apps/user-ui/app/(drawer)/(tabs)/flash-delivery/_layout.tsx index 5a1c8bc..a9e39dc 100644 --- a/apps/user-ui/app/(drawer)/(tabs)/flash-delivery/_layout.tsx +++ b/apps/user-ui/app/(drawer)/(tabs)/flash-delivery/_layout.tsx @@ -5,7 +5,7 @@ import { trpc } from '@/src/trpc-client'; import { MyText, MyTouchableOpacity, tw, AppContainer } from 'common-ui'; import { useRouter } from 'expo-router'; import MaterialIcons from '@expo/vector-icons/MaterialIcons'; -import { useGetEssentialConsts } from '@/src/api-hooks/essential-consts.api'; +import { useGetEssentialConsts } from '@/src/hooks/prominent-api-hooks'; export default function FlashDeliveryBaseLayout() { const router = useRouter(); diff --git a/apps/user-ui/app/(drawer)/(tabs)/home/index.tsx b/apps/user-ui/app/(drawer)/(tabs)/home/index.tsx index d378136..77aa0ad 100755 --- a/apps/user-ui/app/(drawer)/(tabs)/home/index.tsx +++ b/apps/user-ui/app/(drawer)/(tabs)/home/index.tsx @@ -21,13 +21,15 @@ import AddToCartDialog from "@/src/components/AddToCartDialog"; import MyFlatList from "common-ui/src/components/flat-list"; import { trpc } from "@/src/trpc-client"; +import { useAllProducts, useStores, useSlots, useGetEssentialConsts } from "@/src/hooks/prominent-api-hooks"; import { useProductSlotIdentifier } from "@/hooks/useProductSlotIdentifier"; +import { useCentralSlotStore } from "@/src/store/centralSlotStore"; +import { useCentralProductStore } from "@/src/store/centralProductStore"; import FloatingCartBar from "@/components/floating-cart-bar"; import BannerCarousel from "@/components/BannerCarousel"; import { useUserDetails } from "@/src/contexts/AuthContext"; import TabLayoutWrapper from "@/components/TabLayoutWrapper"; import { useNavigationStore } from "@/src/store/navigationStore"; -import { useGetEssentialConsts } from "@/src/api-hooks/essential-consts.api"; import NextOrderGlimpse from "@/components/NextOrderGlimpse"; dayjs.extend(relativeTime); @@ -360,8 +362,6 @@ export default function Dashboard() { const router = useRouter(); const userDetails = useUserDetails(); const [inputQuery, setInputQuery] = useState(""); - const [searchQuery, setSearchQuery] = useState(""); - const [selectedTagId, setSelectedTagId] = useState(null); const [isLoadingDialogOpen, setIsLoadingDialogOpen] = useState(false); const [gradientHeight, setGradientHeight] = useState(0); const [displayedProducts, setDisplayedProducts] = useState([]); @@ -369,22 +369,22 @@ export default function Dashboard() { const [isLoadingMore, setIsLoadingMore] = useState(false); const { backgroundColor } = useStatusBarStore(); const { getQuickestSlot } = useProductSlotIdentifier(); + const productSlotsMap = useCentralSlotStore((state) => state.productSlotsMap); + const refetchProducts = useCentralProductStore((state) => state.refetchProducts); + const refetchSlotsFromStore = useCentralSlotStore((state) => state.refetchSlots); const [isRefreshing, setIsRefreshing] = useState(false); const { data: productsData, isLoading, error, - refetch, - } = trpc.common.product.getAllProductsSummary.useQuery({ - searchQuery: searchQuery || undefined, - tagId: selectedTagId || undefined, - }); + } = useAllProducts(); + const { data: essentialConsts, isLoading: isLoadingConsts, error: constsError, refetch: refetchConsts } = useGetEssentialConsts(); - const { data: storesData, refetch: refetchStores } = trpc.user.stores.getStores.useQuery(); - const { data: slotsData, refetch: refetchSlots } = trpc.user.slots.getSlotsWithProducts.useQuery(); + const { data: storesData, refetch: refetchStores } = useStores(); + const { data: slotsData } = useSlots(); const products = productsData?.products || []; @@ -397,15 +397,18 @@ export default function Dashboard() { const slotB = getQuickestSlot(b.id); if (slotA && !slotB) return -1; if (!slotA && slotB) return 1; - if (a.isOutOfStock && !b.isOutOfStock) return 1; - if (!a.isOutOfStock && b.isOutOfStock) return -1; + const aOutOfStock = productSlotsMap[a.id]?.isOutOfStock; + const bOutOfStock = productSlotsMap[b.id]?.isOutOfStock; + if (aOutOfStock && !bOutOfStock) return 1; + if (!aOutOfStock && bOutOfStock) return -1; return 0; }); - + + console.log('setting the displayed products') setDisplayedProducts(initialBatch); setHasMore(products.length > 10); } - }, [productsData]); + }, [productsData, productSlotsMap]); const popularItemIds = useMemo(() => { const popularItems = essentialConsts?.popularItems; @@ -440,11 +443,22 @@ export default function Dashboard() { const handleRefresh = useCallback(async () => { setIsRefreshing(true); try { - await Promise.all([refetch(), refetchStores(), refetchSlots(), refetchConsts()]); + const promises = []; + + if (refetchProducts) { + promises.push(refetchProducts()); + } + if (refetchSlotsFromStore) { + promises.push(refetchSlotsFromStore()); + } + promises.push(refetchStores()); + promises.push(refetchConsts()); + + await Promise.all(promises); } finally { setIsRefreshing(false); } - }, [refetch, refetchStores, refetchSlots, refetchConsts]); + }, [refetchProducts, refetchSlotsFromStore, refetchStores, refetchConsts]); useManualRefresh(() => { handleRefresh(); @@ -468,6 +482,7 @@ export default function Dashboard() { const renderProductItem = useCallback(({ item }: { item: any }) => ( + // ), [handleProductPress]); const listHeader = useMemo(() => ( @@ -512,7 +527,9 @@ export default function Dashboard() { ); } - + let str = '' + displayedProducts.forEach(product => str += `${product.id}-`) + // console.log(str) return ( diff --git a/apps/user-ui/app/(drawer)/(tabs)/home/search-results/index.tsx b/apps/user-ui/app/(drawer)/(tabs)/home/search-results/index.tsx index b7a1b17..b54b74c 100644 --- a/apps/user-ui/app/(drawer)/(tabs)/home/search-results/index.tsx +++ b/apps/user-ui/app/(drawer)/(tabs)/home/search-results/index.tsx @@ -1,4 +1,4 @@ -import React, { useState, useRef, useEffect, useCallback } from "react"; +import React, { useState, useRef, useEffect, useCallback, useMemo } from "react"; import { View, Dimensions } from "react-native"; import { useRouter, useLocalSearchParams } from "expo-router"; import { @@ -10,7 +10,8 @@ import { SearchBar, } from "common-ui"; import MaterialIcons from "@expo/vector-icons/MaterialIcons"; -import { trpc } from "@/src/trpc-client"; +import Fuse from "fuse.js"; +import { useAllProducts } from "@/src/hooks/prominent-api-hooks"; import ProductCard from "@/components/ProductCard"; import FloatingCartBar from "@/components/floating-cart-bar"; @@ -51,12 +52,27 @@ export default function SearchResults() { }); }, []); - const { data: productsData, isLoading, error, refetch } = - trpc.common.product.getAllProductsSummary.useQuery({ - searchQuery: debouncedQuery || undefined, + const { data: productsData, isLoading, error, refetch } = useAllProducts(); + + const allProducts = productsData?.products || []; + + // Client-side search filtering using Fuse.js + const products = useMemo(() => { + if (!debouncedQuery.trim()) return allProducts; + + const fuse = new Fuse(allProducts, { + keys: [ + 'name', + 'shortDescription', + ], + threshold: 0.3, + includeScore: true, + shouldSort: true, }); - const products = productsData?.products || []; + const fuseResults = fuse.search(debouncedQuery); + return fuseResults.map(result => result.item); + }, [allProducts, debouncedQuery]); useManualRefresh(() => { refetch(); diff --git a/apps/user-ui/app/(drawer)/(tabs)/me/complaints/index.tsx b/apps/user-ui/app/(drawer)/(tabs)/me/complaints/index.tsx index 948182d..04976f0 100644 --- a/apps/user-ui/app/(drawer)/(tabs)/me/complaints/index.tsx +++ b/apps/user-ui/app/(drawer)/(tabs)/me/complaints/index.tsx @@ -4,7 +4,7 @@ import { Image } from 'expo-image'; import { MyText, tw, useManualRefresh, MyFlatList, useMarkDataFetchers, theme, MyTouchableOpacity } from 'common-ui'; import { MaterialIcons, Ionicons } from '@expo/vector-icons'; import { trpc } from '@/src/trpc-client'; -import { useGetEssentialConsts } from '@/src/api-hooks/essential-consts.api'; +import { useGetEssentialConsts } from '@/src/hooks/prominent-api-hooks'; import dayjs from 'dayjs'; import { useRouter } from 'expo-router'; @@ -48,6 +48,23 @@ const ComplaintItem: React.FC = ({ item }) => ( {item.complaintBody} + {/* Complaint Images */} + {item.images && item.images.length > 0 && ( + + + {item.images.map((imageUrl: string, index: number) => ( + + + + ))} + + + )} + {/* Admin Response */} {item.response && ( diff --git a/apps/user-ui/app/(drawer)/(tabs)/me/delivery-slots/_layout.tsx b/apps/user-ui/app/(drawer)/(tabs)/me/delivery-slots/_layout.tsx deleted file mode 100644 index 8a04d45..0000000 --- a/apps/user-ui/app/(drawer)/(tabs)/me/delivery-slots/_layout.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { Stack } from 'expo-router' - -function DeliverySlotsLayout() { - return ( - - ) -} - -export default DeliverySlotsLayout \ No newline at end of file diff --git a/apps/user-ui/app/(drawer)/(tabs)/me/delivery-slots/index.tsx b/apps/user-ui/app/(drawer)/(tabs)/me/delivery-slots/index.tsx deleted file mode 100644 index e239577..0000000 --- a/apps/user-ui/app/(drawer)/(tabs)/me/delivery-slots/index.tsx +++ /dev/null @@ -1,230 +0,0 @@ -import React, { useState } from 'react'; -import { View, ScrollView } from 'react-native'; -import { Image } from 'expo-image'; -import { useRouter } from 'expo-router'; -import { MyFlatList, MyText, tw, useMarkDataFetchers, BottomDialog, theme, MyTouchableOpacity } from 'common-ui'; -import { trpc } from '@/src/trpc-client'; -import MaterialIcons from '@expo/vector-icons/MaterialIcons'; -import dayjs from 'dayjs'; - -export default function DeliverySlots() { - const router = useRouter(); - const { data, isLoading, error, refetch } = trpc.user.slots.getSlotsWithProducts.useQuery(); - const [selectedSlotForDialog, setSelectedSlotForDialog] = useState(null); - - useMarkDataFetchers(() => { - refetch(); - }); - - if (isLoading) { - return ( - null} - ListHeaderComponent={() => ( - - Loading delivery slots... - - )} - /> - ); - } - - if (error) { - return ( - null} - ListHeaderComponent={() => ( - - Error loading delivery slots - refetch()} - style={tw`mt-4 bg-blue-500 px-4 py-2 rounded-lg`} - > - Retry - - - )} - /> - ); - } - - const slots = data?.slots || []; - - if (slots.length === 0) { - return ( - null} - ListHeaderComponent={() => ( - - - - No upcoming delivery slots available - - - Check back later for new delivery schedules - - - )} - /> - ); - } - - return ( - <> - item.id.toString()} - // ListHeaderComponent={() => ( - // - // Delivery Slots - // - // Choose your preferred delivery time - // - // - // )} - renderItem={({ item: slot }) => ( - - {/* Slot Header */} - - - - - {dayjs(slot.deliveryTime).format('ddd DD MMM, h:mm a')} - - - Orders close by: {dayjs(slot.freezeTime).format('h:mm a')} - - - - - - {slot.products.length} items - - - router.push(`/(drawer)/(tabs)/home/cart?slot=${slot.id}`)} - style={tw`bg-pink-500 p-2 rounded-full`} - > - - - - - - - {/* Products List */} - - - Available Products - - - {slot.products.slice(0, 2).map((product) => ( - router.push(`/(drawer)/(tabs)/home/product-detail/${product.id}`)} - style={tw`bg-gray-50 rounded-lg p-3 flex-row items-center`} - > - {product.images && product.images.length > 0 ? ( - - ) : ( - - - - )} - - - {product.name} - - - ₹{product.price} {product.unit && `per ${product.unit}`} - - - {product.isOutOfStock && ( - Out of stock - )} - - ))} - - {slot.products.length > 2 && ( - setSelectedSlotForDialog(slot)} - style={tw`bg-pink-50 rounded-lg p-3 flex-row items-center justify-center border border-pink-200`} - > - - +{slot.products.length - 2} more products - - - - )} - - - - )} - ListFooterComponent={() => } - showsVerticalScrollIndicator={false} - contentContainerStyle={tw`pt-2`} - /> - - {/* Products Dialog */} - setSelectedSlotForDialog(null)} - > - - - All Products - {dayjs(selectedSlotForDialog?.deliveryTime).format('ddd DD MMM, h:mm a')} - - - - - {selectedSlotForDialog?.products.map((product: any) => ( - { - setSelectedSlotForDialog(null); - router.push(`/(drawer)/(tabs)/home/product-detail/${product.id}`); - }} - style={tw`bg-gray-50 rounded-lg p-4 flex-row items-center`} - > - {product.images && product.images.length > 0 ? ( - - ) : ( - - - - )} - - - {product.name} - - - ₹{product.price} {product.unit && `per ${product.unit}`} - - {product.marketPrice && ( - - ₹{product.marketPrice} - - )} - - {product.isOutOfStock && ( - Out of stock - )} - - ))} - - - - - - ); -} \ No newline at end of file diff --git a/apps/user-ui/app/(drawer)/(tabs)/me/edit-profile/index.tsx b/apps/user-ui/app/(drawer)/(tabs)/me/edit-profile/index.tsx index 2253fa1..8db5d44 100644 --- a/apps/user-ui/app/(drawer)/(tabs)/me/edit-profile/index.tsx +++ b/apps/user-ui/app/(drawer)/(tabs)/me/edit-profile/index.tsx @@ -3,14 +3,13 @@ import { View, ScrollView, TextInput, Alert } from "react-native"; import { AppContainer, MyButton, MyText, tw , BottomDialog } from "common-ui"; import RegistrationForm from "@/components/registration-form"; import { useUserDetails, useAuth } from "@/src/contexts/AuthContext"; -import { useUpdateProfile } from "@/src/api-hooks/auth.api"; import { router } from "expo-router"; import { trpc } from '@/src/trpc-client'; function EditProfile() { const userDetails = useUserDetails(); - const { updateUserDetails, logout } = useAuth(); - const updateProfileMutation = useUpdateProfile(); + const { logout, refetchUser } = useAuth(); + const updateProfileMutation = trpc.user.auth.updateProfile.useMutation(); // State for mobile verification modal const [showDeleteModal, setShowDeleteModal] = useState(false); @@ -20,14 +19,16 @@ function EditProfile() { // Prevent unnecessary re-renders const mobileInputValue = useMemo(() => enteredMobile, [enteredMobile]); - const handleUpdate = async (data: FormData) => { + const handleUpdate = async (data: { name: string; email: string; mobile: string; password: string; imageKey?: string }) => { try { - const response = await updateProfileMutation.mutateAsync(data); + await updateProfileMutation.mutateAsync({ + name: data.name, + email: data.email, + imageKey: data.imageKey, + }); - // Update the context with new user details - if (response.user) { - updateUserDetails(response.user); - } + // Refetch user data to get updated values + await refetchUser(); // Navigate back to profile/me page router.replace('/(drawer)/(tabs)/me'); @@ -76,6 +77,10 @@ function EditProfile() { email: userDetails.email || '', mobile: userDetails.mobile || '', profileImageUri: userDetails.profileImage || undefined, + // Password fields not needed for edit mode + password: '', + confirmPassword: '', + termsAccepted: true, } : undefined; return ( diff --git a/apps/user-ui/app/(drawer)/(tabs)/stores/index.tsx b/apps/user-ui/app/(drawer)/(tabs)/stores/index.tsx index 0500e47..e5586de 100644 --- a/apps/user-ui/app/(drawer)/(tabs)/stores/index.tsx +++ b/apps/user-ui/app/(drawer)/(tabs)/stores/index.tsx @@ -16,7 +16,7 @@ import { } from "common-ui"; import MaterialIcons from "@expo/vector-icons/MaterialIcons"; import { Ionicons } from "@expo/vector-icons"; -import { trpc } from "@/src/trpc-client"; +import { useStores } from "@/src/hooks/prominent-api-hooks"; import { LinearGradient } from "expo-linear-gradient"; import TabLayoutWrapper from "@/components/TabLayoutWrapper"; import FloatingCartBar from "@/components/floating-cart-bar"; @@ -157,7 +157,7 @@ export default function Stores() { isLoading, error, refetch, - } = trpc.user.stores.getStores.useQuery(); + } = useStores(); const stores = storesData?.stores || []; diff --git a/apps/user-ui/app/(drawer)/(tabs)/stores/store-detail/[id].tsx b/apps/user-ui/app/(drawer)/(tabs)/stores/store-detail/[id].tsx index af62179..e8538a8 100644 --- a/apps/user-ui/app/(drawer)/(tabs)/stores/store-detail/[id].tsx +++ b/apps/user-ui/app/(drawer)/(tabs)/stores/store-detail/[id].tsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useMemo, useState } from "react"; import { View, Dimensions, ScrollView, TouchableOpacity } from "react-native"; import { useRouter, useLocalSearchParams } from "expo-router"; import { Image } from 'expo-image'; @@ -13,10 +13,10 @@ import { } from "common-ui"; import MaterialIcons from "@expo/vector-icons/MaterialIcons"; import FontAwesome5 from "@expo/vector-icons/FontAwesome5"; -import { trpc } from "@/src/trpc-client"; import ProductCard from "@/components/ProductCard"; import FloatingCartBar from "@/components/floating-cart-bar"; import { useStoreHeaderStore } from "@/src/store/storeHeaderStore"; +import { useAllProducts, useStoreWithProducts } from "@/src/hooks/prominent-api-hooks"; const { width: screenWidth } = Dimensions.get("window"); const itemWidth = (screenWidth - 48) / 2; @@ -63,24 +63,32 @@ export default function StoreDetail() { const [selectedTagId, setSelectedTagId] = useState(null); const { data: storeData, isLoading, refetch, error } = - trpc.user.stores.getStoreWithProducts.useQuery( - { storeId: storeIdNum }, - { enabled: !!storeIdNum } - ); + useStoreWithProducts(storeIdNum); - const { data: tagsData, isLoading: isLoadingTags } = - trpc.user.tags.getTagsByStore.useQuery( - { storeId: storeIdNum }, - { enabled: !!storeIdNum } - ); + const { data: productsData, isLoading: isProductsLoading } = useAllProducts(); + + const productById = useMemo(() => { + const map = new Map(); + productsData?.products?.forEach((product) => { + map.set(product.id, product); + }); + return map; + }, [productsData]); + + const storeProducts = useMemo(() => { + if (!storeData?.products) return []; + return storeData.products + .map((product) => productById.get(product.id)) + .filter(Boolean); + }, [storeData, productById]); // Filter products based on selected tag const filteredProducts = selectedTagId - ? storeData?.products.filter(product => { - const selectedTag = tagsData?.tags.find(t => t.id === selectedTagId); + ? storeProducts.filter(product => { + const selectedTag = storeData?.tags.find(t => t.id === selectedTagId); return selectedTag?.productIds?.includes(product.id) ?? false; - }) || [] - : storeData?.products || []; + }) + : storeProducts; // Set the store header title const setStoreHeaderTitle = useStoreHeaderStore((state) => state.setTitle); @@ -98,10 +106,12 @@ export default function StoreDetail() { useDrawerTitle(storeData?.store?.name || "Store", [storeData?.store?.name]); - if (isLoading) { + if (isLoading || isProductsLoading) { return ( - Loading store... + + {isLoading ? 'Loading store...' : 'Loading products...'} + ); } @@ -184,13 +194,13 @@ export default function StoreDetail() { )} {/* Tags Section */} - {tagsData && tagsData.tags.length > 0 && ( + {storeData?.tags && storeData.tags.length > 0 && ( - {tagsData.tags.map((tag) => ( + {storeData.tags.map((tag) => ( {selectedTagId - ? `${tagsData?.tags.find(t => t.id === selectedTagId)?.tagName} items` + ? `${storeData?.tags.find(t => t.id === selectedTagId)?.tagName} items` : `${filteredProducts.length} products`} diff --git a/apps/user-ui/app/_layout.tsx b/apps/user-ui/app/_layout.tsx index 7c1c49b..2c02370 100755 --- a/apps/user-ui/app/_layout.tsx +++ b/apps/user-ui/app/_layout.tsx @@ -22,6 +22,7 @@ import LocationTestWrapper from "@/components/LocationTestWrapper"; import HealthTestWrapper from "@/components/HealthTestWrapper"; import FirstUserWrapper from "@/components/FirstUserWrapper"; import UpdateChecker from "@/components/UpdateChecker"; +import CentralStoreInitializer from "@/src/components/CentralStoreInitializer"; import { RefreshProvider } from "../../../packages/ui/src/lib/refresh-context"; import WebViewWrapper from "@/components/WebViewWrapper"; import BackHandlerWrapper from "@/components/BackHandler"; @@ -68,10 +69,12 @@ export default function RootLayout() { + - + + diff --git a/apps/user-ui/components/BannerCarousel.tsx b/apps/user-ui/components/BannerCarousel.tsx index 7844d3f..893f8b0 100644 --- a/apps/user-ui/components/BannerCarousel.tsx +++ b/apps/user-ui/components/BannerCarousel.tsx @@ -2,7 +2,7 @@ import React, { useState, useRef, useEffect } from 'react'; import { View, Dimensions, Image, ScrollView, NativeSyntheticEvent, NativeScrollEvent } from 'react-native'; import { MyTouchableOpacity, MyText, tw } from 'common-ui'; import { useRouter } from 'expo-router'; -import { trpc } from '@/src/trpc-client'; +import { useBanners } from '@/src/hooks/prominent-api-hooks'; import MaterialIcons from '@expo/vector-icons/MaterialIcons'; const { width: screenWidth } = Dimensions.get('window'); @@ -25,7 +25,7 @@ export default function BannerCarousel() { const [isAutoPlaying, setIsAutoPlaying] = useState(true); // Fetch banners data - const { data: bannersData, isLoading, error } = trpc.user.banner.getBanners.useQuery(); + const { data: bannersData, isLoading, error } = useBanners(); const banners = bannersData?.banners || []; @@ -123,7 +123,7 @@ export default function BannerCarousel() { {/* Pagination Dots */} {banners.length > 1 && ( - {banners.map((_, index: number) => ( + {banners.map((_: Banner, index: number) => ( goToSlide(index)} @@ -140,4 +140,4 @@ export default function BannerCarousel() { )} ); -} \ No newline at end of file +} diff --git a/apps/user-ui/components/ComplaintForm.tsx b/apps/user-ui/components/ComplaintForm.tsx index 040d06b..1607546 100644 --- a/apps/user-ui/components/ComplaintForm.tsx +++ b/apps/user-ui/components/ComplaintForm.tsx @@ -1,11 +1,10 @@ import React, { useState } from 'react'; import { View, TextInput, ActivityIndicator, KeyboardAvoidingView, Platform, Alert } from 'react-native'; import { MaterialIcons } from '@expo/vector-icons'; -import { useMutation } from "@tanstack/react-query"; import { MyText, ImageUploader, tw, MyTouchableOpacity } from 'common-ui'; import usePickImage from 'common-ui/src/components/use-pick-image'; -import axios from '../services/axios-user-ui'; -// import axios from 'common-ui/src/services/axios'; +import { trpc } from '@/src/trpc-client'; +import { useUploadToObjectStorage } from '@/src/hooks/useUploadToObjectStorage'; interface ComplaintFormProps { open: boolean; @@ -15,70 +14,73 @@ interface ComplaintFormProps { export default function ComplaintForm({ open, onClose, orderId }: ComplaintFormProps) { const [complaintBody, setComplaintBody] = useState(''); - const [complaintImages, setComplaintImages] = useState<{ uri?: string }[]>([]); - - // API function - const raiseComplaintApi = async (payload: { complaintBody: string; images: { uri?: string }[] }) => { - const formData = new FormData(); - - formData.append('orderId', orderId.toString()); - formData.append('complaintBody', payload.complaintBody); - - // Add images if provided - if (payload.images && payload.images.length > 0) { - payload.images.forEach((image, index) => { - if (image.uri) { - const fileName = `complaint-image-${index}.jpg`; - formData.append('images', { - uri: image.uri, - name: fileName, - type: 'image/jpeg', - } as any); - } - }); - } - - const response = await axios.post('/uv/complaints/raise', formData, { - headers: { - 'Content-Type': 'multipart/form-data', - }, - }); - return response.data; - }; - - // Hook - const raiseComplaintMutation = useMutation({ - mutationFn: raiseComplaintApi, - }); + const [complaintImages, setComplaintImages] = useState<{ uri: string; mimeType: string }[]>([]); + + const raiseComplaintMutation = trpc.user.complaint.raise.useMutation(); + const { upload, isUploading } = useUploadToObjectStorage(); const pickComplaintImage = usePickImage({ - setFile: (files) => setComplaintImages(prev => [...prev, ...files]), + setFile: async (assets: any) => { + if (!assets || (Array.isArray(assets) && assets.length === 0)) { + return; + } + + const files = Array.isArray(assets) ? assets : [assets]; + const newImages = files.map((asset: any) => ({ + uri: asset.uri, + mimeType: asset.mimeType || 'image/jpeg', + })); + + setComplaintImages(prev => [...prev, ...newImages]); + }, multiple: true, }); - const handleSubmit = () => { + const handleRemoveImage = (image: { uri: string; mimeType: string }) => { + setComplaintImages(prev => prev.filter(img => img.uri !== image.uri)); + }; + + const handleSubmit = async () => { if (!complaintBody.trim()) { Alert.alert('Error', 'Please enter complaint details'); return; } - raiseComplaintMutation.mutate( - { - complaintBody: complaintBody.trim(), - images: complaintImages, - }, - { - onSuccess: () => { - Alert.alert('Success', 'Complaint raised successfully'); - setComplaintBody(''); - setComplaintImages([]); - onClose(); - }, - onError: (error: any) => { - Alert.alert('Error', error.message || 'Failed to raise complaint'); - }, + try { + let imageKeys: string[] = []; + + // Upload images if provided + if (complaintImages.length > 0) { + // Fetch blobs from URIs + const imagesWithBlobs = await Promise.all( + complaintImages.map(async (img) => { + const response = await fetch(img.uri); + const blob = await response.blob(); + return { blob, mimeType: img.mimeType }; + }) + ); + + const result = await upload({ + images: imagesWithBlobs, + contextString: 'complaint', + }); + imageKeys = result.keys; } - ); + + // Submit complaint + await raiseComplaintMutation.mutateAsync({ + orderId, + complaintBody: complaintBody.trim(), + imageKeys, + }); + + Alert.alert('Success', 'Complaint raised successfully'); + setComplaintBody(''); + setComplaintImages([]); + onClose(); + } catch (error: any) { + Alert.alert('Error', error.message || 'Failed to raise complaint'); + } }; if (!open) return null; @@ -109,14 +111,15 @@ export default function ComplaintForm({ open, onClose, orderId }: ComplaintFormP images={complaintImages} onAddImage={pickComplaintImage} onRemoveImage={(uri) => setComplaintImages(prev => prev.filter(img => img.uri !== uri))} + allowMultiple={true} /> - {raiseComplaintMutation.isPending ? ( + {isUploading || raiseComplaintMutation.isPending ? ( ) : ( Submit Complaint @@ -125,4 +128,4 @@ export default function ComplaintForm({ open, onClose, orderId }: ComplaintFormP ); -} \ No newline at end of file +} diff --git a/apps/user-ui/components/HealthTestWrapper.tsx b/apps/user-ui/components/HealthTestWrapper.tsx index 227bdc5..bc8387f 100644 --- a/apps/user-ui/components/HealthTestWrapper.tsx +++ b/apps/user-ui/components/HealthTestWrapper.tsx @@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'; import { View, ActivityIndicator, Platform } from 'react-native'; import { tw, theme, MyText, MyTouchableOpacity , BottomDialog } from 'common-ui'; import { trpc, trpcClient } from '@/src/trpc-client'; -import { useGetEssentialConsts } from '@/src/api-hooks/essential-consts.api'; +import { useGetEssentialConsts } from '@/src/hooks/prominent-api-hooks'; import Constants from 'expo-constants'; import * as Linking from 'expo-linking'; diff --git a/apps/user-ui/components/NextOrderGlimpse.tsx b/apps/user-ui/components/NextOrderGlimpse.tsx index f3d154b..933ddfb 100644 --- a/apps/user-ui/components/NextOrderGlimpse.tsx +++ b/apps/user-ui/components/NextOrderGlimpse.tsx @@ -8,7 +8,7 @@ import dayjs from 'dayjs'; import { trpc } from '@/src/trpc-client'; import { Image } from 'expo-image'; import { orderStatusManipulator } from '@/src/lib/string-manipulators'; -import { useGetEssentialConsts } from '@/src/api-hooks/essential-consts.api'; +import { useGetEssentialConsts } from '@/src/hooks/prominent-api-hooks'; interface OrderItem { productName: string; diff --git a/apps/user-ui/components/PaymentAndOrderComponent.tsx b/apps/user-ui/components/PaymentAndOrderComponent.tsx index 713aefe..e05b0fa 100644 --- a/apps/user-ui/components/PaymentAndOrderComponent.tsx +++ b/apps/user-ui/components/PaymentAndOrderComponent.tsx @@ -6,6 +6,8 @@ import MaterialIcons from '@expo/vector-icons/MaterialIcons'; // import RazorpayCheckout from 'react-native-razorpay'; import { trpc } from '@/src/trpc-client'; +import { useCentralProductStore } from '@/src/store/centralProductStore'; +import { useCentralSlotStore } from '@/src/store/centralSlotStore'; import { clearLocalCart } from '@/hooks/cart-query-hooks'; import { useQueryClient } from '@tanstack/react-query'; import { FontAwesome5, FontAwesome6 } from '@expo/vector-icons'; @@ -54,17 +56,19 @@ const PaymentAndOrderComponent: React.FC = ({ queryClient.invalidateQueries({ queryKey: [`local-cart-${cartType}`] }); }; - const { data: productsData } = trpc.common.product.getAllProductsSummary.useQuery({}); + const products = useCentralProductStore((state) => state.products); + const productsById = useCentralProductStore((state) => state.productsById); + const productSlotsMap = useCentralSlotStore((state) => state.productSlotsMap); // Memoized flash-eligible product IDs const flashEligibleProductIds = useMemo(() => { - if (!productsData?.products) return new Set(); + if (!products.length) return new Set(); return new Set( - productsData.products - .filter((product: any) => product.isFlashAvailable) - .map((product: any) => product.id) + products + .filter((product) => productSlotsMap[product.id]?.isFlashAvailable) + .map((product) => product.id) ); - }, [productsData]); + }, [products, productSlotsMap]); const placeOrderMutation = trpc.user.order.placeOrder.useMutation({ onSuccess: (data) => { @@ -126,7 +130,7 @@ const PaymentAndOrderComponent: React.FC = ({ const availableItems = cartItems .filter(item => { - if (item.product?.isOutOfStock) return false; + if (productSlotsMap[item.productId]?.isOutOfStock) return false; // For flash delivery, check if product supports flash delivery if (isFlashDelivery) { return flashEligibleProductIds.has(item.productId); diff --git a/apps/user-ui/components/ProductCard.tsx b/apps/user-ui/components/ProductCard.tsx index 70aec1c..6be6716 100644 --- a/apps/user-ui/components/ProductCard.tsx +++ b/apps/user-ui/components/ProductCard.tsx @@ -1,3 +1,4 @@ + import React, { useMemo } from 'react'; import { View, Alert, TouchableOpacity, Text } from 'react-native'; import { Image } from 'expo-image'; diff --git a/apps/user-ui/components/ProductDetail.tsx b/apps/user-ui/components/ProductDetail.tsx index c221cd6..d4ce7a5 100644 --- a/apps/user-ui/components/ProductDetail.tsx +++ b/apps/user-ui/components/ProductDetail.tsx @@ -12,9 +12,11 @@ import { trpc, trpcClient } from '@/src/trpc-client'; import { useAddToCart, useGetCart, useUpdateCartItem, useRemoveFromCart } from '@/hooks/cart-query-hooks'; import { useProductSlotIdentifier } from '@/hooks/useProductSlotIdentifier'; import { useFlashNavigationStore } from '@/components/stores/flashNavigationStore'; +import { useSlots } from '@/src/hooks/prominent-api-hooks'; import FloatingCartBar from './floating-cart-bar'; import { useStoreHeaderStore } from '@/src/store/storeHeaderStore'; import { useCartStore } from '@/src/store/cartStore'; +import { useCentralSlotStore } from '@/src/store/centralSlotStore'; const { width: screenWidth } = Dimensions.get("window"); const carouselWidth = screenWidth; @@ -57,15 +59,28 @@ const ProductDetail: React.FC = ({ productId, isFlashDeliver const { getQuickestSlot } = useProductSlotIdentifier(); const { setShouldNavigateToCart } = useFlashNavigationStore(); const { setAddedToCartProduct } = useCartStore(); + const { data: slotsData } = useSlots(); + const productSlotsMap = useCentralSlotStore((state) => state.productSlotsMap); + + const productAvailability = useMemo(() => { + if (!productDetail) return null; + return productSlotsMap[productDetail.id]; + }, [productDetail, productSlotsMap]); const sortedDeliverySlots = useMemo(() => { - if (!productDetail?.deliverySlots) return [] - return [...productDetail.deliverySlots].sort((a, b) => { + if (!slotsData?.slots || !productDetail) return [] + + // Filter slots that contain this product + const productSlots = slotsData.slots.filter((slot: any) => + slot.products?.some((p: any) => p.id === productDetail.id) + ) + + return productSlots.sort((a: any, b: any) => { const deliveryDiff = new Date(a.deliveryTime).getTime() - new Date(b.deliveryTime).getTime() if (deliveryDiff !== 0) return deliveryDiff return new Date(a.freezeTime).getTime() - new Date(b.freezeTime).getTime() }) - }, [productDetail?.deliverySlots]) + }, [slotsData, productDetail]) // Find current quantity from cart data const cartItem = productDetail ? cartData?.data?.items?.find((item: any) => item.productId === productDetail.id) : null; @@ -94,7 +109,7 @@ const ProductDetail: React.FC = ({ productId, isFlashDeliver const handleAddToCart = (productId: number) => { if (isFlashDelivery) { - if (!productDetail?.isFlashAvailable) { + if (!productAvailability?.isFlashAvailable) { Alert.alert("Error", "This product is not available for flash delivery"); return; } @@ -113,7 +128,7 @@ const ProductDetail: React.FC = ({ productId, isFlashDeliver const handleBuyNow = (productId: number) => { if (isFlashDelivery) { - if (!productDetail?.isFlashAvailable) { + if (!productAvailability?.isFlashAvailable) { Alert.alert("Error", "This product is not available for flash delivery"); return; } @@ -241,13 +256,13 @@ const ProductDetail: React.FC = ({ productId, isFlashDeliver {productDetail.name} - {productDetail.isFlashAvailable && ( + {productAvailability?.isFlashAvailable && ( 1 Hr Delivery )} - {productDetail.isOutOfStock && ( + {productAvailability?.isOutOfStock && ( Out of Stock @@ -277,7 +292,7 @@ const ProductDetail: React.FC = ({ productId, isFlashDeliver {/* Flash price on separate line - smaller and less prominent */} - {productDetail.isFlashAvailable && productDetail.flashPrice && productDetail.flashPrice !== productDetail.price && ( + {productAvailability?.isFlashAvailable && productDetail.flashPrice && productDetail.flashPrice !== productDetail.price && ( 1 Hr Delivery: ₹{productDetail.flashPrice} / {formatQuantity(productDetail.productQuantity || 1, productDetail.unitNotation).display} @@ -304,11 +319,11 @@ const ProductDetail: React.FC = ({ productId, isFlashDeliver // Show "Add to Cart" button when not in cart { - if (productDetail.isOutOfStock || (isFlashDelivery && !productDetail.isFlashAvailable)) { + if (productAvailability?.isOutOfStock || (isFlashDelivery && !productAvailability?.isFlashAvailable)) { return; } if (isFlashDelivery) { @@ -319,10 +334,10 @@ const ProductDetail: React.FC = ({ productId, isFlashDeliver setAddedToCartProduct({ productId: productDetail.id, product: productDetail }); } }} - disabled={productDetail.isOutOfStock || (isFlashDelivery && !productDetail.isFlashAvailable)} + disabled={productAvailability?.isOutOfStock || (isFlashDelivery && !productAvailability?.isFlashAvailable)} > - - {(productDetail.isOutOfStock || (isFlashDelivery && !productDetail.isFlashAvailable)) ? 'Unavailable' : 'Add to Cart'} + + {(productAvailability?.isOutOfStock || (isFlashDelivery && !productAvailability?.isFlashAvailable)) ? 'Unavailable' : 'Add to Cart'} )} @@ -330,26 +345,26 @@ const ProductDetail: React.FC = ({ productId, isFlashDeliver {isFlashDelivery ? ( !(productDetail.isOutOfStock || !productDetail.isFlashAvailable) && handleBuyNow(productDetail.id)} - disabled={productDetail.isOutOfStock || !productDetail.isFlashAvailable} + onPress={() => !(productAvailability?.isOutOfStock || !productAvailability?.isFlashAvailable) && handleBuyNow(productDetail.id)} + disabled={productAvailability?.isOutOfStock || !productAvailability?.isFlashAvailable} > - - {productDetail.isOutOfStock ? 'Out of Stock' : - (!productDetail.isFlashAvailable ? 'Not Flash Eligible' : 'Get in 1 Hour')} + + {productAvailability?.isOutOfStock ? 'Out of Stock' : + (!productAvailability?.isFlashAvailable ? 'Not Flash Eligible' : 'Get in 1 Hour')} - ) : productDetail.isFlashAvailable ? ( + ) : productAvailability?.isFlashAvailable ? ( productDetail.deliverySlots.length > 0 && handleBuyNow(productDetail.id)} - disabled={productDetail.deliverySlots.length === 0} + onPress={() => sortedDeliverySlots.length > 0 && handleBuyNow(productDetail.id)} + disabled={sortedDeliverySlots.length === 0} > - - {productDetail.deliverySlots.length === 0 ? 'No Slots' : 'Get in 1 Hour'} + + {sortedDeliverySlots.length === 0 ? 'No Slots' : 'Get in 1 Hour'} ) : ( @@ -378,7 +393,7 @@ const ProductDetail: React.FC = ({ productId, isFlashDeliver key={index} style={tw`flex-row items-start mb-4 bg-gray-50 p-3 rounded-xl border border-gray-100`} onPress={() => handleSlotAddToCart(productDetail.id, slot.id)} - disabled={productDetail.isOutOfStock} + disabled={productAvailability?.isOutOfStock} activeOpacity={0.7} > @@ -590,7 +605,7 @@ const ProductDetail: React.FC = ({ productId, isFlashDeliver key={index} style={tw`flex-row items-start mb-4 bg-gray-50 p-4 rounded-xl border border-gray-100`} onPress={() => handleSlotAddToCart(productDetail.id, slot.id)} - disabled={productDetail.isOutOfStock} + disabled={productAvailability?.isOutOfStock} activeOpacity={0.7} > @@ -797,4 +812,4 @@ const ReviewForm = ({ productId, onReviewSubmitted }: ReviewFormProps) => { ); }; -export default ProductDetail; \ No newline at end of file +export default ProductDetail; diff --git a/apps/user-ui/components/QuickDeliveryAddressSelector.tsx b/apps/user-ui/components/QuickDeliveryAddressSelector.tsx index dc28eeb..4d6ac53 100644 --- a/apps/user-ui/components/QuickDeliveryAddressSelector.tsx +++ b/apps/user-ui/components/QuickDeliveryAddressSelector.tsx @@ -6,6 +6,7 @@ import { BottomDialog, MyTouchableOpacity, MyText, tw, theme } from 'common-ui'; import { useAuth } from '@/src/contexts/AuthContext'; import { trpc } from '@/src/trpc-client'; import { useAddressStore } from '@/src/store/addressStore'; +import { useSlots } from '@/src/hooks/prominent-api-hooks'; import dayjs from 'dayjs'; interface QuickDeliveryAddressSelectorProps { @@ -31,13 +32,13 @@ const QuickDeliveryAddressSelector: React.FC const { data: addressesData } = trpc.user.address.getUserAddresses.useQuery(undefined, { enabled: isAuthenticated, }); - const { data: slotsData } = trpc.user.slots.getSlotsWithProducts.useQuery(); + const { data: slotsData } = useSlots(); const defaultAddress = defaultAddressData?.data; const addresses = addressesData?.data || []; // Format time range helper - const formatTimeRange = (deliveryTime: string) => { + const formatTimeRange = (deliveryTime: string | Date) => { const time = dayjs(deliveryTime); const endTime = time.add(1, 'hour'); const startPeriod = time.format('A'); @@ -276,4 +277,4 @@ const QuickDeliveryAddressSelector: React.FC ); }; -export default QuickDeliveryAddressSelector; \ No newline at end of file +export default QuickDeliveryAddressSelector; diff --git a/apps/user-ui/components/SlotSpecificView.tsx b/apps/user-ui/components/SlotSpecificView.tsx index 8a9c5ec..2cb714c 100644 --- a/apps/user-ui/components/SlotSpecificView.tsx +++ b/apps/user-ui/components/SlotSpecificView.tsx @@ -7,7 +7,11 @@ import { useRouter, usePathname } from 'expo-router'; import MaterialIcons from '@expo/vector-icons/MaterialIcons'; import { tw, theme, MyText, MyTouchableOpacity, MyFlatList, AppContainer, MiniQuantifier } from 'common-ui'; import { trpc } from '@/src/trpc-client'; +import { useAllProducts, useStores, useSlots } from '@/src/hooks/prominent-api-hooks'; +import { AllProductsApiType } from '@backend/trpc/router'; import { useQuickDeliveryStore } from '@/src/store/quickDeliveryStore'; +import { useCentralSlotStore } from '@/src/store/centralSlotStore'; +import { useCentralProductStore } from '@/src/store/centralProductStore'; import { useAddToCart, useGetCart, useUpdateCartItem, useRemoveFromCart } from '@/hooks/cart-query-hooks'; import { useHideTabNav } from '@/src/hooks/useHideTabNav'; import CartIcon from '@/components/icons/CartIcon'; @@ -32,7 +36,7 @@ interface SlotLayoutProps { function CustomDrawerContent(baseUrl: string, drawerProps: DrawerContentComponentProps, slotIdParent?: number, storeIdParent?: number) { const router = useRouter(); const pathname = usePathname(); - const { data: storesData } = trpc.user.stores.getStores.useQuery(); + const { data: storesData } = useStores(); const setStoreId = useSlotStore(state => state.setStoreId); const { slotId, storeId } = useSlotStore(); @@ -179,17 +183,10 @@ export function SlotLayout({ slotId, storeId, baseUrl, isForFlashDelivery }: Slo router.replace(`${baseUrl}?slotId=${newSlotId}` as any); }; - const slotQuery = slotId - ? trpc.user.slots.getSlotById.useQuery({ slotId: Number(slotId) }) - : trpc.user.slots.nextMajorDelivery.useQuery(); - const deliveryTime = dayjs(slotQuery.data?.deliveryTime).format('DD MMM hh:mm A'); - - return ( <> state.productSlotsMap); const updateCartItem = useUpdateCartItem({ showSuccessAlert: false, showErrorAlert: false, @@ -256,6 +254,7 @@ const CompactProductCard = ({ const cartItem = cartData?.items?.find((cartItem: any) => cartItem.productId === item.id); const quantity = cartItem?.quantity || 0; + const isOutOfStock = productSlotsMap[item.id]?.isOutOfStock; const handleQuantityChange = (newQuantity: number) => { if (newQuantity === 0 && cartItem) { @@ -281,7 +280,7 @@ const CompactProductCard = ({ source={{ uri: item.images?.[0] }} style={{ width: "100%", height: itemWidth, resizeMode: "cover" }} /> - {item.isOutOfStock && ( + {isOutOfStock && ( Out of Stock @@ -340,22 +339,20 @@ export function SlotProducts({ slotId:slotIdParent, storeId:storeIdParent, baseU const slotId = slotIdParent; const storeId = storeIdParent; const storeIdNum = storeId; - // const { storeId, slotId: slotIdRaw } = useLocalSearchParams(); - // const slotId = Number(slotIdRaw); + const { data: slotsData, isLoading: slotsLoading, error: slotsError } = useSlots(); + const { productsById } = useCentralProductStore(); + const productSlotsMap = useCentralSlotStore((state) => state.productSlotsMap); - // const storeIdNum = storeId ? Number(storeId) : undefined; - - const slotQuery = trpc.user.slots.getSlotById.useQuery({ slotId: slotId! }, { enabled: !!slotId }); - - const productsQuery = trpc.common.product.getAllProductsSummary.useQuery({}); + // Find the specific slot from cached data + const slot = slotsData?.slots?.find(s => s.id === slotId); const { addToCart = () => { } } = useAddToCart({ showSuccessAlert: false, showErrorAlert: false, refetchCart: true }, "regular") || {}; const handleAddToCart = (productId: number) => { setIsLoadingDialogOpen(true); - const item = filteredProducts.find((p: any) => p.id === productId); - const deliveryTime = slotQuery.data?.deliveryTime ? dayjs(slotQuery.data.deliveryTime).format('ddd, DD MMM • h:mm A') : ''; + const item = filteredProducts.find((p) => p.id === productId); + const deliveryTime = slot?.deliveryTime ? dayjs(slot.deliveryTime).format('ddd, DD MMM • h:mm A') : ''; addToCart(productId, 1, slotId || 0, () => { setIsLoadingDialogOpen(false); if (item) { @@ -364,7 +361,7 @@ export function SlotProducts({ slotId:slotIdParent, storeId:storeIdParent, baseU }); }; - if (slotQuery.isLoading || (storeIdNum && productsQuery?.isLoading)) { + if (slotsLoading) { return ( @@ -374,7 +371,7 @@ export function SlotProducts({ slotId:slotIdParent, storeId:storeIdParent, baseU ); } - if (slotQuery.error || (storeIdNum && productsQuery?.error)) { + if (slotsError) { return ( @@ -386,7 +383,7 @@ export function SlotProducts({ slotId:slotIdParent, storeId:storeIdParent, baseU ); } - if (!slotQuery.data) { + if (!slot) { return ( @@ -397,14 +394,16 @@ export function SlotProducts({ slotId:slotIdParent, storeId:storeIdParent, baseU ); } - // Create a Set of product IDs from slot data for O(1) lookup - const slotProductIds = new Set(slotQuery.data.products?.map((p: any) => p.id) || []); + // Get product details from central store using slot product IDs + // Filter: 1) Must exist in productsById, 2) Must not be out of stock (from slots data) + const slotProducts = slot.products + ?.map(p => productsById[p.id]) + ?.filter((product): product is NonNullable => product !== null && product !== undefined) + ?.filter(product => !productSlotsMap[product.id]?.isOutOfStock) || []; - const filteredProducts: any[] = storeIdNum - ? productsQuery?.data?.products?.filter(p => - p.storeId === storeIdNum && slotProductIds.has(p.id) - ) || [] - : slotQuery.data.products; + const filteredProducts = storeIdNum + ? slotProducts.filter(p => p.storeId === storeIdNum) + : slotProducts; return ( @@ -422,7 +421,7 @@ export function SlotProducts({ slotId:slotIdParent, storeId:storeIdParent, baseU keyExtractor={(item, index) => index.toString()} columnWrapperStyle={{ gap: 16, justifyContent: 'flex-start' }} contentContainerStyle={[tw`pb-24 px-4`, { gap: 16 }]} - onRefresh={() => slotQuery.refetch()} + onRefresh={() => {}} ListEmptyComponent={ storeIdNum ? ( @@ -448,7 +447,8 @@ export function FlashDeliveryProducts({ storeId:storeIdParent, baseUrl, onProduc const storeId = storeIdParent; const storeIdNum = storeId; - const productsQuery = trpc.common.product.getAllProductsSummary.useQuery({}); + const productsQuery = useAllProducts(); + const productSlotsMap = useCentralSlotStore((state) => state.productSlotsMap); const { addToCart = () => { } } = useAddToCart({ showSuccessAlert: false, showErrorAlert: false, refetchCart: true }, "flash") || {}; @@ -486,20 +486,22 @@ export function FlashDeliveryProducts({ storeId:storeIdParent, baseUrl, onProduc } // Filter products to only include those eligible for flash delivery - let flashProducts: any[] = []; + let flashProducts: AllProductsApiType['products'][number][] = []; if (storeIdNum) { // Filter by store, flash availability, and stock status - flashProducts = productsQuery?.data?.products?.filter(p => - p.storeId === storeIdNum && - p.isFlashAvailable && - !p.isOutOfStock - ) || []; + flashProducts = productsQuery?.data?.products?.filter(p => { + const productInfo = productSlotsMap[p.id]; + return p.storeId === storeIdNum && + productInfo?.isFlashAvailable && + !productInfo?.isOutOfStock; + }) || []; } else { // Show all flash-available products that are in stock - flashProducts = productsQuery?.data?.products?.filter(p => - p.isFlashAvailable && - !p.isOutOfStock - ) || []; + flashProducts = productsQuery?.data?.products?.filter(p => { + const productInfo = productSlotsMap[p.id]; + return productInfo?.isFlashAvailable && + !productInfo?.isOutOfStock; + }) || []; } return ( diff --git a/apps/user-ui/components/WebViewWrapper.tsx b/apps/user-ui/components/WebViewWrapper.tsx index 2f64735..c0ea863 100644 --- a/apps/user-ui/components/WebViewWrapper.tsx +++ b/apps/user-ui/components/WebViewWrapper.tsx @@ -2,7 +2,7 @@ import React, { useState } from 'react'; import { View, ActivityIndicator } from 'react-native'; import { WebView } from 'react-native-webview'; import { trpc } from '@/src/trpc-client'; -import { useGetEssentialConsts } from '@/src/api-hooks/essential-consts.api'; +import { useGetEssentialConsts } from '@/src/hooks/prominent-api-hooks'; import { theme, MyText, MyTouchableOpacity } from 'common-ui'; import MaterialIcons from '@expo/vector-icons/MaterialIcons'; diff --git a/apps/user-ui/components/cart-page.tsx b/apps/user-ui/components/cart-page.tsx index cae6dc7..4e29829 100644 --- a/apps/user-ui/components/cart-page.tsx +++ b/apps/user-ui/components/cart-page.tsx @@ -24,8 +24,10 @@ import TestingPhaseNote from "@/components/TestingPhaseNote"; import dayjs from "dayjs"; import { trpc } from "@/src/trpc-client"; +import { useCentralProductStore } from '@/src/store/centralProductStore'; +import { useCentralSlotStore } from '@/src/store/centralSlotStore'; import { useGetCart, useUpdateCartItem, useRemoveFromCart } from '@/hooks/cart-query-hooks'; -import { useGetEssentialConsts } from '@/src/api-hooks/essential-consts.api'; +import { useGetEssentialConsts } from '@/src/hooks/prominent-api-hooks'; interface CartPageProps { isFlashDelivery?: boolean; @@ -80,33 +82,34 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { const { data: couponsRaw, error: couponsError } = trpc.user.coupon.getEligible.useQuery(); const { data: constsData } = useGetEssentialConsts(); - const { data: productsData } = trpc.common.product.getAllProductsSummary.useQuery({}); + const products = useCentralProductStore((state) => state.products); + const productsById = useCentralProductStore((state) => state.productsById); + const productSlotsMap = useCentralSlotStore((state) => state.productSlotsMap); const cartItems = cartData?.items || []; // Memoized flash-eligible product IDs const flashEligibleProductIds = useMemo(() => { - if (!productsData?.products) return new Set(); + if (!products.length) return new Set(); return new Set( - productsData.products - .filter((product: any) => product.isFlashAvailable) - .map((product: any) => product.id) + products + .filter((product) => productSlotsMap[product.id]?.isFlashAvailable) + .map((product) => product.id) ); - }, [productsData]); + }, [products, productSlotsMap]); // Base total price without discounts for coupon eligibility check - const baseTotalPrice = useMemo( - () => - cartItems - .filter((item) => !item.product?.isOutOfStock) - .reduce( - (sum, item) => - sum + - (item.product?.price || 0) * (quantities[item.id] || item.quantity), - 0 - ), - [cartItems, quantities] + const baseTotalPrice = useMemo( + () => + cartItems + .filter((item) => !productSlotsMap[item.productId]?.isOutOfStock) + .reduce((sum, item) => { + const product = productsById[item.productId]; + const price = product?.price || 0; + return sum + price * (quantities[item.id] || item.quantity); + }, 0), + [cartItems, quantities, productsById] ); const eligibleCoupons = useMemo(() => { @@ -167,7 +170,9 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { const getAvailableSlotsForProduct = React.useMemo(() => { return (productId: number) => { if (!slotsData || !slotsData[productId]) return []; - return slotsData[productId].map((slot) => { + return slotsData[productId] + .filter((slot) => dayjs(slot.freezeTime).isAfter(dayjs())) + .map((slot) => { const formatTimeRange = (deliveryTime: string) => { const time = dayjs(deliveryTime); const endTime = time.add(1, 'hour'); @@ -184,11 +189,11 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { return `${time.format('ddd, DD MMM ')}${timeRange}`; }; - return { - label: `Delivery: ${formatTimeRange(slot.deliveryTime)} - Close time: ${dayjs(slot.freezeTime).format("h:mm a")}`, - value: slot.id, - }; - }); + return { + label: `Delivery: ${formatTimeRange(slot.deliveryTime)} - Close time: ${dayjs(slot.freezeTime).format("h:mm a")}`, + value: slot.id, + }; + }); }; }, [slotsData]); @@ -199,13 +204,14 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { [eligibleCoupons, selectedCouponId] ); - const totalPrice = cartItems - .filter((item) => !item.product?.isOutOfStock) - .reduce((sum, item) => { - const quantity = quantities[item.id] || item.quantity; - const price = isFlashDelivery ? (item.product?.flashPrice ?? item.product?.price ?? 0) : (item.product?.price || 0); - return sum + price * quantity; - }, 0); + const totalPrice = cartItems + .filter((item) => !productSlotsMap[item.productId]?.isOutOfStock) + .reduce((sum, item) => { + const product = productsById[item.productId]; + const quantity = quantities[item.id] || item.quantity; + const price = isFlashDelivery ? (product?.flashPrice ?? product?.price ?? 0) : (product?.price || 0); + return sum + price * quantity; + }, 0); const dropdownData = useMemo( () => eligibleCoupons?.map((coupon) => { @@ -273,7 +279,7 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { const finalTotalWithDelivery = finalTotal + deliveryCharge; - const hasAvailableItems = cartItems.some(item => !item.product?.isOutOfStock); + const hasAvailableItems = cartItems.some(item => !productSlotsMap[item.productId]?.isOutOfStock); useEffect(() => { const initial: Record = {}; @@ -303,11 +309,11 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { if (!productSlots || productSlots.length === 0) return; const now = dayjs(); - const upcomingSlots = productSlots.filter(slot => - dayjs(slot.deliveryTime).isAfter(now) - ).sort((a, b) => - dayjs(a.deliveryTime).diff(dayjs(b.deliveryTime)) - ); + const upcomingSlots = productSlots + .filter((slot) => dayjs(slot.freezeTime).isAfter(now)) + .sort((a, b) => + dayjs(a.deliveryTime).diff(dayjs(b.deliveryTime)) + ); if (upcomingSlots.length > 0) { @@ -410,10 +416,12 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { const productSlots = getAvailableSlotsForProduct(item.productId); const selectedSlotForItem = selectedSlots[item.id]; const isFlashEligible = isFlashDelivery ? flashEligibleProductIds.has(item.productId) : true; + const product = productsById[item.productId]; + const productSlotInfo = productSlotsMap[item.productId]; // const isAvailable = (productSlots.length > 0 || isFlashDelivery) && !item.product?.isOutOfStock && isFlashEligible; let isAvailable = true; - if(item.product?.isOutOfStock) { + if (productSlotInfo?.isOutOfStock) { isAvailable = false; } else if(isFlashDelivery) { if(!isFlashEligible) { @@ -430,7 +438,7 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { // isAvailable = isFlashEligible; // } const quantity = quantities[item.id] || item.quantity; - const price = isFlashDelivery ? (item.product?.flashPrice ?? item.product?.price ?? 0) : (item.product?.price || 0); + const price = isFlashDelivery ? (product?.flashPrice ?? product?.price ?? 0) : (product?.price || 0); const itemPrice = price * quantity; return ( @@ -438,7 +446,7 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { @@ -446,12 +454,12 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { style={tw`text-sm text-gray-900 flex-1 mr-3`} numberOfLines={2} > - {item.product.name} + {product?.name} {(() => { - const qty = item.product?.productQuantity || 1; - const unit = item.product?.unitNotation || ''; + const qty = product?.productQuantity || 1; + const unit = product?.unitNotation || ''; if (unit?.toLowerCase() === 'kg' && qty < 1) { return `${Math.round(qty * 1000)}g`; } @@ -512,8 +520,8 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { }); } }} - step={item.product.incrementStep} - unit={item.product?.unitNotation} + step={product?.incrementStep} + unit={product?.unitNotation} /> @@ -579,7 +587,7 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { onPress={() => { Alert.alert( "Remove Item", - `Remove ${item.product.name} from cart?`, + `Remove ${product?.name} from cart?`, [ { text: "Cancel", style: "cancel" }, { @@ -630,7 +638,7 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { onPress={() => { Alert.alert( "Remove Item", - `Remove ${item.product.name} from cart?`, + `Remove ${product?.name} from cart?`, [ { text: "Cancel", style: "cancel" }, { @@ -670,12 +678,12 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { )} {!isAvailable && ( - - - {item.product?.isOutOfStock - ? "Out of Stock" + + + {productSlotInfo?.isOutOfStock + ? "Out of Stock" : isFlashDelivery && !flashEligibleProductIds.has(item.productId) ? "Not available for flash delivery. Please remove" : "No delivery slots available"} @@ -908,7 +916,7 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { onPress={() => { const availableItems = cartItems .filter(item => { - if (item.product?.isOutOfStock) return false; + if (productSlotsMap[item.productId]?.isOutOfStock) return false; if (isFlashDelivery) { // Check if product supports flash delivery return flashEligibleProductIds.has(item.productId); @@ -917,12 +925,10 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { }) .map(item => item.id); - - - if (availableItems.length === 0) { - // Determine why no items are available - const outOfStockItems = cartItems.filter(item => item.product?.isOutOfStock); - const inStockItems = cartItems.filter(item => !item.product?.isOutOfStock); + if (availableItems.length === 0) { + // Determine why no items are available + const outOfStockItems = cartItems.filter(item => productSlotsMap[item.productId]?.isOutOfStock); + const inStockItems = cartItems.filter(item => !productSlotsMap[item.productId]?.isOutOfStock); let errorTitle = "Cannot Proceed"; let errorMessage = ""; @@ -959,9 +965,9 @@ export default function CartPage({ isFlashDelivery = false }: CartPageProps) { return; } - // Check if there are items without slots (for regular delivery) - if (!isFlashDelivery && availableItems.length < cartItems.length) { - const itemsWithoutSlots = cartItems.filter(item => !selectedSlots[item.id] && !item.product?.isOutOfStock); + // Check if there are items without slots (for regular delivery) + if (!isFlashDelivery && availableItems.length < cartItems.length) { + const itemsWithoutSlots = cartItems.filter(item => !selectedSlots[item.id] && !productSlotsMap[item.productId]?.isOutOfStock); if (itemsWithoutSlots.length > 0) { Alert.alert( "Delivery Slot Required", diff --git a/apps/user-ui/components/checkout-page.tsx b/apps/user-ui/components/checkout-page.tsx index 1f25ec5..84f1d50 100644 --- a/apps/user-ui/components/checkout-page.tsx +++ b/apps/user-ui/components/checkout-page.tsx @@ -8,8 +8,10 @@ import AddressForm from '@/src/components/AddressForm'; import { useAuthenticatedRoute } from '@/hooks/useAuthenticatedRoute'; import { trpc } from '@/src/trpc-client'; +import { useCentralProductStore } from '@/src/store/centralProductStore'; +import { useCentralSlotStore } from '@/src/store/centralSlotStore'; import { useGetCart } from '@/hooks/cart-query-hooks'; -import { useGetEssentialConsts } from '@/src/api-hooks/essential-consts.api'; +import { useGetEssentialConsts } from '@/src/hooks/prominent-api-hooks'; import PaymentAndOrderComponent from '@/components/PaymentAndOrderComponent'; import CheckoutAddressSelector from '@/components/CheckoutAddressSelector'; import { useAddressStore } from '@/src/store/addressStore'; @@ -35,7 +37,9 @@ const CheckoutPage: React.FC = ({ isFlashDelivery = false }) const { data: addresses, refetch: refetchAddresses } = trpc.user.address.getUserAddresses.useQuery(); const { data: slotsData, refetch: refetchSlots } = trpc.user.slots.getSlots.useQuery(); const { data: constsData } = useGetEssentialConsts(); - const { data: productsData } = trpc.common.product.getAllProductsSummary.useQuery({}); + const products = useCentralProductStore((state) => state.products); + const productsById = useCentralProductStore((state) => state.productsById); + const productSlotsMap = useCentralSlotStore((state) => state.productSlotsMap); useMarkDataFetchers(() => { refetchCart(); @@ -51,15 +55,15 @@ const CheckoutPage: React.FC = ({ isFlashDelivery = false }) const cartItems = cartData?.items || []; - // Memoized flash-eligible product IDs - const flashEligibleProductIds = useMemo(() => { - if (!productsData?.products) return new Set(); - return new Set( - productsData.products - .filter((product: any) => product.isFlashAvailable) - .map((product: any) => product.id) - ); - }, [productsData]); + // Memoized flash-eligible product IDs + const flashEligibleProductIds = useMemo(() => { + if (!products.length) return new Set(); + return new Set( + products + .filter((product) => productSlotsMap[product.id]?.isFlashAvailable) + .map((product) => product.id) + ); + }, [products, productSlotsMap]); // Parse slots parameter from URL (format: "1:1,2,3;2:4,5") const selectedSlots = useMemo(() => { @@ -123,10 +127,11 @@ const CheckoutPage: React.FC = ({ isFlashDelivery = false }) const totalPrice = selectedItems - .filter((item) => !item.product?.isOutOfStock) + .filter((item) => !productSlotsMap[item.productId]?.isOutOfStock) .reduce( (sum, item) => { - const price = isFlashDelivery ? (item.product?.flashPrice ?? item.product?.price ?? 0) : (item.product?.price || 0); + const product = productsById[item.productId]; + const price = isFlashDelivery ? (product?.flashPrice ?? product?.price ?? 0) : (product?.price || 0); return sum + price * item.quantity; }, 0 diff --git a/apps/user-ui/components/floating-cart-bar.tsx b/apps/user-ui/components/floating-cart-bar.tsx index cbf7e79..fff1dc8 100644 --- a/apps/user-ui/components/floating-cart-bar.tsx +++ b/apps/user-ui/components/floating-cart-bar.tsx @@ -14,7 +14,6 @@ import { theme, updateStatusBarColor, } from "common-ui"; -import { trpc } from "@/src/trpc-client"; import { useGetCart, useUpdateCartItem, @@ -22,8 +21,9 @@ import { useAddToCart, type CartType, } from "@/hooks/cart-query-hooks"; -import { useGetEssentialConsts } from "@/src/api-hooks/essential-consts.api"; +import { useGetEssentialConsts, useSlots } from "@/src/hooks/prominent-api-hooks" import { useProductSlotIdentifier } from "@/hooks/useProductSlotIdentifier"; +import { useCentralProductStore } from "@/src/store/centralProductStore"; import dayjs from "dayjs"; import { LinearGradient } from "expo-linear-gradient"; @@ -36,7 +36,7 @@ interface FloatingCartBarProps { } // Smart time window formatting function -const formatTimeRange = (deliveryTime: string) => { +const formatTimeRange = (deliveryTime: string | Date) => { const time = dayjs(deliveryTime); const endTime = time.add(1, 'hour'); const startPeriod = time.format('A'); @@ -79,7 +79,8 @@ const FloatingCartBar: React.FC = ({ const setIsExpanded = controlledSetIsExpanded ?? setLocalIsExpanded; const { data: cartData, refetch: refetchCart } = useGetCart({}, cartType); const { data: constsData } = useGetEssentialConsts(); - const { data: slotsData } = trpc.user.slots.getSlotsWithProducts.useQuery(); + const { data: slotsData } = useSlots(); + const productsById = useCentralProductStore((state) => state.productsById); const { productSlotsMap } = useProductSlotIdentifier(); const cartItems = cartData?.items || []; const itemCount = cartItems.length; @@ -108,21 +109,21 @@ const FloatingCartBar: React.FC = ({ setQuantities(initial); }, [cartData]); -useEffect(() => { + useEffect(() => { if (!cartItems.length || !slotsData?.slots || !productSlotsMap) return; const itemsToUpdate = cartItems.filter(item => { if (isFlashDelivery || !item.slotId) return false; - const availableSlots = productSlotsMap.get(item.productId) || []; - const isSlotAvailable = availableSlots.includes(item.slotId); + const availableSlots = productSlotsMap[item.productId]?.slots || []; + const isSlotAvailable = availableSlots.some((slot) => slot.id === item.slotId); return !isSlotAvailable; }); itemsToUpdate.forEach((item) => { - const availableSlots = productSlotsMap.get(item.productId) || []; + const availableSlots = productSlotsMap[item.productId]?.slots || []; if (availableSlots.length > 0 && !isFlashDelivery) { - const nearestSlotId = availableSlots[0]; + const nearestSlotId = availableSlots[0].id; removeFromCart.mutate({ itemId: item.id }); addToCartHook.addToCart(item.productId, item.quantity, nearestSlotId); } @@ -135,7 +136,9 @@ useEffect(() => { // Calculate total cart value and free delivery info const totalCartValue = cartItems.reduce( (sum, item) => { - const price = isFlashDelivery ? (item.product.flashPrice ?? item.product.price) : item.product.price; + const product = productsById[item.productId]; + const basePrice = product?.price ?? 0; + const price = isFlashDelivery ? (product?.flashPrice ?? basePrice) : basePrice; return sum + price * item.quantity; }, 0 @@ -256,21 +259,21 @@ useEffect(() => { - + - { + { if (value === 0) { removeFromCart.mutate({ itemId: item.id }); } else { @@ -278,21 +281,20 @@ useEffect(() => { updateCartItem.mutate({ itemId: item.id, quantity: value }); } }} - step={item.product.incrementStep} - showUnits={true} - unit={item.product?.unitNotation} - /> + step={productsById[item.productId]?.incrementStep || 1} + showUnits={true} + unit={productsById[item.productId]?.unitNotation} + /> - {item.slotId && slotsData && productSlotsMap.has(item.productId) && ( + {item.slotId && slotsData && productSlotsMap[item.productId] && ( { - const slot = slotsData.slots.find(s => s.id === slotId); + options={(productSlotsMap[item.productId]?.slots || []).map((slot) => { return { label: slot ? formatTimeRange(slot.deliveryTime) : "N/A", - value: slotId, + value: slot.id, }; })} onValueChange={async (val) => { @@ -325,7 +327,12 @@ useEffect(() => { /> )} - ₹{(isFlashDelivery ? (item.product.flashPrice ?? item.product.price) : item.product.price) * item.quantity} + ₹{(() => { + const product = productsById[item.productId]; + const basePrice = product?.price ?? 0; + const price = isFlashDelivery ? (product?.flashPrice ?? basePrice) : basePrice; + return price * item.quantity; + })()} diff --git a/apps/user-ui/components/registration-form.tsx b/apps/user-ui/components/registration-form.tsx index 3f98b1f..d48182c 100644 --- a/apps/user-ui/components/registration-form.tsx +++ b/apps/user-ui/components/registration-form.tsx @@ -2,8 +2,9 @@ import React, { useState } from "react"; import { View, TextInput, Alert } from "react-native"; import { useForm, Controller } from "react-hook-form"; -import { MyButton, MyText, MyTextInput, ProfileImage, tw, BottomDialog } from "common-ui"; +import { MyButton, MyText, MyTextInput, ProfileImage, tw, BottomDialog, MyTouchableOpacity } from "common-ui"; import { trpc } from "@/src/trpc-client"; +import { useUploadToObjectStorage } from "@/src/hooks/useUploadToObjectStorage"; interface RegisterFormInputs { name: string; @@ -16,19 +17,26 @@ interface RegisterFormInputs { } interface RegistrationFormProps { - onSubmit: (data: FormData) => void | Promise; + onSubmit: (data: { + name: string; + email: string; + mobile: string; + password: string; + imageKey?: string; + }) => void | Promise; isLoading?: boolean; initialValues?: Partial; isEdit?: boolean; } function RegistrationForm({ onSubmit, isLoading = false, initialValues, isEdit = false }: RegistrationFormProps) { + const [profileImage, setProfileImage] = useState<{ uri: string; mimeType: string } | null>(null); const [profileImageUri, setProfileImageUri] = useState(); - const [profileImageFile, setProfileImageFile] = useState(); const [isPasswordDialogOpen, setIsPasswordDialogOpen] = useState(false); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const updatePasswordMutation = trpc.user.auth.updatePassword.useMutation(); + const { uploadSingle, isUploading } = useUploadToObjectStorage(); // Set initial profile image URI for edit mode React.useEffect(() => { @@ -161,27 +169,28 @@ function RegistrationForm({ onSubmit, isLoading = false, initialValues, isEdit = return; } - // Create FormData - const formData = new FormData(); - formData.append('name', data.name.trim()); - formData.append('email', data.email.trim().toLowerCase()); - formData.append('mobile', data.mobile.replace(/\D/g, '')); + try { + let imageKey: string | undefined; - // Only include password if provided (for edit mode) - if (data.password) { - formData.append('password', data.password); + // Upload profile image if selected + if (profileImage) { + const response = await fetch(profileImage.uri); + const blob = await response.blob(); + const result = await uploadSingle(blob, profileImage.mimeType, 'profile'); + imageKey = result.key; + } + + // Call onSubmit with data and imageKey + await onSubmit({ + name: data.name.trim(), + email: data.email.trim().toLowerCase(), + mobile: data.mobile.replace(/\D/g, ''), + password: data.password, + imageKey, + }); + } catch (error: any) { + Alert.alert('Error', error.message || 'Failed to upload image'); } - - if (profileImageFile) { - - formData.append('profileImage', { - uri: profileImageFile.uri, - type: profileImageFile.mimeType || 'image/jpeg', - name: profileImageFile.name || 'profile.jpg', - } as any); - } - - await onSubmit(formData); }; const handleUpdatePassword = async () => { @@ -213,7 +222,10 @@ function RegistrationForm({ onSubmit, isLoading = false, initialValues, isEdit = imageUri={profileImageUri} onImageSelect={(uri, file) => { setProfileImageUri(uri); - setProfileImageFile(file); + setProfileImage({ + uri: file.uri, + mimeType: file.mimeType || 'image/jpeg', + }); }} size={100} editable={true} @@ -407,10 +419,10 @@ function RegistrationForm({ onSubmit, isLoading = false, initialValues, isEdit = fillColor="brand500" textColor="white1" fullWidth - disabled={isLoading} + disabled={isLoading || isUploading} style={tw` rounded-lg`} > - {isLoading ? (isEdit ? "Updating..." : "Creating Account...") : (isEdit ? "Update Profile" : "Create Account")} + {isUploading ? "Uploading Image..." : isLoading ? (isEdit ? "Updating..." : "Creating Account...") : (isEdit ? "Update Profile" : "Create Account")} {isEdit && ( @@ -482,4 +494,4 @@ function RegistrationForm({ onSubmit, isLoading = false, initialValues, isEdit = ); } -export default RegistrationForm; \ No newline at end of file +export default RegistrationForm; diff --git a/apps/user-ui/eas.json b/apps/user-ui/eas.json index a9e57d3..d1cc44e 100755 --- a/apps/user-ui/eas.json +++ b/apps/user-ui/eas.json @@ -5,8 +5,8 @@ }, "build": { "development": { - "developmentClient": true, "distribution": "internal", + "autoIncrement": true, "channel": "development" }, "preview": { diff --git a/apps/user-ui/hooks/cart-query-hooks.tsx b/apps/user-ui/hooks/cart-query-hooks.tsx index 49d7d7e..b63bfda 100644 --- a/apps/user-ui/hooks/cart-query-hooks.tsx +++ b/apps/user-ui/hooks/cart-query-hooks.tsx @@ -1,15 +1,12 @@ -import { trpc } from '@/src/trpc-client'; +import { useAllProducts } from '@/src/hooks/prominent-api-hooks'; +import { useCentralSlotStore } from '@/src/store/centralSlotStore'; import { Alert } from 'react-native'; -import { useState, useEffect } from 'react'; -import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; +import { useQuery, useMutation, useQueryClient, UseQueryResult, UseMutationResult } from '@tanstack/react-query'; import { StorageServiceCasual } from 'common-ui/src/services/StorageServiceCasual'; // Cart type definition export type CartType = "regular" | "flash"; -// const CART_MODE: 'remote' | 'local' = 'remote'; -const CART_MODE: 'remote' | 'local' = 'local'; - const getCartStorageKey = (cartType: CartType = "regular"): string => { return cartType === "flash" ? "flash_cart_items" : "cart_items"; }; @@ -26,15 +23,99 @@ interface ProductSummary { id: number; price: string; incrementStep: number; + isOutOfStock: boolean; + isFlashAvailable: boolean; + name?: string; + flashPrice?: string | null; + images?: string[]; + productQuantity?: number; + unitNotation?: string; + marketPrice?: string | null; } -interface CartItem { +export interface CartItem { id: number; productId: number; quantity: number; addedAt: string; - product: ProductSummary; subtotal: number; + slotId: number; +} + +interface CartData { + items: CartItem[]; + totalItems: number; + totalAmount: number; +} + +interface UseGetCartOptions { + refetchOnWindowFocus?: boolean; + enabled?: boolean; +} + +interface UseGetCartReturn { + data: CartData | undefined; + isLoading: boolean; + error: Error | null; + refetch: () => Promise>; + cartItems: CartItem[]; + totalItems: number; + totalPrice: number; + isEmpty: boolean; + hasItems: boolean; +} + +interface AddToCartVariables { + productId: number; + quantity: number; + slotId: number; +} + +interface UpdateCartVariables { + itemId: number; + quantity: number; +} + +interface RemoveCartVariables { + itemId: number; +} + +interface MutationOptions { + onSuccess?: (data: TData, variables: TVariables) => void; + onError?: (error: Error) => void; + showSuccessAlert?: boolean; + showErrorAlert?: boolean; + refetchCart?: boolean; +} + +interface UseAddToCartReturn { + mutate: UseMutationResult['mutate']; + mutateAsync: UseMutationResult['mutateAsync']; + isLoading: boolean; + error: Error | null; + data: LocalCartItem[] | undefined; + addToCart: (productId: number, quantity?: number, slotId?: number, onSettled?: (data: LocalCartItem[] | undefined, error: Error | null) => void) => void; + addToCartAsync: (productId: number, quantity?: number, slotId?: number) => Promise; +} + +interface UseUpdateCartItemReturn { + mutate: UseMutationResult['mutate']; + mutateAsync: UseMutationResult['mutateAsync']; + isLoading: boolean; + error: Error | null; + data: LocalCartItem[] | undefined; + updateCartItem: (itemId: number, quantity: number) => void; + updateCartItemAsync: (itemId: number, quantity: number) => Promise; +} + +interface UseRemoveFromCartReturn { + mutate: UseMutationResult['mutate']; + mutateAsync: UseMutationResult['mutateAsync']; + isLoading: boolean; + error: Error | null; + data: LocalCartItem[] | undefined; + removeFromCart: (itemId: number) => void; + removeFromCartAsync: (itemId: number) => Promise; } const getLocalCart = async (cartType: CartType = "regular"): Promise => { @@ -46,8 +127,7 @@ const getLocalCart = async (cartType: CartType = "regular"): Promise => { const key = getCartStorageKey(cartType); await StorageServiceCasual.setItem(key, JSON.stringify(items)); - const fetchedItems = await getLocalCart(cartType); - + await getLocalCart(cartType); }; const getNextCartItemId = (items: LocalCartItem[]): number => { @@ -55,8 +135,7 @@ const getNextCartItemId = (items: LocalCartItem[]): number => { return maxId + 1; }; -const addToLocalCart = async (productId: number, quantity: number, slotId?: number, cartType: CartType = "regular"): Promise => { - +const addToLocalCart = async (productId: number, quantity: number, slotId: number | undefined, cartType: CartType = "regular"): Promise => { const items = await getLocalCart(cartType); const existingIndex = items.findIndex(item => item.productId === productId); @@ -67,13 +146,13 @@ const addToLocalCart = async (productId: number, quantity: number, slotId?: numb } } else { const newId = getNextCartItemId(items); - const cartItem = { + const cartItem: LocalCartItem = { id: newId, productId, quantity, - slotId: slotId ?? 0, // Default to 0 if not provided + slotId: slotId ?? 0, addedAt: new Date().toISOString(), - } + }; items.push(cartItem); } @@ -104,401 +183,192 @@ const clearLocalCart = async (cartType: CartType = "regular"): Promise => await StorageServiceCasual.setItem(key, JSON.stringify([])); }; -export function useGetCart(options?: { - refetchOnWindowFocus?: boolean; - enabled?: boolean; -}, cartType: CartType = "regular") { - if (CART_MODE === 'remote') { - const query = trpc.user.cart.getCart.useQuery(undefined, { - refetchOnWindowFocus: options?.refetchOnWindowFocus ?? true, - enabled: options?.enabled ?? true, - ...options - }); +export function useGetCart(options: UseGetCartOptions = {}, cartType: CartType = "regular"): UseGetCartReturn { + const { data: products } = useAllProducts(); + const productSlotsMap = useCentralSlotStore((state) => state.productSlotsMap); + + const query: UseQueryResult = useQuery({ + queryKey: [`local-cart-${cartType}`], + queryFn: async (): Promise => { + const cartItems = await getLocalCart(cartType); - return { - // Original tRPC returns - data: query.data, - isLoading: query.isLoading, - error: query.error, - refetch: query.refetch, + const productMap: Record> = Object.fromEntries( + products?.products?.map((p) => [ + p.id, + { + id: p.id, + price: String(p.price), + incrementStep: p.incrementStep, + marketPrice: p.marketPrice === null || p.marketPrice === undefined ? null : String(p.marketPrice), + name: p.name, + flashPrice: p.flashPrice, + images: p.images, + productQuantity: p.productQuantity, + unitNotation: p.unitNotation, + }, + ]) ?? [] + ); - // Computed properties - cartItems: query.data?.items || [], - totalItems: query.data?.totalItems || 0, - totalPrice: query.data?.totalAmount || 0, + const items: CartItem[] = cartItems + .map((cartItem): CartItem | null => { + const productBasic = productMap[cartItem.productId]; + const productAvailability = productSlotsMap[cartItem.productId]; - // Helper methods - isEmpty: !query.data?.items?.length, - hasItems: Boolean(query.data?.items?.length), - }; - } else { - - const { data: products } = trpc.common.product.getAllProductsSummary.useQuery({}); - const query = useQuery({ - queryKey: [`local-cart-${cartType}`], - queryFn: async () => { - - const cartItems = await getLocalCart(cartType); - - const productMap = Object.fromEntries( - products?.products?.map((p) => [ - p.id, - { - ...p, - price: String(p.price), - marketPrice: p.marketPrice === null || p.marketPrice === undefined ? null : String(p.marketPrice), - } as ProductSummary, - ]) || [] - ); - - const items: CartItem[] = cartItems.map(cartItem => { - const product = productMap[cartItem.productId]; + if (!productBasic || !productAvailability) return null; - if (!product) return null as any; return { id: cartItem.id, productId: cartItem.productId, quantity: cartItem.quantity, - addedAt: cartItem.addedAt, - product, - incrementStep: product.incrementStep, - subtotal: Number(product.price) * cartItem.quantity, + addedAt: cartItem.addedAt, + subtotal: Number(productBasic.price) * cartItem.quantity, slotId: cartItem.slotId, }; - }).filter(Boolean) as CartItem[]; - const totalAmount = items.reduce((sum, item) => sum + item.subtotal, 0); + }) + .filter((item): item is CartItem => item !== null); - return { - items, - totalItems: items.length, - totalAmount, - }; - }, - refetchOnWindowFocus: options?.refetchOnWindowFocus ?? true, - enabled: (options?.enabled ?? true) && !!products, + const totalAmount = items.reduce((sum, item) => sum + item.subtotal, 0); + + return { + items, + totalItems: items.length, + totalAmount, + }; + }, + refetchOnWindowFocus: options?.refetchOnWindowFocus ?? true, + enabled: (options?.enabled ?? true) && !!products, + }); + + return { + data: query.data, + isLoading: query.isLoading, + error: query.error, + refetch: query.refetch, + cartItems: query.data?.items ?? [], + totalItems: query.data?.totalItems ?? 0, + totalPrice: query.data?.totalAmount ?? 0, + isEmpty: !(query.data?.items?.length ?? 0), + hasItems: Boolean(query.data?.items?.length), + }; +} + +export function useAddToCart(options: MutationOptions = {}, cartType: CartType = "regular"): UseAddToCartReturn { + const queryClient = useQueryClient(); + + const mutation: UseMutationResult = useMutation({ + mutationFn: async ({ productId, quantity, slotId }: AddToCartVariables): Promise => { + return await addToLocalCart(productId, quantity, slotId, cartType); + }, + onSuccess: (data: LocalCartItem[], variables: AddToCartVariables) => { + queryClient.invalidateQueries({ queryKey: [`local-cart-${cartType}`] }); + if (options?.showSuccessAlert !== false) { + Alert.alert("Success", "Item added to cart!"); + } + options?.onSuccess?.(data, variables); + }, + onError: (error: Error) => { + if (options?.showErrorAlert !== false) { + Alert.alert("Error", error.message || "Failed to add item to cart"); + } + options?.onError?.(error); + }, + }); + + const addToCart = (productId: number, quantity = 1, slotId?: number, onSettled?: (data: LocalCartItem[] | undefined, error: Error | null) => void): void => { + if (slotId == null) { + throw new Error('slotId is required for adding to cart'); + } + mutation.mutate({ productId, quantity, slotId }, { + onSettled: (data: LocalCartItem[] | undefined, error: Error | null) => { + onSettled?.(data, error); + } }); - - return { - data: query.data, - isLoading: query.isLoading, - error: query.error, - refetch: query.refetch, + }; - // Computed properties - cartItems: query.data?.items || [], - totalItems: query.data?.totalItems || 0, - totalPrice: query.data?.totalAmount || 0, - - // Helper methods - isEmpty: !query.data?.items?.length, - hasItems: Boolean(query.data?.items?.length), - }; - } -} - -interface UseAddToCartReturn { - mutate: any; - mutateAsync: any; - isLoading: boolean; - error: any; - data: any; - addToCart: (productId: number, quantity?: number, slotId?: number, onSettled?: (data: any, error: any) => void) => void; - addToCartAsync: (productId: number, quantity?: number, slotId?: number) => Promise; -} - -export function useAddToCart(options?: { - onSuccess?: (data: any, variables: any) => void; - onError?: (error: any) => void; - showSuccessAlert?: boolean; - showErrorAlert?: boolean; - refetchCart?: boolean; -}, cartType: CartType = "regular"): UseAddToCartReturn { - if (CART_MODE === 'remote') { - const utils = trpc.useUtils(); - - const mutation = trpc.user.cart.addToCart.useMutation({ - onSuccess: (data, variables) => { - // Default success handling - if (options?.showSuccessAlert !== false) { - Alert.alert("Success", "Item added to cart!"); - } - - // Auto-refetch cart if requested - if (options?.refetchCart) { - utils.user.cart.getCart.invalidate(); - } - - // Custom success callback - options?.onSuccess?.(data, variables); - }, - onError: (error) => { - // Default error handling - if (options?.showErrorAlert !== false) { - Alert.alert("Error", error.message || "Failed to add item to cart"); - } - - // Custom error callback - options?.onError?.(error); - }, - }) as any; - - const addToCart = (productId: number, quantity = 1, slotId?: number, onSettled?: (data: any, error: any) => void) => { - + return { + mutate: mutation.mutate, + mutateAsync: mutation.mutateAsync, + isLoading: mutation.isPending, + error: mutation.error, + data: mutation.data, + addToCart, + addToCartAsync: (productId: number, quantity = 1, slotId?: number): Promise => { if (slotId == null) { throw new Error('slotId is required for adding to cart'); } - return mutation.mutate({ productId, quantity, slotId }, { - onSettled: (data: any, error: any) => { - onSettled?.(data, error); - } - }); - }; + return mutation.mutateAsync({ productId, quantity, slotId }); + }, + }; +} - return { - // Original mutation returns - mutate: mutation.mutate, - mutateAsync: mutation.mutateAsync, - isLoading: mutation.isPending, - error: mutation.error, - data: mutation.data, +export function useUpdateCartItem(options: MutationOptions = {}, cartType: CartType = "regular"): UseUpdateCartItemReturn { + const queryClient = useQueryClient(); - addToCart, - - addToCartAsync: (productId: number, quantity = 1, slotId?: number) => { - if (slotId == null) { - throw new Error('slotId is required for adding to cart'); - } - return mutation.mutateAsync({ productId, quantity, slotId }); - }, - }; - } else { - - const queryClient = useQueryClient(); - - const mutation = useMutation({ - mutationFn: async ({ productId, quantity, slotId }: { productId: number, quantity: number, slotId: number }) => { - return await addToLocalCart(productId, quantity, slotId, cartType); - }, - onSuccess: (data, variables) => { - queryClient.invalidateQueries({ queryKey: [`local-cart-${cartType}`] }); - if (options?.showSuccessAlert !== false) { - Alert.alert("Success", "Item added to cart!"); - } - options?.onSuccess?.(data, variables); - }, - onError: (error) => { - if (options?.showErrorAlert !== false) { - Alert.alert("Error", error.message || "Failed to add item to cart"); - } - options?.onError?.(error); - }, - }); - - const addToCart = (productId: number, quantity = 1, slotId?: number, onSettled?: (data: any, error: any) => void) => { - - if (slotId == null) { - throw new Error('slotId is required for adding to cart'); + const mutation: UseMutationResult = useMutation({ + mutationFn: async ({ itemId, quantity }: UpdateCartVariables): Promise => { + return await updateLocalCartItem(itemId, quantity, cartType); + }, + onSuccess: (data: LocalCartItem[], variables: UpdateCartVariables) => { + queryClient.invalidateQueries({ queryKey: [`local-cart-${cartType}`] }); + if (options?.showSuccessAlert !== false) { + Alert.alert("Success", "Cart item updated!"); } - return mutation.mutate({ productId, quantity, slotId }, { - onSettled: (data: any, error: any) => { - onSettled?.(data, error); - } - }); - }; + options?.onSuccess?.(data, variables); + }, + onError: (error: Error) => { + if (options?.showErrorAlert !== false) { + Alert.alert("Error", error.message || "Failed to update cart item"); + } + options?.onError?.(error); + }, + }); - return { - mutate: mutation.mutate, - mutateAsync: mutation.mutateAsync, - isLoading: mutation.isPending, - error: mutation.error, - data: mutation.data, - addToCart, - addToCartAsync: (productId: number, quantity = 1, slotId?: number) => { - if (slotId == null) { - throw new Error('slotId is required for adding to cart'); - } - return mutation.mutateAsync({ productId, quantity, slotId }); - }, - }; - } + return { + mutate: mutation.mutate, + mutateAsync: mutation.mutateAsync, + isLoading: mutation.isPending, + error: mutation.error, + data: mutation.data, + updateCartItem: (itemId: number, quantity: number): void => + mutation.mutate({ itemId, quantity }), + updateCartItemAsync: (itemId: number, quantity: number): Promise => + mutation.mutateAsync({ itemId, quantity }), + }; } -export function useUpdateCartItem(options?: { - onSuccess?: (data: any, variables: any) => void; - onError?: (error: any) => void; - showSuccessAlert?: boolean; - showErrorAlert?: boolean; - refetchCart?: boolean; -}, cartType: CartType = "regular") { - if (CART_MODE === 'remote') { - const utils = trpc.useUtils(); +export function useRemoveFromCart(options: MutationOptions = {}, cartType: CartType = "regular"): UseRemoveFromCartReturn { + const queryClient = useQueryClient(); - const mutation = trpc.user.cart.updateCartItem.useMutation({ - onSuccess: (data, variables) => { - // Default success handling - if (options?.showSuccessAlert !== false) { - Alert.alert("Success", "Cart item updated!"); - } + const mutation: UseMutationResult = useMutation({ + mutationFn: async ({ itemId }: RemoveCartVariables): Promise => { + return await removeFromLocalCart(itemId, cartType); + }, + onSuccess: (data: LocalCartItem[], variables: RemoveCartVariables) => { + queryClient.invalidateQueries({ queryKey: [`local-cart-${cartType}`] }); + if (options?.showSuccessAlert !== false) { + Alert.alert("Success", "Item removed from cart!"); + } + options?.onSuccess?.(data, variables); + }, + onError: (error: Error) => { + if (options?.showErrorAlert !== false) { + Alert.alert("Error", error.message || "Failed to remove item from cart"); + } + options?.onError?.(error); + }, + }); - // Auto-refetch cart if requested - if (options?.refetchCart) { - utils.user.cart.getCart.invalidate(); - } - - // Custom success callback - options?.onSuccess?.(data, variables); - }, - onError: (error) => { - // Default error handling - if (options?.showErrorAlert !== false) { - Alert.alert("Error", error.message || "Failed to update cart item"); - } - - // Custom error callback - options?.onError?.(error); - }, - }); - - return { - // Original mutation returns - mutate: mutation.mutate, - mutateAsync: mutation.mutateAsync, - isLoading: mutation.isPending, - error: mutation.error, - data: mutation.data, - - // Helper methods - updateCartItem: (itemId: number, quantity: number) => - mutation.mutate({ itemId, quantity }), - - updateCartItemAsync: (itemId: number, quantity: number) => - mutation.mutateAsync({ itemId, quantity }), - }; - } else { - const queryClient = useQueryClient(); - - const mutation = useMutation({ - mutationFn: async ({ itemId, quantity }: { itemId: number, quantity: number }) => { - return await updateLocalCartItem(itemId, quantity, cartType); - }, - onSuccess: (data, variables) => { - queryClient.invalidateQueries({ queryKey: [`local-cart-${cartType}`] }); - if (options?.showSuccessAlert !== false) { - Alert.alert("Success", "Cart item updated!"); - } - options?.onSuccess?.(data, variables); - }, - onError: (error) => { - if (options?.showErrorAlert !== false) { - Alert.alert("Error", error.message || "Failed to update cart item"); - } - options?.onError?.(error); - }, - }); - - return { - mutate: mutation.mutate, - mutateAsync: mutation.mutateAsync, - isLoading: mutation.isPending, - error: mutation.error, - data: mutation.data, - - updateCartItem: (itemId: number, quantity: number) => - mutation.mutate({ itemId, quantity }), - - updateCartItemAsync: (itemId: number, quantity: number) => - mutation.mutateAsync({ itemId, quantity }), - }; - } -} - -export function useRemoveFromCart(options?: { - onSuccess?: (data: any, variables: any) => void; - onError?: (error: any) => void; - showSuccessAlert?: boolean; - showErrorAlert?: boolean; - refetchCart?: boolean; -}, cartType: CartType = "regular") { - if (CART_MODE === 'remote') { - const utils = trpc.useUtils(); - - const mutation = trpc.user.cart.removeFromCart.useMutation({ - onSuccess: (data, variables) => { - // Default success handling - if (options?.showSuccessAlert !== false) { - Alert.alert("Success", "Item removed from cart!"); - } - - // Auto-refetch cart if requested - if (options?.refetchCart) { - utils.user.cart.getCart.invalidate(); - } - - // Custom success callback - options?.onSuccess?.(data, variables); - }, - onError: (error) => { - // Default error handling - if (options?.showErrorAlert !== false) { - Alert.alert("Error", error.message || "Failed to remove item from cart"); - } - - // Custom error callback - options?.onError?.(error); - }, - }); - - return { - // Original mutation returns - mutate: mutation.mutate, - mutateAsync: mutation.mutateAsync, - isLoading: mutation.isPending, - error: mutation.error, - data: mutation.data, - - // Helper methods - removeFromCart: (itemId: number) => - mutation.mutate({ itemId }), - - removeFromCartAsync: (itemId: number) => - mutation.mutateAsync({ itemId }), - }; - } else { - const queryClient = useQueryClient(); - - const mutation = useMutation({ - mutationFn: async ({ itemId }: { itemId: number }) => { - return await removeFromLocalCart(itemId, cartType); - }, - onSuccess: (data, variables) => { - queryClient.invalidateQueries({ queryKey: [`local-cart-${cartType}`] }); - if (options?.showSuccessAlert !== false) { - Alert.alert("Success", "Item removed from cart!"); - } - options?.onSuccess?.(data, variables); - }, - onError: (error) => { - if (options?.showErrorAlert !== false) { - Alert.alert("Error", error.message || "Failed to remove item from cart"); - } - options?.onError?.(error); - }, - }); - - return { - mutate: mutation.mutate, - mutateAsync: mutation.mutateAsync, - isLoading: mutation.isPending, - error: mutation.error, - data: mutation.data, - - removeFromCart: (itemId: number) => - mutation.mutate({ itemId }), - - removeFromCartAsync: (itemId: number) => - mutation.mutateAsync({ itemId }), - }; - } + return { + mutate: mutation.mutate, + mutateAsync: mutation.mutateAsync, + isLoading: mutation.isPending, + error: mutation.error, + data: mutation.data, + removeFromCart: (itemId: number): void => + mutation.mutate({ itemId }), + removeFromCartAsync: (itemId: number): Promise => + mutation.mutateAsync({ itemId }), + }; } // Export clear cart function for direct use diff --git a/apps/user-ui/hooks/useProductSlotIdentifier.ts b/apps/user-ui/hooks/useProductSlotIdentifier.ts index 9f5292a..69b29ea 100644 --- a/apps/user-ui/hooks/useProductSlotIdentifier.ts +++ b/apps/user-ui/hooks/useProductSlotIdentifier.ts @@ -1,46 +1,28 @@ -import { trpc } from '@/src/trpc-client'; import dayjs from 'dayjs'; +import { useCentralSlotStore } from '@/src/store/centralSlotStore'; export function useProductSlotIdentifier() { - // Fetch all slots with products - const { data: slotsData, isLoading: isProductsLoading } = trpc.user.slots.getSlotsWithProducts.useQuery(); - - - const productSlotsMap = new Map(); - - if (slotsData?.slots) { - const now = dayjs(); - - // Build map of productId to available slot IDs - slotsData.slots.forEach(slot => { - if (dayjs(slot.deliveryTime).isAfter(now)) { - slot.products.forEach(product => { - if (!productSlotsMap.has(product.id)) { - productSlotsMap.set(product.id, []); - } - productSlotsMap.get(product.id)!.push(slot.id); - }); - } - }); - } + // Get slots data from central store + const slots = useCentralSlotStore((state) => state.slots); + const productSlotsMap = useCentralSlotStore((state) => state.productSlotsMap); const getQuickestSlot = (productId: number): number | null => { - - if (!slotsData?.slots) return null; + if (!slots?.length) return null; const now = dayjs(); + const productInfo = productSlotsMap[productId]; + + if (!productInfo?.slots?.length) return null; // Find slots that contain this product and have future delivery time - const availableSlots = slotsData.slots.filter(slot => - slot.products.some(product => product.id === productId) && + const availableSlots = productInfo.slots.filter((slot: any) => dayjs(slot.deliveryTime).isAfter(now) ); - // if(productId === 98) - // console.log(JSON.stringify(slotsData)) + if (availableSlots.length === 0) return null; // Return earliest slot ID (sorted by delivery time) - const earliestSlot = availableSlots.sort((a, b) => + const earliestSlot = availableSlots.sort((a: any, b: any) => dayjs(a.deliveryTime).diff(dayjs(b.deliveryTime)) )[0]; @@ -48,4 +30,4 @@ export function useProductSlotIdentifier() { }; return { getQuickestSlot, productSlotsMap }; -} \ No newline at end of file +} diff --git a/apps/user-ui/metro.config.js b/apps/user-ui/metro.config.js index fbbf1eb..bfdd5c4 100755 --- a/apps/user-ui/metro.config.js +++ b/apps/user-ui/metro.config.js @@ -1,6 +1,20 @@ // Learn more on how to setup config for the app: https://docs.expo.dev/guides/config-plugins/#metro-config const { getDefaultConfig } = require('expo/metro-config'); +const path = require('path'); const config = getDefaultConfig(__dirname); +// Add the packages directory to watch folders +config.watchFolders = [ + ...config.watchFolders || [], + path.resolve(__dirname, '../../packages/shared'), +]; + +// Configure module resolution for @packages/* +config.resolver.extraNodeModules = { + ...config.resolver.extraNodeModules, + '@packages/shared': path.resolve(__dirname, '../../packages/shared'), + 'global-shared': path.resolve(__dirname, '../../packages/shared'), +}; + module.exports = config; diff --git a/apps/user-ui/package.json b/apps/user-ui/package.json index 026136f..6c5da91 100644 --- a/apps/user-ui/package.json +++ b/apps/user-ui/package.json @@ -48,6 +48,7 @@ "expo-updates": "~0.28.17", "expo-web-browser": "~14.2.0", "formik": "^2.4.6", + "fuse.js": "^7.1.0", "jwt-decode": "^4.0.0", "react": "19.0.0", "react-dom": "19.0.0", diff --git a/apps/user-ui/src/api-hooks/auth.api.ts b/apps/user-ui/src/api-hooks/auth.api.ts index 99dc48a..1f3fd26 100644 --- a/apps/user-ui/src/api-hooks/auth.api.ts +++ b/apps/user-ui/src/api-hooks/auth.api.ts @@ -1,19 +1,5 @@ import { useMutation } from "@tanstack/react-query"; import axios from 'common-ui/src/services/axios'; -import { LoginCredentials, RegisterData } from '@/src/types/auth'; - -// API response types -interface RegisterResponse { - token: string; - user: { - id: number; - name: string; - email: string; - mobile: string; - profileImage?: string; - createdAt: string; - }; -} interface UpdateProfileResponse { token: string; @@ -31,15 +17,6 @@ interface UpdateProfileResponse { } // API functions -const registerApi = async (data: FormData): Promise => { - const response = await axios.post('/uv/auth/register', data, { - headers: { - 'Content-Type': 'multipart/form-data', - }, - }); - return response.data.data; // response.data is {success, data}, we want the inner data -}; - const updateProfileApi = async (data: FormData): Promise => { const response = await axios.put('/uv/auth/profile', data, { headers: { @@ -50,11 +27,12 @@ const updateProfileApi = async (data: FormData): Promise }; // React Query hooks -export const useRegister = () => { - return useMutation({ - mutationFn: registerApi, - }); -}; +// NOTE: useRegister has been migrated to tRPC in AuthContext +// export const useRegister = () => { +// return useMutation({ +// mutationFn: registerApi, +// }); +// }; export const useUpdateProfile = () => { return useMutation({ diff --git a/apps/user-ui/src/api-hooks/essential-consts.api.ts b/apps/user-ui/src/api-hooks/essential-consts.api.ts deleted file mode 100644 index 7791682..0000000 --- a/apps/user-ui/src/api-hooks/essential-consts.api.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { trpc } from '@/src/trpc-client'; - -export const useGetEssentialConsts = () => { - const query = trpc.common.essentialConsts.useQuery(undefined, { - refetchInterval: 60000, - }); - return { ...query, refetch: query.refetch }; -}; diff --git a/apps/user-ui/src/components/AddToCartDialog.tsx b/apps/user-ui/src/components/AddToCartDialog.tsx index 66a9ff4..8a6e124 100644 --- a/apps/user-ui/src/components/AddToCartDialog.tsx +++ b/apps/user-ui/src/components/AddToCartDialog.tsx @@ -5,9 +5,9 @@ import { tw, BottomDialog, MyText, MyTouchableOpacity, Quantifier } from 'common import MaterialIcons from '@expo/vector-icons/MaterialIcons'; import { useCartStore } from '@/src/store/cartStore'; import { useFlashCartStore } from '@/src/store/flashCartStore'; -import { trpc } from '@/src/trpc-client'; +import { useCentralSlotStore } from '@/src/store/centralSlotStore'; import { useAddToCart, useGetCart, useUpdateCartItem, useRemoveFromCart } from '@/hooks/cart-query-hooks'; -import { useGetEssentialConsts } from '@/src/api-hooks/essential-consts.api'; +import { useGetEssentialConsts, useSlots } from '@/src/hooks/prominent-api-hooks'; import dayjs from 'dayjs'; import { SafeAreaView } from 'react-native-safe-area-context'; @@ -31,9 +31,10 @@ export default function AddToCartDialog() { const [selectedSlotId, setSelectedSlotId] = useState(null); const [selectedFlashDelivery, setSelectedFlashDelivery] = useState(false); - const { data: slotsData } = trpc.user.slots.getSlotsWithProducts.useQuery(); + const { data: slotsData } = useSlots(); const { data: cartData } = useGetCart(); const { data: constsData } = useGetEssentialConsts(); + const productSlotsMap = useCentralSlotStore((state) => state.productSlotsMap); // const isFlashDeliveryEnabled = constsData?.isFlashDeliveryEnabled === true; const isFlashDeliveryEnabled = true; @@ -113,7 +114,7 @@ export default function AddToCartDialog() { const isUpdate = (cartItem?.quantity || 0) >= 1; // Check if flash delivery option should be shown - const showFlashOption = product?.isFlashAvailable === true && isFlashDeliveryEnabled; + const showFlashOption = productSlotsMap[product?.id]?.isFlashAvailable === true && isFlashDeliveryEnabled; const handleAddToCart = () => { if (selectedFlashDelivery) { diff --git a/apps/user-ui/src/components/CentralStoreInitializer.tsx b/apps/user-ui/src/components/CentralStoreInitializer.tsx new file mode 100644 index 0000000..faa6b53 --- /dev/null +++ b/apps/user-ui/src/components/CentralStoreInitializer.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import { useInitializeCentralSlotStore } from '@/src/store/centralSlotStore'; +import { useInitializeCentralProductStore } from '@/src/store/centralProductStore'; + +interface CentralStoreInitializerProps { + children: React.ReactNode; +} + +export default function CentralStoreInitializer({ children }: CentralStoreInitializerProps) { + useInitializeCentralSlotStore(); + useInitializeCentralProductStore(); + + return <>{children}; +} diff --git a/apps/user-ui/src/contexts/AuthContext.tsx b/apps/user-ui/src/contexts/AuthContext.tsx index 1226ec3..0f0c87b 100644 --- a/apps/user-ui/src/contexts/AuthContext.tsx +++ b/apps/user-ui/src/contexts/AuthContext.tsx @@ -1,7 +1,6 @@ import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react'; import { getAuthToken, saveAuthToken, deleteAuthToken, saveUserId, getUserId } from '../../hooks/useJWT'; import { getCurrentUserId } from '@/utils/getCurrentUserId'; -import { useRegister } from '@/src/api-hooks/auth.api'; import { AuthState, AuthContextType, LoginCredentials, RegisterData, User, UserDetails } from '@/src/types/auth'; import { trpc } from '@/src/trpc-client'; import { StorageServiceCasual } from 'common-ui'; @@ -32,7 +31,7 @@ export const AuthProvider: React.FC = ({ children }) => { // const loginMutation = useLogin(); const loginMutation = trpc.user.auth.login.useMutation(); - const registerMutation = useRegister(); + const registerMutation = trpc.user.auth.register.useMutation(); // Initialize auth state on app startup useEffect(() => { @@ -228,12 +227,12 @@ export const AuthProvider: React.FC = ({ children }) => { }; - const register = async (data: FormData): Promise => { + const register = async (data: { name: string; email: string; mobile: string; password: string; imageKey?: string }): Promise => { try { setAuthState(prev => ({ ...prev, isLoading: true })); const response = await registerMutation.mutateAsync(data); - const { token, user } = response; + const { token, user } = response.data; await saveAuthToken(token); await saveUserId(user.id.toString()); @@ -245,7 +244,7 @@ export const AuthProvider: React.FC = ({ children }) => { email: user.email, mobile: user.mobile, profileImage: user.profileImage, - createdAt: '', + createdAt: user.createdAt, }, userDetails: user, isAuthenticated: true, @@ -305,6 +304,7 @@ export const AuthProvider: React.FC = ({ children }) => { logout, updateUser, updateUserDetails, + refetchUser: async () => { await refetchSelfData(); }, }; return ( diff --git a/apps/user-ui/src/hooks/prominent-api-hooks.ts b/apps/user-ui/src/hooks/prominent-api-hooks.ts new file mode 100644 index 0000000..fed1c32 --- /dev/null +++ b/apps/user-ui/src/hooks/prominent-api-hooks.ts @@ -0,0 +1,126 @@ +import { useQuery } from '@tanstack/react-query' +import axios from 'axios' +import { trpc } from '@/src/trpc-client' +import { AllProductsApiType, StoresApiType, SlotsApiType, EssentialConstsApiType, BannersApiType, StoreWithProductsApiType } from "@backend/trpc/router"; +import { CACHE_FILENAMES } from "@packages/shared"; + +// Local useGetEssentialConsts hook +export const useGetEssentialConsts = () => { + const query = trpc.common.essentialConsts.useQuery(undefined, { + refetchInterval: 60000, + }) + return { ...query, refetch: query.refetch } +} + +type ProductsResponse = AllProductsApiType; +type StoresResponse = StoresApiType; +type SlotsResponse = SlotsApiType; +type EssentialConstsResponse = EssentialConstsApiType; +type BannersResponse = BannersApiType; +type StoreWithProductsResponse = StoreWithProductsApiType; + +function useCacheUrl(filename: string): string | null { + const { data: essentialConsts } = useGetEssentialConsts() + + const assetsDomain = essentialConsts?.assetsDomain + const apiCacheKey = essentialConsts?.apiCacheKey + + return assetsDomain && apiCacheKey + ? `${assetsDomain}${apiCacheKey}/${filename}` + : null +} + +export function useAllProducts() { + const cacheUrl = useCacheUrl(CACHE_FILENAMES.products) + + console.log(cacheUrl) + return useQuery({ + queryKey: ['all-products', cacheUrl], + queryFn: async () => { + if (!cacheUrl) { + throw new Error('Cache URL not available') + } + const response = await axios.get(cacheUrl) + return response.data + }, + staleTime: 60000, // 1 minute + enabled: !!cacheUrl, + }) +} + +export function useStores() { + const cacheUrl = useCacheUrl(CACHE_FILENAMES.stores) + + return useQuery({ + queryKey: ['stores', cacheUrl], + queryFn: async () => { + if (!cacheUrl) { + throw new Error('Cache URL not available') + } + const response = await axios.get(cacheUrl) + return response.data + }, + staleTime: 60000, // 1 minute + enabled: !!cacheUrl, + }) +} + +export function useSlots() { + const cacheUrl = useCacheUrl(CACHE_FILENAMES.slots) + + return useQuery({ + queryKey: ['slots', cacheUrl], + queryFn: async () => { + if (!cacheUrl) { + throw new Error('Cache URL not available') + } + const response = await axios.get(cacheUrl) + return response.data + }, + staleTime: 60000, // 1 minute + enabled: !!cacheUrl, + }) +} + +export function useBanners() { + const cacheUrl = useCacheUrl(CACHE_FILENAMES.banners) + + return useQuery({ + queryKey: ['banners', cacheUrl], + queryFn: async () => { + + if (!cacheUrl) { + throw new Error('Cache URL not available') + } + const response = await axios.get(cacheUrl) + return response.data + + }, + staleTime: 60000, // 1 minute + enabled: !!cacheUrl, + }) +} + +export function useStoreWithProducts(storeId: number) { + const { data: essentialConsts } = useGetEssentialConsts() + + const assetsDomain = essentialConsts?.assetsDomain + const apiCacheKey = essentialConsts?.apiCacheKey + + const cacheUrl = assetsDomain && apiCacheKey + ? `${assetsDomain}${apiCacheKey}/stores/${storeId}.json` + : null + + return useQuery({ + queryKey: ['store-with-products', storeId, cacheUrl], + queryFn: async () => { + if (!cacheUrl) { + throw new Error('Cache URL not available') + } + const response = await axios.get(cacheUrl) + return response.data + }, + staleTime: 60000, // 1 minute + enabled: !!cacheUrl, + }) +} diff --git a/apps/user-ui/src/hooks/useUploadToObjectStorage.ts b/apps/user-ui/src/hooks/useUploadToObjectStorage.ts new file mode 100644 index 0000000..5cef774 --- /dev/null +++ b/apps/user-ui/src/hooks/useUploadToObjectStorage.ts @@ -0,0 +1,119 @@ +import { useState } from 'react'; +import { trpc } from '../trpc-client'; +// import { trpc } from '../src/trpc-client'; + +type ContextString = 'review' | 'product_info' | 'notification' | 'store' | 'profile' | 'complaint'; + +interface UploadInput { + blob: Blob; + mimeType: string; +} + +interface UploadBatchInput { + images: UploadInput[]; + contextString: ContextString; +} + +interface UploadResult { + keys: string[]; + presignedUrls: string[]; +} + +export function useUploadToObjectStorage() { + const [isUploading, setIsUploading] = useState(false); + const [error, setError] = useState(null); + const [progress, setProgress] = useState<{ completed: number; total: number } | null>(null); + + const generateUploadUrls = trpc.common.generateUploadUrls.useMutation(); + + const upload = async (input: UploadBatchInput): Promise => { + setIsUploading(true); + setError(null); + setProgress({ completed: 0, total: input.images.length }); + + try { + const { images, contextString } = input; + + if (images.length === 0) { + return { keys: [], presignedUrls: [] }; + } + + // 1. Get presigned URLs from backend (one call for all images) + const mimeTypes = images.map(img => img.mimeType); + const { uploadUrls } = await generateUploadUrls.mutateAsync({ + contextString, + mimeTypes, + }); + + if (uploadUrls.length !== images.length) { + throw new Error(`Expected ${images.length} URLs, got ${uploadUrls.length}`); + } + + // 2. Upload all images in parallel + const uploadPromises = images.map(async (image, index) => { + const presignedUrl = uploadUrls[index]; + const { blob, mimeType } = image; + + const response = await fetch(presignedUrl, { + method: 'PUT', + body: blob, + headers: { 'Content-Type': mimeType }, + }); + + if (!response.ok) { + throw new Error(`Upload ${index + 1} failed with status ${response.status}`); + } + + // Update progress + setProgress(prev => prev ? { ...prev, completed: prev.completed + 1 } : null); + + return { + key: extractKeyFromPresignedUrl(presignedUrl), + presignedUrl, + }; + }); + + // Use Promise.all - if any fails, entire batch fails + const results = await Promise.all(uploadPromises); + + return { + keys: results.map(r => r.key), + presignedUrls: results.map(r => r.presignedUrl), + }; + } catch (err) { + const uploadError = err instanceof Error ? err : new Error('Upload failed'); + setError(uploadError); + throw uploadError; + } finally { + setIsUploading(false); + setProgress(null); + } + }; + + const uploadSingle = async (blob: Blob, mimeType: string, contextString: ContextString): Promise<{ key: string; presignedUrl: string }> => { + const result = await upload({ + images: [{ blob, mimeType }], + contextString, + }); + return { + key: result.keys[0], + presignedUrl: result.presignedUrls[0], + }; + }; + + return { + upload, + uploadSingle, + isUploading, + error, + progress, + isPending: generateUploadUrls.isPending + }; +} + +function extractKeyFromPresignedUrl(url: string): string { + const u = new URL(url); + let rawKey = u.pathname.replace(/^\/+/, ''); + rawKey = rawKey.split('/').slice(1).join('/'); // make meatfarmer/product-images/asdf as product-images/asdf + return decodeURIComponent(rawKey); +} diff --git a/apps/user-ui/src/store/centralProductStore.ts b/apps/user-ui/src/store/centralProductStore.ts new file mode 100644 index 0000000..a1b1b59 --- /dev/null +++ b/apps/user-ui/src/store/centralProductStore.ts @@ -0,0 +1,50 @@ +import { create } from 'zustand' +import { useEffect } from 'react' +import { useAllProducts } from '@/src/hooks/prominent-api-hooks' +import { AllProductsApiType } from '@backend/trpc/router' + +type Product = AllProductsApiType['products'][number] + +interface CentralProductState { + products: Product[] + productsById: Record + refetchProducts: (() => Promise) | null + setProducts: (products: Product[]) => void + clearProducts: () => void + setRefetchProducts: (refetch: () => Promise) => void +} + +export const useCentralProductStore = create((set) => ({ + products: [], + productsById: {}, + refetchProducts: null, + setProducts: (products) => { + const productsById: Record = {} + + products.forEach((product) => { + productsById[product.id] = product + }) + + set({ products, productsById }) + }, + clearProducts: () => set({ products: [], productsById: {} }), + setRefetchProducts: (refetchProducts) => set({ refetchProducts }), +})) + +export function useInitializeCentralProductStore() { + const { data: productsData, refetch } = useAllProducts() + const setProducts = useCentralProductStore((state) => state.setProducts) + const setRefetchProducts = useCentralProductStore((state) => state.setRefetchProducts) + + useEffect(() => { + if (productsData?.products) { + setProducts(productsData.products) + } + }, [productsData, setProducts]) + + useEffect(() => { + setRefetchProducts(async () => { + await refetch() + }) + }, [refetch, setRefetchProducts]) +} diff --git a/apps/user-ui/src/store/centralSlotStore.ts b/apps/user-ui/src/store/centralSlotStore.ts new file mode 100644 index 0000000..483c680 --- /dev/null +++ b/apps/user-ui/src/store/centralSlotStore.ts @@ -0,0 +1,71 @@ +import { create } from 'zustand'; +import { useSlots } from '@/src/hooks/prominent-api-hooks'; +import { useEffect } from 'react'; +import { SlotsApiType } from "@backend/trpc/router"; + +type Slot = SlotsApiType['slots'][number]; +type ProductAvailability = SlotsApiType['productAvailability'][number]; + +interface ProductSlotInfo { + slots: Slot[]; + isOutOfStock: boolean; + isFlashAvailable: boolean; +} + +interface CentralSlotState { + slots: Slot[]; + productSlotsMap: Record; + refetchSlots: (() => Promise) | null; + setSlotsData: (slots: Slot[], productAvailability: ProductAvailability[]) => void; + clearSlotsData: () => void; + setRefetchSlots: (refetch: () => Promise) => void; +} + +export const useCentralSlotStore = create((set) => ({ + slots: [], + productSlotsMap: {}, + refetchSlots: null, + setSlotsData: (slots, productAvailability) => { + const productSlotsMap: Record = {}; + + // First, create entries for ALL products from productAvailability + productAvailability.forEach((product) => { + productSlotsMap[product.id] = { + slots: [], + isOutOfStock: product.isOutOfStock, + isFlashAvailable: product.isFlashAvailable, + }; + }); + + // Then, populate slots for products that appear in delivery slots + slots.forEach((slot) => { + slot.products?.forEach((product) => { + if (productSlotsMap[product.id]) { + productSlotsMap[product.id].slots.push(slot); + } + }); + }); + + set({ slots, productSlotsMap }); + }, + clearSlotsData: () => set({ slots: [], productSlotsMap: {} }), + setRefetchSlots: (refetchSlots) => set({ refetchSlots }), +})); + +export function useInitializeCentralSlotStore() { + const { data: slotsData, refetch } = useSlots(); + const setSlotsData = useCentralSlotStore((state) => state.setSlotsData); + const setRefetchSlots = useCentralSlotStore((state) => state.setRefetchSlots); + + useEffect(() => { + if (slotsData?.slots) { + setSlotsData(slotsData.slots, slotsData.productAvailability || []); + } + }, [slotsData, setSlotsData]); + + useEffect(() => { + setRefetchSlots(async () => { + await refetch(); + }); + }, [refetch, setRefetchSlots]); +} diff --git a/apps/user-ui/src/types/auth.ts b/apps/user-ui/src/types/auth.ts index 892a062..1df9e6c 100644 --- a/apps/user-ui/src/types/auth.ts +++ b/apps/user-ui/src/types/auth.ts @@ -37,14 +37,15 @@ export interface RegisterData { email: string; mobile: string; password: string; - profileImage?: string; + imageKey?: string; } export interface AuthContextType extends AuthState { login: (credentials: LoginCredentials) => Promise; loginWithToken: (token: string, user: User) => Promise; - register: (data: FormData) => Promise; + register: (data: RegisterData) => Promise; logout: () => Promise; updateUser: (user: Partial) => void; updateUserDetails: (userDetails: Partial) => void; + refetchUser: () => Promise; } \ No newline at end of file diff --git a/apps/user-ui/tsconfig.json b/apps/user-ui/tsconfig.json index d753e48..6442a8a 100755 --- a/apps/user-ui/tsconfig.json +++ b/apps/user-ui/tsconfig.json @@ -18,6 +18,18 @@ ], "common-ui/*": [ "../../packages/ui/*" + ], + "@packages/shared": [ + "../../packages/shared" + ], + "@packages/shared/*": [ + "../../packages/shared/*" + ], + "global-shared": [ + "../../packages/shared" + ], + "global-shared/*": [ + "../../packages/shared/*" ] }, "moduleSuffixes": [ @@ -34,5 +46,6 @@ "**/*.tsx", ".expo/types/**/*.ts", "expo-env.d.ts", + "../../packages/shared" ] } \ No newline at end of file diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..578541a --- /dev/null +++ b/bun.lock @@ -0,0 +1,3869 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "meat-farmer-monorepo", + "dependencies": { + "@react-native/virtualized-lists": "^0.79.6", + "@react-three/drei": "^10.7.7", + "@react-three/fiber": "^9.5.0", + "@types/three": "^0.182.0", + "admin-ui": "^1.0.0", + "backend": "^1.0.0", + "canvas-confetti": "^1.9.4", + "drizzle-orm": "^0.45.1", + "expo": "~53.0.22", + "expo-auth-session": "~6.2.1", + "expo-crypto": "~14.1.5", + "expo-server-sdk": "^5.0.0", + "expo-web-browser": "~14.2.0", + "fuse.js": "^7.1.0", + "node-cron": "^4.2.1", + "pg": "^8.20.0", + "react": "19.0.0", + "react-native": "0.79.6", + "three": "^0.182.0", + "user-ui": "^1.0.0", + "zustand": "^5.0.9", + }, + "devDependencies": { + "@babel/core": "^7.25.2", + "@types/canvas-confetti": "^1.9.0", + "@types/react": "~19.0.10", + "@types/react-native-razorpay": "^2.2.6", + "eslint": "^9.25.0", + "eslint-config-expo": "~9.2.0", + "turbo": "^2.0.0", + "typescript": "~5.8.3", + }, + }, + "apps/admin-ui": { + "name": "admin-ui", + "version": "1.0.0", + "dependencies": { + "@expo/vector-icons": "^14.1.0", + "@react-native-community/datetimepicker": "8.4.1", + "@react-native-picker/picker": "2.11.1", + "@react-navigation/bottom-tabs": "^7.3.10", + "@react-navigation/drawer": "^7.3.9", + "@react-navigation/elements": "^2.3.8", + "@react-navigation/material-top-tabs": "^7.4.11", + "@react-navigation/native": "^7.1.6", + "@tanstack/react-query": "^5.85.9", + "@trpc/client": "^11.6.0", + "@trpc/react-query": "^11.6.0", + "axios": "^1.11.0", + "buffer": "^6.0.3", + "date-fns": "^4.1.0", + "dayjs": "^1.11.18", + "expo": "~53.0.22", + "expo-blur": "~14.1.5", + "expo-constants": "~17.1.7", + "expo-device": "~7.1.4", + "expo-document-picker": "~13.1.6", + "expo-font": "~13.3.2", + "expo-haptics": "~14.1.4", + "expo-image": "~2.4.0", + "expo-image-picker": "~16.1.4", + "expo-linear-gradient": "~14.1.5", + "expo-linking": "~7.1.7", + "expo-location": "^19.0.8", + "expo-notifications": "~0.31.4", + "expo-router": "~5.1.5", + "expo-secure-store": "~14.2.4", + "expo-splash-screen": "~0.30.10", + "expo-status-bar": "~2.2.3", + "expo-symbols": "~0.4.5", + "expo-system-ui": "~5.0.11", + "expo-updates": "~0.28.17", + "expo-web-browser": "~14.2.0", + "formik": "^2.4.6", + "jwt-decode": "^4.0.0", + "react": "19.0.0", + "react-dom": "19.0.0", + "react-hook-form": "^7.62.0", + "react-native": "0.79.6", + "react-native-draggable-flatlist": "^4.0.3", + "react-native-element-dropdown": "^2.12.4", + "react-native-gesture-handler": "~2.24.0", + "react-native-pager-view": "6.7.1", + "react-native-paper": "^5.14.5", + "react-native-reanimated": "~3.17.4", + "react-native-safe-area-context": "5.4.0", + "react-native-screens": "~4.11.1", + "react-native-tab-view": "^4.1.3", + "react-native-toast-message": "^2.3.3", + "react-native-web": "~0.20.0", + "react-native-webview": "13.13.5", + "twrnc": "^4.9.1", + "yup": "^1.7.0", + }, + "devDependencies": { + "@babel/core": "^7.25.2", + "@types/react": "~19.0.10", + "@types/react-native-razorpay": "^2.2.6", + "eslint": "^9.25.0", + "eslint-config-expo": "~9.2.0", + "typescript": "~5.8.3", + }, + }, + "apps/backend": { + "name": "backend", + "version": "1.0.0", + "dependencies": { + "@aws-sdk/client-s3": "^3.888.0", + "@aws-sdk/s3-request-presigner": "^3.888.0", + "@trpc/server": "^11.6.0", + "@turf/turf": "^7.2.0", + "@types/bcryptjs": "^2.4.6", + "@types/cors": "^2.8.19", + "axios": "^1.11.0", + "bcryptjs": "^3.0.2", + "bullmq": "^5.63.0", + "cors": "^2.8.5", + "dayjs": "^1.11.18", + "dotenv": "^17.2.1", + "drizzle-orm": "^0.44.5", + "expo-server-sdk": "^4.0.0", + "fuse.js": "^7.1.0", + "hono": "^4.6.3", + "jose": "^5.10.0", + "node-cron": "^4.2.1", + "pg": "^8.16.3", + "razorpay": "^2.9.6", + "redis": "^5.9.0", + "zod": "^4.1.12", + }, + "devDependencies": { + "@types/bun": "^1.1.10", + "@types/node": "^24.5.2", + "@types/pg": "^8.15.5", + "drizzle-kit": "^0.31.4", + "rimraf": "^6.1.2", + "ts-node-dev": "^2.0.0", + "tsc-alias": "^1.8.16", + "tsx": "^4.20.5", + "typescript": "^5.9.2", + }, + }, + "apps/fallback-ui": { + "name": "fallback-ui", + "version": "0.1.0", + "dependencies": { + "@radix-ui/react-slot": "^1.1.2", + "@tanstack/react-query": "^5.59.16", + "@tanstack/react-router": "^1.92.8", + "@tanstack/router-devtools": "^1.92.8", + "@trpc/client": "^11.6.0", + "@trpc/react-query": "^11.6.0", + "axios": "^1.7.9", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "dayjs": "^1.11.19", + "formik": "^2.4.9", + "jwt-decode": "^4.0.0", + "maplibre-gl": "^4.7.0", + "react": "19.0.0", + "react-dom": "19.0.0", + "superjson": "^2.2.1", + "tailwind-merge": "^2.5.5", + "yup": "^1.7.1", + "zod": "^3.24.1", + "zustand": "^5.0.10", + }, + "devDependencies": { + "@types/node": "^20.17.10", + "@types/react": "~19.0.10", + "@types/react-dom": "~19.0.4", + "@typescript-eslint/eslint-plugin": "^8.18.1", + "@typescript-eslint/parser": "^8.18.1", + "@vitejs/plugin-react-swc": "^3.7.2", + "autoprefixer": "^10.4.20", + "eslint": "^9.25.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.9", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.16", + "tailwindcss-animate": "^1.0.7", + "typescript": "~5.8.3", + "vite": "^6.0.5", + }, + }, + "apps/info-site": { + "name": "symbuyote-info-site", + "version": "1.0.0", + "dependencies": { + "express": "^4.18.2", + "pug": "^3.0.2", + }, + }, + "apps/user-ui": { + "name": "user-ui", + "version": "1.0.0", + "dependencies": { + "@expo/vector-icons": "^14.1.0", + "@react-native-community/datetimepicker": "8.4.1", + "@react-native-google-signin/google-signin": "^16.0.0", + "@react-native-picker/picker": "2.11.1", + "@react-navigation/bottom-tabs": "^7.3.10", + "@react-navigation/drawer": "^7.3.9", + "@react-navigation/elements": "^2.3.8", + "@react-navigation/native": "^7.1.6", + "@tanstack/react-query": "^5.85.9", + "@trpc/client": "^11.6.0", + "@trpc/react-query": "^11.6.0", + "axios": "^1.11.0", + "buffer": "^6.0.3", + "dayjs": "^1.11.18", + "expo": "~53.0.22", + "expo-blur": "~14.1.5", + "expo-constants": "~17.1.7", + "expo-crypto": "~14.1.5", + "expo-device": "~7.1.4", + "expo-document-picker": "~13.1.6", + "expo-font": "~13.3.2", + "expo-haptics": "~14.1.4", + "expo-image": "2.4.1", + "expo-image-picker": "~16.1.4", + "expo-linear-gradient": "~14.1.5", + "expo-linking": "~7.1.7", + "expo-location": "~18.1.6", + "expo-notifications": "~0.31.4", + "expo-router": "~5.1.5", + "expo-secure-store": "~14.2.4", + "expo-splash-screen": "~0.30.10", + "expo-status-bar": "~2.2.3", + "expo-symbols": "~0.4.5", + "expo-system-ui": "~5.0.11", + "expo-updates": "~0.28.17", + "expo-web-browser": "~14.2.0", + "formik": "^2.4.6", + "fuse.js": "^7.1.0", + "jwt-decode": "^4.0.0", + "react": "19.0.0", + "react-dom": "19.0.0", + "react-hook-form": "^7.62.0", + "react-native": "0.79.6", + "react-native-element-dropdown": "^2.12.4", + "react-native-gesture-handler": "~2.24.0", + "react-native-pager-view": "6.7.1", + "react-native-paper": "^5.14.5", + "react-native-razorpay": "^2.3.1", + "react-native-reanimated": "~3.17.4", + "react-native-safe-area-context": "5.4.0", + "react-native-screens": "~4.11.1", + "react-native-svg": "15.11.2", + "react-native-tab-view": "^4.1.3", + "react-native-toast-message": "^2.3.3", + "react-native-web": "~0.20.0", + "react-native-webview": "13.13.5", + "twrnc": "^4.9.1", + "yup": "^1.7.0", + }, + "devDependencies": { + "@babel/core": "^7.25.2", + "@types/react": "~19.0.10", + "@types/react-native-razorpay": "^2.2.6", + "eslint": "^9.25.0", + "eslint-config-expo": "~9.2.0", + "typescript": "~5.8.3", + }, + }, + "packages/shared": { + "name": "@packages/shared", + "version": "1.0.0", + }, + "packages/ui": { + "name": "common-ui", + "version": "1.0.0", + "dependencies": { + "@expo/vector-icons": "^14.1.0", + "@react-native-community/datetimepicker": "8.4.1", + "@react-native-google-signin/google-signin": "^16.0.0", + "@react-native-picker/picker": "2.11.1", + "@react-navigation/bottom-tabs": "^7.3.10", + "@react-navigation/drawer": "^7.5.8", + "@react-navigation/elements": "^2.3.8", + "@react-navigation/native": "^7.1.6", + "@tanstack/react-query": "^5.85.9", + "axios": "^1.11.0", + "buffer": "^6.0.3", + "dayjs": "^1.11.18", + "expo": "~53.0.22", + "expo-blur": "~14.1.5", + "expo-constants": "~17.1.7", + "expo-dev-client": "~5.2.4", + "expo-device": "~7.1.4", + "expo-document-picker": "~13.1.6", + "expo-font": "~13.3.2", + "expo-haptics": "~14.1.4", + "expo-image": "~2.4.0", + "expo-image-picker": "~16.1.4", + "expo-linear-gradient": "~14.1.5", + "expo-linking": "~7.1.7", + "expo-notifications": "~0.31.4", + "expo-router": "~5.1.5", + "expo-secure-store": "~14.2.4", + "expo-splash-screen": "~0.30.10", + "expo-status-bar": "~2.2.3", + "expo-symbols": "~0.4.5", + "expo-system-ui": "~5.0.11", + "expo-web-browser": "~14.2.0", + "formik": "^2.4.6", + "jwt-decode": "^4.0.0", + "react": "19.0.0", + "react-dom": "19.0.0", + "react-hook-form": "^7.62.0", + "react-native": "0.79.6", + "react-native-element-dropdown": "^2.12.4", + "react-native-gesture-handler": "~2.24.0", + "react-native-keyboard-aware-scroll-view": "^0.9.5", + "react-native-pager-view": "^6.9.1", + "react-native-paper": "^5.14.5", + "react-native-phonepe-pg": "^3.1.1", + "react-native-razorpay": "^2.3.0", + "react-native-reanimated": "~3.17.4", + "react-native-safe-area-context": "5.4.0", + "react-native-screens": "~4.11.1", + "react-native-tab-view": "^4.1.3", + "react-native-toast-message": "^2.3.3", + "react-native-web": "~0.20.0", + "react-native-webview": "13.13.5", + "twrnc": "^4.9.1", + "yup": "^1.7.0", + "zustand": "^5.0.10", + }, + }, + }, + "packages": { + "@0no-co/graphql.web": ["@0no-co/graphql.web@1.2.0", "", { "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" }, "optionalPeers": ["graphql"] }, "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw=="], + + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + + "@aws-crypto/crc32": ["@aws-crypto/crc32@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="], + + "@aws-crypto/crc32c": ["@aws-crypto/crc32c@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag=="], + + "@aws-crypto/sha1-browser": ["@aws-crypto/sha1-browser@5.2.0", "", { "dependencies": { "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg=="], + + "@aws-crypto/sha256-browser": ["@aws-crypto/sha256-browser@5.2.0", "", { "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw=="], + + "@aws-crypto/sha256-js": ["@aws-crypto/sha256-js@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA=="], + + "@aws-crypto/supports-web-crypto": ["@aws-crypto/supports-web-crypto@5.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg=="], + + "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], + + "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.1009.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.973.20", "@aws-sdk/credential-provider-node": "^3.972.21", "@aws-sdk/middleware-bucket-endpoint": "^3.972.8", "@aws-sdk/middleware-expect-continue": "^3.972.8", "@aws-sdk/middleware-flexible-checksums": "^3.973.6", "@aws-sdk/middleware-host-header": "^3.972.8", "@aws-sdk/middleware-location-constraint": "^3.972.8", "@aws-sdk/middleware-logger": "^3.972.8", "@aws-sdk/middleware-recursion-detection": "^3.972.8", "@aws-sdk/middleware-sdk-s3": "^3.972.20", "@aws-sdk/middleware-ssec": "^3.972.8", "@aws-sdk/middleware-user-agent": "^3.972.21", "@aws-sdk/region-config-resolver": "^3.972.8", "@aws-sdk/signature-v4-multi-region": "^3.996.8", "@aws-sdk/types": "^3.973.6", "@aws-sdk/util-endpoints": "^3.996.5", "@aws-sdk/util-user-agent-browser": "^3.972.8", "@aws-sdk/util-user-agent-node": "^3.973.7", "@smithy/config-resolver": "^4.4.11", "@smithy/core": "^3.23.11", "@smithy/eventstream-serde-browser": "^4.2.12", "@smithy/eventstream-serde-config-resolver": "^4.3.12", "@smithy/eventstream-serde-node": "^4.2.12", "@smithy/fetch-http-handler": "^5.3.15", "@smithy/hash-blob-browser": "^4.2.13", "@smithy/hash-node": "^4.2.12", "@smithy/hash-stream-node": "^4.2.12", "@smithy/invalid-dependency": "^4.2.12", "@smithy/md5-js": "^4.2.12", "@smithy/middleware-content-length": "^4.2.12", "@smithy/middleware-endpoint": "^4.4.25", "@smithy/middleware-retry": "^4.4.42", "@smithy/middleware-serde": "^4.2.14", "@smithy/middleware-stack": "^4.2.12", "@smithy/node-config-provider": "^4.3.12", "@smithy/node-http-handler": "^4.4.16", "@smithy/protocol-http": "^5.3.12", "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", "@smithy/util-defaults-mode-browser": "^4.3.41", "@smithy/util-defaults-mode-node": "^4.2.44", "@smithy/util-endpoints": "^3.3.3", "@smithy/util-middleware": "^4.2.12", "@smithy/util-retry": "^4.2.12", "@smithy/util-stream": "^4.5.19", "@smithy/util-utf8": "^4.2.2", "@smithy/util-waiter": "^4.2.13", "tslib": "^2.6.2" } }, "sha512-luy8CxallkoiGWTqU86ca/BbvkWJjs0oala7uIIRN1JtQxMb5i4Yl/PBZVcQFhbK9kQi0PK0GfD8gIpLkI91fw=="], + + "@aws-sdk/core": ["@aws-sdk/core@3.973.20", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@aws-sdk/xml-builder": "^3.972.11", "@smithy/core": "^3.23.11", "@smithy/node-config-provider": "^4.3.12", "@smithy/property-provider": "^4.2.12", "@smithy/protocol-http": "^5.3.12", "@smithy/signature-v4": "^5.3.12", "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", "@smithy/util-base64": "^4.3.2", "@smithy/util-middleware": "^4.2.12", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-i3GuX+lowD892F3IuJf8o6AbyDupMTdyTxQrCJGcn71ni5hTZ82L4nQhcdumxZ7XPJRJJVHS/CR3uYOIIs0PVA=="], + + "@aws-sdk/crc64-nvme": ["@aws-sdk/crc64-nvme@3.972.5", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-2VbTstbjKdT+yKi8m7b3a9CiVac+pL/IY2PHJwsaGkkHmuuqkJZIErPck1h6P3T9ghQMLSdMPyW6Qp7Di5swFg=="], + + "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.18", "", { "dependencies": { "@aws-sdk/core": "^3.973.20", "@aws-sdk/types": "^3.973.6", "@smithy/property-provider": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-X0B8AlQY507i5DwjLByeU2Af4ARsl9Vr84koDcXCbAkplmU+1xBFWxEPrWRAoh56waBne/yJqEloSwvRf4x6XA=="], + + "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.20", "", { "dependencies": { "@aws-sdk/core": "^3.973.20", "@aws-sdk/types": "^3.973.6", "@smithy/fetch-http-handler": "^5.3.15", "@smithy/node-http-handler": "^4.4.16", "@smithy/property-provider": "^4.2.12", "@smithy/protocol-http": "^5.3.12", "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", "@smithy/util-stream": "^4.5.19", "tslib": "^2.6.2" } }, "sha512-ey9Lelj001+oOfrbKmS6R2CJAiXX7QKY4Vj9VJv6L2eE6/VjD8DocHIoYqztTm70xDLR4E1jYPTKfIui+eRNDA=="], + + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.972.20", "", { "dependencies": { "@aws-sdk/core": "^3.973.20", "@aws-sdk/credential-provider-env": "^3.972.18", "@aws-sdk/credential-provider-http": "^3.972.20", "@aws-sdk/credential-provider-login": "^3.972.20", "@aws-sdk/credential-provider-process": "^3.972.18", "@aws-sdk/credential-provider-sso": "^3.972.20", "@aws-sdk/credential-provider-web-identity": "^3.972.20", "@aws-sdk/nested-clients": "^3.996.10", "@aws-sdk/types": "^3.973.6", "@smithy/credential-provider-imds": "^4.2.12", "@smithy/property-provider": "^4.2.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-5flXSnKHMloObNF+9N0cupKegnH1Z37cdVlpETVgx8/rAhCe+VNlkcZH3HDg2SDn9bI765S+rhNPXGDJJPfbtA=="], + + "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.20", "", { "dependencies": { "@aws-sdk/core": "^3.973.20", "@aws-sdk/nested-clients": "^3.996.10", "@aws-sdk/types": "^3.973.6", "@smithy/property-provider": "^4.2.12", "@smithy/protocol-http": "^5.3.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-gEWo54nfqp2jABMu6HNsjVC4hDLpg9HC8IKSJnp0kqWtxIJYHTmiLSsIfI4ScQjxEwpB+jOOH8dOLax1+hy/Hw=="], + + "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.21", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.18", "@aws-sdk/credential-provider-http": "^3.972.20", "@aws-sdk/credential-provider-ini": "^3.972.20", "@aws-sdk/credential-provider-process": "^3.972.18", "@aws-sdk/credential-provider-sso": "^3.972.20", "@aws-sdk/credential-provider-web-identity": "^3.972.20", "@aws-sdk/types": "^3.973.6", "@smithy/credential-provider-imds": "^4.2.12", "@smithy/property-provider": "^4.2.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-hah8if3/B/Q+LBYN5FukyQ1Mym6PLPDsBOBsIgNEYD6wLyZg0UmUF/OKIVC3nX9XH8TfTPuITK+7N/jenVACWA=="], + + "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.18", "", { "dependencies": { "@aws-sdk/core": "^3.973.20", "@aws-sdk/types": "^3.973.6", "@smithy/property-provider": "^4.2.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-Tpl7SRaPoOLT32jbTWchPsn52hYYgJ0kpiFgnwk8pxTANQdUymVSZkzFvv1+oOgZm1CrbQUP9MBeoMZ9IzLZjA=="], + + "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.972.20", "", { "dependencies": { "@aws-sdk/core": "^3.973.20", "@aws-sdk/nested-clients": "^3.996.10", "@aws-sdk/token-providers": "3.1009.0", "@aws-sdk/types": "^3.973.6", "@smithy/property-provider": "^4.2.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-p+R+PYR5Z7Gjqf/6pvbCnzEHcqPCpLzR7Yf127HjJ6EAb4hUcD+qsNRnuww1sB/RmSeCLxyay8FMyqREw4p1RA=="], + + "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.20", "", { "dependencies": { "@aws-sdk/core": "^3.973.20", "@aws-sdk/nested-clients": "^3.996.10", "@aws-sdk/types": "^3.973.6", "@smithy/property-provider": "^4.2.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-rWCmh8o7QY4CsUj63qopzMzkDq/yPpkrpb+CnjBEFSOg/02T/we7sSTVg4QsDiVS9uwZ8VyONhq98qt+pIh3KA=="], + + "@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@aws-sdk/util-arn-parser": "^3.972.3", "@smithy/node-config-provider": "^4.3.12", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw=="], + + "@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ=="], + + "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.973.6", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "^3.973.20", "@aws-sdk/crc64-nvme": "^3.972.5", "@aws-sdk/types": "^3.973.6", "@smithy/is-array-buffer": "^4.2.2", "@smithy/node-config-provider": "^4.3.12", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "@smithy/util-middleware": "^4.2.12", "@smithy/util-stream": "^4.5.19", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-0nYEgkJH7Yt9k+nZJyllTghnkKaz17TWFcr5Mi0XMVMzYlF4ytDZADQpF2/iJo36cKL5AYSzRsvlykE4M/ErTA=="], + + "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ=="], + + "@aws-sdk/middleware-location-constraint": ["@aws-sdk/middleware-location-constraint@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw=="], + + "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA=="], + + "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA=="], + + "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.972.20", "", { "dependencies": { "@aws-sdk/core": "^3.973.20", "@aws-sdk/types": "^3.973.6", "@aws-sdk/util-arn-parser": "^3.972.3", "@smithy/core": "^3.23.11", "@smithy/node-config-provider": "^4.3.12", "@smithy/protocol-http": "^5.3.12", "@smithy/signature-v4": "^5.3.12", "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", "@smithy/util-config-provider": "^4.2.2", "@smithy/util-middleware": "^4.2.12", "@smithy/util-stream": "^4.5.19", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-yhva/xL5H4tWQgsBjwV+RRD0ByCzg0TcByDCLp3GXdn/wlyRNfy8zsswDtCvr1WSKQkSQYlyEzPuWkJG0f5HvQ=="], + + "@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw=="], + + "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.972.21", "", { "dependencies": { "@aws-sdk/core": "^3.973.20", "@aws-sdk/types": "^3.973.6", "@aws-sdk/util-endpoints": "^3.996.5", "@smithy/core": "^3.23.11", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "@smithy/util-retry": "^4.2.12", "tslib": "^2.6.2" } }, "sha512-62XRl1GDYPpkt7cx1AX1SPy9wgNE9Iw/NPuurJu4lmhCWS7sGKO+kS53TQ8eRmIxy3skmvNInnk0ZbWrU5Dpyg=="], + + "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.996.10", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.973.20", "@aws-sdk/middleware-host-header": "^3.972.8", "@aws-sdk/middleware-logger": "^3.972.8", "@aws-sdk/middleware-recursion-detection": "^3.972.8", "@aws-sdk/middleware-user-agent": "^3.972.21", "@aws-sdk/region-config-resolver": "^3.972.8", "@aws-sdk/types": "^3.973.6", "@aws-sdk/util-endpoints": "^3.996.5", "@aws-sdk/util-user-agent-browser": "^3.972.8", "@aws-sdk/util-user-agent-node": "^3.973.7", "@smithy/config-resolver": "^4.4.11", "@smithy/core": "^3.23.11", "@smithy/fetch-http-handler": "^5.3.15", "@smithy/hash-node": "^4.2.12", "@smithy/invalid-dependency": "^4.2.12", "@smithy/middleware-content-length": "^4.2.12", "@smithy/middleware-endpoint": "^4.4.25", "@smithy/middleware-retry": "^4.4.42", "@smithy/middleware-serde": "^4.2.14", "@smithy/middleware-stack": "^4.2.12", "@smithy/node-config-provider": "^4.3.12", "@smithy/node-http-handler": "^4.4.16", "@smithy/protocol-http": "^5.3.12", "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", "@smithy/util-defaults-mode-browser": "^4.3.41", "@smithy/util-defaults-mode-node": "^4.2.44", "@smithy/util-endpoints": "^3.3.3", "@smithy/util-middleware": "^4.2.12", "@smithy/util-retry": "^4.2.12", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-SlDol5Z+C7Ivnc2rKGqiqfSUmUZzY1qHfVs9myt/nxVwswgfpjdKahyTzLTx802Zfq0NFRs7AejwKzzzl5Co2w=="], + + "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/config-resolver": "^4.4.11", "@smithy/node-config-provider": "^4.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw=="], + + "@aws-sdk/s3-request-presigner": ["@aws-sdk/s3-request-presigner@3.1009.0", "", { "dependencies": { "@aws-sdk/signature-v4-multi-region": "^3.996.8", "@aws-sdk/types": "^3.973.6", "@aws-sdk/util-format-url": "^3.972.8", "@smithy/middleware-endpoint": "^4.4.25", "@smithy/protocol-http": "^5.3.12", "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-iLHNt/R35ZWnmP/oxYbcA6NAsOXHn2kUHAii48aPR9A/0+eMXajBaeIQ37CsQPZPTzqGhy0pqBG8CnpcRXP6rg=="], + + "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.8", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "^3.972.20", "@aws-sdk/types": "^3.973.6", "@smithy/protocol-http": "^5.3.12", "@smithy/signature-v4": "^5.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-n1qYFD+tbqZuyskVaxUE+t10AUz9g3qzDw3Tp6QZDKmqsjfDmZBd4GIk2EKJJNtcCBtE5YiUjDYA+3djFAFBBg=="], + + "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1009.0", "", { "dependencies": { "@aws-sdk/core": "^3.973.20", "@aws-sdk/nested-clients": "^3.996.10", "@aws-sdk/types": "^3.973.6", "@smithy/property-provider": "^4.2.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-KCPLuTqN9u0Rr38Arln78fRG9KXpzsPWmof+PZzfAHMMQq2QED6YjQrkrfiH7PDefLWEposY1o4/eGwrmKA4JA=="], + + "@aws-sdk/types": ["@aws-sdk/types@3.973.6", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw=="], + + "@aws-sdk/util-arn-parser": ["@aws-sdk/util-arn-parser@3.972.3", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA=="], + + "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.996.5", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "@smithy/util-endpoints": "^3.3.3", "tslib": "^2.6.2" } }, "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw=="], + + "@aws-sdk/util-format-url": ["@aws-sdk/util-format-url@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/querystring-builder": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-J6DS9oocrgxM8xlUTTmQOuwRF6rnAGEujAN9SAzllcrQmwn5iJ58ogxy3SEhD0Q7JZvlA5jvIXBkpQRqEqlE9A=="], + + "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.965.5", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ=="], + + "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/types": "^4.13.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA=="], + + "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.973.7", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "^3.972.21", "@aws-sdk/types": "^3.973.6", "@smithy/node-config-provider": "^4.3.12", "@smithy/types": "^4.13.1", "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-Hz6EZMUAEzqUd7e+vZ9LE7mn+5gMbxltXy18v+YSFY+9LBJz15wkNZvw5JqfX3z0FS9n3bgUtz3L5rAsfh4YlA=="], + + "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.11", "", { "dependencies": { "@smithy/types": "^4.13.1", "fast-xml-parser": "5.4.1", "tslib": "^2.6.2" } }, "sha512-iitV/gZKQMvY9d7ovmyFnFuTHbBAtrmLnvaSb/3X8vOKyevwtpmEtyc8AdhVWZe0pI/1GsHxlEvQeOePFzy7KQ=="], + + "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.4", "", {}, "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ=="], + + "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], + + "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="], + + "@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="], + + "@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="], + + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], + + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow=="], + + "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw=="], + + "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.7", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "debug": "^4.4.3", "lodash.debounce": "^4.0.8", "resolve": "^1.22.11" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-6Fqi8MtQ/PweQ9xvux65emkLQ83uB+qAVtfHkC9UodyHMIZdxNI01HjLCLUtybElp2KY2XNE0nOgyP1E1vXw9w=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="], + + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="], + + "@babel/helper-remap-async-to-generator": ["@babel/helper-remap-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-wrap-function": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA=="], + + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.28.6", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg=="], + + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helper-wrap-function": ["@babel/helper-wrap-function@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ=="], + + "@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="], + + "@babel/highlight": ["@babel/highlight@7.25.9", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw=="], + + "@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="], + + "@babel/plugin-proposal-decorators": ["@babel/plugin-proposal-decorators@7.29.0", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/plugin-syntax-decorators": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA=="], + + "@babel/plugin-proposal-export-default-from": ["@babel/plugin-proposal-export-default-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw=="], + + "@babel/plugin-syntax-async-generators": ["@babel/plugin-syntax-async-generators@7.8.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="], + + "@babel/plugin-syntax-bigint": ["@babel/plugin-syntax-bigint@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg=="], + + "@babel/plugin-syntax-class-properties": ["@babel/plugin-syntax-class-properties@7.12.13", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA=="], + + "@babel/plugin-syntax-class-static-block": ["@babel/plugin-syntax-class-static-block@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw=="], + + "@babel/plugin-syntax-decorators": ["@babel/plugin-syntax-decorators@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA=="], + + "@babel/plugin-syntax-dynamic-import": ["@babel/plugin-syntax-dynamic-import@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ=="], + + "@babel/plugin-syntax-export-default-from": ["@babel/plugin-syntax-export-default-from@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Svlx1fjJFnNz0LZeUaybRukSxZI3KkpApUmIRzEdXC5k8ErTOz0OD0kNrICi5Vc3GlpP5ZCeRyRO+mfWTSz+iQ=="], + + "@babel/plugin-syntax-flow": ["@babel/plugin-syntax-flow@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew=="], + + "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw=="], + + "@babel/plugin-syntax-import-meta": ["@babel/plugin-syntax-import-meta@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="], + + "@babel/plugin-syntax-json-strings": ["@babel/plugin-syntax-json-strings@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="], + + "@babel/plugin-syntax-logical-assignment-operators": ["@babel/plugin-syntax-logical-assignment-operators@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="], + + "@babel/plugin-syntax-nullish-coalescing-operator": ["@babel/plugin-syntax-nullish-coalescing-operator@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="], + + "@babel/plugin-syntax-numeric-separator": ["@babel/plugin-syntax-numeric-separator@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug=="], + + "@babel/plugin-syntax-object-rest-spread": ["@babel/plugin-syntax-object-rest-spread@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA=="], + + "@babel/plugin-syntax-optional-catch-binding": ["@babel/plugin-syntax-optional-catch-binding@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q=="], + + "@babel/plugin-syntax-optional-chaining": ["@babel/plugin-syntax-optional-chaining@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="], + + "@babel/plugin-syntax-private-property-in-object": ["@babel/plugin-syntax-private-property-in-object@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg=="], + + "@babel/plugin-syntax-top-level-await": ["@babel/plugin-syntax-top-level-await@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A=="], + + "@babel/plugin-transform-arrow-functions": ["@babel/plugin-transform-arrow-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA=="], + + "@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.29.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.29.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w=="], + + "@babel/plugin-transform-async-to-generator": ["@babel/plugin-transform-async-to-generator@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g=="], + + "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw=="], + + "@babel/plugin-transform-class-properties": ["@babel/plugin-transform-class-properties@7.28.6", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw=="], + + "@babel/plugin-transform-classes": ["@babel/plugin-transform-classes@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-replace-supers": "^7.28.6", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q=="], + + "@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/template": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ=="], + + "@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw=="], + + "@babel/plugin-transform-export-namespace-from": ["@babel/plugin-transform-export-namespace-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ=="], + + "@babel/plugin-transform-flow-strip-types": ["@babel/plugin-transform-flow-strip-types@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg=="], + + "@babel/plugin-transform-for-of": ["@babel/plugin-transform-for-of@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw=="], + + "@babel/plugin-transform-function-name": ["@babel/plugin-transform-function-name@7.27.1", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ=="], + + "@babel/plugin-transform-literals": ["@babel/plugin-transform-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA=="], + + "@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A=="], + + "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.28.6", "", { "dependencies": { "@babel/helper-module-transforms": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA=="], + + "@babel/plugin-transform-named-capturing-groups-regex": ["@babel/plugin-transform-named-capturing-groups-regex@7.29.0", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ=="], + + "@babel/plugin-transform-nullish-coalescing-operator": ["@babel/plugin-transform-nullish-coalescing-operator@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg=="], + + "@babel/plugin-transform-numeric-separator": ["@babel/plugin-transform-numeric-separator@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w=="], + + "@babel/plugin-transform-object-rest-spread": ["@babel/plugin-transform-object-rest-spread@7.28.6", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA=="], + + "@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ=="], + + "@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w=="], + + "@babel/plugin-transform-parameters": ["@babel/plugin-transform-parameters@7.27.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg=="], + + "@babel/plugin-transform-private-methods": ["@babel/plugin-transform-private-methods@7.28.6", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg=="], + + "@babel/plugin-transform-private-property-in-object": ["@babel/plugin-transform-private-property-in-object@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA=="], + + "@babel/plugin-transform-react-display-name": ["@babel/plugin-transform-react-display-name@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA=="], + + "@babel/plugin-transform-react-jsx": ["@babel/plugin-transform-react-jsx@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-module-imports": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/plugin-syntax-jsx": "^7.28.6", "@babel/types": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow=="], + + "@babel/plugin-transform-react-jsx-development": ["@babel/plugin-transform-react-jsx-development@7.27.1", "", { "dependencies": { "@babel/plugin-transform-react-jsx": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q=="], + + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], + + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], + + "@babel/plugin-transform-react-pure-annotations": ["@babel/plugin-transform-react-pure-annotations@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA=="], + + "@babel/plugin-transform-regenerator": ["@babel/plugin-transform-regenerator@7.29.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog=="], + + "@babel/plugin-transform-runtime": ["@babel/plugin-transform-runtime@7.29.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w=="], + + "@babel/plugin-transform-shorthand-properties": ["@babel/plugin-transform-shorthand-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ=="], + + "@babel/plugin-transform-spread": ["@babel/plugin-transform-spread@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA=="], + + "@babel/plugin-transform-sticky-regex": ["@babel/plugin-transform-sticky-regex@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g=="], + + "@babel/plugin-transform-template-literals": ["@babel/plugin-transform-template-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg=="], + + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw=="], + + "@babel/plugin-transform-unicode-regex": ["@babel/plugin-transform-unicode-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw=="], + + "@babel/preset-react": ["@babel/preset-react@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-transform-react-display-name": "^7.28.0", "@babel/plugin-transform-react-jsx": "^7.27.1", "@babel/plugin-transform-react-jsx-development": "^7.27.1", "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ=="], + + "@babel/preset-typescript": ["@babel/preset-typescript@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g=="], + + "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="], + + "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], + + "@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], + + "@babel/traverse--for-generate-function-map": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], + + "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + + "@callstack/react-theme-provider": ["@callstack/react-theme-provider@3.0.9", "", { "dependencies": { "deepmerge": "^3.2.0", "hoist-non-react-statics": "^3.3.0" }, "peerDependencies": { "react": ">=16.3.0" } }, "sha512-tTQ0uDSCL0ypeMa8T/E9wAZRGKWj8kXP7+6RYgPTfOPs9N07C9xM8P02GJ3feETap4Ux5S69D9nteq9mEj86NA=="], + + "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], + + "@dimforge/rapier3d-compat": ["@dimforge/rapier3d-compat@0.12.0", "", {}, "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow=="], + + "@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="], + + "@egjs/hammerjs": ["@egjs/hammerjs@2.0.17", "", { "dependencies": { "@types/hammerjs": "^2.0.36" } }, "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A=="], + + "@emnapi/core": ["@emnapi/core@1.9.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" } }, "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg=="], + + "@esbuild-kit/core-utils": ["@esbuild-kit/core-utils@3.3.2", "", { "dependencies": { "esbuild": "~0.18.20", "source-map-support": "^0.5.21" } }, "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="], + + "@esbuild-kit/esm-loader": ["@esbuild-kit/esm-loader@2.6.5", "", { "dependencies": { "@esbuild-kit/core-utils": "^3.3.2", "get-tsconfig": "^4.7.0" } }, "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], + + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + + "@expo/cli": ["@expo/cli@0.24.24", "", { "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@babel/runtime": "^7.20.0", "@expo/code-signing-certificates": "^0.0.6", "@expo/config": "~11.0.13", "@expo/config-plugins": "~10.1.2", "@expo/devcert": "^1.1.2", "@expo/env": "~1.0.7", "@expo/image-utils": "^0.7.6", "@expo/json-file": "^9.1.5", "@expo/metro-config": "~0.20.18", "@expo/osascript": "^2.2.5", "@expo/package-manager": "^1.8.6", "@expo/plist": "^0.3.5", "@expo/prebuild-config": "^9.0.12", "@expo/schema-utils": "^0.1.0", "@expo/spawn-async": "^1.7.2", "@expo/ws-tunnel": "^1.0.1", "@expo/xcpretty": "^4.3.0", "@react-native/dev-middleware": "0.79.6", "@urql/core": "^5.0.6", "@urql/exchange-retry": "^1.3.0", "accepts": "^1.3.8", "arg": "^5.0.2", "better-opn": "~3.0.2", "bplist-creator": "0.1.0", "bplist-parser": "^0.3.1", "chalk": "^4.0.0", "ci-info": "^3.3.0", "compression": "^1.7.4", "connect": "^3.7.0", "debug": "^4.3.4", "env-editor": "^0.4.1", "freeport-async": "^2.0.0", "getenv": "^2.0.0", "glob": "^10.4.2", "lan-network": "^0.1.6", "minimatch": "^9.0.0", "node-forge": "^1.3.3", "npm-package-arg": "^11.0.0", "ora": "^3.4.0", "picomatch": "^3.0.1", "pretty-bytes": "^5.6.0", "pretty-format": "^29.7.0", "progress": "^2.0.3", "prompts": "^2.3.2", "qrcode-terminal": "0.11.0", "require-from-string": "^2.0.2", "requireg": "^0.2.2", "resolve": "^1.22.2", "resolve-from": "^5.0.0", "resolve.exports": "^2.0.3", "semver": "^7.6.0", "send": "^0.19.0", "slugify": "^1.3.4", "source-map-support": "~0.5.21", "stacktrace-parser": "^0.1.10", "structured-headers": "^0.4.1", "tar": "^7.4.3", "terminal-link": "^2.1.1", "undici": "^6.18.2", "wrap-ansi": "^7.0.0", "ws": "^8.12.1" }, "bin": { "expo-internal": "build/bin/cli" } }, "sha512-XybHfF2QNPJNnHoUKHcG796iEkX5126UuTAs6MSpZuvZRRQRj/sGCLX+driCOVHbDOpcCOusMuHrhxHbtTApyg=="], + + "@expo/code-signing-certificates": ["@expo/code-signing-certificates@0.0.6", "", { "dependencies": { "node-forge": "^1.3.3" } }, "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w=="], + + "@expo/config": ["@expo/config@11.0.13", "", { "dependencies": { "@babel/code-frame": "~7.10.4", "@expo/config-plugins": "~10.1.2", "@expo/config-types": "^53.0.5", "@expo/json-file": "^9.1.5", "deepmerge": "^4.3.1", "getenv": "^2.0.0", "glob": "^10.4.2", "require-from-string": "^2.0.2", "resolve-from": "^5.0.0", "resolve-workspace-root": "^2.0.0", "semver": "^7.6.0", "slugify": "^1.3.4", "sucrase": "3.35.0" } }, "sha512-TnGb4u/zUZetpav9sx/3fWK71oCPaOjZHoVED9NaEncktAd0Eonhq5NUghiJmkUGt3gGSjRAEBXiBbbY9/B1LA=="], + + "@expo/config-plugins": ["@expo/config-plugins@10.1.2", "", { "dependencies": { "@expo/config-types": "^53.0.5", "@expo/json-file": "~9.1.5", "@expo/plist": "^0.3.5", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", "debug": "^4.3.5", "getenv": "^2.0.0", "glob": "^10.4.2", "resolve-from": "^5.0.0", "semver": "^7.5.4", "slash": "^3.0.0", "slugify": "^1.6.6", "xcode": "^3.0.1", "xml2js": "0.6.0" } }, "sha512-IMYCxBOcnuFStuK0Ay+FzEIBKrwW8OVUMc65+v0+i7YFIIe8aL342l7T4F8lR4oCfhXn7d6M5QPgXvjtc/gAcw=="], + + "@expo/config-types": ["@expo/config-types@53.0.5", "", {}, "sha512-kqZ0w44E+HEGBjy+Lpyn0BVL5UANg/tmNixxaRMLS6nf37YsDrLk2VMAmeKMMk5CKG0NmOdVv3ngeUjRQMsy9g=="], + + "@expo/devcert": ["@expo/devcert@1.2.1", "", { "dependencies": { "@expo/sudo-prompt": "^9.3.1", "debug": "^3.1.0" } }, "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA=="], + + "@expo/env": ["@expo/env@1.0.7", "", { "dependencies": { "chalk": "^4.0.0", "debug": "^4.3.4", "dotenv": "~16.4.5", "dotenv-expand": "~11.0.6", "getenv": "^2.0.0" } }, "sha512-qSTEnwvuYJ3umapO9XJtrb1fAqiPlmUUg78N0IZXXGwQRt+bkp0OBls+Y5Mxw/Owj8waAM0Z3huKKskRADR5ow=="], + + "@expo/fingerprint": ["@expo/fingerprint@0.13.4", "", { "dependencies": { "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", "chalk": "^4.1.2", "debug": "^4.3.4", "find-up": "^5.0.0", "getenv": "^2.0.0", "glob": "^10.4.2", "ignore": "^5.3.1", "minimatch": "^9.0.0", "p-limit": "^3.1.0", "resolve-from": "^5.0.0", "semver": "^7.6.0" }, "bin": { "fingerprint": "bin/cli.js" } }, "sha512-MYfPYBTMfrrNr07DALuLhG6EaLVNVrY/PXjEzsjWdWE4ZFn0yqI0IdHNkJG7t1gePT8iztHc7qnsx+oo/rDo6w=="], + + "@expo/image-utils": ["@expo/image-utils@0.7.6", "", { "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", "getenv": "^2.0.0", "jimp-compact": "0.16.1", "parse-png": "^2.1.0", "resolve-from": "^5.0.0", "semver": "^7.6.0", "temp-dir": "~2.0.0", "unique-string": "~2.0.0" } }, "sha512-GKnMqC79+mo/1AFrmAcUcGfbsXXTRqOMNS1umebuevl3aaw+ztsYEFEiuNhHZW7PQ3Xs3URNT513ZxKhznDscw=="], + + "@expo/json-file": ["@expo/json-file@9.1.5", "", { "dependencies": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" } }, "sha512-prWBhLUlmcQtvN6Y7BpW2k9zXGd3ySa3R6rAguMJkp1z22nunLN64KYTUWfijFlprFoxm9r2VNnGkcbndAlgKA=="], + + "@expo/metro-config": ["@expo/metro-config@0.20.18", "", { "dependencies": { "@babel/core": "^7.20.0", "@babel/generator": "^7.20.5", "@babel/parser": "^7.20.0", "@babel/types": "^7.20.0", "@expo/config": "~11.0.13", "@expo/env": "~1.0.7", "@expo/json-file": "~9.1.5", "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", "debug": "^4.3.2", "dotenv": "~16.4.5", "dotenv-expand": "~11.0.6", "getenv": "^2.0.0", "glob": "^10.4.2", "jsc-safe-url": "^0.2.4", "lightningcss": "~1.27.0", "minimatch": "^9.0.0", "postcss": "~8.4.32", "resolve-from": "^5.0.0" } }, "sha512-qPYq3Cq61KQO1CppqtmxA1NGKpzFOmdiL7WxwLhEVnz73LPSgneW7dV/3RZwVFkjThzjA41qB4a9pxDqtpepPg=="], + + "@expo/metro-runtime": ["@expo/metro-runtime@5.0.5", "", { "peerDependencies": { "react-native": "*" } }, "sha512-P8UFTi+YsmiD1BmdTdiIQITzDMcZgronsA3RTQ4QKJjHM3bas11oGzLQOnFaIZnlEV8Rrr3m1m+RHxvnpL+t/A=="], + + "@expo/osascript": ["@expo/osascript@2.4.2", "", { "dependencies": { "@expo/spawn-async": "^1.7.2" } }, "sha512-/XP7PSYF2hzOZzqfjgkoWtllyeTN8dW3aM4P6YgKcmmPikKL5FdoyQhti4eh6RK5a5VrUXJTOlTNIpIHsfB5Iw=="], + + "@expo/package-manager": ["@expo/package-manager@1.10.3", "", { "dependencies": { "@expo/json-file": "^10.0.12", "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", "npm-package-arg": "^11.0.0", "ora": "^3.4.0", "resolve-workspace-root": "^2.0.0" } }, "sha512-ZuXiK/9fCrIuLjPSe1VYmfp0Sa85kCMwd8QQpgyi5ufppYKRtLBg14QOgUqj8ZMbJTxE0xqzd0XR7kOs3vAK9A=="], + + "@expo/plist": ["@expo/plist@0.3.5", "", { "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.2.3", "xmlbuilder": "^15.1.1" } }, "sha512-9RYVU1iGyCJ7vWfg3e7c/NVyMFs8wbl+dMWZphtFtsqyN9zppGREU3ctlD3i8KUE0sCUTVnLjCWr+VeUIDep2g=="], + + "@expo/prebuild-config": ["@expo/prebuild-config@9.0.12", "", { "dependencies": { "@expo/config": "~11.0.13", "@expo/config-plugins": "~10.1.2", "@expo/config-types": "^53.0.5", "@expo/image-utils": "^0.7.6", "@expo/json-file": "^9.1.5", "@react-native/normalize-colors": "0.79.6", "debug": "^4.3.1", "resolve-from": "^5.0.0", "semver": "^7.6.0", "xml2js": "0.6.0" } }, "sha512-AKH5Scf+gEMgGxZZaimrJI2wlUJlRoqzDNn7/rkhZa5gUTnO4l6slKak2YdaH+nXlOWCNfAQWa76NnpQIfmv6Q=="], + + "@expo/schema-utils": ["@expo/schema-utils@0.1.8", "", {}, "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A=="], + + "@expo/sdk-runtime-versions": ["@expo/sdk-runtime-versions@1.0.0", "", {}, "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ=="], + + "@expo/server": ["@expo/server@0.6.3", "", { "dependencies": { "abort-controller": "^3.0.0", "debug": "^4.3.4", "source-map-support": "~0.5.21", "undici": "^6.18.2 || ^7.0.0" } }, "sha512-Ea7NJn9Xk1fe4YeJ86rObHSv/bm3u/6WiQPXEqXJ2GrfYpVab2Swoh9/PnSM3KjR64JAgKjArDn1HiPjITCfHA=="], + + "@expo/spawn-async": ["@expo/spawn-async@1.7.2", "", { "dependencies": { "cross-spawn": "^7.0.3" } }, "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew=="], + + "@expo/sudo-prompt": ["@expo/sudo-prompt@9.3.2", "", {}, "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw=="], + + "@expo/vector-icons": ["@expo/vector-icons@14.1.0", "", { "peerDependencies": { "expo-font": "*", "react": "*", "react-native": "*" } }, "sha512-7T09UE9h8QDTsUeMGymB4i+iqvtEeaO5VvUjryFB4tugDTG/bkzViWA74hm5pfjjDEhYMXWaX112mcvhccmIwQ=="], + + "@expo/ws-tunnel": ["@expo/ws-tunnel@1.0.6", "", {}, "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q=="], + + "@expo/xcpretty": ["@expo/xcpretty@4.4.1", "", { "dependencies": { "@babel/code-frame": "^7.20.0", "chalk": "^4.1.0", "js-yaml": "^4.1.0" }, "bin": { "excpretty": "build/cli.js" } }, "sha512-KZNxZvnGCtiM2aYYZ6Wz0Ix5r47dAvpNLApFtZWnSoERzAdOMzVBOPysBoM0JlF6FKWZ8GPqgn6qt3dV/8Zlpg=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@ide/backoff": ["@ide/backoff@1.0.0", "", {}, "sha512-F0YfUDjvT+Mtt/R4xdl2X0EYCHMMiJqNLdxHD++jDT5ydEFIyqbCHh51Qx2E211dgZprPKhV7sHmnXKpLuvc5g=="], + + "@ioredis/commands": ["@ioredis/commands@1.5.0", "", {}, "sha512-eUgLqrMf8nJkZxT24JvVRrQya1vZkQh8BBeYNwGDqa5I0VUi8ACx7uFvAaLxintokpTenkK6DASvo/bvNbBGow=="], + + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@isaacs/ttlcache": ["@isaacs/ttlcache@1.4.1", "", {}, "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA=="], + + "@istanbuljs/load-nyc-config": ["@istanbuljs/load-nyc-config@1.1.0", "", { "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } }, "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="], + + "@istanbuljs/schema": ["@istanbuljs/schema@0.1.3", "", {}, "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="], + + "@jest/create-cache-key-function": ["@jest/create-cache-key-function@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3" } }, "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA=="], + + "@jest/environment": ["@jest/environment@29.7.0", "", { "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0" } }, "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw=="], + + "@jest/fake-timers": ["@jest/fake-timers@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ=="], + + "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], + + "@jest/transform": ["@jest/transform@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw=="], + + "@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@mapbox/geojson-rewind": ["@mapbox/geojson-rewind@0.5.2", "", { "dependencies": { "get-stream": "^6.0.1", "minimist": "^1.2.6" }, "bin": { "geojson-rewind": "geojson-rewind" } }, "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA=="], + + "@mapbox/jsonlint-lines-primitives": ["@mapbox/jsonlint-lines-primitives@2.0.2", "", {}, "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ=="], + + "@mapbox/point-geometry": ["@mapbox/point-geometry@0.1.0", "", {}, "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ=="], + + "@mapbox/tiny-sdf": ["@mapbox/tiny-sdf@2.0.7", "", {}, "sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug=="], + + "@mapbox/unitbezier": ["@mapbox/unitbezier@0.0.1", "", {}, "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw=="], + + "@mapbox/vector-tile": ["@mapbox/vector-tile@1.3.1", "", { "dependencies": { "@mapbox/point-geometry": "~0.1.0" } }, "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw=="], + + "@mapbox/whoots-js": ["@mapbox/whoots-js@3.1.0", "", {}, "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q=="], + + "@maplibre/maplibre-gl-style-spec": ["@maplibre/maplibre-gl-style-spec@20.4.0", "", { "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/unitbezier": "^0.0.1", "json-stringify-pretty-compact": "^4.0.0", "minimist": "^1.2.8", "quickselect": "^2.0.0", "rw": "^1.3.3", "tinyqueue": "^3.0.0" }, "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" } }, "sha512-AzBy3095fTFPjDjmWpR2w6HVRAZJ6hQZUCwk5Plz6EyfnfuQW1odeW5i2Ai47Y6TBA2hQnC+azscjBSALpaWgw=="], + + "@mediapipe/tasks-vision": ["@mediapipe/tasks-vision@0.10.17", "", {}, "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg=="], + + "@monogrid/gainmap-js": ["@monogrid/gainmap-js@3.4.0", "", { "dependencies": { "promise-worker-transferable": "^1.0.4" }, "peerDependencies": { "three": ">= 0.159.0" } }, "sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg=="], + + "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw=="], + + "@msgpackr-extract/msgpackr-extract-darwin-x64": ["@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw=="], + + "@msgpackr-extract/msgpackr-extract-linux-arm": ["@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3", "", { "os": "linux", "cpu": "arm" }, "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw=="], + + "@msgpackr-extract/msgpackr-extract-linux-arm64": ["@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg=="], + + "@msgpackr-extract/msgpackr-extract-linux-x64": ["@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3", "", { "os": "linux", "cpu": "x64" }, "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg=="], + + "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3", "", { "os": "win32", "cpu": "x64" }, "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="], + + "@packages/shared": ["@packages/shared@workspace:packages/shared"], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA=="], + + "@react-native-community/datetimepicker": ["@react-native-community/datetimepicker@8.4.1", "", { "dependencies": { "invariant": "^2.2.4" }, "peerDependencies": { "expo": ">=52.0.0", "react": "*", "react-native": "*", "react-native-windows": "*" }, "optionalPeers": ["expo", "react-native-windows"] }, "sha512-DrK+CUS5fZnz8dhzBezirkzQTcNDdaXer3oDLh0z4nc2tbdIdnzwvXCvi8IEOIvleoc9L95xS5tKUl0/Xv71Mg=="], + + "@react-native-google-signin/google-signin": ["@react-native-google-signin/google-signin@16.1.2", "", { "peerDependencies": { "expo": ">=52.0.40", "react": "*", "react-native": "*" }, "optionalPeers": ["expo"] }, "sha512-1hf4pRmpnS5t0dHtqU72Q1FmWzsCZR2Sm3uVQbbfMKeNPl5TKjpAsP6F8QTZ9L+Q6Cnn9tL9BXpDCb1nyutdCQ=="], + + "@react-native-picker/picker": ["@react-native-picker/picker@2.11.1", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-ThklnkK4fV3yynnIIRBkxxjxR4IFbdMNJVF6tlLdOJ/zEFUEFUEdXY0KmH0iYzMwY8W4/InWsLiA7AkpAbnexA=="], + + "@react-native/assets-registry": ["@react-native/assets-registry@0.79.6", "", {}, "sha512-UVSP1224PWg0X+mRlZNftV5xQwZGfawhivuW8fGgxNK9MS/U84xZ+16lkqcPh1ank6MOt239lIWHQ1S33CHgqA=="], + + "@react-native/babel-plugin-codegen": ["@react-native/babel-plugin-codegen@0.79.6", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.79.6" } }, "sha512-CS5OrgcMPixOyUJ/Sk/HSsKsKgyKT5P7y3CojimOQzWqRZBmoQfxdST4ugj7n1H+ebM2IKqbgovApFbqXsoX0g=="], + + "@react-native/babel-preset": ["@react-native/babel-preset@0.79.6", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-default-from": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-transform-arrow-functions": "^7.24.7", "@babel/plugin-transform-async-generator-functions": "^7.25.4", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoping": "^7.25.0", "@babel/plugin-transform-class-properties": "^7.25.4", "@babel/plugin-transform-classes": "^7.25.4", "@babel/plugin-transform-computed-properties": "^7.24.7", "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-flow-strip-types": "^7.25.2", "@babel/plugin-transform-for-of": "^7.24.7", "@babel/plugin-transform-function-name": "^7.25.1", "@babel/plugin-transform-literals": "^7.25.2", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-modules-commonjs": "^7.24.8", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", "@babel/plugin-transform-numeric-separator": "^7.24.7", "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-optional-catch-binding": "^7.24.7", "@babel/plugin-transform-optional-chaining": "^7.24.8", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-react-display-name": "^7.24.7", "@babel/plugin-transform-react-jsx": "^7.25.2", "@babel/plugin-transform-react-jsx-self": "^7.24.7", "@babel/plugin-transform-react-jsx-source": "^7.24.7", "@babel/plugin-transform-regenerator": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/plugin-transform-shorthand-properties": "^7.24.7", "@babel/plugin-transform-spread": "^7.24.7", "@babel/plugin-transform-sticky-regex": "^7.24.7", "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/template": "^7.25.0", "@react-native/babel-plugin-codegen": "0.79.6", "babel-plugin-syntax-hermes-parser": "0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" } }, "sha512-H+FRO+r2Ql6b5IwfE0E7D52JhkxjeGSBSUpCXAI5zQ60zSBJ54Hwh2bBJOohXWl4J+C7gKYSAd2JHMUETu+c/A=="], + + "@react-native/codegen": ["@react-native/codegen@0.79.6", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", "glob": "^7.1.1", "hermes-parser": "0.25.1", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "yargs": "^17.6.2" } }, "sha512-iRBX8Lgbqypwnfba7s6opeUwVyaR23mowh9ILw7EcT2oLz3RqMmjJdrbVpWhGSMGq2qkPfqAH7bhO8C7O+xfjQ=="], + + "@react-native/community-cli-plugin": ["@react-native/community-cli-plugin@0.79.6", "", { "dependencies": { "@react-native/dev-middleware": "0.79.6", "chalk": "^4.0.0", "debug": "^2.2.0", "invariant": "^2.2.4", "metro": "^0.82.0", "metro-config": "^0.82.0", "metro-core": "^0.82.0", "semver": "^7.1.3" }, "peerDependencies": { "@react-native-community/cli": "*" }, "optionalPeers": ["@react-native-community/cli"] }, "sha512-ZHVst9vByGsegeaddkD2YbZ6NvYb4n3pD9H7Pit94u+NlByq2uBJghoOjT6EKqg+UVl8tLRdi88cU2pDPwdHqA=="], + + "@react-native/debugger-frontend": ["@react-native/debugger-frontend@0.79.6", "", {}, "sha512-lIK/KkaH7ueM22bLO0YNaQwZbT/oeqhaghOvmZacaNVbJR1Cdh/XAqjT8FgCS+7PUnbxA8B55NYNKGZG3O2pYw=="], + + "@react-native/dev-middleware": ["@react-native/dev-middleware@0.79.6", "", { "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.79.6", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", "debug": "^2.2.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "open": "^7.0.3", "serve-static": "^1.16.2", "ws": "^6.2.3" } }, "sha512-BK3GZBa9c7XSNR27EDRtxrgyyA3/mf1j3/y+mPk7Ac0Myu85YNrXnC9g3mL5Ytwo0g58TKrAIgs1fF2Q5Mn6mQ=="], + + "@react-native/gradle-plugin": ["@react-native/gradle-plugin@0.79.6", "", {}, "sha512-C5odetI6py3CSELeZEVz+i00M+OJuFZXYnjVD4JyvpLn462GesHRh+Se8mSkU5QSaz9cnpMnyFLJAx05dokWbA=="], + + "@react-native/js-polyfills": ["@react-native/js-polyfills@0.79.6", "", {}, "sha512-6wOaBh1namYj9JlCNgX2ILeGUIwc6OP6MWe3Y5jge7Xz9fVpRqWQk88Q5Y9VrAtTMTcxoX3CvhrfRr3tGtSfQw=="], + + "@react-native/normalize-colors": ["@react-native/normalize-colors@0.79.6", "", {}, "sha512-0v2/ruY7eeKun4BeKu+GcfO+SHBdl0LJn4ZFzTzjHdWES0Cn+ONqKljYaIv8p9MV2Hx/kcdEvbY4lWI34jC/mQ=="], + + "@react-native/virtualized-lists": ["@react-native/virtualized-lists@0.79.7", "", { "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "peerDependencies": { "@types/react": "^19.0.0", "react": "*", "react-native": "*" }, "optionalPeers": ["@types/react"] }, "sha512-CPJ995n1WIyi7KeLj+/aeFCe6MWQrRRXfMvBnc7XP4noSa4WEJfH8Zcvl/iWYVxrQdIaInadoiYLakeSflz5jg=="], + + "@react-navigation/bottom-tabs": ["@react-navigation/bottom-tabs@7.15.5", "", { "dependencies": { "@react-navigation/elements": "^2.9.10", "color": "^4.2.3", "sf-symbols-typescript": "^2.1.0" }, "peerDependencies": { "@react-navigation/native": "^7.1.33", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0", "react-native-screens": ">= 4.0.0" } }, "sha512-wQHredlCrRmShWQ1vF4HUcLdaiJ8fUgnbaeQH7BJ7MQVQh4mdzab0IOY/4QSmUyNRB350oyu1biTycyQ5FKWMQ=="], + + "@react-navigation/core": ["@react-navigation/core@7.16.1", "", { "dependencies": { "@react-navigation/routers": "^7.5.3", "escape-string-regexp": "^4.0.0", "fast-deep-equal": "^3.1.3", "nanoid": "^3.3.11", "query-string": "^7.1.3", "react-is": "^19.1.0", "use-latest-callback": "^0.2.4", "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "react": ">= 18.2.0" } }, "sha512-xhquoyhKdqDfiL7LuupbwYnmauUGfVFGDEJO34m26k8zSN1eDjQ2stBZcHN8ILOI1PrG9885nf8ZmfaQxPS0ww=="], + + "@react-navigation/drawer": ["@react-navigation/drawer@7.9.4", "", { "dependencies": { "@react-navigation/elements": "^2.9.10", "color": "^4.2.3", "react-native-drawer-layout": "^4.2.2", "use-latest-callback": "^0.2.4" }, "peerDependencies": { "@react-navigation/native": "^7.1.33", "react": ">= 18.2.0", "react-native": "*", "react-native-gesture-handler": ">= 2.0.0", "react-native-reanimated": ">= 2.0.0", "react-native-safe-area-context": ">= 4.0.0", "react-native-screens": ">= 4.0.0" } }, "sha512-Af2dQZiiHiw/FoP+houLdYn0WYQrkVXVZwOMT+RK8juY4Sn9KLRWg/ZsT1Z5Qml8W/poI06is32PXQXZNjk3YQ=="], + + "@react-navigation/elements": ["@react-navigation/elements@2.9.10", "", { "dependencies": { "color": "^4.2.3", "use-latest-callback": "^0.2.4", "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@react-native-masked-view/masked-view": ">= 0.2.0", "@react-navigation/native": "^7.1.33", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0" }, "optionalPeers": ["@react-native-masked-view/masked-view"] }, "sha512-N8tuBekzTRb0pkMHFJGvmC6Q5OisSbt6gzvw7RHMnp4NDo5auVllT12sWFaTXf8mTduaLKNSrD/NZNaOqThCBg=="], + + "@react-navigation/material-top-tabs": ["@react-navigation/material-top-tabs@7.4.19", "", { "dependencies": { "@react-navigation/elements": "^2.9.10", "color": "^4.2.3", "react-native-tab-view": "^4.3.0" }, "peerDependencies": { "@react-navigation/native": "^7.1.33", "react": ">= 18.2.0", "react-native": "*", "react-native-pager-view": ">= 6.0.0", "react-native-safe-area-context": ">= 4.0.0" } }, "sha512-jYGgItg51bjy3ypKeLm7sNEmGh0tFLn0VLV/p06iUprwKzuIvQESFin9M2+HUHa0pE1+g5tnf/ECKQJiAw712Q=="], + + "@react-navigation/native": ["@react-navigation/native@7.1.33", "", { "dependencies": { "@react-navigation/core": "^7.16.1", "escape-string-regexp": "^4.0.0", "fast-deep-equal": "^3.1.3", "nanoid": "^3.3.11", "use-latest-callback": "^0.2.4" }, "peerDependencies": { "react": ">= 18.2.0", "react-native": "*" } }, "sha512-DpFdWGcgLajKZ1TuIvDNQsblN2QaUFWpTQaB8v7WRP9Mix8H/6TFoIrZd93pbymI2hybd6UYrD+lI408eWVcfw=="], + + "@react-navigation/native-stack": ["@react-navigation/native-stack@7.14.5", "", { "dependencies": { "@react-navigation/elements": "^2.9.10", "color": "^4.2.3", "sf-symbols-typescript": "^2.1.0", "warn-once": "^0.1.1" }, "peerDependencies": { "@react-navigation/native": "^7.1.33", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0", "react-native-screens": ">= 4.0.0" } }, "sha512-NuyMf21kKk3jODvYgpcDA+HwyWr/KEj72ciqquyEupZlsmQ3WNUGgdaixEB3A19+iPOvHLQzDLcoTrrqZk8Leg=="], + + "@react-navigation/routers": ["@react-navigation/routers@7.5.3", "", { "dependencies": { "nanoid": "^3.3.11" } }, "sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg=="], + + "@react-three/drei": ["@react-three/drei@10.7.7", "", { "dependencies": { "@babel/runtime": "^7.26.0", "@mediapipe/tasks-vision": "0.10.17", "@monogrid/gainmap-js": "^3.0.6", "@use-gesture/react": "^10.3.1", "camera-controls": "^3.1.0", "cross-env": "^7.0.3", "detect-gpu": "^5.0.56", "glsl-noise": "^0.0.0", "hls.js": "^1.5.17", "maath": "^0.10.8", "meshline": "^3.3.1", "stats-gl": "^2.2.8", "stats.js": "^0.17.0", "suspend-react": "^0.1.3", "three-mesh-bvh": "^0.8.3", "three-stdlib": "^2.35.6", "troika-three-text": "^0.52.4", "tunnel-rat": "^0.1.2", "use-sync-external-store": "^1.4.0", "utility-types": "^3.11.0", "zustand": "^5.0.1" }, "peerDependencies": { "@react-three/fiber": "^9.0.0", "react": "^19", "react-dom": "^19", "three": ">=0.159" }, "optionalPeers": ["react-dom"] }, "sha512-ff+J5iloR0k4tC++QtD/j9u3w5fzfgFAWDtAGQah9pF2B1YgOq/5JxqY0/aVoQG5r3xSZz0cv5tk2YuBob4xEQ=="], + + "@react-three/fiber": ["@react-three/fiber@9.5.0", "", { "dependencies": { "@babel/runtime": "^7.17.8", "@types/webxr": "*", "base64-js": "^1.5.1", "buffer": "^6.0.3", "its-fine": "^2.0.0", "react-use-measure": "^2.1.7", "scheduler": "^0.27.0", "suspend-react": "^0.1.3", "use-sync-external-store": "^1.4.0", "zustand": "^5.0.3" }, "peerDependencies": { "expo": ">=43.0", "expo-asset": ">=8.4", "expo-file-system": ">=11.0", "expo-gl": ">=11.0", "react": ">=19 <19.3", "react-dom": ">=19 <19.3", "react-native": ">=0.78", "three": ">=0.156" }, "optionalPeers": ["expo", "expo-asset", "expo-file-system", "expo-gl", "react-dom", "react-native"] }, "sha512-FiUzfYW4wB1+PpmsE47UM+mCads7j2+giRBltfwH7SNhah95rqJs3ltEs9V3pP8rYdS0QlNne+9Aj8dS/SiaIA=="], + + "@redis/bloom": ["@redis/bloom@5.11.0", "", { "peerDependencies": { "@redis/client": "^5.11.0" } }, "sha512-KYiVilAhAFN3057afUb/tfYJpsEyTkQB+tQcn5gVVA7DgcNOAj8lLxe4j8ov8BF6I9C1Fe/kwlbuAICcTMX8Lw=="], + + "@redis/client": ["@redis/client@5.11.0", "", { "dependencies": { "cluster-key-slot": "1.1.2" }, "peerDependencies": { "@node-rs/xxhash": "^1.1.0" }, "optionalPeers": ["@node-rs/xxhash"] }, "sha512-GHoprlNQD51Xq2Ztd94HHV94MdFZQ3CVrpA04Fz8MVoHM0B7SlbmPEVIjwTbcv58z8QyjnrOuikS0rWF03k5dQ=="], + + "@redis/json": ["@redis/json@5.11.0", "", { "peerDependencies": { "@redis/client": "^5.11.0" } }, "sha512-1iAy9kAtcD0quB21RbPTbUqqy+T2Uu2JxucwE+B4A+VaDbIRvpZR6DMqV8Iqaws2YxJYB3GC5JVNzPYio2ErUg=="], + + "@redis/search": ["@redis/search@5.11.0", "", { "peerDependencies": { "@redis/client": "^5.11.0" } }, "sha512-g1l7f3Rnyk/xI99oGHIgWHSKFl45Re5YTIcO8j/JE8olz389yUFyz2+A6nqVy/Zi031VgPDWscbbgOk8hlhZ3g=="], + + "@redis/time-series": ["@redis/time-series@5.11.0", "", { "peerDependencies": { "@redis/client": "^5.11.0" } }, "sha512-TWFeOcU4xkj0DkndnOyhtxvX1KWD+78UHT3XX3x3XRBUGWeQrKo3jqzDsZwxbggUgf9yLJr/akFHXru66X5UQA=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.59.0", "", { "os": "android", "cpu": "arm" }, "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.59.0", "", { "os": "android", "cpu": "arm64" }, "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.59.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.59.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.59.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.59.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA=="], + + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg=="], + + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA=="], + + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.59.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg=="], + + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.59.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.59.0", "", { "os": "none", "cpu": "arm64" }, "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.59.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.59.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA=="], + + "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], + + "@sinclair/typebox": ["@sinclair/typebox@0.27.10", "", {}, "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA=="], + + "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "@sinonjs/fake-timers": ["@sinonjs/fake-timers@10.3.0", "", { "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA=="], + + "@smithy/abort-controller": ["@smithy/abort-controller@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q=="], + + "@smithy/chunked-blob-reader": ["@smithy/chunked-blob-reader@5.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw=="], + + "@smithy/chunked-blob-reader-native": ["@smithy/chunked-blob-reader-native@4.2.3", "", { "dependencies": { "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" } }, "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw=="], + + "@smithy/config-resolver": ["@smithy/config-resolver@4.4.11", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.12", "@smithy/types": "^4.13.1", "@smithy/util-config-provider": "^4.2.2", "@smithy/util-endpoints": "^3.3.3", "@smithy/util-middleware": "^4.2.12", "tslib": "^2.6.2" } }, "sha512-YxFiiG4YDAtX7WMN7RuhHZLeTmRRAOyCbr+zB8e3AQzHPnUhS8zXjB1+cniPVQI3xbWsQPM0X2aaIkO/ME0ymw=="], + + "@smithy/core": ["@smithy/core@3.23.11", "", { "dependencies": { "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-middleware": "^4.2.12", "@smithy/util-stream": "^4.5.19", "@smithy/util-utf8": "^4.2.2", "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" } }, "sha512-952rGf7hBRnhUIaeLp6q4MptKW8sPFe5VvkoZ5qIzFAtx6c/QZ/54FS3yootsyUSf9gJX/NBqEBNdNR7jMIlpQ=="], + + "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.2.12", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.12", "@smithy/property-provider": "^4.2.12", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "tslib": "^2.6.2" } }, "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg=="], + + "@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.12", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.13.1", "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA=="], + + "@smithy/eventstream-serde-browser": ["@smithy/eventstream-serde-browser@4.2.12", "", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A=="], + + "@smithy/eventstream-serde-config-resolver": ["@smithy/eventstream-serde-config-resolver@4.3.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q=="], + + "@smithy/eventstream-serde-node": ["@smithy/eventstream-serde-node@4.2.12", "", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA=="], + + "@smithy/eventstream-serde-universal": ["@smithy/eventstream-serde-universal@4.2.12", "", { "dependencies": { "@smithy/eventstream-codec": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ=="], + + "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.3.15", "", { "dependencies": { "@smithy/protocol-http": "^5.3.12", "@smithy/querystring-builder": "^4.2.12", "@smithy/types": "^4.13.1", "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" } }, "sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A=="], + + "@smithy/hash-blob-browser": ["@smithy/hash-blob-browser@4.2.13", "", { "dependencies": { "@smithy/chunked-blob-reader": "^5.2.2", "@smithy/chunked-blob-reader-native": "^4.2.3", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-YrF4zWKh+ghLuquldj6e/RzE3xZYL8wIPfkt0MqCRphVICjyyjH8OwKD7LLlKpVEbk4FLizFfC1+gwK6XQdR3g=="], + + "@smithy/hash-node": ["@smithy/hash-node@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w=="], + + "@smithy/hash-stream-node": ["@smithy/hash-stream-node@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-O3YbmGExeafuM/kP7Y8r6+1y0hIh3/zn6GROx0uNlB54K9oihAL75Qtc+jFfLNliTi6pxOAYZrRKD9A7iA6UFw=="], + + "@smithy/invalid-dependency": ["@smithy/invalid-dependency@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g=="], + + "@smithy/is-array-buffer": ["@smithy/is-array-buffer@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow=="], + + "@smithy/md5-js": ["@smithy/md5-js@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-W/oIpHCpWU2+iAkfZYyGWE+qkpuf3vEXHLxQQDx9FPNZTTdnul0dZ2d/gUFrtQ5je1G2kp4cjG0/24YueG2LbQ=="], + + "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.2.12", "", { "dependencies": { "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA=="], + + "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.4.25", "", { "dependencies": { "@smithy/core": "^3.23.11", "@smithy/middleware-serde": "^4.2.14", "@smithy/node-config-provider": "^4.3.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "@smithy/util-middleware": "^4.2.12", "tslib": "^2.6.2" } }, "sha512-dqjLwZs2eBxIUG6Qtw8/YZ4DvzHGIf0DA18wrgtfP6a50UIO7e2nY0FPdcbv5tVJKqWCCU5BmGMOUwT7Puan+A=="], + + "@smithy/middleware-retry": ["@smithy/middleware-retry@4.4.42", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.12", "@smithy/protocol-http": "^5.3.12", "@smithy/service-error-classification": "^4.2.12", "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", "@smithy/util-middleware": "^4.2.12", "@smithy/util-retry": "^4.2.12", "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" } }, "sha512-vbwyqHRIpIZutNXZpLAozakzamcINaRCpEy1MYmK6xBeW3xN+TyPRA123GjXnuxZIjc9848MRRCugVMTXxC4Eg=="], + + "@smithy/middleware-serde": ["@smithy/middleware-serde@4.2.14", "", { "dependencies": { "@smithy/core": "^3.23.11", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-+CcaLoLa5apzSRtloOyG7lQvkUw2ZDml3hRh4QiG9WyEPfW5Ke/3tPOPiPjUneuT59Tpn8+c3RVaUvvkkwqZwg=="], + + "@smithy/middleware-stack": ["@smithy/middleware-stack@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw=="], + + "@smithy/node-config-provider": ["@smithy/node-config-provider@4.3.12", "", { "dependencies": { "@smithy/property-provider": "^4.2.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw=="], + + "@smithy/node-http-handler": ["@smithy/node-http-handler@4.4.16", "", { "dependencies": { "@smithy/abort-controller": "^4.2.12", "@smithy/protocol-http": "^5.3.12", "@smithy/querystring-builder": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-ULC8UCS/HivdCB3jhi+kLFYe4B5gxH2gi9vHBfEIiRrT2jfKiZNiETJSlzRtE6B26XbBHjPtc8iZKSNqMol9bw=="], + + "@smithy/property-provider": ["@smithy/property-provider@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A=="], + + "@smithy/protocol-http": ["@smithy/protocol-http@5.3.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw=="], + + "@smithy/querystring-builder": ["@smithy/querystring-builder@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "@smithy/util-uri-escape": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg=="], + + "@smithy/querystring-parser": ["@smithy/querystring-parser@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw=="], + + "@smithy/service-error-classification": ["@smithy/service-error-classification@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1" } }, "sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ=="], + + "@smithy/shared-ini-file-loader": ["@smithy/shared-ini-file-loader@4.4.7", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw=="], + + "@smithy/signature-v4": ["@smithy/signature-v4@5.3.12", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.2", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "@smithy/util-hex-encoding": "^4.2.2", "@smithy/util-middleware": "^4.2.12", "@smithy/util-uri-escape": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw=="], + + "@smithy/smithy-client": ["@smithy/smithy-client@4.12.5", "", { "dependencies": { "@smithy/core": "^3.23.11", "@smithy/middleware-endpoint": "^4.4.25", "@smithy/middleware-stack": "^4.2.12", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "@smithy/util-stream": "^4.5.19", "tslib": "^2.6.2" } }, "sha512-UqwYawyqSr/aog8mnLnfbPurS0gi4G7IYDcD28cUIBhsvWs1+rQcL2IwkUQ+QZ7dibaoRzhNF99fAQ9AUcO00w=="], + + "@smithy/types": ["@smithy/types@4.13.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g=="], + + "@smithy/url-parser": ["@smithy/url-parser@4.2.12", "", { "dependencies": { "@smithy/querystring-parser": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA=="], + + "@smithy/util-base64": ["@smithy/util-base64@4.3.2", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ=="], + + "@smithy/util-body-length-browser": ["@smithy/util-body-length-browser@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ=="], + + "@smithy/util-body-length-node": ["@smithy/util-body-length-node@4.2.3", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g=="], + + "@smithy/util-buffer-from": ["@smithy/util-buffer-from@4.2.2", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q=="], + + "@smithy/util-config-provider": ["@smithy/util-config-provider@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ=="], + + "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.3.41", "", { "dependencies": { "@smithy/property-provider": "^4.2.12", "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-M1w1Ux0rSVvBOxIIiqbxvZvhnjQ+VUjJrugtORE90BbadSTH+jsQL279KRL3Hv0w69rE7EuYkV/4Lepz/NBW9g=="], + + "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.2.44", "", { "dependencies": { "@smithy/config-resolver": "^4.4.11", "@smithy/credential-provider-imds": "^4.2.12", "@smithy/node-config-provider": "^4.3.12", "@smithy/property-provider": "^4.2.12", "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-YPze3/lD1KmWuZsl9JlfhcgGLX7AXhSoaCDtiPntUjNW5/YY0lOHjkcgxyE9x/h5vvS1fzDifMGjzqnNlNiqOQ=="], + + "@smithy/util-endpoints": ["@smithy/util-endpoints@3.3.3", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig=="], + + "@smithy/util-hex-encoding": ["@smithy/util-hex-encoding@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg=="], + + "@smithy/util-middleware": ["@smithy/util-middleware@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ=="], + + "@smithy/util-retry": ["@smithy/util-retry@4.2.12", "", { "dependencies": { "@smithy/service-error-classification": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ=="], + + "@smithy/util-stream": ["@smithy/util-stream@4.5.19", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.3.15", "@smithy/node-http-handler": "^4.4.16", "@smithy/types": "^4.13.1", "@smithy/util-base64": "^4.3.2", "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-hex-encoding": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-v4sa+3xTweL1CLO2UP0p7tvIMH/Rq1X4KKOxd568mpe6LSLMQCnDHs4uv7m3ukpl3HvcN2JH6jiCS0SNRXKP/w=="], + + "@smithy/util-uri-escape": ["@smithy/util-uri-escape@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw=="], + + "@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="], + + "@smithy/util-waiter": ["@smithy/util-waiter@4.2.13", "", { "dependencies": { "@smithy/abort-controller": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-2zdZ9DTHngRtcYxJK1GUDxruNr53kv5W2Lupe0LMU+Imr6ohQg8M2T14MNkj1Y0wS3FFwpgpGQyvuaMF7CiTmQ=="], + + "@smithy/uuid": ["@smithy/uuid@1.1.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g=="], + + "@swc/core": ["@swc/core@1.15.18", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.25" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.15.18", "@swc/core-darwin-x64": "1.15.18", "@swc/core-linux-arm-gnueabihf": "1.15.18", "@swc/core-linux-arm64-gnu": "1.15.18", "@swc/core-linux-arm64-musl": "1.15.18", "@swc/core-linux-x64-gnu": "1.15.18", "@swc/core-linux-x64-musl": "1.15.18", "@swc/core-win32-arm64-msvc": "1.15.18", "@swc/core-win32-ia32-msvc": "1.15.18", "@swc/core-win32-x64-msvc": "1.15.18" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-z87aF9GphWp//fnkRsqvtY+inMVPgYW3zSlXH1kJFvRT5H/wiAn+G32qW5l3oEk63KSF1x3Ov0BfHCObAmT8RA=="], + + "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.15.18", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+mIv7uBuSaywN3C9LNuWaX1jJJ3SKfiJuE6Lr3bd+/1Iv8oMU7oLBjYMluX1UrEPzwN2qCdY6Io0yVicABoCwQ=="], + + "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.15.18", "", { "os": "darwin", "cpu": "x64" }, "sha512-wZle0eaQhnzxWX5V/2kEOI6Z9vl/lTFEC6V4EWcn+5pDjhemCpQv9e/TDJ0GIoiClX8EDWRvuZwh+Z3dhL1NAg=="], + + "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.15.18", "", { "os": "linux", "cpu": "arm" }, "sha512-ao61HGXVqrJFHAcPtF4/DegmwEkVCo4HApnotLU8ognfmU8x589z7+tcf3hU+qBiU1WOXV5fQX6W9Nzs6hjxDw=="], + + "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.15.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-3xnctOBLIq3kj8PxOCgPrGjBLP/kNOddr6f5gukYt/1IZxsITQaU9TDyjeX6jG+FiCIHjCuWuffsyQDL5Ew1bg=="], + + "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.15.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-0a+Lix+FSSHBSBOA0XznCcHo5/1nA6oLLjcnocvzXeqtdjnPb+SvchItHI+lfeiuj1sClYPDvPMLSLyXFaiIKw=="], + + "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.15.18", "", { "os": "linux", "cpu": "x64" }, "sha512-wG9J8vReUlpaHz4KOD/5UE1AUgirimU4UFT9oZmupUDEofxJKYb1mTA/DrMj0s78bkBiNI+7Fo2EgPuvOJfuAA=="], + + "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.15.18", "", { "os": "linux", "cpu": "x64" }, "sha512-4nwbVvCphKzicwNWRmvD5iBaZj8JYsRGa4xOxJmOyHlMDpsvvJ2OR2cODlvWyGFH6BYL1MfIAK3qph3hp0Az6g=="], + + "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.15.18", "", { "os": "win32", "cpu": "arm64" }, "sha512-zk0RYO+LjiBCat2RTMHzAWaMky0cra9loH4oRrLKLLNuL+jarxKLFDA8xTZWEkCPLjUTwlRN7d28eDLLMgtUcQ=="], + + "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.15.18", "", { "os": "win32", "cpu": "ia32" }, "sha512-yVuTrZ0RccD5+PEkpcLOBAuPbYBXS6rslENvIXfvJGXSdX5QGi1ehC4BjAMl5FkKLiam4kJECUI0l7Hq7T1vwg=="], + + "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.15.18", "", { "os": "win32", "cpu": "x64" }, "sha512-7NRmE4hmUQNCbYU3Hn9Tz57mK9Qq4c97ZS+YlamlK6qG9Fb5g/BB3gPDe0iLlJkns/sYv2VWSkm8c3NmbEGjbg=="], + + "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], + + "@swc/types": ["@swc/types@0.1.25", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g=="], + + "@tanstack/history": ["@tanstack/history@1.161.6", "", {}, "sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg=="], + + "@tanstack/query-core": ["@tanstack/query-core@5.90.20", "", {}, "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg=="], + + "@tanstack/react-query": ["@tanstack/react-query@5.90.21", "", { "dependencies": { "@tanstack/query-core": "5.90.20" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg=="], + + "@tanstack/react-router": ["@tanstack/react-router@1.167.3", "", { "dependencies": { "@tanstack/history": "1.161.6", "@tanstack/react-store": "^0.9.1", "@tanstack/router-core": "1.167.3", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-1qbSy4r+O7IBdmPLlcKsjB041Gq2MMnIEAYSGIjaMZIL4duUIQnOWLw4jTfjKil/IJz/9rO5JcvrbxOG5UTSdg=="], + + "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.166.9", "", { "dependencies": { "@tanstack/router-devtools-core": "1.166.9" }, "peerDependencies": { "@tanstack/react-router": "^1.167.2", "@tanstack/router-core": "^1.167.2", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["@tanstack/router-core"] }, "sha512-O49eZmaeEKB5YnKH/qd61AbxV/lW8ICm4stfZ4GNQNpzQQ6rhPIB0p3PMZDIgX+6DoMivdNvLRmXAOOpzpIpDg=="], + + "@tanstack/react-store": ["@tanstack/react-store@0.9.2", "", { "dependencies": { "@tanstack/store": "0.9.2", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Vt5usJE5sHG/cMechQfmwvwne6ktGCELe89Lmvoxe3LKRoFrhPa8OCKWs0NliG8HTJElEIj7PLtaBQIcux5pAQ=="], + + "@tanstack/router-core": ["@tanstack/router-core@1.167.3", "", { "dependencies": { "@tanstack/history": "1.161.6", "@tanstack/store": "^0.9.1", "cookie-es": "^2.0.0", "seroval": "^1.4.2", "seroval-plugins": "^1.4.2", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" } }, "sha512-M/CxrTGKk1fsySJjd+Pzpbi3YLDz+cJSutDjSTMy12owWlOgHV/I6kzR0UxyaBlHraM6XgMHNA0XdgsS1fa4Nw=="], + + "@tanstack/router-devtools": ["@tanstack/router-devtools@1.166.9", "", { "dependencies": { "@tanstack/react-router-devtools": "1.166.9", "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/react-router": "^1.167.2", "csstype": "^3.0.10", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["csstype"] }, "sha512-AOZWjCju4jpEw/zE/hapo5slmM7RTAGMB5zNeo60ZOFr+Tkrt0utxOGTJ0mVDTKyBA1DGnyryAced3rBulT19A=="], + + "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.166.9", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16", "tiny-invariant": "^1.3.3" }, "peerDependencies": { "@tanstack/router-core": "^1.167.2", "csstype": "^3.0.10" }, "optionalPeers": ["csstype"] }, "sha512-PNlA7GmOUX9wY7LUG709Pk3Lg33dfHBztQwzjzrOiOsuf4ggp2R6bwarF8nYGNjG79z/MaB5PN+5yvkCVk8jGw=="], + + "@tanstack/store": ["@tanstack/store@0.9.2", "", {}, "sha512-K013lUJEFJK2ofFQ/hZKJUmCnpcV00ebLyOyFOWQvyQHUOZp/iYO84BM6aOGiV81JzwbX0APTVmW8YI7yiG5oA=="], + + "@trpc/client": ["@trpc/client@11.13.4", "", { "peerDependencies": { "@trpc/server": "11.13.4", "typescript": ">=5.7.2" } }, "sha512-AOM7u2blAjjpAzEyDXm4bk8f1HML0sFLuSXPsqZHQX3XCIVo7+mlArEAGMbwEtTwW8hUocI0i3/9tVYUF4Nu0g=="], + + "@trpc/react-query": ["@trpc/react-query@11.13.4", "", { "peerDependencies": { "@tanstack/react-query": "^5.80.3", "@trpc/client": "11.13.4", "@trpc/server": "11.13.4", "react": ">=18.2.0", "typescript": ">=5.7.2" } }, "sha512-YGdm8zl2iypiO3Uyw99oToGgnZ51BMoT0YLPkLod0bT7QqJX2oHzBzIBFOOfMupyLEH1pzdEC27F+fw9sAtQsA=="], + + "@trpc/server": ["@trpc/server@11.13.4", "", { "peerDependencies": { "typescript": ">=5.7.2" } }, "sha512-SZmLwi43KSp1D3jp2aPuzqhC644gIy87hgFuD9xWCTwFspH9Pr5DO2/JmpWjCqybTG2fTuKYzxFYLUGjTY5LGg=="], + + "@tsconfig/node10": ["@tsconfig/node10@1.0.12", "", {}, "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ=="], + + "@tsconfig/node12": ["@tsconfig/node12@1.0.11", "", {}, "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="], + + "@tsconfig/node14": ["@tsconfig/node14@1.0.3", "", {}, "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="], + + "@tsconfig/node16": ["@tsconfig/node16@1.0.4", "", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="], + + "@turf/along": ["@turf/along@7.3.4", "", { "dependencies": { "@turf/bearing": "7.3.4", "@turf/destination": "7.3.4", "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-PvIoXin0I1t3nRwJz7uqR6fsxDMqdGwJq90qGOeqkNwlZqlF+5o2wKHPwYwi0RXZhLvxRP5qlbNIvV8ADdbWxw=="], + + "@turf/angle": ["@turf/angle@7.3.4", "", { "dependencies": { "@turf/bearing": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/rhumb-bearing": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-235JAfbrNMjHQXQfd/p+fYnlfCHsQsKHda5Eeyc+/jIY0s5mKvhcxgFaOEnigA2q1n+PrVOExs3BViGTKnWhAg=="], + + "@turf/area": ["@turf/area@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-UEQQFw2XwHpozSBAMEtZI3jDsAad4NnHL/poF7/S6zeDCjEBCkt3MYd6DSGH/cvgcOozxH/ky3/rIVSMZdx4vA=="], + + "@turf/bbox": ["@turf/bbox@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-D5ErVWtfQbEPh11yzI69uxqrcJmbPU/9Y59f1uTapgwAwQHQztDWgsYpnL3ns8r1GmPWLP8sGJLVTIk2TZSiYA=="], + + "@turf/bbox-clip": ["@turf/bbox-clip@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-HCn0q/WPVEE9Dztg7tCvClOPrrh9MoxNUk73byHvcZLBcvziN6F84f/ZbFcbQSh8hgOeVMs/keeqWMqsICcNLg=="], + + "@turf/bbox-polygon": ["@turf/bbox-polygon@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-XCDYQwCA41Bum3R1xX0Na1nR4ozoe/pCYy5bxqrzyMs87kPJUIfBrD5IWxjnZyLqFpfEpolMHJz5ed1uA2PanQ=="], + + "@turf/bearing": ["@turf/bearing@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-zvFjapyFaOrM8nBtAND7f4yb0BJV0jyj6cyoXyTYqLY+3Hn0eHgL0M8lwxDLbTom5KfqYDHDVDQC3+VSfypoEA=="], + + "@turf/bezier-spline": ["@turf/bezier-spline@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-+iDUeiBKByIs/6K5WW8pG6IDxrRLJHFLM80zSpzk2xBtgy3mq36NZwwt67Pu7EJAkc9GUXKIm9SkspoKue9aYQ=="], + + "@turf/boolean-clockwise": ["@turf/boolean-clockwise@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-X/O+u/OsoJ99mujhlqviuB7HX0tdJ5931TBjNSseps43XtROVuB5PwBDgwKfu5lY1B4DSGAxbbxJ795RmPnguQ=="], + + "@turf/boolean-concave": ["@turf/boolean-concave@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-SHuAzjqaAes6ELDZcN/FKZWCQZsqwYv3gMosoLRFWTwKyBQe8i29e4y6XnXakDr1uklVUeRRcdhZ5oKtX9ABPQ=="], + + "@turf/boolean-contains": ["@turf/boolean-contains@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/boolean-point-in-polygon": "7.3.4", "@turf/boolean-point-on-line": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/line-split": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-AJMGbtC6HiXgHvq0RNlTfsDB58Qf9Js45MP/APbhGTH4AiLZ8VMDISywVFNd7qN6oppNlDd3xApVR28+ti8bNg=="], + + "@turf/boolean-crosses": ["@turf/boolean-crosses@7.3.4", "", { "dependencies": { "@turf/boolean-equal": "7.3.4", "@turf/boolean-point-in-polygon": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/line-intersect": "7.3.4", "@turf/polygon-to-line": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-v/U3SuGdkexfLTMhho6Vj0OjqPUeYdThxp8zggGJ1VHow27fvLLez0DjUR3AftHjjHM6bRzZoNsu2qUlEe5hjw=="], + + "@turf/boolean-disjoint": ["@turf/boolean-disjoint@7.3.4", "", { "dependencies": { "@turf/boolean-point-in-polygon": "7.3.4", "@turf/helpers": "7.3.4", "@turf/line-intersect": "7.3.4", "@turf/meta": "7.3.4", "@turf/polygon-to-line": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-Dl4O27ygi2NqskGQuvSlDLJYlJ2SPkHb3A9T/v6eAudjlMiKdEY6bMxKUfU5y+Px1WiCZxd+9rXGXJgGC3WiQg=="], + + "@turf/boolean-equal": ["@turf/boolean-equal@7.3.4", "", { "dependencies": { "@turf/clean-coords": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "geojson-equality-ts": "^1.0.2", "tslib": "^2.8.1" } }, "sha512-AhWqe7D1o0wp3d3QQRSqgWDI8s1JfTFKFe9rU5mrSxYPGlmaQsJC07RCaYfFiGym9lACd1lxBJiPidCbLaPOfw=="], + + "@turf/boolean-intersects": ["@turf/boolean-intersects@7.3.4", "", { "dependencies": { "@turf/boolean-disjoint": "7.3.4", "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-sxi41NXkb5hrJgOvpm32hyBLhW8fem0vn2XxR4+jyRg1rM/v3ziF10/VqC9KDZuDNZkt9JjL9B0825Cf7AN6Lg=="], + + "@turf/boolean-overlap": ["@turf/boolean-overlap@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/line-intersect": "7.3.4", "@turf/line-overlap": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "geojson-equality-ts": "^1.0.2", "tslib": "^2.8.1" } }, "sha512-Q3dlswIuqffSiMfln7xa36YDnN1TWtERMF/155rzjglm4NTUG/6S+gNsb8s6qpLjc+hN6btCq1ZjxAWurPf8Vg=="], + + "@turf/boolean-parallel": ["@turf/boolean-parallel@7.3.4", "", { "dependencies": { "@turf/clean-coords": "7.3.4", "@turf/helpers": "7.3.4", "@turf/line-segment": "7.3.4", "@turf/rhumb-bearing": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-sTNMqsUkLPnSJEqc2IZ5ig3nHRoubyOH2HW1LILqOybCJI630FEM9UoYP1pZniF5nwTyCjQWnXA1FxusVILuFQ=="], + + "@turf/boolean-point-in-polygon": ["@turf/boolean-point-in-polygon@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "point-in-polygon-hao": "^1.1.0", "tslib": "^2.8.1" } }, "sha512-v/4hfyY90Vz9cDgs2GwjQf+Lft8o7mNCLJOTz/iv8SHAIgMMX0czEoIaNVOJr7tBqPqwin1CGwsncrkf5C9n8Q=="], + + "@turf/boolean-point-on-line": ["@turf/boolean-point-on-line@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-70gm5x6YQOZKcw0b/O4jjMwVWnFj+Zb6TXozLgZFDZShc8pgTQtZku7K+HKZ7Eya+7usHIB4IimZauomOMa+iw=="], + + "@turf/boolean-touches": ["@turf/boolean-touches@7.3.4", "", { "dependencies": { "@turf/boolean-point-in-polygon": "7.3.4", "@turf/boolean-point-on-line": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-XOwhjc0oCWhnBUB+l4drpXcg7mkNXPX3SuSz/Xv7gvLH/yRrBwzVGllzK1AHlGU9BVkGVBJIZGYX7jgTM681NQ=="], + + "@turf/boolean-valid": ["@turf/boolean-valid@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/boolean-crosses": "7.3.4", "@turf/boolean-disjoint": "7.3.4", "@turf/boolean-overlap": "7.3.4", "@turf/boolean-point-in-polygon": "7.3.4", "@turf/boolean-point-on-line": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/line-intersect": "7.3.4", "@types/geojson": "^7946.0.10", "geojson-polygon-self-intersections": "^1.2.1", "tslib": "^2.8.1" } }, "sha512-P6M9BtRvzFF2N5g+1/DTIbYGpEbwQ2sv/Pw+uj11P3NYAA9VE8mvrxFYf+CowFdSfY6bY4ejhuqKhrTmAMv7wA=="], + + "@turf/boolean-within": ["@turf/boolean-within@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/boolean-point-in-polygon": "7.3.4", "@turf/boolean-point-on-line": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/line-split": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-eLgi803gz0KcYkyxnnqnz9Vd6tw2/0eAExe/Rq8sO0dqypaSiomSumxjqu89d/yo24Qz8gW7c0kJ6YihNbMYxA=="], + + "@turf/buffer": ["@turf/buffer@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/center": "7.3.4", "@turf/helpers": "7.3.4", "@turf/jsts": "^2.7.1", "@turf/meta": "7.3.4", "@turf/projection": "7.3.4", "@types/geojson": "^7946.0.10", "d3-geo": "1.7.1" } }, "sha512-MVOCBDuOl3KGDsh2stW12RmiFaFeSkVjeUbZ+ADUtIVnv+jlFsmjBpFtsEw8s9YQn5g0667QppOshm0FBHA57Q=="], + + "@turf/center": ["@turf/center@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-4SsLMDHWthXbyIHsczgFCo4fx+8tC8w2+B5HdEuY+P+cSOOL4T+6QQzd7WWjuN/Y3ndowFssUmwRrvXuwVRxQA=="], + + "@turf/center-mean": ["@turf/center-mean@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-6foVk5HLjlSPr48EI686Eis6/bYrJiHjKQlwY/7YlJc1uDitsIjPw2LjUCGIUZDEd6PdNUgg1+LgI7klXYvW3A=="], + + "@turf/center-median": ["@turf/center-median@7.3.4", "", { "dependencies": { "@turf/center-mean": "7.3.4", "@turf/centroid": "7.3.4", "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-Bz6rDr0plQOGSXgT3X3t941pYd44a5vIY8OEt4Y11H1BsgpmzFc6g7L5mr7FXW/uiYGxOewAfNcVUYUdJf9kMg=="], + + "@turf/center-of-mass": ["@turf/center-of-mass@7.3.4", "", { "dependencies": { "@turf/centroid": "7.3.4", "@turf/convex": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-mOSupDF5qxQTA/kOWYletHcBJQ3S2gVl/IRgrBH/YY9yiFq6UGRpZ0sNcIML4H06u/1DY/jqqG+d1nc/1yIA6Q=="], + + "@turf/centroid": ["@turf/centroid@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-6c3kyTSKBrmiPMe75UkHw6MgedroZ6eR5usEvdlDhXgA3MudFPXIZkMFmMd1h9XeJ9xFfkmq+HPCdF0cOzvztA=="], + + "@turf/circle": ["@turf/circle@7.3.4", "", { "dependencies": { "@turf/destination": "7.3.4", "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-6ccr5iT51/XONF+pbpkqoRxKX4ZVWLubXb1frGCnClv2suo1UIY9SIlINNctVDupXd2P9PpqZCbrXATrcrokPg=="], + + "@turf/clean-coords": ["@turf/clean-coords@7.3.4", "", { "dependencies": { "@turf/boolean-point-on-line": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-S61aJXLvPN/uZHtjzmJbLv7xhi28Sq3PshCIZSvno4Mo45bvl79Vg4aZskrG05AaSSbipplqfH+MZrkW9Xboeg=="], + + "@turf/clone": ["@turf/clone@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-pwQ+RyQw986uu7IulY/18NRAebwZZScb084bvVqVkTrllwLSv4oVBqUxmUMiwtp+PNdiRGRFOvNyZqtRsiD+Jw=="], + + "@turf/clusters": ["@turf/clusters@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-+zoSyiF0LilXy4Tr0/lC7IgqbTMZZ2wwP3iSrqre58b61pUtdhCnBcjA2r8FkcW7z3GMbGf5XkIWhO+b+vDSsw=="], + + "@turf/clusters-dbscan": ["@turf/clusters-dbscan@7.3.4", "", { "dependencies": { "@turf/clone": "7.3.4", "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "@types/geokdbush": "^1.1.5", "geokdbush": "^2.0.1", "kdbush": "^4.0.2", "tslib": "^2.8.1" } }, "sha512-RkuXf767Shk0AfY+fh0PASVw8YR4H8zYR7XQrCgWd/bCuh6CXs7rWZ6UTLu/PiA6y6WsIhyAQv4LhNH5kCzpbA=="], + + "@turf/clusters-kmeans": ["@turf/clusters-kmeans@7.3.4", "", { "dependencies": { "@turf/clone": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "skmeans": "0.9.7", "tslib": "^2.8.1" } }, "sha512-89mlwhcb+vyZAKX0eBa3LQ8VyIKLayrzJpKGb90sEkIu0hDua9JCE+zlbaPoUAvAqflEiX+poFFuh7pngtsBMg=="], + + "@turf/collect": ["@turf/collect@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/boolean-point-in-polygon": "7.3.4", "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "rbush": "^3.0.1", "tslib": "^2.8.1" } }, "sha512-fG28oDZK4HCXC/AhF0pmHKLtI9DWwdJr/ktuWolrqzA5b1G7eawrXwDu8B5I3sXhdWonNRMcuLbIuz+XQscHKw=="], + + "@turf/combine": ["@turf/combine@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-wNp9ar4FfpTfQXLZWXQ/jUBBoUFOwRN/mmlv5xrhoYFpP/F5SNy7GVDMZXaBfHdUUplfJUPF5hIKQlCUR8+k3A=="], + + "@turf/concave": ["@turf/concave@7.3.4", "", { "dependencies": { "@turf/clone": "7.3.4", "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@turf/tin": "7.3.4", "@types/geojson": "^7946.0.10", "topojson-client": "3.x", "topojson-server": "3.x", "tslib": "^2.8.1" } }, "sha512-HZa1CV2pv4Xpcoe3t5S3ZW6j9jVbc27exzKwZWF7MlFxSz4BKRirWiME8Fku8nvQcGafpfLc+Lwpma+nGvg06w=="], + + "@turf/convex": ["@turf/convex@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "concaveman": "^1.2.1", "tslib": "^2.8.1" } }, "sha512-zeNv0fFdOoHuOQB7nl6OLb0DyjvzDvm0e3zlFkph50GF9pEKOmkCSmlniw681aWL2aRBdWZBnON3rRzOS+9C7Q=="], + + "@turf/destination": ["@turf/destination@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-YxoUJwkKmTHiRFQxMQOP0tz8Vy+ga5EXl+C+F/WubjDLwT1AJu5y8CNIjLvWyjPWckj/vZG4u/1js5bx6MLADA=="], + + "@turf/difference": ["@turf/difference@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "polyclip-ts": "^0.16.8", "tslib": "^2.8.1" } }, "sha512-kIxizNQrYLO2rtqUIeed0tPycicrXoipy/g9d4mjv91kzBEbwpyojz9zi8U9G1ISBfCEgA7wsViQD0r+8qzxXw=="], + + "@turf/dissolve": ["@turf/dissolve@7.3.4", "", { "dependencies": { "@turf/flatten": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "polyclip-ts": "^0.16.8", "tslib": "^2.8.1" } }, "sha512-xjGY1gQ4icWhDgsW0YfU2KQtij1+ru34AfvtkVMQEgI86O9EwjW2r9Jq5DJY2PMKPbor3kz9yM/RTOiDP7f3Jg=="], + + "@turf/distance": ["@turf/distance@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-9drWgd46uHPPyzgrcRQLgSvdS/SjVlQ6ZIBoRQagS5P2kSjUbcOXHIMeOSPwfxwlKhEtobLyr+IiR2ns1TfF8w=="], + + "@turf/distance-weight": ["@turf/distance-weight@7.3.4", "", { "dependencies": { "@turf/centroid": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-dVMNEmIluKgn7iQTmzJJOe0UASRNmmSdFX1boAev5MISaW3AvPiURCCOV+lTIeoaQbWRpEAESbAp6JIimXFr8Q=="], + + "@turf/ellipse": ["@turf/ellipse@7.3.4", "", { "dependencies": { "@turf/destination": "7.3.4", "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/transform-rotate": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-SMgbERZl12j7H8YaIofmnf0NwAvdF5Wly4tjI/eUhj/sFOKrKXOS1lvCSBJ6uSV9tFijl3ecGOVOlTpURdZ30g=="], + + "@turf/envelope": ["@turf/envelope@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/bbox-polygon": "7.3.4", "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-anXSjYMXGAyXT7rpO74VyRI0q/rPAbKE/MYvou+QvG0U/Oa7el0yF4JNNi9wKEAxXg/10aWm9kHp8s2caeLg6A=="], + + "@turf/explode": ["@turf/explode@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-7QWhp3f8jhrWjvArhJ74hXBFHMaiJr/2Y1PzHCWue2/pC5MbbTV0o7peehwrrrJC/1uD6CVb3hlcb77IxtMQkw=="], + + "@turf/flatten": ["@turf/flatten@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-Yt3HCh/qeNaXS4LYhXczFhBfTeaKlTBoxEw1OICb9RT3SiGU0XCxuK7H0W26OLo7XxB0qP7GPs2L3FZbiri6wQ=="], + + "@turf/flip": ["@turf/flip@7.3.4", "", { "dependencies": { "@turf/clone": "7.3.4", "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-HME+kVMTyvcsYVY6dC6DTvuzq8vvDpw+C7PviEqpuT3KcVlBCoGPAqlWRdyWYOb9MDciOqNxvvJF/okpb/GQcg=="], + + "@turf/geojson-rbush": ["@turf/geojson-rbush@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "rbush": "^3.0.1", "tslib": "^2.8.1" } }, "sha512-aDG/5mMCgKduqBwZ3XpLOdlE2hizV3fM+5dHCWyrBepCQLeM/QRvvpBDCdQKDWKpoIBmrGGYDNiOofnf3QmGhg=="], + + "@turf/great-circle": ["@turf/great-circle@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "arc": "^0.2.0", "tslib": "^2.8.1" } }, "sha512-JvfzWFL9efP+xKtOnKzGvwEIXfaN0CLZoPPxNnWa/cVisLs9FVMlC9PWnuL3/3aqH5VhBHPddmU8ipzNE6KIIA=="], + + "@turf/helpers": ["@turf/helpers@7.3.4", "", { "dependencies": { "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-U/S5qyqgx3WTvg4twaH0WxF3EixoTCfDsmk98g1E3/5e2YKp7JKYZdz0vivsS5/UZLJeZDEElOSFH4pUgp+l7g=="], + + "@turf/hex-grid": ["@turf/hex-grid@7.3.4", "", { "dependencies": { "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@turf/intersect": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-TDCgBykFdsrP3IOOfToiiLpYkbUb3eEEhM9riIqWht0ubKUY61LN7qVs9bxZD83hG6XaDB6uY7SWkxK1zIEopQ=="], + + "@turf/interpolate": ["@turf/interpolate@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/centroid": "7.3.4", "@turf/clone": "7.3.4", "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@turf/hex-grid": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@turf/point-grid": "7.3.4", "@turf/square-grid": "7.3.4", "@turf/triangle-grid": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-lwYSMbHxsXYEWObv0tyBCjwTLXyfsTvOLn/NFhlsGrNCYEXn8I1VPtLGwuxbSdF3hVRgurn8qftkB1npHrNs6Q=="], + + "@turf/intersect": ["@turf/intersect@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "polyclip-ts": "^0.16.8", "tslib": "^2.8.1" } }, "sha512-VsqMEMeRWWs2mjwI7sTlUgH1cEfugTGhQ0nF8ncHG7YKd9HUUTzIKpn9FJeoguPWIYITcy1ar4yJEOU/hteBVw=="], + + "@turf/invariant": ["@turf/invariant@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-88Eo4va4rce9sNZs6XiMJowWkikM3cS2TBhaCKlU+GFHdNf8PFEpiU42VDU8q5tOF6/fu21Rvlke5odgOGW4AQ=="], + + "@turf/isobands": ["@turf/isobands@7.3.4", "", { "dependencies": { "@turf/area": "7.3.4", "@turf/bbox": "7.3.4", "@turf/boolean-point-in-polygon": "7.3.4", "@turf/explode": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-SFYefwjQdQfF0MV0zfaSwNg9J1wD7mfPP8scGcScKGM3admbwS2A3V8rqPADBfYLD2eCPBDFnySxcl9SHbPung=="], + + "@turf/isolines": ["@turf/isolines@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-UFRIULkIgkZOmrhLxExWvguixbzfoCgVcXIqo2Cp68do4v+nwc3pTM7MTt4DBVFloIdX0Usrn4K44LQ/V05gxg=="], + + "@turf/jsts": ["@turf/jsts@2.7.2", "", { "dependencies": { "jsts": "2.7.1" } }, "sha512-zAezGlwWHPyU0zxwcX2wQY3RkRpwuoBmhhNE9HY9kWhFDkCxZ3aWK5URKwa/SWKJbj9aztO+8vtdiBA28KVJFg=="], + + "@turf/kinks": ["@turf/kinks@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-LZTKELWxvXl0vc9ZxVgi0v07fO9+2FrZOam2B10fz/eGjy3oKNazU5gjggbnc499wEIcJS4hN+VyjQZrmsJAdQ=="], + + "@turf/length": ["@turf/length@7.3.4", "", { "dependencies": { "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-Dg1GnQ/B2go5NIWXt91N4L7XTjIgIWCftBSYIXkrpIM7QGjItzglek0Z5caytvb8ZRWXzZOGs8//+Q5we91WuQ=="], + + "@turf/line-arc": ["@turf/line-arc@7.3.4", "", { "dependencies": { "@turf/circle": "7.3.4", "@turf/destination": "7.3.4", "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-nqZ+JKjDVIrvREFHgtJIP9Ps4WbWw3eStqdIzAPolrzoXyAZnpIKquyfRTxpJFYUUjDmf+uQ/SFWsPP4SOWAqQ=="], + + "@turf/line-chunk": ["@turf/line-chunk@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/length": "7.3.4", "@turf/line-slice-along": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-xWEHR99EpUO5ZPEZhMfa0QvnFZC0W+QLxB1GcJcSeJAQ5ZMXUXY8doKF1Nztk0eppawMprEEO3nQWLvQoR4z2g=="], + + "@turf/line-intersect": ["@turf/line-intersect@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "sweepline-intersections": "^1.5.0", "tslib": "^2.8.1" } }, "sha512-XygbTvHa6A+v6l2ZKYtS8AAWxwmrPxKxfBbdH75uED1JvdytSLWYTKGlcU3soxd9sYb4x/g9sDvRIVyU6Lucrg=="], + + "@turf/line-offset": ["@turf/line-offset@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-CSrg3njde9Tx+C0oL+BHUpZYpgD+PEmzp0ldDNis5ZQiTe5tUrwiIyG7A/QXf9eDnGhtV1WhCAycX0Wjged4pg=="], + + "@turf/line-overlap": ["@turf/line-overlap@7.3.4", "", { "dependencies": { "@turf/boolean-point-on-line": "7.3.4", "@turf/geojson-rbush": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/line-segment": "7.3.4", "@turf/meta": "7.3.4", "@turf/nearest-point-on-line": "7.3.4", "@types/geojson": "^7946.0.10", "fast-deep-equal": "^3.1.3", "tslib": "^2.8.1" } }, "sha512-3GBECiwNAQ2MmSwiqAHMweIl+EiePK0Jx4fXxF1KFE+NGCDv/MbGcEYfAbmsTg8mg6oRI9D8fJZzrT44DHpHXA=="], + + "@turf/line-segment": ["@turf/line-segment@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-UeISzf/JHoWEY5yeoyvKwA5epWcvJMCpCwbIMolvfTC5pp+IVozjHPVCRvRWuzmbmAvetcW0unL5bjqi0ADmuQ=="], + + "@turf/line-slice": ["@turf/line-slice@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/nearest-point-on-line": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-6Vt4Eptdr2C5T+jtpbo8D4v8b6X7KqYonPPyMB6huv+Kcg3nz4JRI9OQCDCaon9rWvU3ffWwjsjcbJCQS9o0sA=="], + + "@turf/line-slice-along": ["@turf/line-slice-along@7.3.4", "", { "dependencies": { "@turf/bearing": "7.3.4", "@turf/destination": "7.3.4", "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-RT5HydNy8+m9Y3u39USeYZauG2EyMqCYoLnTpWcAxbZGdq9WjIwdzAwYir3d8eJkOzjlR6Khz071VM4Ufqs0Kg=="], + + "@turf/line-split": ["@turf/line-split@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/geojson-rbush": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/line-intersect": "7.3.4", "@turf/line-segment": "7.3.4", "@turf/meta": "7.3.4", "@turf/nearest-point-on-line": "7.3.4", "@turf/truncate": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-l1zmCSUnGsiN4gf22Aw91a2VnYs5DZS67FdkYqKgr+wPEAL/gpQgIBBWSTmhwY8zb3NEqty+f/gMEe8EJAWYng=="], + + "@turf/line-to-polygon": ["@turf/line-to-polygon@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/clone": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-vRnDHjzwOroC74/fsJEU+dUeGhiR/B2bG0/HeEWRBplAjmwVPptRBmDGtXKTz8sbA6or17/XtOITp3zTU0lBZw=="], + + "@turf/mask": ["@turf/mask@7.3.4", "", { "dependencies": { "@turf/clone": "7.3.4", "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "polyclip-ts": "^0.16.8", "tslib": "^2.8.1" } }, "sha512-FJIlSk8m0AiqzNoLSMdYuhDRif6aeOYVdW/WxjEjpUoMalwy2w5MMlZqJB9zxt/xSrMq6lvTWJgZfZfGL2s4ZQ=="], + + "@turf/meta": ["@turf/meta@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-tlmw9/Hs1p2n0uoHVm1w3ugw1I6L8jv9YZrcdQa4SH5FX5UY0ATrKeIvfA55FlL//PGuYppJp+eyg/0eb4goqw=="], + + "@turf/midpoint": ["@turf/midpoint@7.3.4", "", { "dependencies": { "@turf/bearing": "7.3.4", "@turf/destination": "7.3.4", "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-/XAeGvsz8l5HaqcP7TUlexzGfibqXozQgBZ8rH7az6op2Dfm3pL/Z7bKLHoVavM0ccBg0Pt7g6j9NM54kZWdKA=="], + + "@turf/moran-index": ["@turf/moran-index@7.3.4", "", { "dependencies": { "@turf/distance-weight": "7.3.4", "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-SNb16szwEG0OiyNn3z9zvSnk3M3tfwvvN8i//9UIC32APEApI+MRXCl93H/qZkKMhhh/cHA0pF0pjYZwl5z8Ow=="], + + "@turf/nearest-neighbor-analysis": ["@turf/nearest-neighbor-analysis@7.3.4", "", { "dependencies": { "@turf/area": "7.3.4", "@turf/bbox": "7.3.4", "@turf/bbox-polygon": "7.3.4", "@turf/centroid": "7.3.4", "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@turf/nearest-point": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-8EZlDy5poU0t7BDy8KTzOmfiGsAs2kWuB3/kgI4sMdbThKVk2P4hHKuToCSGvqAzwSy3B2qKYM1N6JeVWytu+w=="], + + "@turf/nearest-point": ["@turf/nearest-point@7.3.4", "", { "dependencies": { "@turf/clone": "7.3.4", "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-WfI09f2bX0nKx/jkO7zCt3tUrJulyAlUYQtZHP7lWYMCOmZ6Pq26D6lKWjpfs2it0OHbhlx1XF/UupEUaz830w=="], + + "@turf/nearest-point-on-line": ["@turf/nearest-point-on-line@7.3.4", "", { "dependencies": { "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-DQrP3lRju83rIXFN68tUEpc7ki/eRwdwBkK2CTT4RAcyCxbcH2NGJPQv8dYiww/Ar77u1WLVn+aINXZH904dWw=="], + + "@turf/nearest-point-to-line": ["@turf/nearest-point-to-line@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@turf/point-to-line-distance": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-Nzp3ojQt0gDACNYG+oNWymRXAUCey0LzdiSezYtRwdA0/+FQCtuxP8Lbc8FftV10JL8D78/CRlmt7omaXLLXCg=="], + + "@turf/planepoint": ["@turf/planepoint@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-KAhMAnddbuWIEZuk2bK//g+xTeKn8aV9N2AaE27x6JMJyV/wqvatIuVVqEIXI3SkAFbhiVBpVuarvPYhrJ+fhg=="], + + "@turf/point-grid": ["@turf/point-grid@7.3.4", "", { "dependencies": { "@turf/boolean-within": "7.3.4", "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-9CL3OJ4dEt266+fxYlOQeRFqAY3XtsAuak2Gpk+K8k+Y3yGv8pvyn3QaAQ6P2npbiKt0zfG8Md/+HBAPOMPQ0A=="], + + "@turf/point-on-feature": ["@turf/point-on-feature@7.3.4", "", { "dependencies": { "@turf/boolean-point-in-polygon": "7.3.4", "@turf/center": "7.3.4", "@turf/explode": "7.3.4", "@turf/helpers": "7.3.4", "@turf/nearest-point": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-tQfIxsJUxZqyO7OeJC25y3DqN9i4fmrAt4TBrPvZcIIwymgN7aMrElJKlg/dfi7JDihKp3h/CkWMjtMQA14Vwg=="], + + "@turf/point-to-line-distance": ["@turf/point-to-line-distance@7.3.4", "", { "dependencies": { "@turf/bearing": "7.3.4", "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@turf/nearest-point-on-line": "7.3.4", "@turf/projection": "7.3.4", "@turf/rhumb-bearing": "7.3.4", "@turf/rhumb-distance": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-IdPAxlAQZj7FCZg+ObyVHlNdqwLL/oxYoQjpxMNJ511gNxokCtEv0aeRZQjYOYIxr9Ss97v3yo3ILJaF9V2kPw=="], + + "@turf/point-to-polygon-distance": ["@turf/point-to-polygon-distance@7.3.4", "", { "dependencies": { "@turf/boolean-point-in-polygon": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@turf/point-to-line-distance": "7.3.4", "@turf/polygon-to-line": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-VxbkgHyzCkYWSxirqSUqw+lzbYmTf2qFhVZ/T5dprhwyXWcgalpupvgRzmZmjKkgsoJ017vrvCNKZRaCCn+Z7Q=="], + + "@turf/points-within-polygon": ["@turf/points-within-polygon@7.3.4", "", { "dependencies": { "@turf/boolean-point-in-polygon": "7.3.4", "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-HfT83Iw99zywDfCp+nJwS+JDzH+GdNug0sut9WDjGEznHKoZyAcOk+hGKL/ja8TeCLx9VsZHOiVCQFm+NTgvgA=="], + + "@turf/polygon-smooth": ["@turf/polygon-smooth@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-AnpaGgNYVvP/dfz10id3AotDrUh9O+4unXCk3es1ff51VrpUhVgH3H+zyTSbVL4zAXN/ejPb8UnKCxDvNOQs4g=="], + + "@turf/polygon-tangents": ["@turf/polygon-tangents@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/boolean-within": "7.3.4", "@turf/explode": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/nearest-point": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-D1IFocXJYF8PUMZ+BmnOstyRrzklqC86FgakYVk9O61F9Ki8LhMGaRfF+6reKMD473KvHvEf1M2EgmGt+OHDRw=="], + + "@turf/polygon-to-line": ["@turf/polygon-to-line@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-xhmOZ5rHZAKLUDLeYKWMsX84ip8CCGOcGLBHtPPYOjdIDHddMV6Sxt5kVgkmlZpK6NEWEmOD6lYR4obxHcHlGA=="], + + "@turf/polygonize": ["@turf/polygonize@7.3.4", "", { "dependencies": { "@turf/boolean-point-in-polygon": "7.3.4", "@turf/envelope": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-kmj05rkJ4tE8LvbQ4GVsL5GOrRiX/F5W4RIdxo8gPGTw1Y5oLG/1vFk6Hg6x63L1WcdNtF0sq6AdEI0G9BXWXA=="], + + "@turf/projection": ["@turf/projection@7.3.4", "", { "dependencies": { "@turf/clone": "7.3.4", "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-p91zOaLmzoBHzU/2H6Ot1tOhTmAom85n1P7I4Oo0V9xU8hmJXWfNnomLFf/6rnkKDIFZkncLQIBz4iIecZ61sA=="], + + "@turf/quadrat-analysis": ["@turf/quadrat-analysis@7.3.4", "", { "dependencies": { "@turf/area": "7.3.4", "@turf/bbox": "7.3.4", "@turf/bbox-polygon": "7.3.4", "@turf/centroid": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/point-grid": "7.3.4", "@turf/random": "7.3.4", "@turf/square-grid": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-Yxqq8wgrDiXIX+s0uOZ2exmYfRwTIcUX8J7j4P+sbyLVbyN8W3AjN2s5ZX21P0aFf3v24FBd2fNWlm5VmMUAdg=="], + + "@turf/random": ["@turf/random@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-CXMS5XDoI5x0zc1aCYbn3t603k8hjaFHNsSOvGBW20z68cwP0UwMQQr0KLqFPqI4J1O7dMX+urn8IHH27RXFYg=="], + + "@turf/rectangle-grid": ["@turf/rectangle-grid@7.3.4", "", { "dependencies": { "@turf/boolean-intersects": "7.3.4", "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-qM7vujJ4wndB4MKZlEcnUSawgvs5wXpSEFf4f+LWRIfmGhtv6serzDqFzWcmy8kF8hg5J465PMktRmAFWq/a+w=="], + + "@turf/rewind": ["@turf/rewind@7.3.4", "", { "dependencies": { "@turf/boolean-clockwise": "7.3.4", "@turf/clone": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-4BZ8MHMujl4NAT7XnIs7JoOuDhpR96oDTB0RtqTeIP4onioIedVnw1ZA3Uq08sILGpR0qKLuDsvdz4x9jtbptg=="], + + "@turf/rhumb-bearing": ["@turf/rhumb-bearing@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-tvX1toSo80q0iL0cUMMXpSKsCCfOjRqDGCmOdR6B9shhk6xP1ZM2PLQDr+MFPBFeGyQuyY4CNFkV2+3DF49vYw=="], + + "@turf/rhumb-destination": ["@turf/rhumb-destination@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-6HikEb5nm2A18FQWk6vVLMQkc099I/7c69j47RYM27xQK8J8uBCNk1zLYyMPcZTh24xcNSbZ1iPHDsDOqw6wWQ=="], + + "@turf/rhumb-distance": ["@turf/rhumb-distance@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-phwskeijdgYMsR3qDQmytfsg2iZcp3uWK7UFc76wKTEpxozbDGFI4enX5gXvZPpyI1iD7gsktGqHsO33AjnFDA=="], + + "@turf/sample": ["@turf/sample@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-XzAATg09c2XYAXkIBbg8lktSrU1tXNjJYXtbVwF6jLp1q2wTRpwb+mZpTEPAwzZwVF81uR5c0CsdQyr5UHINVw=="], + + "@turf/sector": ["@turf/sector@7.3.4", "", { "dependencies": { "@turf/circle": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/line-arc": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-x2tNAXl21HRcF302ghU5ohE/vmmfDcXpQKgoWHyi7o5Q9kDRBwy7kbvr5YxbT3vwW/kAWUDYM7FoXNH42bXgCw=="], + + "@turf/shortest-path": ["@turf/shortest-path@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/bbox-polygon": "7.3.4", "@turf/boolean-point-in-polygon": "7.3.4", "@turf/clean-coords": "7.3.4", "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@turf/transform-scale": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-xbK/oM+JRL+lJCHkAdZ3QPgoivT40J9WKJ0d1Ddt8LXTpzX2YeJVgcwOZaBPG9ncZUzHfHIWS1rUjc54clnZcg=="], + + "@turf/simplify": ["@turf/simplify@7.3.4", "", { "dependencies": { "@turf/clean-coords": "7.3.4", "@turf/clone": "7.3.4", "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-OoSwu3vI0H9P+GzLDaOJIL9v0V8ubeP8wQjM8GeMEZrq6U2uh9JWQnAU+jviT3ODcKF5H+88snpiMik585L0wA=="], + + "@turf/square": ["@turf/square@7.3.4", "", { "dependencies": { "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-vJ+NeiEaOVsb8YiUExtyIgvH+ZybthHszl2TASZn5q340ioKHPb2JeHGlbgrB2x8pEMh3MVhoqxAbXDuND/cnw=="], + + "@turf/square-grid": ["@turf/square-grid@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/rectangle-grid": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-MgjlVRklQYFfQm9yJNha9kXothLPliVdeycNdmn4lWLH3SOZe1rqJPB5Z9+dhmJELT3BJraDq3W5ik5taEpKyQ=="], + + "@turf/standard-deviational-ellipse": ["@turf/standard-deviational-ellipse@7.3.4", "", { "dependencies": { "@turf/center-mean": "7.3.4", "@turf/ellipse": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@turf/points-within-polygon": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-+BaetOKN8zA2mQCVTcRWMcfidNR3JkjmYj0r5iGRncK0J+pdxIjX2q6sF6yBMOOxMoEMy393P7j07HdBIPbibw=="], + + "@turf/tag": ["@turf/tag@7.3.4", "", { "dependencies": { "@turf/boolean-point-in-polygon": "7.3.4", "@turf/clone": "7.3.4", "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-ienLhLzBLeChtKhbJMmU3/vGg0hWzi6Wh/q0n39W4CmdNb+yAoGQhlYjcCbPOJT4IcdFlWE3OhbP9EmH/xPgfg=="], + + "@turf/tesselate": ["@turf/tesselate@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "earcut": "^2.2.4", "tslib": "^2.8.1" } }, "sha512-NnDgVb5ZchJEhEpq1je2hktS5UhnHMfeeumxZQgnIoMeGILpJtcOL//b/1biBBUVSJ0ZZg5zxiHdQc1PgK2gxA=="], + + "@turf/tin": ["@turf/tin@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-tuegrGlbKPp6Dm8r5SuYDtQ2EVzdXVVxelqI1agnzj9N+l8oTBIKLRxRbBkLsizeVIDnlmVHCQB6cRc3v+u8JQ=="], + + "@turf/transform-rotate": ["@turf/transform-rotate@7.3.4", "", { "dependencies": { "@turf/centroid": "7.3.4", "@turf/clone": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@turf/rhumb-bearing": "7.3.4", "@turf/rhumb-destination": "7.3.4", "@turf/rhumb-distance": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-pbUG6QLwyJvvitq4aAq4IQH79X8T0NmEPUGDUEEP69yW7t4+UZjDBAVbCKwpOc8gtsK0K5yvxlZ0e2CdtpNmEw=="], + + "@turf/transform-scale": ["@turf/transform-scale@7.3.4", "", { "dependencies": { "@turf/bbox": "7.3.4", "@turf/center": "7.3.4", "@turf/centroid": "7.3.4", "@turf/clone": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@turf/rhumb-bearing": "7.3.4", "@turf/rhumb-destination": "7.3.4", "@turf/rhumb-distance": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-7gUIFFHaU3Ewj3rCzIu5Yo7Zjfv4R2ypjh6UWiMJnDavb7RQ8fn0AKKcNMA/vF/yxuncp2l3zoa2gygv4AKM8A=="], + + "@turf/transform-translate": ["@turf/transform-translate@7.3.4", "", { "dependencies": { "@turf/clone": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@turf/meta": "7.3.4", "@turf/rhumb-destination": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-qbSIEueOR8mNB7p4EB88vHvUAyuSBM8zxP68UiiTNV3Gh+OZF2VXTFiu3EFYMTaD9sE6Lxmzvv3fjW8N2q82pw=="], + + "@turf/triangle-grid": ["@turf/triangle-grid@7.3.4", "", { "dependencies": { "@turf/distance": "7.3.4", "@turf/helpers": "7.3.4", "@turf/intersect": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-0bki10XwYvNcPzDcSs5kUh3niOogdVeFtawJEz5FdlyTAUohbNlC+Vb40K//OqEyTrGII+q1/dE4q+1J6ZCmDA=="], + + "@turf/truncate": ["@turf/truncate@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-VPXdae9+RLLM19FMrJgt7QANBikm7DxPbfp/dXgzE4Ca7v+mJ4T1fYc7gCZDaqOrWMccHKbvv4iSuW7YZWdIIA=="], + + "@turf/turf": ["@turf/turf@7.3.4", "", { "dependencies": { "@turf/along": "7.3.4", "@turf/angle": "7.3.4", "@turf/area": "7.3.4", "@turf/bbox": "7.3.4", "@turf/bbox-clip": "7.3.4", "@turf/bbox-polygon": "7.3.4", "@turf/bearing": "7.3.4", "@turf/bezier-spline": "7.3.4", "@turf/boolean-clockwise": "7.3.4", "@turf/boolean-concave": "7.3.4", "@turf/boolean-contains": "7.3.4", "@turf/boolean-crosses": "7.3.4", "@turf/boolean-disjoint": "7.3.4", "@turf/boolean-equal": "7.3.4", "@turf/boolean-intersects": "7.3.4", "@turf/boolean-overlap": "7.3.4", "@turf/boolean-parallel": "7.3.4", "@turf/boolean-point-in-polygon": "7.3.4", "@turf/boolean-point-on-line": "7.3.4", "@turf/boolean-touches": "7.3.4", "@turf/boolean-valid": "7.3.4", "@turf/boolean-within": "7.3.4", "@turf/buffer": "7.3.4", "@turf/center": "7.3.4", "@turf/center-mean": "7.3.4", "@turf/center-median": "7.3.4", "@turf/center-of-mass": "7.3.4", "@turf/centroid": "7.3.4", "@turf/circle": "7.3.4", "@turf/clean-coords": "7.3.4", "@turf/clone": "7.3.4", "@turf/clusters": "7.3.4", "@turf/clusters-dbscan": "7.3.4", "@turf/clusters-kmeans": "7.3.4", "@turf/collect": "7.3.4", "@turf/combine": "7.3.4", "@turf/concave": "7.3.4", "@turf/convex": "7.3.4", "@turf/destination": "7.3.4", "@turf/difference": "7.3.4", "@turf/dissolve": "7.3.4", "@turf/distance": "7.3.4", "@turf/distance-weight": "7.3.4", "@turf/ellipse": "7.3.4", "@turf/envelope": "7.3.4", "@turf/explode": "7.3.4", "@turf/flatten": "7.3.4", "@turf/flip": "7.3.4", "@turf/geojson-rbush": "7.3.4", "@turf/great-circle": "7.3.4", "@turf/helpers": "7.3.4", "@turf/hex-grid": "7.3.4", "@turf/interpolate": "7.3.4", "@turf/intersect": "7.3.4", "@turf/invariant": "7.3.4", "@turf/isobands": "7.3.4", "@turf/isolines": "7.3.4", "@turf/kinks": "7.3.4", "@turf/length": "7.3.4", "@turf/line-arc": "7.3.4", "@turf/line-chunk": "7.3.4", "@turf/line-intersect": "7.3.4", "@turf/line-offset": "7.3.4", "@turf/line-overlap": "7.3.4", "@turf/line-segment": "7.3.4", "@turf/line-slice": "7.3.4", "@turf/line-slice-along": "7.3.4", "@turf/line-split": "7.3.4", "@turf/line-to-polygon": "7.3.4", "@turf/mask": "7.3.4", "@turf/meta": "7.3.4", "@turf/midpoint": "7.3.4", "@turf/moran-index": "7.3.4", "@turf/nearest-neighbor-analysis": "7.3.4", "@turf/nearest-point": "7.3.4", "@turf/nearest-point-on-line": "7.3.4", "@turf/nearest-point-to-line": "7.3.4", "@turf/planepoint": "7.3.4", "@turf/point-grid": "7.3.4", "@turf/point-on-feature": "7.3.4", "@turf/point-to-line-distance": "7.3.4", "@turf/point-to-polygon-distance": "7.3.4", "@turf/points-within-polygon": "7.3.4", "@turf/polygon-smooth": "7.3.4", "@turf/polygon-tangents": "7.3.4", "@turf/polygon-to-line": "7.3.4", "@turf/polygonize": "7.3.4", "@turf/projection": "7.3.4", "@turf/quadrat-analysis": "7.3.4", "@turf/random": "7.3.4", "@turf/rectangle-grid": "7.3.4", "@turf/rewind": "7.3.4", "@turf/rhumb-bearing": "7.3.4", "@turf/rhumb-destination": "7.3.4", "@turf/rhumb-distance": "7.3.4", "@turf/sample": "7.3.4", "@turf/sector": "7.3.4", "@turf/shortest-path": "7.3.4", "@turf/simplify": "7.3.4", "@turf/square": "7.3.4", "@turf/square-grid": "7.3.4", "@turf/standard-deviational-ellipse": "7.3.4", "@turf/tag": "7.3.4", "@turf/tesselate": "7.3.4", "@turf/tin": "7.3.4", "@turf/transform-rotate": "7.3.4", "@turf/transform-scale": "7.3.4", "@turf/transform-translate": "7.3.4", "@turf/triangle-grid": "7.3.4", "@turf/truncate": "7.3.4", "@turf/union": "7.3.4", "@turf/unkink-polygon": "7.3.4", "@turf/voronoi": "7.3.4", "@types/geojson": "^7946.0.10", "@types/kdbush": "^3.0.5", "tslib": "^2.8.1" } }, "sha512-uMAKLYt2tWJj8xIepq4vExF1r8fzJviP/5l/elDHuRyauI2mASy/Gox6kSFlrN0t0p8AT4Cs8o//4GuJTXyC+Q=="], + + "@turf/union": ["@turf/union@7.3.4", "", { "dependencies": { "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "polyclip-ts": "^0.16.8", "tslib": "^2.8.1" } }, "sha512-JJYyPMmGcrTa9sPv2ief2QU9Hb//cEAU1zgKu/OfoCMa9a8Imp5QVm9UTAkhGlc+4qm/N/X16iJ+cvVWaxPjkg=="], + + "@turf/unkink-polygon": ["@turf/unkink-polygon@7.3.4", "", { "dependencies": { "@turf/area": "7.3.4", "@turf/boolean-point-in-polygon": "7.3.4", "@turf/helpers": "7.3.4", "@turf/meta": "7.3.4", "@types/geojson": "^7946.0.10", "rbush": "^3.0.1", "tslib": "^2.8.1" } }, "sha512-dFIqTLAnLL5D3OANPJtRb5OvmOM81GlNCjwgjlLQy0xdpYgKwGdE+gNXjygDrPUUXNc22xnaj3EfAfC3Pq7W4Q=="], + + "@turf/voronoi": ["@turf/voronoi@7.3.4", "", { "dependencies": { "@turf/clone": "7.3.4", "@turf/helpers": "7.3.4", "@turf/invariant": "7.3.4", "@types/d3-voronoi": "^1.1.12", "@types/geojson": "^7946.0.10", "d3-voronoi": "1.1.2", "tslib": "^2.8.1" } }, "sha512-cwKSiDzDHRnA7yafQ1zOhWxRuMzp+fYFFzadCdByBAG1jAD7UlFwKhS1fjNPBNs67Fl5X3LL5ahCLW5gEdFgmg=="], + + "@tweenjs/tween.js": ["@tweenjs/tween.js@23.1.3", "", {}, "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], + + "@types/bcryptjs": ["@types/bcryptjs@2.4.6", "", {}, "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ=="], + + "@types/bun": ["@types/bun@1.3.11", "", { "dependencies": { "bun-types": "1.3.11" } }, "sha512-5vPne5QvtpjGpsGYXiFyycfpDF2ECyPcTSsFBMa0fraoxiQyMJ3SmuQIGhzPg2WJuWxVBoxWJ2kClYTcw/4fAg=="], + + "@types/canvas-confetti": ["@types/canvas-confetti@1.9.0", "", {}, "sha512-aBGj/dULrimR1XDZLtG9JwxX1b4HPRF6CX9Yfwh3NvstZEm1ZL7RBnel4keCPSqs1ANRu1u2Aoz9R+VmtjYuTg=="], + + "@types/cors": ["@types/cors@2.8.19", "", { "dependencies": { "@types/node": "*" } }, "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg=="], + + "@types/d3-voronoi": ["@types/d3-voronoi@1.1.12", "", {}, "sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw=="], + + "@types/draco3d": ["@types/draco3d@1.4.10", "", {}, "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], + + "@types/geojson-vt": ["@types/geojson-vt@3.2.5", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g=="], + + "@types/geokdbush": ["@types/geokdbush@1.1.5", "", { "dependencies": { "@types/kdbush": "^1" } }, "sha512-jIsYnXY+RQ/YCyBqeEHxYN9mh+7PqKJUJUp84wLfZ7T2kqyVPNaXwZuvf1A2uQUkrvVqEbsG94ff8jH32AlLvA=="], + + "@types/graceful-fs": ["@types/graceful-fs@4.1.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ=="], + + "@types/hammerjs": ["@types/hammerjs@2.0.46", "", {}, "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw=="], + + "@types/hoist-non-react-statics": ["@types/hoist-non-react-statics@3.3.7", "", { "dependencies": { "hoist-non-react-statics": "^3.3.0" }, "peerDependencies": { "@types/react": "*" } }, "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g=="], + + "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], + + "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], + + "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], + + "@types/kdbush": ["@types/kdbush@3.0.5", "", {}, "sha512-tdJz7jaWFu4nR+8b2B+CdPZ6811ighYylWsu2hpsivapzW058yP0KdfZuNY89IiRe5jbKvBGXN3LQdN2KPXVdQ=="], + + "@types/mapbox__point-geometry": ["@types/mapbox__point-geometry@0.1.4", "", {}, "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA=="], + + "@types/mapbox__vector-tile": ["@types/mapbox__vector-tile@1.3.4", "", { "dependencies": { "@types/geojson": "*", "@types/mapbox__point-geometry": "*", "@types/pbf": "*" } }, "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg=="], + + "@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], + + "@types/offscreencanvas": ["@types/offscreencanvas@2019.7.3", "", {}, "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A=="], + + "@types/pbf": ["@types/pbf@3.0.5", "", {}, "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA=="], + + "@types/pg": ["@types/pg@8.18.0", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-gT+oueVQkqnj6ajGJXblFR4iavIXWsGAFCk3dP4Kki5+a9R4NMt0JARdk6s8cUKcfUoqP5dAtDSLU8xYUTFV+Q=="], + + "@types/react": ["@types/react@19.0.14", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-ixLZ7zG7j1fM0DijL9hDArwhwcCb4vqmePgwtV0GfnkHRSCUEv4LvzarcTdhoqgyMznUx/EhoTUv31CKZzkQlw=="], + + "@types/react-dom": ["@types/react-dom@19.0.6", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-lo6MuY+rFr8kIiFnr+7TzO+Av0wUPcEcepiPV4epGP0eTQpkDfp9czudg73isV8UxKauCUNlL1N8fXhcnx4iBw=="], + + "@types/react-native-razorpay": ["@types/react-native-razorpay@2.2.6", "", { "dependencies": { "@types/react": "*" } }, "sha512-8CqZvL53bqs51aLaNXssEaBFN5a09WB5nWEOa1RtNXTnuh9zDyMZ9yKqjN+buVFFOAH4mE9IpB7J1V1I3REnMQ=="], + + "@types/react-reconciler": ["@types/react-reconciler@0.28.9", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg=="], + + "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], + + "@types/stats.js": ["@types/stats.js@0.17.4", "", {}, "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA=="], + + "@types/strip-bom": ["@types/strip-bom@3.0.0", "", {}, "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ=="], + + "@types/strip-json-comments": ["@types/strip-json-comments@0.0.30", "", {}, "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ=="], + + "@types/supercluster": ["@types/supercluster@7.1.3", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA=="], + + "@types/three": ["@types/three@0.182.0", "", { "dependencies": { "@dimforge/rapier3d-compat": "~0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", "@types/webxr": ">=0.5.17", "@webgpu/types": "*", "fflate": "~0.8.2", "meshoptimizer": "~0.22.0" } }, "sha512-WByN9V3Sbwbe2OkWuSGyoqQO8Du6yhYaXtXLoA5FkKTUJorZ+yOHBZ35zUUPQXlAKABZmbYp5oAqpA4RBjtJ/Q=="], + + "@types/webxr": ["@types/webxr@0.5.24", "", {}, "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg=="], + + "@types/yargs": ["@types/yargs@17.0.35", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg=="], + + "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.57.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.57.0", "@typescript-eslint/type-utils": "8.57.0", "@typescript-eslint/utils": "8.57.0", "@typescript-eslint/visitor-keys": "8.57.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.57.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.57.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.57.0", "@typescript-eslint/types": "8.57.0", "@typescript-eslint/typescript-estree": "8.57.0", "@typescript-eslint/visitor-keys": "8.57.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.57.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.57.0", "@typescript-eslint/types": "^8.57.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.57.0", "", { "dependencies": { "@typescript-eslint/types": "8.57.0", "@typescript-eslint/visitor-keys": "8.57.0" } }, "sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.57.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.57.0", "", { "dependencies": { "@typescript-eslint/types": "8.57.0", "@typescript-eslint/typescript-estree": "8.57.0", "@typescript-eslint/utils": "8.57.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.57.0", "", {}, "sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.57.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.57.0", "@typescript-eslint/tsconfig-utils": "8.57.0", "@typescript-eslint/types": "8.57.0", "@typescript-eslint/visitor-keys": "8.57.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.57.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.57.0", "@typescript-eslint/types": "8.57.0", "@typescript-eslint/typescript-estree": "8.57.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.57.0", "", { "dependencies": { "@typescript-eslint/types": "8.57.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg=="], + + "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.11.1", "", { "os": "android", "cpu": "arm" }, "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw=="], + + "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.11.1", "", { "os": "android", "cpu": "arm64" }, "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g=="], + + "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.11.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g=="], + + "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.11.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ=="], + + "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.11.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw=="], + + "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw=="], + + "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw=="], + + "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ=="], + + "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w=="], + + "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.11.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA=="], + + "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ=="], + + "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew=="], + + "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.11.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg=="], + + "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w=="], + + "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA=="], + + "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.11.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ=="], + + "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.11.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw=="], + + "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.11.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ=="], + + "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.11.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g=="], + + "@urql/core": ["@urql/core@5.2.0", "", { "dependencies": { "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" } }, "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A=="], + + "@urql/exchange-retry": ["@urql/exchange-retry@1.3.2", "", { "dependencies": { "@urql/core": "^5.1.2", "wonka": "^6.3.2" } }, "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg=="], + + "@use-gesture/core": ["@use-gesture/core@10.3.1", "", {}, "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw=="], + + "@use-gesture/react": ["@use-gesture/react@10.3.1", "", { "dependencies": { "@use-gesture/core": "10.3.1" }, "peerDependencies": { "react": ">= 16.8.0" } }, "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g=="], + + "@vitejs/plugin-react-swc": ["@vitejs/plugin-react-swc@3.11.0", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-beta.27", "@swc/core": "^1.12.11" }, "peerDependencies": { "vite": "^4 || ^5 || ^6 || ^7" } }, "sha512-YTJCGFdNMHCMfjODYtxRNVAYmTWQ1Lb8PulP/2/f/oEEtglw8oKxKIZmmRkyXrVrHfsKOaVkAc3NT9/dMutO5w=="], + + "@webgpu/types": ["@webgpu/types@0.1.69", "", {}, "sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ=="], + + "@xmldom/xmldom": ["@xmldom/xmldom@0.8.11", "", {}, "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "acorn-walk": ["acorn-walk@8.3.5", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw=="], + + "admin-ui": ["admin-ui@workspace:apps/admin-ui"], + + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + + "ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], + + "anser": ["anser@1.4.10", "", {}, "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww=="], + + "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "arc": ["arc@0.2.0", "", {}, "sha512-8NFOo126uYKQJyXNSLY/jSklgfLQL+XWAcPXGo876JwEQ8nSOPXWNI3TV2jLZMN8QEw8uksJ1ZwS4npjBca8MA=="], + + "arg": ["arg@4.1.0", "", {}, "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], + + "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], + + "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], + + "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + + "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="], + + "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], + + "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], + + "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], + + "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="], + + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], + + "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="], + + "assert": ["assert@2.1.0", "", { "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", "object-is": "^1.1.5", "object.assign": "^4.1.4", "util": "^0.12.5" } }, "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw=="], + + "assert-never": ["assert-never@1.4.0", "", {}, "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA=="], + + "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], + + "async-limiter": ["async-limiter@1.0.1", "", {}, "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "autoprefixer": ["autoprefixer@10.4.27", "", { "dependencies": { "browserslist": "^4.28.1", "caniuse-lite": "^1.0.30001774", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "axios": ["axios@1.13.6", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ=="], + + "babel-jest": ["babel-jest@29.7.0", "", { "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg=="], + + "babel-plugin-istanbul": ["babel-plugin-istanbul@6.1.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA=="], + + "babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@29.6.3", "", { "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg=="], + + "babel-plugin-polyfill-corejs2": ["babel-plugin-polyfill-corejs2@0.4.16", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-define-polyfill-provider": "^0.6.7", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-xaVwwSfebXf0ooE11BJovZYKhFjIvQo7TsyVpETuIeH2JHv0k/T6Y5j22pPTvqYqmpkxdlPAJlyJ0tfOJAoMxw=="], + + "babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.13.0", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A=="], + + "babel-plugin-polyfill-regenerator": ["babel-plugin-polyfill-regenerator@0.6.7", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.7" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-OTYbUlSwXhNgr4g6efMZgsO8//jA61P7ZbRX3iTT53VON8l+WQS8IAUEVo4a4cWknrg2W8Cj4gQhRYNCJ8GkAA=="], + + "babel-plugin-react-native-web": ["babel-plugin-react-native-web@0.19.13", "", {}, "sha512-4hHoto6xaN23LCyZgL9LJZc3olmAxd7b6jDzlZnKXAh4rRAbZRKNBJoOOdp46OBqgy+K0t0guTj5/mhA8inymQ=="], + + "babel-plugin-syntax-hermes-parser": ["babel-plugin-syntax-hermes-parser@0.25.1", "", { "dependencies": { "hermes-parser": "0.25.1" } }, "sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ=="], + + "babel-plugin-transform-flow-enums": ["babel-plugin-transform-flow-enums@0.0.2", "", { "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } }, "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ=="], + + "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.2.0", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg=="], + + "babel-preset-expo": ["babel-preset-expo@13.2.5", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", "@babel/plugin-proposal-export-default-from": "^7.24.7", "@babel/plugin-syntax-export-default-from": "^7.24.7", "@babel/plugin-transform-export-namespace-from": "^7.25.9", "@babel/plugin-transform-flow-strip-types": "^7.25.2", "@babel/plugin-transform-modules-commonjs": "^7.24.8", "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.23.0", "@react-native/babel-preset": "0.79.6", "babel-plugin-react-native-web": "~0.19.13", "babel-plugin-syntax-hermes-parser": "^0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", "debug": "^4.3.4", "react-refresh": "^0.14.2", "resolve-from": "^5.0.0" }, "peerDependencies": { "babel-plugin-react-compiler": "^19.0.0-beta-e993439-20250405" }, "optionalPeers": ["babel-plugin-react-compiler"] }, "sha512-YjVkP1bOLO2OgR2fyCedruYMPR7GFbAtCvvWITBW1UAp6e3ACYZtN6uoqkXgXP6PHQkb6M7qf2vZreBPEZK38A=="], + + "babel-preset-jest": ["babel-preset-jest@29.6.3", "", { "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA=="], + + "babel-walk": ["babel-walk@3.0.0-canary-5", "", { "dependencies": { "@babel/types": "^7.9.6" } }, "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw=="], + + "backend": ["backend@workspace:apps/backend"], + + "badgin": ["badgin@1.2.3", "", {}, "sha512-NQGA7LcfCpSzIbGRbkgjgdWkjy7HI+Th5VLxTJfW5EeaAf3fnS+xWQaQOCYiny+q6QSvxqoSO04vCx+4u++EJw=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.8", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ=="], + + "bcryptjs": ["bcryptjs@3.0.3", "", { "bin": { "bcrypt": "bin/bcrypt" } }, "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g=="], + + "better-opn": ["better-opn@3.0.2", "", { "dependencies": { "open": "^8.0.4" } }, "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ=="], + + "bidi-js": ["bidi-js@1.0.3", "", { "dependencies": { "require-from-string": "^2.0.2" } }, "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw=="], + + "big-integer": ["big-integer@1.6.52", "", {}, "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="], + + "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "body-parser": ["body-parser@1.20.4", "", { "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "~1.2.0", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", "qs": "~6.14.0", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" } }, "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "bowser": ["bowser@2.14.1", "", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="], + + "bplist-creator": ["bplist-creator@0.1.0", "", { "dependencies": { "stream-buffers": "2.2.x" } }, "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg=="], + + "bplist-parser": ["bplist-parser@0.3.2", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], + + "bser": ["bser@2.1.1", "", { "dependencies": { "node-int64": "^0.4.0" } }, "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bullmq": ["bullmq@5.71.0", "", { "dependencies": { "cron-parser": "4.9.0", "ioredis": "5.9.3", "msgpackr": "1.11.5", "node-abort-controller": "3.1.1", "semver": "7.7.4", "tslib": "2.8.1", "uuid": "11.1.0" } }, "sha512-aeNWh4drsafSKnAJeiNH/nZP/5O8ZdtdMbnOPZmpjXj7NZUP5YC901U3bIH41iZValm7d1i3c34ojv7q31m30w=="], + + "bun-types": ["bun-types@1.3.11", "", { "dependencies": { "@types/node": "*" } }, "sha512-1KGPpoxQWl9f6wcZh57LvrPIInQMn2TQ7jsgxqpRzg+l0QPOFvJVH7HmvHo/AiPgwXy+/Thf6Ov3EdVn1vOabg=="], + + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "caller-callsite": ["caller-callsite@2.0.0", "", { "dependencies": { "callsites": "^2.0.0" } }, "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ=="], + + "caller-path": ["caller-path@2.0.0", "", { "dependencies": { "caller-callsite": "^2.0.0" } }, "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], + + "camera-controls": ["camera-controls@3.1.2", "", { "peerDependencies": { "three": ">=0.126.1" } }, "sha512-xkxfpG2ECZ6Ww5/9+kf4mfg1VEYAoe9aDSY+IwF0UEs7qEzwy0aVRfs2grImIECs/PoBtWFrh7RXsQkwG922JA=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001779", "", {}, "sha512-U5og2PN7V4DMgF50YPNtnZJGWVLFjjsN3zb6uMT5VGYIewieDj1upwfuVNXf4Kor+89c3iCRJnSzMD5LmTvsfA=="], + + "canvas-confetti": ["canvas-confetti@1.9.4", "", {}, "sha512-yxQbJkAVrFXWNbTUjPqjF7G+g6pDotOUHGbkZq2NELZUMDpiJ85rIEazVb8GTaAptNW2miJAXbs1BtioA251Pw=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "character-parser": ["character-parser@2.2.0", "", { "dependencies": { "is-regex": "^1.0.3" } }, "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw=="], + + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "chrome-launcher": ["chrome-launcher@0.15.2", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0" }, "bin": { "print-chrome-path": "bin/print-chrome-path.js" } }, "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ=="], + + "chromium-edge-launcher": ["chromium-edge-launcher@0.2.0", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0", "mkdirp": "^1.0.4", "rimraf": "^3.0.2" } }, "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg=="], + + "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], + + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + + "cli-cursor": ["cli-cursor@2.1.0", "", { "dependencies": { "restore-cursor": "^2.0.0" } }, "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw=="], + + "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], + + "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="], + + "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "common-ui": ["common-ui@workspace:packages/ui"], + + "compressible": ["compressible@2.0.18", "", { "dependencies": { "mime-db": ">= 1.43.0 < 2" } }, "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="], + + "compression": ["compression@1.8.1", "", { "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", "on-headers": "~1.1.0", "safe-buffer": "5.2.1", "vary": "~1.1.2" } }, "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "concaveman": ["concaveman@1.2.1", "", { "dependencies": { "point-in-polygon": "^1.1.0", "rbush": "^3.0.1", "robust-predicates": "^2.0.4", "tinyqueue": "^2.0.3" } }, "sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw=="], + + "connect": ["connect@3.7.0", "", { "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", "parseurl": "~1.3.3", "utils-merge": "1.0.1" } }, "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ=="], + + "constantinople": ["constantinople@4.0.1", "", { "dependencies": { "@babel/parser": "^7.6.0", "@babel/types": "^7.6.1" } }, "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw=="], + + "content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], + + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "cookie-es": ["cookie-es@2.0.0", "", {}, "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg=="], + + "cookie-signature": ["cookie-signature@1.0.7", "", {}, "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA=="], + + "copy-anything": ["copy-anything@4.0.5", "", { "dependencies": { "is-what": "^5.2.0" } }, "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA=="], + + "core-js-compat": ["core-js-compat@3.48.0", "", { "dependencies": { "browserslist": "^4.28.1" } }, "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q=="], + + "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="], + + "cosmiconfig": ["cosmiconfig@5.2.1", "", { "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" } }, "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA=="], + + "create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="], + + "cron-parser": ["cron-parser@4.9.0", "", { "dependencies": { "luxon": "^3.2.1" } }, "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q=="], + + "cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="], + + "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "crypto-random-string": ["crypto-random-string@2.0.0", "", {}, "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="], + + "css-in-js-utils": ["css-in-js-utils@3.1.0", "", { "dependencies": { "hyphenate-style-name": "^1.0.3" } }, "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A=="], + + "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], + + "css-tree": ["css-tree@1.1.3", "", { "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" } }, "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q=="], + + "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "d3-array": ["d3-array@1.2.4", "", {}, "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="], + + "d3-geo": ["d3-geo@1.7.1", "", { "dependencies": { "d3-array": "1" } }, "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw=="], + + "d3-voronoi": ["d3-voronoi@1.1.2", "", {}, "sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw=="], + + "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], + + "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], + + "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], + + "date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="], + + "dayjs": ["dayjs@1.11.20", "", {}, "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decode-uri-component": ["decode-uri-component@0.2.2", "", {}, "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ=="], + + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "deepmerge": ["deepmerge@2.2.1", "", {}, "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA=="], + + "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + + "detect-gpu": ["detect-gpu@5.0.70", "", { "dependencies": { "webgl-constants": "^1.1.1" } }, "sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w=="], + + "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], + + "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], + + "diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], + + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + + "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], + + "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], + + "doctypes": ["doctypes@1.1.0", "", {}, "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ=="], + + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="], + + "dotenv-expand": ["dotenv-expand@11.0.7", "", { "dependencies": { "dotenv": "^16.4.5" } }, "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA=="], + + "draco3d": ["draco3d@1.5.7", "", {}, "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ=="], + + "drizzle-kit": ["drizzle-kit@0.31.9", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.4", "esbuild-register": "^3.5.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-GViD3IgsXn7trFyBUUHyTFBpH/FsHTxYJ66qdbVggxef4UBPHRYxQaRzYLTuekYnk9i5FIEL9pbBIwMqX/Uwrg=="], + + "drizzle-orm": ["drizzle-orm@0.45.1", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "dynamic-dedupe": ["dynamic-dedupe@0.3.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ=="], + + "earcut": ["earcut@3.0.2", "", {}, "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.313", "", {}, "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "env-editor": ["env-editor@0.4.2", "", {}, "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA=="], + + "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], + + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], + + "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], + + "es-abstract": ["es-abstract@1.24.1", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-iterator-helpers": ["es-iterator-helpers@1.3.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.1", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", "math-intrinsics": "^1.1.0", "safe-array-concat": "^1.1.3" } }, "sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], + + "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], + + "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + + "esbuild-register": ["esbuild-register@3.6.0", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "esbuild": ">=0.12 <1" } }, "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + + "eslint-config-expo": ["eslint-config-expo@9.2.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "^8.18.2", "@typescript-eslint/parser": "^8.18.2", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-expo": "^0.1.4", "eslint-plugin-import": "^2.30.0", "eslint-plugin-react": "^7.37.3", "eslint-plugin-react-hooks": "^5.1.0", "globals": "^16.0.0" }, "peerDependencies": { "eslint": ">=8.10" } }, "sha512-TQgmSx+2mRM7qUS0hB5kTDrHcSC35rA1UzOSgK5YRLmSkSMlKLmXkUrhwOpnyo9D/nHdf4ERRAySRYxgA6dlrw=="], + + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], + + "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.10.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^2.0.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.13", "unrs-resolver": "^1.6.2" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ=="], + + "eslint-module-utils": ["eslint-module-utils@2.12.1", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw=="], + + "eslint-plugin-expo": ["eslint-plugin-expo@0.1.4", "", { "dependencies": { "@typescript-eslint/types": "^8.29.1", "@typescript-eslint/utils": "^8.29.1", "eslint": "^9.24.0" } }, "sha512-YA7yiMacQbLJySuyJA0Eb5V65obqp6fVOWtw1JdYDRWC5MeToPrnNvhGDpk01Bv3Vm4ownuzUfvi89MXi1d6cg=="], + + "eslint-plugin-import": ["eslint-plugin-import@2.32.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA=="], + + "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="], + + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], + + "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.26", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ=="], + + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "expo": ["expo@53.0.27", "", { "dependencies": { "@babel/runtime": "^7.20.0", "@expo/cli": "0.24.24", "@expo/config": "~11.0.13", "@expo/config-plugins": "~10.1.2", "@expo/fingerprint": "0.13.4", "@expo/metro-config": "0.20.18", "@expo/vector-icons": "^14.0.0", "babel-preset-expo": "~13.2.5", "expo-asset": "~11.1.7", "expo-constants": "~17.1.8", "expo-file-system": "~18.1.11", "expo-font": "~13.3.2", "expo-keep-awake": "~14.1.4", "expo-modules-autolinking": "2.1.15", "expo-modules-core": "2.5.0", "react-native-edge-to-edge": "1.6.0", "whatwg-url-without-unicode": "8.0.0-3" }, "peerDependencies": { "@expo/dom-webview": "*", "@expo/metro-runtime": "*", "react": "*", "react-native": "*", "react-native-webview": "*" }, "optionalPeers": ["@expo/dom-webview", "@expo/metro-runtime", "react-native-webview"], "bin": { "expo": "bin/cli", "fingerprint": "bin/fingerprint", "expo-modules-autolinking": "bin/autolinking" } }, "sha512-iQwe2uWLb88opUY4vBYEW1d2GUq3lsa43gsMBEdDV+6pw0Oek93l/4nDLe0ODDdrBRjIJm/rdhKqJC/ehHCUqw=="], + + "expo-application": ["expo-application@6.1.5", "", { "peerDependencies": { "expo": "*" } }, "sha512-ToImFmzw8luY043pWFJhh2ZMm4IwxXoHXxNoGdlhD4Ym6+CCmkAvCglg0FK8dMLzAb+/XabmOE7Rbm8KZb6NZg=="], + + "expo-asset": ["expo-asset@11.1.7", "", { "dependencies": { "@expo/image-utils": "^0.7.6", "expo-constants": "~17.1.7" }, "peerDependencies": { "expo": "*", "react": "*", "react-native": "*" } }, "sha512-b5P8GpjUh08fRCf6m5XPVAh7ra42cQrHBIMgH2UXP+xsj4Wufl6pLy6jRF5w6U7DranUMbsXm8TOyq4EHy7ADg=="], + + "expo-auth-session": ["expo-auth-session@6.2.1", "", { "dependencies": { "expo-application": "~6.1.5", "expo-constants": "~17.1.7", "expo-crypto": "~14.1.5", "expo-linking": "~7.1.7", "expo-web-browser": "~14.2.0", "invariant": "^2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-9KgqrGpW7PoNOhxJ7toofi/Dz5BU2TE4Q+ktJZsmDXLoFcNOcvBokh2+mkhG58Qvd/xJ9Z5sAt/5QoOFaPb9wA=="], + + "expo-blur": ["expo-blur@14.1.5", "", { "peerDependencies": { "expo": "*", "react": "*", "react-native": "*" } }, "sha512-CCLJHxN4eoAl06ESKT3CbMasJ98WsjF9ZQEJnuxtDb9ffrYbZ+g9ru84fukjNUOTtc8A8yXE5z8NgY1l0OMrmQ=="], + + "expo-constants": ["expo-constants@17.1.8", "", { "dependencies": { "@expo/config": "~11.0.13", "@expo/env": "~1.0.7" }, "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-sOCeMN/BWLA7hBP6lMwoEQzFNgTopk6YY03sBAmwT216IHyL54TjNseg8CRU1IQQ/+qinJ2fYWCl7blx2TiNcA=="], + + "expo-crypto": ["expo-crypto@14.1.5", "", { "dependencies": { "base64-js": "^1.3.0" }, "peerDependencies": { "expo": "*" } }, "sha512-ZXJoUMoUeiMNEoSD4itItFFz3cKrit6YJ/BR0hjuwNC+NczbV9rorvhvmeJmrU9O2cFQHhJQQR1fjQnt45Vu4Q=="], + + "expo-dev-client": ["expo-dev-client@5.2.4", "", { "dependencies": { "expo-dev-launcher": "5.1.16", "expo-dev-menu": "6.1.14", "expo-dev-menu-interface": "1.10.0", "expo-manifests": "~0.16.6", "expo-updates-interface": "~1.1.0" }, "peerDependencies": { "expo": "*" } }, "sha512-s/N/nK5LPo0QZJpV4aPijxyrzV4O49S3dN8D2fljqrX2WwFZzWwFO6dX1elPbTmddxumdcpczsdUPY+Ms8g43g=="], + + "expo-dev-launcher": ["expo-dev-launcher@5.1.16", "", { "dependencies": { "ajv": "8.11.0", "expo-dev-menu": "6.1.14", "expo-manifests": "~0.16.6", "resolve-from": "^5.0.0" }, "peerDependencies": { "expo": "*" } }, "sha512-tbCske9pvbozaEblyxoyo/97D6od9Ma4yAuyUnXtRET1CKAPKYS+c4fiZ+I3B4qtpZwN3JNFUjG3oateN0y6Hg=="], + + "expo-dev-menu": ["expo-dev-menu@6.1.14", "", { "dependencies": { "expo-dev-menu-interface": "1.10.0" }, "peerDependencies": { "expo": "*" } }, "sha512-yonNMg2GHJZtuisVowdl1iQjZfYP85r1D1IO+ar9D9zlrBPBJhq2XEju52jd1rDmDkmDuEhBSbPNhzIcsBNiPg=="], + + "expo-dev-menu-interface": ["expo-dev-menu-interface@1.10.0", "", { "peerDependencies": { "expo": "*" } }, "sha512-NxtM/qot5Rh2cY333iOE87dDg1S8CibW+Wu4WdLua3UMjy81pXYzAGCZGNOeY7k9GpNFqDPNDXWyBSlk9r2pBg=="], + + "expo-device": ["expo-device@7.1.4", "", { "dependencies": { "ua-parser-js": "^0.7.33" }, "peerDependencies": { "expo": "*" } }, "sha512-HS04IiE1Fy0FRjBLurr9e5A6yj3kbmQB+2jCZvbSGpsjBnCLdSk/LCii4f5VFhPIBWJLyYuN5QqJyEAw6BcS4Q=="], + + "expo-document-picker": ["expo-document-picker@13.1.6", "", { "peerDependencies": { "expo": "*" } }, "sha512-8FTQPDOkyCvFN/i4xyqzH7ELW4AsB6B3XBZQjn1FEdqpozo6rpNJRr7sWFU/93WrLgA9FJEKpKbyr6XxczK6BA=="], + + "expo-eas-client": ["expo-eas-client@0.14.4", "", {}, "sha512-TSL1BbBFIuXchJmPgbPnB7cGpOOuSGJcQ/L7gij/+zPjExwvKm5ckA5dlSulwoFhH8zQt4vb7bfISPSAWQVWBw=="], + + "expo-file-system": ["expo-file-system@18.1.11", "", { "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-HJw/m0nVOKeqeRjPjGdvm+zBi5/NxcdPf8M8P3G2JFvH5Z8vBWqVDic2O58jnT1OFEy0XXzoH9UqFu7cHg9DTQ=="], + + "expo-font": ["expo-font@13.3.2", "", { "dependencies": { "fontfaceobserver": "^2.1.0" }, "peerDependencies": { "expo": "*", "react": "*" } }, "sha512-wUlMdpqURmQ/CNKK/+BIHkDA5nGjMqNlYmW0pJFXY/KE/OG80Qcavdu2sHsL4efAIiNGvYdBS10WztuQYU4X0A=="], + + "expo-haptics": ["expo-haptics@14.1.4", "", { "peerDependencies": { "expo": "*" } }, "sha512-QZdE3NMX74rTuIl82I+n12XGwpDWKb8zfs5EpwsnGi/D/n7O2Jd4tO5ivH+muEG/OCJOMq5aeaVDqqaQOhTkcA=="], + + "expo-image": ["expo-image@2.4.1", "", { "peerDependencies": { "expo": "*", "react": "*", "react-native": "*", "react-native-web": "*" }, "optionalPeers": ["react-native-web"] }, "sha512-yHp0Cy4ylOYyLR21CcH6i70DeRyLRPc0yAIPFPn4BT/BpkJNaX5QMXDppcHa58t4WI3Bb8QRJRLuAQaeCtDF8A=="], + + "expo-image-loader": ["expo-image-loader@5.1.0", "", { "peerDependencies": { "expo": "*" } }, "sha512-sEBx3zDQIODWbB5JwzE7ZL5FJD+DK3LVLWBVJy6VzsqIA6nDEnSFnsnWyCfCTSvbGigMATs1lgkC2nz3Jpve1Q=="], + + "expo-image-picker": ["expo-image-picker@16.1.4", "", { "dependencies": { "expo-image-loader": "~5.1.0" }, "peerDependencies": { "expo": "*" } }, "sha512-bTmmxtw1AohUT+HxEBn2vYwdeOrj1CLpMXKjvi9FKSoSbpcarT4xxI0z7YyGwDGHbrJqyyic3I9TTdP2J2b4YA=="], + + "expo-json-utils": ["expo-json-utils@0.15.0", "", {}, "sha512-duRT6oGl80IDzH2LD2yEFWNwGIC2WkozsB6HF3cDYNoNNdUvFk6uN3YiwsTsqVM/D0z6LEAQ01/SlYvN+Fw0JQ=="], + + "expo-keep-awake": ["expo-keep-awake@14.1.4", "", { "peerDependencies": { "expo": "*", "react": "*" } }, "sha512-wU9qOnosy4+U4z/o4h8W9PjPvcFMfZXrlUoKTMBW7F4pLqhkkP/5G4EviPZixv4XWFMjn1ExQ5rV6BX8GwJsWA=="], + + "expo-linear-gradient": ["expo-linear-gradient@14.1.5", "", { "peerDependencies": { "expo": "*", "react": "*", "react-native": "*" } }, "sha512-BSN3MkSGLZoHMduEnAgfhoj3xqcDWaoICgIr4cIYEx1GcHfKMhzA/O4mpZJ/WC27BP1rnAqoKfbclk1eA70ndQ=="], + + "expo-linking": ["expo-linking@7.1.7", "", { "dependencies": { "expo-constants": "~17.1.7", "invariant": "^2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-ZJaH1RIch2G/M3hx2QJdlrKbYFUTOjVVW4g39hfxrE5bPX9xhZUYXqxqQtzMNl1ylAevw9JkgEfWbBWddbZ3UA=="], + + "expo-location": ["expo-location@19.0.8", "", { "peerDependencies": { "expo": "*" } }, "sha512-H/FI75VuJ1coodJbbMu82pf+Zjess8X8Xkiv9Bv58ZgPKS/2ztjC1YO1/XMcGz7+s9DrbLuMIw22dFuP4HqneA=="], + + "expo-manifests": ["expo-manifests@0.16.6", "", { "dependencies": { "@expo/config": "~11.0.12", "expo-json-utils": "~0.15.0" }, "peerDependencies": { "expo": "*" } }, "sha512-1A+do6/mLUWF9xd3uCrlXr9QFDbjbfqAYmUy8UDLOjof1lMrOhyeC4Yi6WexA/A8dhZEpIxSMCKfn7G4aHAh4w=="], + + "expo-modules-autolinking": ["expo-modules-autolinking@2.1.15", "", { "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", "commander": "^7.2.0", "find-up": "^5.0.0", "glob": "^10.4.2", "require-from-string": "^2.0.2", "resolve-from": "^5.0.0" }, "bin": { "expo-modules-autolinking": "bin/expo-modules-autolinking.js" } }, "sha512-IUITUERdkgooXjr9bXsX0PmhrZUIGTMyP6NtmQpAxN5+qtf/I7ewbwLx1/rX7tgiAOzaYme+PZOp/o6yqIhFsw=="], + + "expo-modules-core": ["expo-modules-core@2.5.0", "", { "dependencies": { "invariant": "^2.2.4" } }, "sha512-aIbQxZE2vdCKsolQUl6Q9Farlf8tjh/ROR4hfN1qT7QBGPl1XrJGnaOKkcgYaGrlzCPg/7IBe0Np67GzKMZKKQ=="], + + "expo-notifications": ["expo-notifications@0.31.5", "", { "dependencies": { "@expo/image-utils": "^0.7.6", "@ide/backoff": "^1.0.0", "abort-controller": "^3.0.0", "assert": "^2.0.0", "badgin": "^1.1.5", "expo-application": "~6.1.5", "expo-constants": "~17.1.8" }, "peerDependencies": { "expo": "*", "react": "*", "react-native": "*" } }, "sha512-HsitfTrSESFDWwaX0Y+6GQlWEooQqZKdGbNTwTPHfp5PNCr02tVPwwya9j1tdg3Awj8/vmfXmSxzNhULfmgJhQ=="], + + "expo-router": ["expo-router@5.1.11", "", { "dependencies": { "@expo/metro-runtime": "5.0.5", "@expo/schema-utils": "^0.1.0", "@expo/server": "^0.6.3", "@radix-ui/react-slot": "1.2.0", "@react-navigation/bottom-tabs": "^7.3.10", "@react-navigation/native": "^7.1.6", "@react-navigation/native-stack": "^7.3.10", "client-only": "^0.0.1", "invariant": "^2.2.4", "react-fast-compare": "^3.2.2", "react-native-is-edge-to-edge": "^1.1.6", "semver": "~7.6.3", "server-only": "^0.0.1", "shallowequal": "^1.1.0" }, "peerDependencies": { "@react-navigation/drawer": "^7.3.9", "expo": "*", "expo-constants": "*", "expo-linking": "*", "react-native-reanimated": "*", "react-native-safe-area-context": "*", "react-native-screens": "*", "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4" }, "optionalPeers": ["@react-navigation/drawer", "react-native-reanimated", "react-server-dom-webpack"] }, "sha512-6YQGqQM2rviVSiU6++hrJDPMByHZ7Oiux4XmgoSaGdaHku5QOn9911f2puEUZh2H9ALKBipw5v3ZkrECBd6Zbw=="], + + "expo-secure-store": ["expo-secure-store@14.2.4", "", { "peerDependencies": { "expo": "*" } }, "sha512-ePaz4fnTitJJZjAiybaVYGfLWWyaEtepZC+vs9ZBMhQMfG5HUotIcVsDaSo3FnwpHmgwsLVPY2qFeryI6AtULw=="], + + "expo-server-sdk": ["expo-server-sdk@5.0.0", "", { "dependencies": { "promise-limit": "^2.7.0", "promise-retry": "^2.0.1", "undici": "^7.2.0" } }, "sha512-GEp1XYLU80iS/hdRo3c2n092E8TgTXcHSuw6Lw68dSoWaAgiLPI2R+e5hp5+hGF1TtJZOi2nxtJX63+XA3iz9g=="], + + "expo-splash-screen": ["expo-splash-screen@0.30.10", "", { "dependencies": { "@expo/prebuild-config": "^9.0.10" }, "peerDependencies": { "expo": "*" } }, "sha512-Tt9va/sLENQDQYeOQ6cdLdGvTZ644KR3YG9aRlnpcs2/beYjOX1LHT510EGzVN9ljUTg+1ebEo5GGt2arYtPjw=="], + + "expo-status-bar": ["expo-status-bar@2.2.3", "", { "dependencies": { "react-native-edge-to-edge": "1.6.0", "react-native-is-edge-to-edge": "^1.1.6" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-+c8R3AESBoduunxTJ8353SqKAKpxL6DvcD8VKBuh81zzJyUUbfB4CVjr1GufSJEKsMzNPXZU+HJwXx7Xh7lx8Q=="], + + "expo-structured-headers": ["expo-structured-headers@4.1.0", "", {}, "sha512-2X+aUNzC/qaw7/WyUhrVHNDB0uQ5rE12XA2H/rJXaAiYQSuOeU90ladaN0IJYV9I2XlhYrjXLktLXWbO7zgbag=="], + + "expo-symbols": ["expo-symbols@0.4.5", "", { "dependencies": { "sf-symbols-typescript": "^2.0.0" }, "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-ZbgvJfACPfWaJxJrUd0YzDmH9X0Ci7vb5m0/ZpDz/tnF1vQJlkovvpFEHLUmCDSLIN7/fNK8t696KSpzfm8/kg=="], + + "expo-system-ui": ["expo-system-ui@5.0.11", "", { "dependencies": { "@react-native/normalize-colors": "0.79.6", "debug": "^4.3.2" }, "peerDependencies": { "expo": "*", "react-native": "*", "react-native-web": "*" }, "optionalPeers": ["react-native-web"] }, "sha512-PG5VdaG5cwBe1Rj02mJdnsihKl9Iw/w/a6+qh2mH3f2K/IvQ+Hf7aG2kavSADtkGNCNj7CEIg7Rn4DQz/SE5rQ=="], + + "expo-updates": ["expo-updates@0.28.18", "", { "dependencies": { "@expo/code-signing-certificates": "^0.0.6", "@expo/config": "~11.0.13", "@expo/config-plugins": "~10.1.2", "@expo/spawn-async": "^1.7.2", "arg": "4.1.0", "chalk": "^4.1.2", "expo-eas-client": "~0.14.4", "expo-manifests": "~0.16.6", "expo-structured-headers": "~4.1.0", "expo-updates-interface": "~1.1.0", "glob": "^10.4.2", "ignore": "^5.3.1", "resolve-from": "^5.0.0" }, "peerDependencies": { "expo": "*", "react": "*" }, "bin": { "expo-updates": "bin/cli.js" } }, "sha512-qbxRF8w/xPNiEWmZHDxK4XJ0ns4A9VpQg66jNeAEc8mrX9f7TG3TyLyLtydAP0F4aTNrBcSxah8K5VA90vcPig=="], + + "expo-updates-interface": ["expo-updates-interface@1.1.0", "", { "peerDependencies": { "expo": "*" } }, "sha512-DeB+fRe0hUDPZhpJ4X4bFMAItatFBUPjw/TVSbJsaf3Exeami+2qbbJhWkcTMoYHOB73nOIcaYcWXYJnCJXO0w=="], + + "expo-web-browser": ["expo-web-browser@14.2.0", "", { "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-6S51d8pVlDRDsgGAp8BPpwnxtyKiMWEFdezNz+5jVIyT+ctReW42uxnjRgtsdn5sXaqzhaX+Tzk/CWaKCyC0hw=="], + + "exponential-backoff": ["exponential-backoff@3.1.3", "", {}, "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA=="], + + "express": ["express@4.22.1", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "~1.20.3", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "~1.3.1", "fresh": "~0.5.2", "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", "serve-static": "~1.16.2", "setprototypeof": "1.2.0", "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g=="], + + "fallback-ui": ["fallback-ui@workspace:apps/fallback-ui"], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fast-xml-builder": ["fast-xml-builder@1.1.4", "", { "dependencies": { "path-expression-matcher": "^1.1.3" } }, "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg=="], + + "fast-xml-parser": ["fast-xml-parser@5.4.1", "", { "dependencies": { "fast-xml-builder": "^1.0.0", "strnum": "^2.1.2" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A=="], + + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], + + "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], + + "fbjs": ["fbjs@3.0.5", "", { "dependencies": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", "loose-envify": "^1.0.0", "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", "ua-parser-js": "^1.0.35" } }, "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg=="], + + "fbjs-css-vars": ["fbjs-css-vars@1.0.2", "", {}, "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "filter-obj": ["filter-obj@1.1.0", "", {}, "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ=="], + + "finalhandler": ["finalhandler@1.3.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "statuses": "~2.0.2", "unpipe": "~1.0.0" } }, "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.4.1", "", {}, "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ=="], + + "flow-enums-runtime": ["flow-enums-runtime@0.0.6", "", {}, "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw=="], + + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], + + "fontfaceobserver": ["fontfaceobserver@2.3.0", "", {}, "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg=="], + + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], + + "formik": ["formik@2.4.9", "", { "dependencies": { "@types/hoist-non-react-statics": "^3.3.1", "deepmerge": "^2.1.1", "hoist-non-react-statics": "^3.3.0", "lodash": "^4.17.21", "lodash-es": "^4.17.21", "react-fast-compare": "^2.0.1", "tiny-warning": "^1.0.2", "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-5nI94BMnlFDdQRBY4Sz39WkhxajZJ57Fzs8wVbtsQlm5ScKIR1QLYqv/ultBnobObtlUyxpxoLodpixrsf36Og=="], + + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="], + + "freeport-async": ["freeport-async@2.0.0", "", {}, "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ=="], + + "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], + + "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + + "fuse.js": ["fuse.js@7.1.0", "", {}, "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ=="], + + "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "geojson-equality-ts": ["geojson-equality-ts@1.0.2", "", { "dependencies": { "@types/geojson": "^7946.0.14" } }, "sha512-h3Ryq+0mCSN/7yLs0eDgrZhvc9af23o/QuC4aTiuuzP/MRCtd6mf5rLsLRY44jX0RPUfM8c4GqERQmlUxPGPoQ=="], + + "geojson-polygon-self-intersections": ["geojson-polygon-self-intersections@1.2.2", "", { "dependencies": { "rbush": "^2.0.1" } }, "sha512-6XRNF4CsRHYmR9z5YuIk5f/aOototnDf0dgMqYGcS7y1l57ttt6MAIAxl3rXyas6lq1HEbTuLMh4PgvO+OV42w=="], + + "geojson-vt": ["geojson-vt@4.0.2", "", {}, "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A=="], + + "geokdbush": ["geokdbush@2.0.1", "", { "dependencies": { "tinyqueue": "^2.0.3" } }, "sha512-0M8so1Qx6+jJ1xpirpCNrgUsWAzIcQ3LrLmh0KJPBYI3gH7vy70nY5zEEjSp9Tn0nBt6Q2Fh922oL08lfib4Zg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-package-type": ["get-package-type@0.1.0", "", {}, "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], + + "get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="], + + "getenv": ["getenv@2.0.0", "", {}, "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ=="], + + "gl-matrix": ["gl-matrix@3.4.4", "", {}, "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "global-prefix": ["global-prefix@4.0.0", "", { "dependencies": { "ini": "^4.1.3", "kind-of": "^6.0.3", "which": "^4.0.0" } }, "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA=="], + + "globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="], + + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + + "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + + "glsl-noise": ["glsl-noise@0.0.0", "", {}, "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w=="], + + "goober": ["goober@2.1.18", "", { "peerDependencies": { "csstype": "^3.0.10" } }, "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="], + + "hermes-parser": ["hermes-parser@0.25.1", "", { "dependencies": { "hermes-estree": "0.25.1" } }, "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA=="], + + "hls.js": ["hls.js@1.6.15", "", {}, "sha512-E3a5VwgXimGHwpRGV+WxRTKeSp2DW5DI5MWv34ulL3t5UNmyJWCQ1KmLEHbYzcfThfXG8amBL+fCYPneGHC4VA=="], + + "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], + + "hono": ["hono@4.12.8", "", {}, "sha512-VJCEvtrezO1IAR+kqEYnxUOoStaQPGrCmX3j4wDTNOcD1uRPFpGlwQUIW8niPuvHXaTUxeOUl5MMDGrl+tmO9A=="], + + "hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], + + "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "hyphenate-style-name": ["hyphenate-style-name@1.1.0", "", {}, "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw=="], + + "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "image-size": ["image-size@1.2.1", "", { "dependencies": { "queue": "6.0.2" }, "bin": { "image-size": "bin/image-size.js" } }, "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw=="], + + "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@4.1.3", "", {}, "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg=="], + + "inline-style-prefixer": ["inline-style-prefixer@7.0.1", "", { "dependencies": { "css-in-js-utils": "^3.1.0" } }, "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw=="], + + "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], + + "invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="], + + "ioredis": ["ioredis@5.9.3", "", { "dependencies": { "@ioredis/commands": "1.5.0", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", "redis-parser": "^3.0.0", "standard-as-callback": "^2.1.0" } }, "sha512-VI5tMCdeoxZWU5vjHWsiE/Su76JGhBvWF1MJnV9ZtGltHk9BmD48oDq8Tj8haZ85aceXZMxLNDQZRVo5QKNgXA=="], + + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + + "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], + + "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], + + "is-arrayish": ["is-arrayish@0.3.4", "", {}, "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA=="], + + "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], + + "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], + + "is-bun-module": ["is-bun-module@2.0.0", "", { "dependencies": { "semver": "^7.7.1" } }, "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], + + "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], + + "is-directory": ["is-directory@0.3.1", "", {}, "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw=="], + + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "is-expression": ["is-expression@4.0.0", "", { "dependencies": { "acorn": "^7.1.1", "object-assign": "^4.1.1" } }, "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], + + "is-nan": ["is-nan@1.3.2", "", { "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" } }, "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w=="], + + "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], + + "is-promise": ["is-promise@2.2.2", "", {}, "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], + + "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], + + "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], + + "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], + + "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], + + "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], + + "is-what": ["is-what@5.5.0", "", {}, "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw=="], + + "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "isbot": ["isbot@5.1.36", "", {}, "sha512-C/ZtXyJqDPZ7G7JPr06ApWyYoHjYexQbS6hPYD4WYCzpv2Qes6Z+CCEfTX4Owzf+1EJ933PoI2p+B9v7wpGZBQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], + + "istanbul-lib-instrument": ["istanbul-lib-instrument@5.2.1", "", { "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } }, "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg=="], + + "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], + + "its-fine": ["its-fine@2.0.0", "", { "dependencies": { "@types/react-reconciler": "^0.28.9" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng=="], + + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "jest-environment-node": ["jest-environment-node@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw=="], + + "jest-get-type": ["jest-get-type@29.6.3", "", {}, "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw=="], + + "jest-haste-map": ["jest-haste-map@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA=="], + + "jest-message-util": ["jest-message-util@29.7.0", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w=="], + + "jest-mock": ["jest-mock@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "jest-util": "^29.7.0" } }, "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw=="], + + "jest-regex-util": ["jest-regex-util@29.6.3", "", {}, "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg=="], + + "jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], + + "jest-validate": ["jest-validate@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", "pretty-format": "^29.7.0" } }, "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw=="], + + "jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + + "jimp-compact": ["jimp-compact@0.16.1", "", {}, "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww=="], + + "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + + "jose": ["jose@5.10.0", "", {}, "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg=="], + + "js-stringify": ["js-stringify@1.0.2", "", {}, "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + + "jsc-safe-url": ["jsc-safe-url@0.2.4", "", {}, "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-better-errors": ["json-parse-better-errors@1.0.2", "", {}, "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json-stringify-pretty-compact": ["json-stringify-pretty-compact@4.0.0", "", {}, "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jstransformer": ["jstransformer@1.0.0", "", { "dependencies": { "is-promise": "^2.0.0", "promise": "^7.0.1" } }, "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A=="], + + "jsts": ["jsts@2.7.1", "", {}, "sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg=="], + + "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], + + "jwt-decode": ["jwt-decode@4.0.0", "", {}, "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA=="], + + "kdbush": ["kdbush@4.0.2", "", {}, "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], + + "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + + "lan-network": ["lan-network@0.1.7", "", { "bin": { "lan-network": "dist/lan-network-cli.js" } }, "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ=="], + + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lie": ["lie@3.3.0", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ=="], + + "lighthouse-logger": ["lighthouse-logger@1.4.2", "", { "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" } }, "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g=="], + + "lightningcss": ["lightningcss@1.27.0", "", { "dependencies": { "detect-libc": "^1.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.27.0", "lightningcss-darwin-x64": "1.27.0", "lightningcss-freebsd-x64": "1.27.0", "lightningcss-linux-arm-gnueabihf": "1.27.0", "lightningcss-linux-arm64-gnu": "1.27.0", "lightningcss-linux-arm64-musl": "1.27.0", "lightningcss-linux-x64-gnu": "1.27.0", "lightningcss-linux-x64-musl": "1.27.0", "lightningcss-win32-arm64-msvc": "1.27.0", "lightningcss-win32-x64-msvc": "1.27.0" } }, "sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.27.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.27.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.27.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.27.0", "", { "os": "linux", "cpu": "arm" }, "sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.27.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.27.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.27.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.27.0", "", { "os": "linux", "cpu": "x64" }, "sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.27.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.27.0", "", { "os": "win32", "cpu": "x64" }, "sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw=="], + + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + + "lodash-es": ["lodash-es@4.17.23", "", {}, "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg=="], + + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], + + "lodash.defaults": ["lodash.defaults@4.2.0", "", {}, "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="], + + "lodash.isarguments": ["lodash.isarguments@3.1.0", "", {}, "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "lodash.throttle": ["lodash.throttle@4.1.1", "", {}, "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="], + + "log-symbols": ["log-symbols@2.2.0", "", { "dependencies": { "chalk": "^2.0.1" } }, "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "luxon": ["luxon@3.7.2", "", {}, "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="], + + "maath": ["maath@0.10.8", "", { "peerDependencies": { "@types/three": ">=0.134.0", "three": ">=0.134.0" } }, "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g=="], + + "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], + + "makeerror": ["makeerror@1.0.12", "", { "dependencies": { "tmpl": "1.0.5" } }, "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg=="], + + "maplibre-gl": ["maplibre-gl@4.7.1", "", { "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/point-geometry": "^0.1.0", "@mapbox/tiny-sdf": "^2.0.6", "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", "@maplibre/maplibre-gl-style-spec": "^20.3.1", "@types/geojson": "^7946.0.14", "@types/geojson-vt": "3.2.5", "@types/mapbox__point-geometry": "^0.1.4", "@types/mapbox__vector-tile": "^1.3.4", "@types/pbf": "^3.0.5", "@types/supercluster": "^7.1.3", "earcut": "^3.0.0", "geojson-vt": "^4.0.2", "gl-matrix": "^3.4.3", "global-prefix": "^4.0.0", "kdbush": "^4.0.2", "murmurhash-js": "^1.0.0", "pbf": "^3.3.0", "potpack": "^2.0.0", "quickselect": "^3.0.0", "supercluster": "^8.0.1", "tinyqueue": "^3.0.0", "vt-pbf": "^3.1.3" } }, "sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA=="], + + "marky": ["marky@1.3.0", "", {}, "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mdn-data": ["mdn-data@2.0.14", "", {}, "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="], + + "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + + "memoize-one": ["memoize-one@5.2.1", "", {}, "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="], + + "merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "meshline": ["meshline@3.3.1", "", { "peerDependencies": { "three": ">=0.137" } }, "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ=="], + + "meshoptimizer": ["meshoptimizer@0.22.0", "", {}, "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg=="], + + "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], + + "metro": ["metro@0.82.5", "", { "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/parser": "^7.25.3", "@babel/template": "^7.25.0", "@babel/traverse": "^7.25.3", "@babel/types": "^7.25.2", "accepts": "^1.3.7", "chalk": "^4.0.0", "ci-info": "^2.0.0", "connect": "^3.6.5", "debug": "^4.4.0", "error-stack-parser": "^2.0.6", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", "hermes-parser": "0.29.1", "image-size": "^1.0.2", "invariant": "^2.2.4", "jest-worker": "^29.7.0", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", "metro-babel-transformer": "0.82.5", "metro-cache": "0.82.5", "metro-cache-key": "0.82.5", "metro-config": "0.82.5", "metro-core": "0.82.5", "metro-file-map": "0.82.5", "metro-resolver": "0.82.5", "metro-runtime": "0.82.5", "metro-source-map": "0.82.5", "metro-symbolicate": "0.82.5", "metro-transform-plugins": "0.82.5", "metro-transform-worker": "0.82.5", "mime-types": "^2.1.27", "nullthrows": "^1.1.1", "serialize-error": "^2.1.0", "source-map": "^0.5.6", "throat": "^5.0.0", "ws": "^7.5.10", "yargs": "^17.6.2" }, "bin": { "metro": "src/cli.js" } }, "sha512-8oAXxL7do8QckID/WZEKaIFuQJFUTLzfVcC48ghkHhNK2RGuQq8Xvf4AVd+TUA0SZtX0q8TGNXZ/eba1ckeGCg=="], + + "metro-babel-transformer": ["metro-babel-transformer@0.82.5", "", { "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", "hermes-parser": "0.29.1", "nullthrows": "^1.1.1" } }, "sha512-W/scFDnwJXSccJYnOFdGiYr9srhbHPdxX9TvvACOFsIXdLilh3XuxQl/wXW6jEJfgIb0jTvoTlwwrqvuwymr6Q=="], + + "metro-cache": ["metro-cache@0.82.5", "", { "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", "metro-core": "0.82.5" } }, "sha512-AwHV9607xZpedu1NQcjUkua8v7HfOTKfftl6Vc9OGr/jbpiJX6Gpy8E/V9jo/U9UuVYX2PqSUcVNZmu+LTm71Q=="], + + "metro-cache-key": ["metro-cache-key@0.82.5", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-qpVmPbDJuRLrT4kcGlUouyqLGssJnbTllVtvIgXfR7ZuzMKf0mGS+8WzcqzNK8+kCyakombQWR0uDd8qhWGJcA=="], + + "metro-config": ["metro-config@0.82.5", "", { "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", "flow-enums-runtime": "^0.0.6", "jest-validate": "^29.7.0", "metro": "0.82.5", "metro-cache": "0.82.5", "metro-core": "0.82.5", "metro-runtime": "0.82.5" } }, "sha512-/r83VqE55l0WsBf8IhNmc/3z71y2zIPe5kRSuqA5tY/SL/ULzlHUJEMd1szztd0G45JozLwjvrhAzhDPJ/Qo/g=="], + + "metro-core": ["metro-core@0.82.5", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", "metro-resolver": "0.82.5" } }, "sha512-OJL18VbSw2RgtBm1f2P3J5kb892LCVJqMvslXxuxjAPex8OH7Eb8RBfgEo7VZSjgb/LOf4jhC4UFk5l5tAOHHA=="], + + "metro-file-map": ["metro-file-map@0.82.5", "", { "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", "invariant": "^2.2.4", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "nullthrows": "^1.1.1", "walker": "^1.0.7" } }, "sha512-vpMDxkGIB+MTN8Af5hvSAanc6zXQipsAUO+XUx3PCQieKUfLwdoa8qaZ1WAQYRpaU+CJ8vhBcxtzzo3d9IsCIQ=="], + + "metro-minify-terser": ["metro-minify-terser@0.82.5", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" } }, "sha512-v6Nx7A4We6PqPu/ta1oGTqJ4Usz0P7c+3XNeBxW9kp8zayS3lHUKR0sY0wsCHInxZlNAEICx791x+uXytFUuwg=="], + + "metro-resolver": ["metro-resolver@0.82.5", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-kFowLnWACt3bEsuVsaRNgwplT8U7kETnaFHaZePlARz4Fg8tZtmRDUmjaD68CGAwc0rwdwNCkWizLYpnyVcs2g=="], + + "metro-runtime": ["metro-runtime@0.82.5", "", { "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" } }, "sha512-rQZDoCUf7k4Broyw3Ixxlq5ieIPiR1ULONdpcYpbJQ6yQ5GGEyYjtkztGD+OhHlw81LCR2SUAoPvtTus2WDK5g=="], + + "metro-source-map": ["metro-source-map@0.82.5", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-symbolicate": "0.82.5", "nullthrows": "^1.1.1", "ob1": "0.82.5", "source-map": "^0.5.6", "vlq": "^1.0.0" } }, "sha512-wH+awTOQJVkbhn2SKyaw+0cd+RVSCZ3sHVgyqJFQXIee/yLs3dZqKjjeKKhhVeudgjXo7aE/vSu/zVfcQEcUfw=="], + + "metro-symbolicate": ["metro-symbolicate@0.82.5", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-source-map": "0.82.5", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "bin": { "metro-symbolicate": "src/index.js" } }, "sha512-1u+07gzrvYDJ/oNXuOG1EXSvXZka/0JSW1q2EYBWerVKMOhvv9JzDGyzmuV7hHbF2Hg3T3S2uiM36sLz1qKsiw=="], + + "metro-transform-plugins": ["metro-transform-plugins@0.82.5", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/template": "^7.25.0", "@babel/traverse": "^7.25.3", "flow-enums-runtime": "^0.0.6", "nullthrows": "^1.1.1" } }, "sha512-57Bqf3rgq9nPqLrT2d9kf/2WVieTFqsQ6qWHpEng5naIUtc/Iiw9+0bfLLWSAw0GH40iJ4yMjFcFJDtNSYynMA=="], + + "metro-transform-worker": ["metro-transform-worker@0.82.5", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/parser": "^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "metro": "0.82.5", "metro-babel-transformer": "0.82.5", "metro-cache": "0.82.5", "metro-cache-key": "0.82.5", "metro-minify-terser": "0.82.5", "metro-source-map": "0.82.5", "metro-transform-plugins": "0.82.5", "nullthrows": "^1.1.1" } }, "sha512-mx0grhAX7xe+XUQH6qoHHlWedI8fhSpDGsfga7CpkO9Lk9W+aPitNtJWNGrW8PfjKEWbT9Uz9O50dkI8bJqigw=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "mimic-fn": ["mimic-fn@1.2.0", "", {}, "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="], + + "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + + "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], + + "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "msgpackr": ["msgpackr@1.11.5", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA=="], + + "msgpackr-extract": ["msgpackr-extract@3.0.3", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA=="], + + "murmurhash-js": ["murmurhash-js@1.0.0", "", {}, "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw=="], + + "mylas": ["mylas@2.1.14", "", {}, "sha512-BzQguy9W9NJgoVn2mRWzbFrFWWztGCcng2QI9+41frfk+Athwgx3qhqhvStz7ExeUUu7Kzw427sNzHpEZNINog=="], + + "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "napi-postinstall": ["napi-postinstall@0.3.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "nested-error-stacks": ["nested-error-stacks@2.0.1", "", {}, "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A=="], + + "node-abort-controller": ["node-abort-controller@3.1.1", "", {}, "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ=="], + + "node-cron": ["node-cron@4.2.1", "", {}, "sha512-lgimEHPE/QDgFlywTd8yTR61ptugX3Qer29efeyWw2rv259HtGBNn1vZVmp8lB9uo9wC0t/AT4iGqXxia+CJFg=="], + + "node-exports-info": ["node-exports-info@1.6.0", "", { "dependencies": { "array.prototype.flatmap": "^1.3.3", "es-errors": "^1.3.0", "object.entries": "^1.1.9", "semver": "^6.3.1" } }, "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-forge": ["node-forge@1.3.3", "", {}, "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg=="], + + "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="], + + "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], + + "node-releases": ["node-releases@2.0.36", "", {}, "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "npm-package-arg": ["npm-package-arg@11.0.3", "", { "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "nullthrows": ["nullthrows@1.1.1", "", {}, "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw=="], + + "ob1": ["ob1@0.82.5", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-QyQQ6e66f+Ut/qUVjEce0E/wux5nAGLXYZDn1jr15JWstHsCH3l6VVrg8NKDptW9NEiBXKOJeGF/ydxeSDF3IQ=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "object-is": ["object-is@1.1.6", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" } }, "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="], + + "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], + + "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], + + "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "on-headers": ["on-headers@1.1.0", "", {}, "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@2.0.1", "", { "dependencies": { "mimic-fn": "^1.0.0" } }, "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ=="], + + "open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], + + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "ora": ["ora@3.4.0", "", { "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-spinners": "^2.0.0", "log-symbols": "^2.2.0", "strip-ansi": "^5.2.0", "wcwidth": "^1.0.1" } }, "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg=="], + + "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-json": ["parse-json@4.0.0", "", { "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw=="], + + "parse-png": ["parse-png@2.1.0", "", { "dependencies": { "pngjs": "^3.3.0" } }, "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-expression-matcher": ["path-expression-matcher@1.1.3", "", {}, "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "pbf": ["pbf@3.3.0", "", { "dependencies": { "ieee754": "^1.1.12", "resolve-protobuf-schema": "^2.1.0" }, "bin": { "pbf": "bin/pbf" } }, "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q=="], + + "pg": ["pg@8.20.0", "", { "dependencies": { "pg-connection-string": "^2.12.0", "pg-pool": "^3.13.0", "pg-protocol": "^1.13.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.3.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA=="], + + "pg-cloudflare": ["pg-cloudflare@1.3.0", "", {}, "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ=="], + + "pg-connection-string": ["pg-connection-string@2.12.0", "", {}, "sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ=="], + + "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], + + "pg-pool": ["pg-pool@3.13.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA=="], + + "pg-protocol": ["pg-protocol@1.13.0", "", {}, "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w=="], + + "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], + + "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], + + "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + + "plimit-lit": ["plimit-lit@1.6.1", "", { "dependencies": { "queue-lit": "^1.5.1" } }, "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA=="], + + "plist": ["plist@3.1.0", "", { "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } }, "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ=="], + + "pngjs": ["pngjs@3.4.0", "", {}, "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="], + + "point-in-polygon": ["point-in-polygon@1.1.0", "", {}, "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw=="], + + "point-in-polygon-hao": ["point-in-polygon-hao@1.2.4", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ=="], + + "polyclip-ts": ["polyclip-ts@0.16.8", "", { "dependencies": { "bignumber.js": "^9.1.0", "splaytree-ts": "^1.0.2" } }, "sha512-JPtKbDRuPEuAjuTdhR62Gph7Is2BS1Szx69CFOO3g71lpJDFo78k4tFyi+qFOMVPePEzdSKkpGU3NBXPHHjvKQ=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + + "postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="], + + "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="], + + "postcss-js": ["postcss-js@4.1.0", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw=="], + + "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="], + + "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], + + "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + + "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], + + "postgres-bytea": ["postgres-bytea@1.0.1", "", {}, "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ=="], + + "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], + + "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], + + "potpack": ["potpack@2.1.0", "", {}, "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "pretty-bytes": ["pretty-bytes@5.6.0", "", {}, "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg=="], + + "pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], + + "proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + + "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], + + "promise": ["promise@8.3.0", "", { "dependencies": { "asap": "~2.0.6" } }, "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg=="], + + "promise-limit": ["promise-limit@2.7.0", "", {}, "sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw=="], + + "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], + + "promise-worker-transferable": ["promise-worker-transferable@1.0.4", "", { "dependencies": { "is-promise": "^2.1.0", "lie": "^3.0.2" } }, "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw=="], + + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], + + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + + "property-expr": ["property-expr@2.0.6", "", {}, "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA=="], + + "protocol-buffers-schema": ["protocol-buffers-schema@3.6.0", "", {}, "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="], + + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "pug": ["pug@3.0.4", "", { "dependencies": { "pug-code-gen": "^3.0.4", "pug-filters": "^4.0.0", "pug-lexer": "^5.0.1", "pug-linker": "^4.0.0", "pug-load": "^3.0.0", "pug-parser": "^6.0.0", "pug-runtime": "^3.0.1", "pug-strip-comments": "^2.0.0" } }, "sha512-kFfq5mMzrS7+wrl5pLJzZEzemx34OQ0w4SARfhy/3yxTlhbstsudDwJzhf1hP02yHzbjoVMSXUj/Sz6RNfMyXg=="], + + "pug-attrs": ["pug-attrs@3.0.0", "", { "dependencies": { "constantinople": "^4.0.1", "js-stringify": "^1.0.2", "pug-runtime": "^3.0.0" } }, "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA=="], + + "pug-code-gen": ["pug-code-gen@3.0.4", "", { "dependencies": { "constantinople": "^4.0.1", "doctypes": "^1.1.0", "js-stringify": "^1.0.2", "pug-attrs": "^3.0.0", "pug-error": "^2.1.0", "pug-runtime": "^3.0.1", "void-elements": "^3.1.0", "with": "^7.0.0" } }, "sha512-6okWYIKdasTyXICyEtvobmTZAVX57JkzgzIi4iRJlin8kmhG+Xry2dsus+Mun/nGCn6F2U49haHI5mkELXB14g=="], + + "pug-error": ["pug-error@2.1.0", "", {}, "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg=="], + + "pug-filters": ["pug-filters@4.0.0", "", { "dependencies": { "constantinople": "^4.0.1", "jstransformer": "1.0.0", "pug-error": "^2.0.0", "pug-walk": "^2.0.0", "resolve": "^1.15.1" } }, "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A=="], + + "pug-lexer": ["pug-lexer@5.0.1", "", { "dependencies": { "character-parser": "^2.2.0", "is-expression": "^4.0.0", "pug-error": "^2.0.0" } }, "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w=="], + + "pug-linker": ["pug-linker@4.0.0", "", { "dependencies": { "pug-error": "^2.0.0", "pug-walk": "^2.0.0" } }, "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw=="], + + "pug-load": ["pug-load@3.0.0", "", { "dependencies": { "object-assign": "^4.1.1", "pug-walk": "^2.0.0" } }, "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ=="], + + "pug-parser": ["pug-parser@6.0.0", "", { "dependencies": { "pug-error": "^2.0.0", "token-stream": "1.0.0" } }, "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw=="], + + "pug-runtime": ["pug-runtime@3.0.1", "", {}, "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg=="], + + "pug-strip-comments": ["pug-strip-comments@2.0.0", "", { "dependencies": { "pug-error": "^2.0.0" } }, "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ=="], + + "pug-walk": ["pug-walk@2.0.0", "", {}, "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "qrcode-terminal": ["qrcode-terminal@0.11.0", "", { "bin": { "qrcode-terminal": "./bin/qrcode-terminal.js" } }, "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ=="], + + "qs": ["qs@6.14.2", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q=="], + + "query-string": ["query-string@7.1.3", "", { "dependencies": { "decode-uri-component": "^0.2.2", "filter-obj": "^1.1.0", "split-on-first": "^1.0.0", "strict-uri-encode": "^2.0.0" } }, "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg=="], + + "queue": ["queue@6.0.2", "", { "dependencies": { "inherits": "~2.0.3" } }, "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA=="], + + "queue-lit": ["queue-lit@1.5.2", "", {}, "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "quickselect": ["quickselect@3.0.0", "", {}, "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "raw-body": ["raw-body@2.5.3", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "unpipe": "~1.0.0" } }, "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA=="], + + "razorpay": ["razorpay@2.9.6", "", { "dependencies": { "axios": "^1.6.8" } }, "sha512-zsHAQzd6e1Cc6BNoCNZQaf65ElL6O6yw0wulxmoG5VQDr363fZC90Mp1V5EktVzG45yPyNomNXWlf4cQ3622gQ=="], + + "rbush": ["rbush@3.0.1", "", { "dependencies": { "quickselect": "^2.0.0" } }, "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w=="], + + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], + + "react-devtools-core": ["react-devtools-core@6.1.5", "", { "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" } }, "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA=="], + + "react-dom": ["react-dom@19.0.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ=="], + + "react-fast-compare": ["react-fast-compare@3.2.2", "", {}, "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="], + + "react-freeze": ["react-freeze@1.0.4", "", { "peerDependencies": { "react": ">=17.0.0" } }, "sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA=="], + + "react-hook-form": ["react-hook-form@7.71.2", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-1CHvcDYzuRUNOflt4MOq3ZM46AronNJtQ1S7tnX6YN4y72qhgiUItpacZUAQ0TyWYci3yz1X+rXaSxiuEm86PA=="], + + "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "react-native": ["react-native@0.79.6", "", { "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.79.6", "@react-native/codegen": "0.79.6", "@react-native/community-cli-plugin": "0.79.6", "@react-native/gradle-plugin": "0.79.6", "@react-native/js-polyfills": "0.79.6", "@react-native/normalize-colors": "0.79.6", "@react-native/virtualized-lists": "0.79.6", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "babel-jest": "^29.7.0", "babel-plugin-syntax-hermes-parser": "0.25.1", "base64-js": "^1.5.1", "chalk": "^4.0.0", "commander": "^12.0.0", "event-target-shim": "^5.0.1", "flow-enums-runtime": "^0.0.6", "glob": "^7.1.1", "invariant": "^2.2.4", "jest-environment-node": "^29.7.0", "memoize-one": "^5.0.0", "metro-runtime": "^0.82.0", "metro-source-map": "^0.82.0", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", "react-devtools-core": "^6.1.1", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", "scheduler": "0.25.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", "ws": "^6.2.3", "yargs": "^17.6.2" }, "peerDependencies": { "@types/react": "^19.0.0", "react": "^19.0.0" }, "optionalPeers": ["@types/react"], "bin": { "react-native": "cli.js" } }, "sha512-kvIWSmf4QPfY41HC25TR285N7Fv0Pyn3DAEK8qRL9dA35usSaxsJkHfw+VqnonqJjXOaoKCEanwudRAJ60TBGA=="], + + "react-native-draggable-flatlist": ["react-native-draggable-flatlist@4.0.3", "", { "dependencies": { "@babel/preset-typescript": "^7.17.12" }, "peerDependencies": { "react-native": ">=0.64.0", "react-native-gesture-handler": ">=2.0.0", "react-native-reanimated": ">=2.8.0" } }, "sha512-2F4x5BFieWdGq9SetD2nSAR7s7oQCSgNllYgERRXXtNfSOuAGAVbDb/3H3lP0y5f7rEyNwabKorZAD/SyyNbDw=="], + + "react-native-drawer-layout": ["react-native-drawer-layout@4.2.2", "", { "dependencies": { "color": "^4.2.3", "use-latest-callback": "^0.2.4" }, "peerDependencies": { "react": ">= 18.2.0", "react-native": "*", "react-native-gesture-handler": ">= 2.0.0", "react-native-reanimated": ">= 2.0.0" } }, "sha512-UG/PTTeyyr43KahbgoGyXri8LMO5USHY3/RUpeKBKwCc7xLVGnDLOVNSRrJw0dDc7YmPbmAyJ4oxp8nKboKKuw=="], + + "react-native-edge-to-edge": ["react-native-edge-to-edge@1.6.0", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-2WCNdE3Qd6Fwg9+4BpbATUxCLcouF6YRY7K+J36KJ4l3y+tWN6XCqAC4DuoGblAAbb2sLkhEDp4FOlbOIot2Og=="], + + "react-native-element-dropdown": ["react-native-element-dropdown@2.12.4", "", { "dependencies": { "lodash": "^4.17.21" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-abZc5SVji9FIt7fjojRYrbuvp03CoeZJrgvezQoDoSOrpiTqkX69ix5m+j06W2AVncA0VWvbT+vCMam8SoVadw=="], + + "react-native-gesture-handler": ["react-native-gesture-handler@2.24.0", "", { "dependencies": { "@egjs/hammerjs": "^2.0.17", "hoist-non-react-statics": "^3.3.0", "invariant": "^2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-ZdWyOd1C8axKJHIfYxjJKCcxjWEpUtUWgTOVY2wynbiveSQDm8X/PDyAKXSer/GOtIpjudUbACOndZXCN3vHsw=="], + + "react-native-iphone-x-helper": ["react-native-iphone-x-helper@1.3.1", "", { "peerDependencies": { "react-native": ">=0.42.0" } }, "sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg=="], + + "react-native-is-edge-to-edge": ["react-native-is-edge-to-edge@1.3.1", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA=="], + + "react-native-keyboard-aware-scroll-view": ["react-native-keyboard-aware-scroll-view@0.9.5", "", { "dependencies": { "prop-types": "^15.6.2", "react-native-iphone-x-helper": "^1.0.3" }, "peerDependencies": { "react-native": ">=0.48.4" } }, "sha512-XwfRn+T/qBH9WjTWIBiJD2hPWg0yJvtaEw6RtPCa5/PYHabzBaWxYBOl0usXN/368BL1XktnZPh8C2lmTpOREA=="], + + "react-native-pager-view": ["react-native-pager-view@6.7.1", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-cBSr6xw4g5N7Kd3VGWcf+kmaH7iBWb0DXAf2bVo3bXkzBcBbTOmYSvc0LVLHhUPW8nEq5WjT9LCIYAzgF++EXw=="], + + "react-native-paper": ["react-native-paper@5.15.0", "", { "dependencies": { "@callstack/react-theme-provider": "^3.0.9", "color": "^3.1.2", "use-latest-callback": "^0.2.3" }, "peerDependencies": { "react": "*", "react-native": "*", "react-native-safe-area-context": "*" } }, "sha512-I/1CQLfW9VM0Oo5I5dQI/hjgf1I6q2S1wwgzAdsv6whAQ3zO97GWHwtgNh9se9j8zBOJ86afPTQKxxUL0IJd9A=="], + + "react-native-phonepe-pg": ["react-native-phonepe-pg@3.1.1", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-Qd2IS9cPQzYoB1D1YGEKMChMX87+nBL1Nv7eOXpQorv/UZmL+Mypv1N87jro1uiHUbz4ZsDNWyJih2TjNNMUmQ=="], + + "react-native-razorpay": ["react-native-razorpay@2.3.1", "", { "peerDependencies": { "react": ">=16.8.0", "react-native": ">=0.66.0" } }, "sha512-aEod2YigiWx9Vik+2YRpTh9kNKK9KZbfhrRpk5tU8z8ZPDdLt57rRsqd7lVuDybqqO6nLY6ughPjMN+FPyX8Ag=="], + + "react-native-reanimated": ["react-native-reanimated@3.17.5", "", { "dependencies": { "@babel/plugin-transform-arrow-functions": "^7.0.0-0", "@babel/plugin-transform-class-properties": "^7.0.0-0", "@babel/plugin-transform-classes": "^7.0.0-0", "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0", "@babel/plugin-transform-optional-chaining": "^7.0.0-0", "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", "@babel/plugin-transform-template-literals": "^7.0.0-0", "@babel/plugin-transform-unicode-regex": "^7.0.0-0", "@babel/preset-typescript": "^7.16.7", "convert-source-map": "^2.0.0", "invariant": "^2.2.4", "react-native-is-edge-to-edge": "1.1.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0", "react": "*", "react-native": "*" } }, "sha512-SxBK7wQfJ4UoWoJqQnmIC7ZjuNgVb9rcY5Xc67upXAFKftWg0rnkknTw6vgwnjRcvYThrjzUVti66XoZdDJGtw=="], + + "react-native-safe-area-context": ["react-native-safe-area-context@5.4.0", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-JaEThVyJcLhA+vU0NU8bZ0a1ih6GiF4faZ+ArZLqpYbL6j7R3caRqj+mE3lEtKCuHgwjLg3bCxLL1GPUJZVqUA=="], + + "react-native-screens": ["react-native-screens@4.11.1", "", { "dependencies": { "react-freeze": "^1.0.0", "react-native-is-edge-to-edge": "^1.1.7", "warn-once": "^0.1.0" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-F0zOzRVa3ptZfLpD0J8ROdo+y1fEPw+VBFq1MTY/iyDu08al7qFUO5hLMd+EYMda5VXGaTFCa8q7bOppUszhJw=="], + + "react-native-svg": ["react-native-svg@15.11.2", "", { "dependencies": { "css-select": "^5.1.0", "css-tree": "^1.1.3", "warn-once": "0.1.1" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-+YfF72IbWQUKzCIydlijV1fLuBsQNGMT6Da2kFlo1sh+LE3BIm/2Q7AR1zAAR6L0BFLi1WaQPLfFUC9bNZpOmw=="], + + "react-native-tab-view": ["react-native-tab-view@4.3.0", "", { "dependencies": { "use-latest-callback": "^0.2.4" }, "peerDependencies": { "react": ">= 18.2.0", "react-native": "*", "react-native-pager-view": ">= 6.0.0" } }, "sha512-qPMF75uz/7+MuVG2g+YETdGMzlWZnhC6iI4h/7EBbwIBwNBIBi2z4OA6KhY3IOOBwGHXEIz5IyA6doDqifYBHg=="], + + "react-native-toast-message": ["react-native-toast-message@2.3.3", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-4IIUHwUPvKHu4gjD0Vj2aGQzqPATiblL1ey8tOqsxOWRPGGu52iIbL8M/mCz4uyqecvPdIcMY38AfwRuUADfQQ=="], + + "react-native-web": ["react-native-web@0.20.0", "", { "dependencies": { "@babel/runtime": "^7.18.6", "@react-native/normalize-colors": "^0.74.1", "fbjs": "^3.0.4", "inline-style-prefixer": "^7.0.1", "memoize-one": "^6.0.0", "nullthrows": "^1.1.1", "postcss-value-parser": "^4.2.0", "styleq": "^0.1.3" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-OOSgrw+aON6R3hRosCau/xVxdLzbjEcsLysYedka0ZON4ZZe6n9xgeN9ZkoejhARM36oTlUgHIQqxGutEJ9Wxg=="], + + "react-native-webview": ["react-native-webview@13.13.5", "", { "dependencies": { "escape-string-regexp": "^4.0.0", "invariant": "2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-MfC2B+woL4Hlj2WCzcb1USySKk+SteXnUKmKktOk/H/AQy5+LuVdkPKm8SknJ0/RxaxhZ48WBoTRGaqgR137hw=="], + + "react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="], + + "react-use-measure": ["react-use-measure@2.1.7", "", { "peerDependencies": { "react": ">=16.13", "react-dom": ">=16.13" }, "optionalPeers": ["react-dom"] }, "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg=="], + + "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "redis": ["redis@5.11.0", "", { "dependencies": { "@redis/bloom": "5.11.0", "@redis/client": "5.11.0", "@redis/json": "5.11.0", "@redis/search": "5.11.0", "@redis/time-series": "5.11.0" } }, "sha512-YwXjATVDT+AuxcyfOwZn046aml9jMlQPvU1VXIlLDVAExe0u93aTfPYSeRgG4p9Q/Jlkj+LXJ1XEoFV+j2JKcQ=="], + + "redis-errors": ["redis-errors@1.2.0", "", {}, "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w=="], + + "redis-parser": ["redis-parser@3.0.0", "", { "dependencies": { "redis-errors": "^1.0.0" } }, "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A=="], + + "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], + + "regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="], + + "regenerate-unicode-properties": ["regenerate-unicode-properties@10.2.2", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g=="], + + "regenerator-runtime": ["regenerator-runtime@0.13.11", "", {}, "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="], + + "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], + + "regexpu-core": ["regexpu-core@6.4.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.2.1" } }, "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA=="], + + "regjsgen": ["regjsgen@0.8.0", "", {}, "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="], + + "regjsparser": ["regjsparser@0.13.0", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "requireg": ["requireg@0.2.2", "", { "dependencies": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", "resolve": "~1.7.1" } }, "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg=="], + + "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], + + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "resolve-protobuf-schema": ["resolve-protobuf-schema@2.1.0", "", { "dependencies": { "protocol-buffers-schema": "^3.3.1" } }, "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ=="], + + "resolve-workspace-root": ["resolve-workspace-root@2.0.1", "", {}, "sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w=="], + + "resolve.exports": ["resolve.exports@2.0.3", "", {}, "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A=="], + + "restore-cursor": ["restore-cursor@2.0.0", "", { "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q=="], + + "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rimraf": ["rimraf@6.1.3", "", { "dependencies": { "glob": "^13.0.3", "package-json-from-dist": "^1.0.1" }, "bin": { "rimraf": "dist/esm/bin.mjs" } }, "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA=="], + + "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="], + + "rollup": ["rollup@4.59.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.59.0", "@rollup/rollup-android-arm64": "4.59.0", "@rollup/rollup-darwin-arm64": "4.59.0", "@rollup/rollup-darwin-x64": "4.59.0", "@rollup/rollup-freebsd-arm64": "4.59.0", "@rollup/rollup-freebsd-x64": "4.59.0", "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", "@rollup/rollup-linux-arm-musleabihf": "4.59.0", "@rollup/rollup-linux-arm64-gnu": "4.59.0", "@rollup/rollup-linux-arm64-musl": "4.59.0", "@rollup/rollup-linux-loong64-gnu": "4.59.0", "@rollup/rollup-linux-loong64-musl": "4.59.0", "@rollup/rollup-linux-ppc64-gnu": "4.59.0", "@rollup/rollup-linux-ppc64-musl": "4.59.0", "@rollup/rollup-linux-riscv64-gnu": "4.59.0", "@rollup/rollup-linux-riscv64-musl": "4.59.0", "@rollup/rollup-linux-s390x-gnu": "4.59.0", "@rollup/rollup-linux-x64-gnu": "4.59.0", "@rollup/rollup-linux-x64-musl": "4.59.0", "@rollup/rollup-openbsd-x64": "4.59.0", "@rollup/rollup-openharmony-arm64": "4.59.0", "@rollup/rollup-win32-arm64-msvc": "4.59.0", "@rollup/rollup-win32-ia32-msvc": "4.59.0", "@rollup/rollup-win32-x64-gnu": "4.59.0", "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], + + "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "sax": ["sax@1.5.0", "", {}, "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA=="], + + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "send": ["send@0.19.2", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "~0.5.2", "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "~2.4.1", "range-parser": "~1.2.1", "statuses": "~2.0.2" } }, "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg=="], + + "serialize-error": ["serialize-error@2.1.0", "", {}, "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw=="], + + "seroval": ["seroval@1.5.1", "", {}, "sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA=="], + + "seroval-plugins": ["seroval-plugins@1.5.1", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-4FbuZ/TMl02sqv0RTFexu0SP6V+ywaIe5bAWCCEik0fk17BhALgwvUDVF7e3Uvf9pxmwCEJsRPmlkUE6HdzLAw=="], + + "serve-static": ["serve-static@1.16.3", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "~0.19.1" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="], + + "server-only": ["server-only@0.0.1", "", {}, "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], + + "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], + + "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "sf-symbols-typescript": ["sf-symbols-typescript@2.2.0", "", {}, "sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw=="], + + "shallowequal": ["shallowequal@1.1.0", "", {}, "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "simple-plist": ["simple-plist@1.3.1", "", { "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", "plist": "^3.0.5" } }, "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw=="], + + "simple-swizzle": ["simple-swizzle@0.2.4", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "skmeans": ["skmeans@0.9.7", "", {}, "sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "slugify": ["slugify@1.6.8", "", {}, "sha512-HVk9X1E0gz3mSpoi60h/saazLKXKaZThMLU3u/aNwoYn8/xQyX2MGxL0ui2eaokkD7tF+Zo+cKTHUbe1mmmGzA=="], + + "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "splaytree-ts": ["splaytree-ts@1.0.2", "", {}, "sha512-0kGecIZNIReCSiznK3uheYB8sbstLjCZLiwcQwbmLhgHJj2gz6OnSPkVzJQCMnmEz1BQ4gPK59ylhBoEWOhGNA=="], + + "split-on-first": ["split-on-first@1.1.0", "", {}, "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw=="], + + "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="], + + "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], + + "stackframe": ["stackframe@1.3.4", "", {}, "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="], + + "stacktrace-parser": ["stacktrace-parser@0.1.11", "", { "dependencies": { "type-fest": "^0.7.1" } }, "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg=="], + + "standard-as-callback": ["standard-as-callback@2.1.0", "", {}, "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="], + + "stats-gl": ["stats-gl@2.4.2", "", { "dependencies": { "@types/three": "*", "three": "^0.170.0" } }, "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ=="], + + "stats.js": ["stats.js@0.17.0", "", {}, "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw=="], + + "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], + + "stream-buffers": ["stream-buffers@2.2.0", "", {}, "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg=="], + + "strict-uri-encode": ["strict-uri-encode@2.0.0", "", {}, "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="], + + "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="], + + "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], + + "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], + + "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], + + "strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "strnum": ["strnum@2.2.0", "", {}, "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg=="], + + "structured-headers": ["structured-headers@0.4.1", "", {}, "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg=="], + + "styleq": ["styleq@0.1.3", "", {}, "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA=="], + + "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], + + "supercluster": ["supercluster@8.0.1", "", { "dependencies": { "kdbush": "^4.0.2" } }, "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ=="], + + "superjson": ["superjson@2.2.6", "", { "dependencies": { "copy-anything": "^4" } }, "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-hyperlinks": ["supports-hyperlinks@2.3.0", "", { "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" } }, "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "suspend-react": ["suspend-react@0.1.3", "", { "peerDependencies": { "react": ">=17.0" } }, "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ=="], + + "sweepline-intersections": ["sweepline-intersections@1.5.0", "", { "dependencies": { "tinyqueue": "^2.0.0" } }, "sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ=="], + + "symbuyote-info-site": ["symbuyote-info-site@workspace:apps/info-site"], + + "tailwind-merge": ["tailwind-merge@2.6.1", "", {}, "sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ=="], + + "tailwindcss": ["tailwindcss@3.4.19", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ=="], + + "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], + + "tar": ["tar@7.5.11", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ=="], + + "temp-dir": ["temp-dir@2.0.0", "", {}, "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg=="], + + "terminal-link": ["terminal-link@2.1.1", "", { "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" } }, "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ=="], + + "terser": ["terser@5.46.1", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ=="], + + "test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + + "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], + + "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], + + "three": ["three@0.182.0", "", {}, "sha512-GbHabT+Irv+ihI1/f5kIIsZ+Ef9Sl5A1Y7imvS5RQjWgtTPfPnZ43JmlYI7NtCRDK9zir20lQpfg8/9Yd02OvQ=="], + + "three-mesh-bvh": ["three-mesh-bvh@0.8.3", "", { "peerDependencies": { "three": ">= 0.159.0" } }, "sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg=="], + + "three-stdlib": ["three-stdlib@2.36.1", "", { "dependencies": { "@types/draco3d": "^1.4.0", "@types/offscreencanvas": "^2019.6.4", "@types/webxr": "^0.5.2", "draco3d": "^1.4.1", "fflate": "^0.6.9", "potpack": "^1.0.1" }, "peerDependencies": { "three": ">=0.128.0" } }, "sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg=="], + + "throat": ["throat@5.0.0", "", {}, "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="], + + "tiny-case": ["tiny-case@1.0.3", "", {}, "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q=="], + + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + + "tiny-warning": ["tiny-warning@1.0.3", "", {}, "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="], + + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + + "tinyqueue": ["tinyqueue@3.0.0", "", {}, "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g=="], + + "tmpl": ["tmpl@1.0.5", "", {}, "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "token-stream": ["token-stream@1.0.0", "", {}, "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg=="], + + "topojson-client": ["topojson-client@3.1.0", "", { "dependencies": { "commander": "2" }, "bin": { "topo2geo": "bin/topo2geo", "topomerge": "bin/topomerge", "topoquantize": "bin/topoquantize" } }, "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw=="], + + "topojson-server": ["topojson-server@3.0.1", "", { "dependencies": { "commander": "2" }, "bin": { "geo2topo": "bin/geo2topo" } }, "sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw=="], + + "toposort": ["toposort@2.0.2", "", {}, "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], + + "troika-three-text": ["troika-three-text@0.52.4", "", { "dependencies": { "bidi-js": "^1.0.2", "troika-three-utils": "^0.52.4", "troika-worker-utils": "^0.52.0", "webgl-sdf-generator": "1.1.1" }, "peerDependencies": { "three": ">=0.125.0" } }, "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg=="], + + "troika-three-utils": ["troika-three-utils@0.52.4", "", { "peerDependencies": { "three": ">=0.125.0" } }, "sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A=="], + + "troika-worker-utils": ["troika-worker-utils@0.52.0", "", {}, "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw=="], + + "ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="], + + "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], + + "ts-node": ["ts-node@10.9.2", "", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "optionalPeers": ["@swc/core", "@swc/wasm"], "bin": { "ts-node": "dist/bin.js", "ts-script": "dist/bin-script-deprecated.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="], + + "ts-node-dev": ["ts-node-dev@2.0.0", "", { "dependencies": { "chokidar": "^3.5.1", "dynamic-dedupe": "^0.3.0", "minimist": "^1.2.6", "mkdirp": "^1.0.4", "resolve": "^1.0.0", "rimraf": "^2.6.1", "source-map-support": "^0.5.12", "tree-kill": "^1.2.2", "ts-node": "^10.4.0", "tsconfig": "^7.0.0" }, "peerDependencies": { "node-notifier": "*", "typescript": "*" }, "optionalPeers": ["node-notifier"], "bin": { "ts-node-dev": "lib/bin.js", "tsnd": "lib/bin.js" } }, "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w=="], + + "tsc-alias": ["tsc-alias@1.8.16", "", { "dependencies": { "chokidar": "^3.5.3", "commander": "^9.0.0", "get-tsconfig": "^4.10.0", "globby": "^11.0.4", "mylas": "^2.1.9", "normalize-path": "^3.0.0", "plimit-lit": "^1.2.6" }, "bin": { "tsc-alias": "dist/bin/index.js" } }, "sha512-QjCyu55NFyRSBAl6+MTFwplpFcnm2Pq01rR/uxfqJoLMm6X3O14KEGtaSDZpJYaE1bJBGDjD0eSuiIWPe2T58g=="], + + "tsconfig": ["tsconfig@7.0.0", "", { "dependencies": { "@types/strip-bom": "^3.0.0", "@types/strip-json-comments": "0.0.30", "strip-bom": "^3.0.0", "strip-json-comments": "^2.0.0" } }, "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw=="], + + "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "tsx": ["tsx@4.21.0", "", { "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw=="], + + "tunnel-rat": ["tunnel-rat@0.1.2", "", { "dependencies": { "zustand": "^4.3.2" } }, "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ=="], + + "turbo": ["turbo@2.8.17", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.17", "turbo-darwin-arm64": "2.8.17", "turbo-linux-64": "2.8.17", "turbo-linux-arm64": "2.8.17", "turbo-windows-64": "2.8.17", "turbo-windows-arm64": "2.8.17" }, "bin": { "turbo": "bin/turbo" } }, "sha512-YwPsNSqU2f/RXU/+Kcb7cPkPZARxom4+me7LKEdN5jsvy2tpfze3zDZ4EiGrJnvOm9Avu9rK0aaYsP7qZ3iz7A=="], + + "turbo-darwin-64": ["turbo-darwin-64@2.8.17", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZFkv2hv7zHpAPEXBF6ouRRXshllOavYc+jjcrYyVHvxVTTwJWsBZwJ/gpPzmOKGvkSjsEyDO5V6aqqtZzwVF+Q=="], + + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.17", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5DXqhQUt24ycEryXDfMNKEkW5TBHs+QmU23a2qxXwwFDaJsWcPo2obEhBxxdEPOv7qmotjad+09RGeWCcJ9JDw=="], + + "turbo-linux-64": ["turbo-linux-64@2.8.17", "", { "os": "linux", "cpu": "x64" }, "sha512-KLUbz6w7F73D/Ihh51hVagrKR0/CTsPEbRkvXLXvoND014XJ4BCrQUqSxlQ4/hu+nqp1v5WlM85/h3ldeyujuA=="], + + "turbo-linux-arm64": ["turbo-linux-arm64@2.8.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-pJK67XcNJH40lTAjFu7s/rUlobgVXyB3A3lDoq+/JccB3hf+SysmkpR4Itlc93s8LEaFAI4mamhFuTV17Z6wOg=="], + + "turbo-windows-64": ["turbo-windows-64@2.8.17", "", { "os": "win32", "cpu": "x64" }, "sha512-EijeQ6zszDMmGZLP2vT2RXTs/GVi9rM0zv2/G4rNu2SSRSGFapgZdxgW4b5zUYLVaSkzmkpWlGfPfj76SW9yUg=="], + + "turbo-windows-arm64": ["turbo-windows-arm64@2.8.17", "", { "os": "win32", "cpu": "arm64" }, "sha512-crpfeMPkfECd4V1PQ/hMoiyVcOy04+bWedu/if89S15WhOalHZ2BYUi6DOJhZrszY+mTT99OwpOsj4wNfb/GHQ=="], + + "twrnc": ["twrnc@4.16.0", "", { "dependencies": { "tailwindcss": ">=2.0.0 <4.0.0" }, "peerDependencies": { "react-native": ">=0.62.2" } }, "sha512-sPSnSlT2CmOd2ITUm9M8ltsEjTyJti/9HpYfewAfhqRT4gMQtOWkK1tiIev0vVhPJ9IcTGtk2TC33OsSLhsFfA=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], + + "type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], + + "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], + + "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], + + "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], + + "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "ua-parser-js": ["ua-parser-js@0.7.41", "", { "bin": { "ua-parser-js": "script/cli.js" } }, "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg=="], + + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], + + "undici": ["undici@7.24.4", "", {}, "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w=="], + + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="], + + "unicode-match-property-ecmascript": ["unicode-match-property-ecmascript@2.0.0", "", { "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q=="], + + "unicode-match-property-value-ecmascript": ["unicode-match-property-value-ecmascript@2.2.1", "", {}, "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg=="], + + "unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.2.0", "", {}, "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ=="], + + "unique-string": ["unique-string@2.0.0", "", { "dependencies": { "crypto-random-string": "^2.0.0" } }, "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "unrs-resolver": ["unrs-resolver@1.11.1", "", { "dependencies": { "napi-postinstall": "^0.3.0" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.11.1", "@unrs/resolver-binding-android-arm64": "1.11.1", "@unrs/resolver-binding-darwin-arm64": "1.11.1", "@unrs/resolver-binding-darwin-x64": "1.11.1", "@unrs/resolver-binding-freebsd-x64": "1.11.1", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-musl": "1.11.1", "@unrs/resolver-binding-wasm32-wasi": "1.11.1", "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg=="], + + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "use-latest-callback": ["use-latest-callback@0.2.6", "", { "peerDependencies": { "react": ">=16.8" } }, "sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg=="], + + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], + + "user-ui": ["user-ui@workspace:apps/user-ui"], + + "util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "utility-types": ["utility-types@3.11.0", "", {}, "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw=="], + + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + + "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + + "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="], + + "validate-npm-package-name": ["validate-npm-package-name@5.0.1", "", {}, "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], + + "vlq": ["vlq@1.0.1", "", {}, "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w=="], + + "void-elements": ["void-elements@3.1.0", "", {}, "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w=="], + + "vt-pbf": ["vt-pbf@3.1.3", "", { "dependencies": { "@mapbox/point-geometry": "0.1.0", "@mapbox/vector-tile": "^1.3.1", "pbf": "^3.2.1" } }, "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA=="], + + "walker": ["walker@1.0.8", "", { "dependencies": { "makeerror": "1.0.12" } }, "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ=="], + + "warn-once": ["warn-once@0.1.1", "", {}, "sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q=="], + + "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="], + + "webgl-constants": ["webgl-constants@1.1.1", "", {}, "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg=="], + + "webgl-sdf-generator": ["webgl-sdf-generator@1.1.1", "", {}, "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA=="], + + "webidl-conversions": ["webidl-conversions@5.0.0", "", {}, "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="], + + "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "whatwg-url-without-unicode": ["whatwg-url-without-unicode@8.0.0-3", "", { "dependencies": { "buffer": "^5.4.3", "punycode": "^2.1.1", "webidl-conversions": "^5.0.0" } }, "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], + + "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], + + "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], + + "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="], + + "with": ["with@7.0.2", "", { "dependencies": { "@babel/parser": "^7.9.6", "@babel/types": "^7.9.6", "assert-never": "^1.2.1", "babel-walk": "3.0.0-canary-5" } }, "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w=="], + + "wonka": ["wonka@6.3.5", "", {}, "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "write-file-atomic": ["write-file-atomic@4.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" } }, "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg=="], + + "ws": ["ws@6.2.3", "", { "dependencies": { "async-limiter": "~1.0.0" } }, "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA=="], + + "xcode": ["xcode@3.0.1", "", { "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" } }, "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA=="], + + "xml2js": ["xml2js@0.6.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w=="], + + "xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "yup": ["yup@1.7.1", "", { "dependencies": { "property-expr": "^2.0.5", "tiny-case": "^1.0.3", "toposort": "^2.0.2", "type-fest": "^2.19.0" } }, "sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw=="], + + "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + + "zustand": ["zustand@5.0.12", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g=="], + + "@aws-crypto/sha1-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], + + "@aws-crypto/sha256-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], + + "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], + + "@babel/highlight/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "@callstack/react-theme-provider/deepmerge": ["deepmerge@3.3.0", "", {}, "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA=="], + + "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + + "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "@expo/cli/arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], + + "@expo/cli/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "@expo/cli/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "@expo/cli/picomatch": ["picomatch@3.0.1", "", {}, "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag=="], + + "@expo/cli/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "@expo/cli/undici": ["undici@6.24.1", "", {}, "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA=="], + + "@expo/cli/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + + "@expo/config/@babel/code-frame": ["@babel/code-frame@7.10.4", "", { "dependencies": { "@babel/highlight": "^7.10.4" } }, "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg=="], + + "@expo/config/deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "@expo/config/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "@expo/config/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "@expo/config-plugins/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "@expo/config-plugins/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "@expo/devcert/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "@expo/env/dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], + + "@expo/fingerprint/arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], + + "@expo/fingerprint/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "@expo/fingerprint/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "@expo/fingerprint/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "@expo/image-utils/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "@expo/json-file/@babel/code-frame": ["@babel/code-frame@7.10.4", "", { "dependencies": { "@babel/highlight": "^7.10.4" } }, "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg=="], + + "@expo/metro-config/dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], + + "@expo/metro-config/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "@expo/metro-config/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "@expo/metro-config/postcss": ["postcss@8.4.49", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA=="], + + "@expo/package-manager/@expo/json-file": ["@expo/json-file@10.0.12", "", { "dependencies": { "@babel/code-frame": "^7.20.0", "json5": "^2.2.3" } }, "sha512-inbDycp1rMAelAofg7h/mMzIe+Owx6F7pur3XdQ3EPTy00tme+4P6FWgHKUcjN8dBSrnbRNpSyh5/shzHyVCyQ=="], + + "@expo/prebuild-config/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@isaacs/cliui/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "@istanbuljs/load-nyc-config/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + + "@istanbuljs/load-nyc-config/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "@istanbuljs/load-nyc-config/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], + + "@maplibre/maplibre-gl-style-spec/quickselect": ["quickselect@2.0.0", "", {}, "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="], + + "@react-native/community-cli-plugin/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "@react-native/community-cli-plugin/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "@react-native/dev-middleware/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "@react-navigation/core/react-is": ["react-is@19.2.4", "", {}, "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA=="], + + "@turf/tesselate/earcut": ["earcut@2.2.4", "", {}, "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="], + + "@types/geokdbush/@types/kdbush": ["@types/kdbush@1.0.7", "", {}, "sha512-QM5iB8m/0mnGOjUKshErIZQ0LseyTieRSYc3yaOpmrRM0xbWiOuJUWlduJx+TPNK7/VFMWphUGwx3nus7eT1Wg=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], + + "@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + + "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], + + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "backend/drizzle-orm": ["drizzle-orm@0.44.7", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ=="], + + "backend/expo-server-sdk": ["expo-server-sdk@4.0.0", "", { "dependencies": { "node-fetch": "^2.6.0", "promise-limit": "^2.7.0", "promise-retry": "^2.0.1" } }, "sha512-zi83XtG2pqyP3gyn1JIRYkydo2i6HU3CYaWo/VvhZG/F29U+QIDv6LBEUsWf4ddZlVE7c9WN1N8Be49rHgO8OQ=="], + + "backend/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "better-opn/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + + "body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "bullmq/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "caller-callsite/callsites": ["callsites@2.0.0", "", {}, "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ=="], + + "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "chromium-edge-launcher/rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "common-ui/react-native-pager-view": ["react-native-pager-view@6.9.1", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-uUT0MMMbNtoSbxe9pRvdJJKEi9snjuJ3fXlZhG8F2vVMOBJVt/AFtqMPUHu9yMflmqOr08PewKzj9EPl/Yj+Gw=="], + + "compressible/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "compression/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "compression/negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], + + "concaveman/robust-predicates": ["robust-predicates@2.0.4", "", {}, "sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg=="], + + "concaveman/tinyqueue": ["tinyqueue@2.0.3", "", {}, "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA=="], + + "connect/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "connect/finalhandler": ["finalhandler@1.1.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" } }, "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA=="], + + "cosmiconfig/import-fresh": ["import-fresh@2.0.0", "", { "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" } }, "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg=="], + + "cosmiconfig/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], + + "css-tree/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "dotenv-expand/dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], + + "error-ex/is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-react/resolve": ["resolve@2.0.0-next.6", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA=="], + + "expo-dev-launcher/ajv": ["ajv@8.11.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg=="], + + "expo-modules-autolinking/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + + "expo-modules-autolinking/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "expo-router/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="], + + "expo-router/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + + "expo-updates/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "fallback-ui/@types/node": ["@types/node@20.19.37", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw=="], + + "fallback-ui/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "fbjs/promise": ["promise@7.3.1", "", { "dependencies": { "asap": "~2.0.3" } }, "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg=="], + + "fbjs/ua-parser-js": ["ua-parser-js@1.0.41", "", { "bin": { "ua-parser-js": "script/cli.js" } }, "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug=="], + + "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "formik/react-fast-compare": ["react-fast-compare@2.0.4", "", {}, "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="], + + "geojson-polygon-self-intersections/rbush": ["rbush@2.0.2", "", { "dependencies": { "quickselect": "^1.0.1" } }, "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA=="], + + "geokdbush/tinyqueue": ["tinyqueue@2.0.3", "", {}, "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA=="], + + "global-prefix/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + + "hoist-non-react-statics/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "is-bun-module/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "is-expression/acorn": ["acorn@7.4.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="], + + "jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "jstransformer/promise": ["promise@7.3.1", "", { "dependencies": { "asap": "~2.0.3" } }, "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg=="], + + "lighthouse-logger/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "log-symbols/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "metro/ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], + + "metro/hermes-parser": ["hermes-parser@0.29.1", "", { "dependencies": { "hermes-estree": "0.29.1" } }, "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA=="], + + "metro/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "metro-babel-transformer/hermes-parser": ["hermes-parser@0.29.1", "", { "dependencies": { "hermes-estree": "0.29.1" } }, "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "node-gyp-build-optional-packages/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "npm-package-arg/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "ora/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "rbush/quickselect": ["quickselect@2.0.0", "", {}, "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="], + + "rc/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "react-devtools-core/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "react-dom/scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], + + "react-native/@react-native/virtualized-lists": ["@react-native/virtualized-lists@0.79.6", "", { "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "peerDependencies": { "@types/react": "^19.0.0", "react": "*", "react-native": "*" }, "optionalPeers": ["@types/react"] }, "sha512-khA/Hrbb+rB68YUHrLubfLgMOD9up0glJhw25UE3Kntj32YDyuO0Tqc81ryNTcCekFKJ8XrAaEjcfPg81zBGPw=="], + + "react-native/scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], + + "react-native/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "react-native-paper/color": ["color@3.2.1", "", { "dependencies": { "color-convert": "^1.9.3", "color-string": "^1.6.0" } }, "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA=="], + + "react-native-reanimated/react-native-is-edge-to-edge": ["react-native-is-edge-to-edge@1.1.7", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-EH6i7E8epJGIcu7KpfXYXiV2JFIYITtq+rVS8uEb+92naMRBdxhTuS8Wn2Q7j9sqyO0B+Xbaaf9VdipIAmGW4w=="], + + "react-native-web/@react-native/normalize-colors": ["@react-native/normalize-colors@0.74.89", "", {}, "sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg=="], + + "react-native-web/memoize-one": ["memoize-one@6.0.0", "", {}, "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="], + + "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "requireg/resolve": ["resolve@1.7.1", "", { "dependencies": { "path-parse": "^1.0.5" } }, "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw=="], + + "restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "rimraf/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], + + "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "simple-plist/bplist-parser": ["bplist-parser@0.3.1", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA=="], + + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], + + "stacktrace-parser/type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="], + + "stats-gl/three": ["three@0.170.0", "", {}, "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ=="], + + "string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], + + "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], + + "sucrase/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "sweepline-intersections/tinyqueue": ["tinyqueue@2.0.3", "", {}, "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA=="], + + "tailwindcss/arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], + + "tar/yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "three-stdlib/fflate": ["fflate@0.6.10", "", {}, "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg=="], + + "three-stdlib/potpack": ["potpack@1.0.2", "", {}, "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="], + + "topojson-client/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "topojson-server/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "ts-node-dev/rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="], + + "tsc-alias/commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], + + "tsconfig/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], + + "tsx/esbuild": ["esbuild@0.27.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.4", "@esbuild/android-arm": "0.27.4", "@esbuild/android-arm64": "0.27.4", "@esbuild/android-x64": "0.27.4", "@esbuild/darwin-arm64": "0.27.4", "@esbuild/darwin-x64": "0.27.4", "@esbuild/freebsd-arm64": "0.27.4", "@esbuild/freebsd-x64": "0.27.4", "@esbuild/linux-arm": "0.27.4", "@esbuild/linux-arm64": "0.27.4", "@esbuild/linux-ia32": "0.27.4", "@esbuild/linux-loong64": "0.27.4", "@esbuild/linux-mips64el": "0.27.4", "@esbuild/linux-ppc64": "0.27.4", "@esbuild/linux-riscv64": "0.27.4", "@esbuild/linux-s390x": "0.27.4", "@esbuild/linux-x64": "0.27.4", "@esbuild/netbsd-arm64": "0.27.4", "@esbuild/netbsd-x64": "0.27.4", "@esbuild/openbsd-arm64": "0.27.4", "@esbuild/openbsd-x64": "0.27.4", "@esbuild/openharmony-arm64": "0.27.4", "@esbuild/sunos-x64": "0.27.4", "@esbuild/win32-arm64": "0.27.4", "@esbuild/win32-ia32": "0.27.4", "@esbuild/win32-x64": "0.27.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ=="], + + "tunnel-rat/zustand": ["zustand@4.5.7", "", { "dependencies": { "use-sync-external-store": "^1.2.2" }, "peerDependencies": { "@types/react": ">=16.8", "immer": ">=9.0.6", "react": ">=16.8" }, "optionalPeers": ["@types/react", "immer", "react"] }, "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw=="], + + "user-ui/expo-location": ["expo-location@18.1.6", "", { "peerDependencies": { "expo": "*" } }, "sha512-l5dQQ2FYkrBgNzaZN1BvSmdhhcztFOUucu2kEfDBMV4wSIuTIt/CKsho+F3RnAiWgvui1wb1WTTf80E8zq48hA=="], + + "whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url-without-unicode/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + + "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "write-file-atomic/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "xcode/uuid": ["uuid@7.0.3", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg=="], + + "xml2js/xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], + + "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], + + "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], + + "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], + + "@babel/highlight/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "@babel/highlight/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "@babel/highlight/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.18.20", "", { "os": "android", "cpu": "arm64" }, "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.18.20", "", { "os": "android", "cpu": "x64" }, "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.18.20", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.18.20", "", { "os": "darwin", "cpu": "x64" }, "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.18.20", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.18.20", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.18.20", "", { "os": "linux", "cpu": "arm" }, "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.18.20", "", { "os": "linux", "cpu": "arm64" }, "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.18.20", "", { "os": "linux", "cpu": "ia32" }, "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.18.20", "", { "os": "linux", "cpu": "ppc64" }, "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.18.20", "", { "os": "linux", "cpu": "s390x" }, "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.18.20", "", { "os": "linux", "cpu": "x64" }, "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.18.20", "", { "os": "none", "cpu": "x64" }, "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.18.20", "", { "os": "openbsd", "cpu": "x64" }, "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.18.20", "", { "os": "sunos", "cpu": "x64" }, "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.18.20", "", { "os": "win32", "cpu": "arm64" }, "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.18.20", "", { "os": "win32", "cpu": "ia32" }, "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], + + "@expo/cli/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@expo/config-plugins/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "@expo/config/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "@expo/fingerprint/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@expo/metro-config/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "@istanbuljs/load-nyc-config/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "@istanbuljs/load-nyc-config/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "@react-native/community-cli-plugin/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "@react-native/dev-middleware/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + + "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "compression/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "connect/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "connect/finalhandler/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "connect/finalhandler/on-finished": ["on-finished@2.3.0", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww=="], + + "connect/finalhandler/statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], + + "cosmiconfig/import-fresh/resolve-from": ["resolve-from@3.0.0", "", {}, "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw=="], + + "cosmiconfig/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "expo-dev-launcher/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "expo-modules-autolinking/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "expo-updates/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "fallback-ui/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "geojson-polygon-self-intersections/rbush/quickselect": ["quickselect@1.1.1", "", {}, "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ=="], + + "global-prefix/which/isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], + + "lighthouse-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "log-symbols/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "log-symbols/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "log-symbols/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "metro-babel-transformer/hermes-parser/hermes-estree": ["hermes-estree@0.29.1", "", {}, "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ=="], + + "metro/hermes-parser/hermes-estree": ["hermes-estree@0.29.1", "", {}, "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ=="], + + "ora/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "ora/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "ora/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "react-native-paper/color/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "rimraf/glob/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], + + "rimraf/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], + + "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "sucrase/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q=="], + + "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.4", "", { "os": "android", "cpu": "arm" }, "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ=="], + + "tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.4", "", { "os": "android", "cpu": "arm64" }, "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw=="], + + "tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.4", "", { "os": "android", "cpu": "x64" }, "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw=="], + + "tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ=="], + + "tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw=="], + + "tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw=="], + + "tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ=="], + + "tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.4", "", { "os": "linux", "cpu": "arm" }, "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg=="], + + "tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA=="], + + "tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA=="], + + "tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA=="], + + "tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw=="], + + "tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA=="], + + "tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw=="], + + "tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA=="], + + "tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.4", "", { "os": "linux", "cpu": "x64" }, "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA=="], + + "tsx/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.4", "", { "os": "none", "cpu": "arm64" }, "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q=="], + + "tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.4", "", { "os": "none", "cpu": "x64" }, "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg=="], + + "tsx/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow=="], + + "tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ=="], + + "tsx/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.4", "", { "os": "none", "cpu": "arm64" }, "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg=="], + + "tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g=="], + + "tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg=="], + + "tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw=="], + + "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.4", "", { "os": "win32", "cpu": "x64" }, "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg=="], + + "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], + + "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], + + "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], + + "@babel/highlight/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "@expo/config-plugins/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@expo/config/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "expo-modules-autolinking/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "expo-updates/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "log-symbols/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "log-symbols/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "ora/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "ora/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "react-native-paper/color/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + + "rimraf/glob/path-scurry/lru-cache": ["lru-cache@11.2.7", "", {}, "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA=="], + + "sucrase/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@babel/highlight/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "log-symbols/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "ora/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "rimraf/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + } +} diff --git a/edge_migration.md b/edge_migration.md new file mode 100644 index 0000000..d2fce89 --- /dev/null +++ b/edge_migration.md @@ -0,0 +1,342 @@ +# Edge Migration Plan: Node.js → Cloudflare Workers + +## Overview + +Migrating the backend from Node.js (Express, CommonJS) to Cloudflare Workers (V8 isolates, ESM, Web Standard APIs). + +--- + +## BLOCKERS (Must fix, won't work at all) + +### 1. Express.js — Complete Replacement Needed + +**Affected files:** +- `apps/backend/index.ts` +- `apps/backend/src/main-router.ts` +- `apps/backend/src/v1-router.ts` +- All files in `apps/backend/src/apis/` +- All files in `apps/backend/src/uv-apis/` + +**Problem:** Express uses Node.js `http` module internally — unavailable in Workers. + +**Solution:** Replace with **Hono** (lightweight, Workers-native, similar middleware pattern) or use Cloudflare's `export default { fetch }` handler. Switch tRPC from `createExpressMiddleware` to `createFetchMiddleware` (Fetch adapter). + +--- + +### 2. `node-postgres` (`pg`) Driver — TCP Sockets Unavailable + +**Affected files:** +- `apps/backend/src/db/db_index.ts:1` — `drizzle-orm/node-postgres` + +**Problem:** `node-postgres` uses TCP connections to Postgres. Workers have no TCP socket support. + +**Solution:** Replace with `drizzle-orm/neon-http` (Neon serverless driver over HTTP) or use **Cloudflare Hyperdrive** (connection pooling proxy) with `@neondatabase/serverless` or fetch-based driver. Schema stays the same, only the driver changes. + +--- + +### 3. Redis Client (`redis` npm package) — Persistent TCP + Pub/Sub Unavailable + +**Affected files:** +- `apps/backend/src/lib/redis-client.ts` (full custom RedisClient class) +- `apps/backend/src/stores/product-store.ts` +- `apps/backend/src/stores/slot-store.ts` +- `apps/backend/src/stores/banner-store.ts` +- `apps/backend/src/stores/product-tag-store.ts` +- `apps/backend/src/stores/user-negativity-store.ts` +- `apps/backend/src/lib/const-store.ts` +- `apps/backend/src/lib/event-queue.ts` +- `apps/backend/src/lib/post-order-handler.ts` + +**Problem:** The `redis` npm package uses Node.js `net`/`tls` modules. `subscribe()` / `publish()` require persistent TCP connections — fundamentally incompatible with Workers. + +**Solution:** Replace with **Upstash Redis** (HTTP-based Redis, drop-in replacement for get/set/del operations) or **Cloudflare KV** (different API, eventual consistency). Pub/Sub must be rearchitected (see #17). + +--- + +### 4. BullMQ — Depends on Node.js Events + Persistent Redis Connections + +**Affected files:** +- `apps/backend/src/lib/notif-job.ts:1-41` — `Queue` and `Worker` classes + +**Problem:** `Queue` and `Worker` classes depend on Node.js `EventEmitter` and persistent Redis TCP connections. + +**Solution:** Replace with **Cloudflare Queues** (native message queue service) — different API entirely. Or use **Cloudflare Cron Triggers** + Upstash Redis for simpler job scheduling. + +--- + +### 5. `node-cron` — No Background Process in Workers + +**Affected files:** +- `apps/backend/src/lib/automatedJobs.ts` +- `apps/backend/src/jobs/jobs-index.ts` + +**Problem:** Workers are request-driven — no long-running background processes. `cron.schedule()` is meaningless. + +**Solution:** Replace with **Cloudflare Cron Triggers** (`wrangler.toml` crons config) — each cron invocation is a separate Worker invocation. Rewrite cron logic as fetch handler with `event.type === 'scheduled'`. + +--- + +### 6. Multer — Express Middleware, Uses Node.js Streams + +**Affected files:** +- `apps/backend/src/lib/upload-handler.ts` — multer config (10MB, memory storage) +- `apps/backend/src/main-router.ts:39` — complaint upload +- `apps/backend/src/uv-apis/uv-router.ts:9` — complaint upload +- `apps/backend/src/uv-apis/auth.router.ts:8-9` — profile image +- `apps/backend/src/apis/admin-apis/apis/product.router.ts:8-9` — product images +- `apps/backend/src/apis/admin-apis/apis/tag.router.ts:8,11` — tag image + +**Problem:** Multer depends on Node.js streams and multipart parsing tied to Express. + +**Solution:** Replace with native `Request.formData()` in Workers (built into the Fetch API) or use a Workers-compatible multipart parser like `@mjackson/multipart-parser`. + +--- + +### 7. `fs` Module — No Filesystem in Workers + +**Affected files:** +- `apps/backend/src/lib/signed-url-cache.ts:1,22-25,179,196,198` — `fs.existsSync()`, `fs.mkdirSync()`, `fs.writeFileSync()`, `fs.readFileSync()` +- `apps/backend/src/lib/disk-persisted-set.ts:1,13-14,18,28` — `fs.existsSync()`, `fs.writeFileSync()`, `fs.readFileSync()` + +**Problem:** No filesystem in Workers. `fs.readFileSync`, `fs.writeFileSync`, `fs.existsSync`, `fs.mkdirSync` all unavailable. + +**Solution:** Replace disk-persisted caches with **Cloudflare KV** or **Durable Objects** (for stateful storage). +- `signed-url-cache.ts` → KV with TTL +- `disk-persisted-set.ts` → KV or D1 + +--- + +### 8. Static File Serving (`express.static`, `res.sendFile`) + +**Affected files:** +- `apps/backend/index.ts:134-173` — fallback UI serving, assets serving + +**Problem:** No filesystem means no `express.static()` or `res.sendFile()`. + +**Solution:** Deploy fallback UI as a separate **Cloudflare Pages** project. Serve assets from **R2** behind Workers. The fallback UI should not be bundled with the backend. + +--- + +## MAJOR CHANGES (Significant rewrite required) + +### 9. `process.env` — 47 Usages Across 10+ Files + +**Affected files:** +- `apps/backend/src/lib/env-exporter.ts` (27 env vars exported) +- `apps/backend/index.ts` +- `apps/backend/src/db/db_index.ts` +- `apps/backend/src/middleware/auth.ts` +- `apps/backend/src/middleware/auth.middleware.ts` +- `apps/backend/src/middleware/staff-auth.ts` +- `apps/backend/src/trpc/trpc-index.ts` +- All files importing from `env-exporter.ts` + +**Problem:** Workers expose env vars via the `Env` bindings object passed to `fetch(request, env)`, not `process.env`. + +**Solution:** Every function that reads `process.env.*` needs refactoring to accept `env` as a parameter or use a shared context pattern. Create an `Env` type in `wrangler.toml` and thread it through the app. + +--- + +### 10. `process.exit()` and Signal Handlers (`SIGTERM`, `SIGINT`) + +**Affected files:** +- `apps/backend/src/lib/signed-url-cache.ts:254,260` — `process.exit()` +- `apps/backend/src/lib/disk-persisted-set.ts:71-72,76` — `process.exit()` and signal handlers +- `apps/backend/src/lib/notif-job.ts:163` — `process.on('SIGTERM', ...)` +- `apps/backend/src/db/porter.ts:120,124` — `process.exit()` + +**Problem:** Workers don't have `process` object. + +**Solution:** Remove all signal handlers and `process.exit()` calls. Graceful shutdown is handled by the platform. + +--- + +### 11. `Buffer.from()` — 12 Usages + +**Affected files:** +- `apps/backend/src/lib/cloud_cache.ts:27,52,77,102,127,152,259,266,273,280,287,298` + +**Problem:** Workers don't have Node.js `Buffer`. + +**Solution:** Replace with `new TextEncoder().encode()` or `Uint8Array`. + +--- + +### 12. `crypto.createHmac()` — Node.js Crypto API + +**Affected files:** +- `apps/backend/src/trpc/apis/user-apis/apis/payments.ts:8,72-75` — Razorpay signature verification + +**Problem:** Node.js `crypto` module unavailable. + +**Solution:** Replace with **Web Crypto API** (`crypto.subtle.importKey` + `crypto.subtle.sign`) — available natively in Workers but different async syntax. + +--- + +### 13. `bcryptjs` — May Need WASM Alternative + +**Affected files:** +- `apps/backend/src/uv-apis/auth.controller.ts:105,242` — `bcrypt.hash()` +- `apps/backend/src/trpc/apis/user-apis/apis/auth.ts:118,196,311` — `bcrypt.compare()`, `bcrypt.hash()` + +**Problem:** bcryptjs uses Node.js `crypto.randomBytes` internally. + +**Solution:** Works in Workers with latest bcryptjs, or replace with **`@noble/hashes`** (pure JS, no Node dependencies). + +--- + +### 14. `jsonwebtoken` — Depends on Node.js Crypto + +**Affected files:** +- `apps/backend/index.ts:16,81` — `jwt.verify()` +- `apps/backend/src/middleware/auth.ts:2,31` — `jwt.verify()` +- `apps/backend/src/middleware/auth.middleware.ts:2,32` — `jwt.verify()` +- `apps/backend/src/middleware/staff-auth.ts:2,25` — `jwt.verify()` +- `apps/backend/src/uv-apis/auth.controller.ts:3,53` — `jwt.sign()` +- `apps/backend/src/trpc/apis/user-apis/apis/auth.ts:4,53` — `jwt.sign()` +- `apps/backend/src/trpc/apis/admin-apis/apis/staff-user.ts:38` — `jwt.sign()` + +**Problem:** The `jsonwebtoken` lib uses Node.js `crypto` internally. + +**Solution:** Replace with **`jose`** (JWT library designed for Web Crypto API, Workers-compatible). + +--- + +### 15. CommonJS → ESM Module System + +**Affected files:** +- `apps/backend/tsconfig.json:29` — `"module": "commonjs"` +- `apps/backend/index.ts:135,136,167` — `__dirname` usage + +**Problem:** Workers require ESM. `__dirname` not available in ESM. + +**Solution:** Change `module` to `"ESNext"` or `"ES2022"`, `moduleResolution` to `"bundler"`. Remove all `__dirname` usage (static files handled differently, see #8). + +--- + +### 16. AWS S3 (`@aws-sdk/client-s3`) — Replace with R2 + +**Affected files:** +- `apps/backend/src/lib/s3-client.ts` — S3Client, PutObjectCommand, DeleteObjectCommand, GetObjectCommand, getSignedUrl +- `apps/backend/src/lib/cloud_cache.ts` — Buffer.from() for S3 uploads +- `apps/backend/src/lib/s3-client.ts` — `generateSignedUrlFromS3Url()` + +**Problem:** AWS SDK may have Node.js-specific dependencies. + +**Solution:** R2 is S3-compatible — this is the easiest change. Update the S3Client endpoint to point to your R2 bucket. Or use the native `env.R2_BUCKET` binding for better performance. `@aws-sdk/s3-request-presigner` for upload URLs may need R2-specific handling. + +--- + +## MODERATE CHANGES + +### 17. Redis Pub/Sub for Order Notifications + +**Affected files:** +- `apps/backend/src/lib/post-order-handler.ts` — subscribes to `orders:placed`, `orders:cancelled` channels + +**Problem:** Pub/Sub requires persistent TCP connections. + +**Solution:** Replace with **Durable Objects** with WebSocket broadcasting, or **Cloudflare Queues** for async event processing. + +--- + +### 18. `expo-server-sdk` — May Not Work in Workers + +**Affected files:** +- `apps/backend/src/lib/notif-job.ts` +- `apps/backend/src/lib/expo-service.ts` + +**Problem:** SDK may use Node.js internals. + +**Solution:** Check if the SDK uses Node.js internals; if so, replace with direct HTTP calls to Expo's push API via `fetch()`. + +--- + +### 19. `razorpay` SDK — Check Node.js Dependencies + +**Affected files:** +- `apps/backend/src/lib/payments-utils.ts` — `RazorpayPaymentService.createOrder()`, `initiateRefund()`, `fetchRefund()` + +**Problem:** The Razorpay Node SDK may use `http`/`https` internally. + +**Solution:** Replace with direct `fetch()` calls to Razorpay's REST API, or check if the SDK works with a polyfill. + +--- + +### 20. `Error.captureStackTrace` — V8-Specific + +**Affected files:** +- `apps/backend/src/lib/api-error.ts:12` + +**Problem:** V8-specific API. + +**Solution:** Available in Workers (V8 runtime), so this actually works. Verify during migration. + +--- + +### 21. `process.uptime()` — Used in Health Checks + +**Affected files:** +- `apps/backend/src/main-router.ts:18,26` + +**Problem:** No `process` object in Workers. + +**Solution:** Replace with a custom uptime tracker using `Date.now()` at module load. + +--- + +### 22. `@turf/turf` — Check Bundle Size + +**Affected files:** +- `apps/backend/src/trpc/apis/common-apis/common-trpc-index.ts:5` — `turf.booleanPointInPolygon()` + +**Problem:** Workers have a **1MB compressed bundle limit** (free) or 10MB (paid). `@turf/turf` is a large library. + +**Solution:** Import only `@turf/boolean-point-in-polygon` to reduce size. Or implement the point-in-polygon check manually using a lightweight algorithm. + +--- + +## Infrastructure Changes + +| Current | Workers Replacement | +|---------|-------------------| +| Express on port 4000 | `export default { fetch }` handler (Hono) | +| PostgreSQL via `pg` | Hyperdrive + Neon/serverless driver | +| Redis (`redis` npm) | Upstash Redis (HTTP) or Cloudflare KV | +| BullMQ | Cloudflare Queues | +| node-cron | Cloudflare Cron Triggers | +| AWS S3 | Cloudflare R2 | +| Disk filesystem | KV / D1 / R2 | +| Docker deployment | `wrangler deploy` | +| `dotenv/config` | `wrangler.toml` `[vars]` + Secrets | + +--- + +## Migration Priority + +### Phase 1 — Foundation +1. CommonJS → ESM (#15) +2. Replace `dotenv/config` with wrangler env bindings (#9) +3. Replace `jsonwebtoken` with `jose` (#14) +4. Replace Node.js `crypto.createHmac` with Web Crypto API (#12) + +### Phase 2 — Data Layer +5. Replace `node-postgres` driver with Neon/HTTP driver (#2) +6. Replace Redis client with Upstash Redis (#3) +7. Replace `fs` cache with KV (#7) +8. Replace S3 with R2 (#16) + +### Phase 3 — HTTP Layer +9. Replace Express with Hono (#1) +10. Replace Multer with native FormData (#6) +11. Move static files to Pages/R2 (#8) + +### Phase 4 — Background Jobs +12. Replace BullMQ with Cloudflare Queues (#4) +13. Replace node-cron with Cron Triggers (#5) +14. Rearchitect pub/sub (#17) + +### Phase 5 — Polish +15. Verify expo-server-sdk / razorpay SDK compatibility (#18, #19) +16. Optimize bundle size (#22) +17. Remove Dockerfile, update deployment pipeline diff --git a/ios/.gitignore b/ios/.gitignore deleted file mode 100644 index 8beb344..0000000 --- a/ios/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace -.xcode.env.local - -# Bundle artifacts -*.jsbundle - -# CocoaPods -/Pods/ diff --git a/ios/.xcode.env b/ios/.xcode.env deleted file mode 100644 index 3d5782c..0000000 --- a/ios/.xcode.env +++ /dev/null @@ -1,11 +0,0 @@ -# This `.xcode.env` file is versioned and is used to source the environment -# used when running script phases inside Xcode. -# To customize your local environment, you can create an `.xcode.env.local` -# file that is not versioned. - -# NODE_BINARY variable contains the PATH to the node executable. -# -# Customize the NODE_BINARY variable here. -# For example, to use nvm with brew, add the following line -# . "$(brew --prefix nvm)/nvm.sh" --no-use -export NODE_BINARY=$(command -v node) diff --git a/ios/Podfile b/ios/Podfile deleted file mode 100644 index 04974a1..0000000 --- a/ios/Podfile +++ /dev/null @@ -1,64 +0,0 @@ -require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") -require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods") - -require 'json' -podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {} - -ENV['RCT_NEW_ARCH_ENABLED'] = '0' if podfile_properties['newArchEnabled'] == 'false' -ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR'] - -platform :ios, podfile_properties['ios.deploymentTarget'] || '15.1' -install! 'cocoapods', - :deterministic_uuids => false - -prepare_react_native_project! - -target 'meatfarmermonorepo' do - use_expo_modules! - - if ENV['EXPO_USE_COMMUNITY_AUTOLINKING'] == '1' - config_command = ['node', '-e', "process.argv=['', '', 'config'];require('@react-native-community/cli').run()"]; - else - config_command = [ - 'npx', - 'expo-modules-autolinking', - 'react-native-config', - '--json', - '--platform', - 'ios' - ] - end - - config = use_native_modules!(config_command) - - use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks'] - use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS'] - - use_react_native!( - :path => config[:reactNativePath], - :hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes', - # An absolute path to your application root. - :app_path => "#{Pod::Config.instance.installation_root}/..", - :privacy_file_aggregation_enabled => podfile_properties['apple.privacyManifestAggregationEnabled'] != 'false', - ) - - post_install do |installer| - react_native_post_install( - installer, - config[:reactNativePath], - :mac_catalyst_enabled => false, - :ccache_enabled => podfile_properties['apple.ccacheEnabled'] == 'true', - ) - - # This is necessary for Xcode 14, because it signs resource bundles by default - # when building for devices. - installer.target_installation_results.pod_target_installation_results - .each do |pod_name, target_installation_result| - target_installation_result.resource_bundle_targets.each do |resource_bundle_target| - resource_bundle_target.build_configurations.each do |config| - config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' - end - end - end - end -end diff --git a/ios/Podfile.lock b/ios/Podfile.lock deleted file mode 100644 index c223241..0000000 --- a/ios/Podfile.lock +++ /dev/null @@ -1,2324 +0,0 @@ -PODS: - - AppAuth (2.0.0): - - AppAuth/Core (= 2.0.0) - - AppAuth/ExternalUserAgent (= 2.0.0) - - AppAuth/Core (2.0.0) - - AppAuth/ExternalUserAgent (2.0.0): - - AppAuth/Core - - AppCheckCore (11.2.0): - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/UserDefaults (~> 8.0) - - PromisesObjC (~> 2.4) - - boost (1.84.0) - - DoubleConversion (1.1.6) - - EASClient (0.14.4): - - ExpoModulesCore - - EXApplication (6.1.5): - - ExpoModulesCore - - EXConstants (17.1.8): - - ExpoModulesCore - - EXImageLoader (5.1.0): - - ExpoModulesCore - - React-Core - - EXJSONUtils (0.15.0) - - EXManifests (0.16.6): - - ExpoModulesCore - - EXNotifications (0.31.4): - - ExpoModulesCore - - Expo (53.0.25): - - DoubleConversion - - ExpoModulesCore - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTAppDelegate - - React-RCTFabric - - React-renderercss - - React-rendererdebug - - React-utils - - ReactAppDependencyProvider - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - ExpoAdapterGoogleSignIn (16.0.0): - - ExpoModulesCore - - GoogleSignIn (~> 9.0) - - React-Core - - ExpoAsset (11.1.7): - - ExpoModulesCore - - ExpoBlur (14.1.5): - - ExpoModulesCore - - ExpoCrypto (14.1.5): - - ExpoModulesCore - - ExpoDevice (7.1.4): - - ExpoModulesCore - - ExpoDocumentPicker (13.1.6): - - ExpoModulesCore - - ExpoFileSystem (18.1.11): - - ExpoModulesCore - - ExpoFont (13.3.2): - - ExpoModulesCore - - ExpoHaptics (14.1.4): - - ExpoModulesCore - - ExpoHead (5.1.10): - - ExpoModulesCore - - ExpoImage (2.4.1): - - ExpoModulesCore - - libavif/libdav1d - - SDWebImage (~> 5.21.0) - - SDWebImageAVIFCoder (~> 0.11.0) - - SDWebImageSVGCoder (~> 1.7.0) - - SDWebImageWebPCoder (~> 0.14.6) - - ExpoImagePicker (16.1.4): - - ExpoModulesCore - - ExpoKeepAwake (14.1.4): - - ExpoModulesCore - - ExpoLinearGradient (14.1.5): - - ExpoModulesCore - - ExpoLinking (7.1.7): - - ExpoModulesCore - - ExpoLocation (18.1.6): - - ExpoModulesCore - - ExpoModulesCore (2.5.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-ImageManager - - React-jsi - - React-jsinspector - - React-NativeModulesApple - - React-RCTFabric - - React-renderercss - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - ExpoSecureStore (14.2.4): - - ExpoModulesCore - - ExpoSplashScreen (0.30.10): - - ExpoModulesCore - - ExpoSymbols (0.4.5): - - ExpoModulesCore - - ExpoSystemUI (5.0.11): - - ExpoModulesCore - - ExpoWebBrowser (14.2.0): - - ExpoModulesCore - - EXStructuredHeaders (4.1.0) - - EXUpdates (0.28.17): - - DoubleConversion - - EASClient - - EXManifests - - ExpoModulesCore - - EXStructuredHeaders - - EXUpdatesInterface - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - ReachabilitySwift - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTFabric - - React-renderercss - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - EXUpdatesInterface (1.1.0): - - ExpoModulesCore - - fast_float (6.1.4) - - FBLazyVector (0.79.6) - - fmt (11.0.2) - - glog (0.3.5) - - GoogleSignIn (9.0.0): - - AppAuth (~> 2.0) - - AppCheckCore (~> 11.0) - - GTMAppAuth (~> 5.0) - - GTMSessionFetcher/Core (~> 3.3) - - GoogleUtilities/Environment (8.1.0): - - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.1.0): - - GoogleUtilities/Environment - - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.1.0) - - GoogleUtilities/UserDefaults (8.1.0): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GTMAppAuth (5.0.0): - - AppAuth/Core (~> 2.0) - - GTMSessionFetcher/Core (< 4.0, >= 3.3) - - GTMSessionFetcher/Core (3.5.0) - - hermes-engine (0.79.6): - - hermes-engine/Pre-built (= 0.79.6) - - hermes-engine/Pre-built (0.79.6) - - libavif/core (0.11.1) - - libavif/libdav1d (0.11.1): - - libavif/core - - libdav1d (>= 0.6.0) - - libdav1d (1.2.0) - - libwebp (1.5.0): - - libwebp/demux (= 1.5.0) - - libwebp/mux (= 1.5.0) - - libwebp/sharpyuv (= 1.5.0) - - libwebp/webp (= 1.5.0) - - libwebp/demux (1.5.0): - - libwebp/webp - - libwebp/mux (1.5.0): - - libwebp/demux - - libwebp/sharpyuv (1.5.0) - - libwebp/webp (1.5.0): - - libwebp/sharpyuv - - PromisesObjC (2.4.0) - - RCT-Folly (2024.11.18.00): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - RCT-Folly/Default (= 2024.11.18.00) - - RCT-Folly/Default (2024.11.18.00): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - RCT-Folly/Fabric (2024.11.18.00): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - RCTDeprecation (0.79.6) - - RCTRequired (0.79.6) - - RCTTypeSafety (0.79.6): - - FBLazyVector (= 0.79.6) - - RCTRequired (= 0.79.6) - - React-Core (= 0.79.6) - - ReachabilitySwift (5.2.4) - - React (0.79.6): - - React-Core (= 0.79.6) - - React-Core/DevSupport (= 0.79.6) - - React-Core/RCTWebSocket (= 0.79.6) - - React-RCTActionSheet (= 0.79.6) - - React-RCTAnimation (= 0.79.6) - - React-RCTBlob (= 0.79.6) - - React-RCTImage (= 0.79.6) - - React-RCTLinking (= 0.79.6) - - React-RCTNetwork (= 0.79.6) - - React-RCTSettings (= 0.79.6) - - React-RCTText (= 0.79.6) - - React-RCTVibration (= 0.79.6) - - React-callinvoker (0.79.6) - - React-Core (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default (= 0.79.6) - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/CoreModulesHeaders (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/Default (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/DevSupport (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default (= 0.79.6) - - React-Core/RCTWebSocket (= 0.79.6) - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTActionSheetHeaders (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTAnimationHeaders (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTBlobHeaders (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTImageHeaders (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTLinkingHeaders (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTNetworkHeaders (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTSettingsHeaders (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTTextHeaders (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTVibrationHeaders (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTWebSocket (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default (= 0.79.6) - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-CoreModules (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - RCT-Folly (= 2024.11.18.00) - - RCTTypeSafety (= 0.79.6) - - React-Core/CoreModulesHeaders (= 0.79.6) - - React-jsi (= 0.79.6) - - React-jsinspector - - React-jsinspectortracing - - React-NativeModulesApple - - React-RCTBlob - - React-RCTFBReactNativeSpec - - React-RCTImage (= 0.79.6) - - ReactCommon - - SocketRocket (= 0.7.1) - - React-cxxreact (0.79.6): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.79.6) - - React-debug (= 0.79.6) - - React-jsi (= 0.79.6) - - React-jsinspector - - React-jsinspectortracing - - React-logger (= 0.79.6) - - React-perflogger (= 0.79.6) - - React-runtimeexecutor (= 0.79.6) - - React-timing (= 0.79.6) - - React-debug (0.79.6) - - React-defaultsnativemodule (0.79.6): - - hermes-engine - - RCT-Folly - - React-domnativemodule - - React-featureflagsnativemodule - - React-hermes - - React-idlecallbacksnativemodule - - React-jsi - - React-jsiexecutor - - React-microtasksnativemodule - - React-RCTFBReactNativeSpec - - React-domnativemodule (0.79.6): - - hermes-engine - - RCT-Folly - - React-Fabric - - React-FabricComponents - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - ReactCommon/turbomodule/core - - Yoga - - React-Fabric (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/animations (= 0.79.6) - - React-Fabric/attributedstring (= 0.79.6) - - React-Fabric/componentregistry (= 0.79.6) - - React-Fabric/componentregistrynative (= 0.79.6) - - React-Fabric/components (= 0.79.6) - - React-Fabric/consistency (= 0.79.6) - - React-Fabric/core (= 0.79.6) - - React-Fabric/dom (= 0.79.6) - - React-Fabric/imagemanager (= 0.79.6) - - React-Fabric/leakchecker (= 0.79.6) - - React-Fabric/mounting (= 0.79.6) - - React-Fabric/observers (= 0.79.6) - - React-Fabric/scheduler (= 0.79.6) - - React-Fabric/telemetry (= 0.79.6) - - React-Fabric/templateprocessor (= 0.79.6) - - React-Fabric/uimanager (= 0.79.6) - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/animations (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/attributedstring (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/componentregistry (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/componentregistrynative (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.79.6) - - React-Fabric/components/root (= 0.79.6) - - React-Fabric/components/scrollview (= 0.79.6) - - React-Fabric/components/view (= 0.79.6) - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/legacyviewmanagerinterop (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/root (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/scrollview (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/view (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-renderercss - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-Fabric/consistency (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/core (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/dom (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/imagemanager (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/leakchecker (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/mounting (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/observers (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/observers/events (= 0.79.6) - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/observers/events (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/scheduler (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/observers/events - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-performancetimeline - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/telemetry (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/templateprocessor (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/uimanager (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/uimanager/consistency (= 0.79.6) - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererconsistency - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/uimanager/consistency (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererconsistency - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-FabricComponents (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-FabricComponents/components (= 0.79.6) - - React-FabricComponents/textlayoutmanager (= 0.79.6) - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.79.6) - - React-FabricComponents/components/iostextinput (= 0.79.6) - - React-FabricComponents/components/modal (= 0.79.6) - - React-FabricComponents/components/rncore (= 0.79.6) - - React-FabricComponents/components/safeareaview (= 0.79.6) - - React-FabricComponents/components/scrollview (= 0.79.6) - - React-FabricComponents/components/text (= 0.79.6) - - React-FabricComponents/components/textinput (= 0.79.6) - - React-FabricComponents/components/unimplementedview (= 0.79.6) - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/inputaccessory (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/iostextinput (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/modal (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/rncore (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/safeareaview (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/scrollview (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/text (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/textinput (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/unimplementedview (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/textlayoutmanager (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricImage (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired (= 0.79.6) - - RCTTypeSafety (= 0.79.6) - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-ImageManager - - React-jsi - - React-jsiexecutor (= 0.79.6) - - React-logger - - React-rendererdebug - - React-utils - - ReactCommon - - Yoga - - React-featureflags (0.79.6): - - RCT-Folly (= 2024.11.18.00) - - React-featureflagsnativemodule (0.79.6): - - hermes-engine - - RCT-Folly - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - ReactCommon/turbomodule/core - - React-graphics (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-hermes - - React-jsi - - React-jsiexecutor - - React-utils - - React-hermes (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact (= 0.79.6) - - React-jsi - - React-jsiexecutor (= 0.79.6) - - React-jsinspector - - React-jsinspectortracing - - React-perflogger (= 0.79.6) - - React-runtimeexecutor - - React-idlecallbacksnativemodule (0.79.6): - - glog - - hermes-engine - - RCT-Folly - - React-hermes - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - React-runtimescheduler - - ReactCommon/turbomodule/core - - React-ImageManager (0.79.6): - - glog - - RCT-Folly/Fabric - - React-Core/Default - - React-debug - - React-Fabric - - React-graphics - - React-rendererdebug - - React-utils - - React-jserrorhandler (0.79.6): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-cxxreact - - React-debug - - React-featureflags - - React-jsi - - ReactCommon/turbomodule/bridging - - React-jsi (0.79.6): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-jsiexecutor (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact (= 0.79.6) - - React-jsi (= 0.79.6) - - React-jsinspector - - React-jsinspectortracing - - React-perflogger (= 0.79.6) - - React-jsinspector (0.79.6): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly - - React-featureflags - - React-jsi - - React-jsinspectortracing - - React-perflogger (= 0.79.6) - - React-runtimeexecutor (= 0.79.6) - - React-jsinspectortracing (0.79.6): - - RCT-Folly - - React-oscompat - - React-jsitooling (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact (= 0.79.6) - - React-jsi (= 0.79.6) - - React-jsinspector - - React-jsinspectortracing - - React-jsitracing (0.79.6): - - React-jsi - - React-logger (0.79.6): - - glog - - React-Mapbuffer (0.79.6): - - glog - - React-debug - - React-microtasksnativemodule (0.79.6): - - hermes-engine - - RCT-Folly - - React-hermes - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - ReactCommon/turbomodule/core - - React-NativeModulesApple (0.79.6): - - glog - - hermes-engine - - React-callinvoker - - React-Core - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsinspector - - React-runtimeexecutor - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - React-oscompat (0.79.6) - - React-perflogger (0.79.6): - - DoubleConversion - - RCT-Folly (= 2024.11.18.00) - - React-performancetimeline (0.79.6): - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact - - React-featureflags - - React-jsinspectortracing - - React-perflogger - - React-timing - - React-RCTActionSheet (0.79.6): - - React-Core/RCTActionSheetHeaders (= 0.79.6) - - React-RCTAnimation (0.79.6): - - RCT-Folly (= 2024.11.18.00) - - RCTTypeSafety - - React-Core/RCTAnimationHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - ReactCommon - - React-RCTAppDelegate (0.79.6): - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-CoreModules - - React-debug - - React-defaultsnativemodule - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-jsitooling - - React-NativeModulesApple - - React-RCTFabric - - React-RCTFBReactNativeSpec - - React-RCTImage - - React-RCTNetwork - - React-RCTRuntime - - React-rendererdebug - - React-RuntimeApple - - React-RuntimeCore - - React-runtimescheduler - - React-utils - - ReactCommon - - React-RCTBlob (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-Core/RCTBlobHeaders - - React-Core/RCTWebSocket - - React-jsi - - React-jsinspector - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - React-RCTNetwork - - ReactCommon - - React-RCTFabric (0.79.6): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-Core - - React-debug - - React-Fabric - - React-FabricComponents - - React-FabricImage - - React-featureflags - - React-graphics - - React-hermes - - React-ImageManager - - React-jsi - - React-jsinspector - - React-jsinspectortracing - - React-performancetimeline - - React-RCTAnimation - - React-RCTImage - - React-RCTText - - React-rendererconsistency - - React-renderercss - - React-rendererdebug - - React-runtimescheduler - - React-utils - - Yoga - - React-RCTFBReactNativeSpec (0.79.6): - - hermes-engine - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-Core - - React-hermes - - React-jsi - - React-jsiexecutor - - React-NativeModulesApple - - ReactCommon - - React-RCTImage (0.79.6): - - RCT-Folly (= 2024.11.18.00) - - RCTTypeSafety - - React-Core/RCTImageHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - React-RCTNetwork - - ReactCommon - - React-RCTLinking (0.79.6): - - React-Core/RCTLinkingHeaders (= 0.79.6) - - React-jsi (= 0.79.6) - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - ReactCommon - - ReactCommon/turbomodule/core (= 0.79.6) - - React-RCTNetwork (0.79.6): - - RCT-Folly (= 2024.11.18.00) - - RCTTypeSafety - - React-Core/RCTNetworkHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - ReactCommon - - React-RCTRuntime (0.79.6): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-Core - - React-hermes - - React-jsi - - React-jsinspector - - React-jsinspectortracing - - React-jsitooling - - React-RuntimeApple - - React-RuntimeCore - - React-RuntimeHermes - - React-RCTSettings (0.79.6): - - RCT-Folly (= 2024.11.18.00) - - RCTTypeSafety - - React-Core/RCTSettingsHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - ReactCommon - - React-RCTText (0.79.6): - - React-Core/RCTTextHeaders (= 0.79.6) - - Yoga - - React-RCTVibration (0.79.6): - - RCT-Folly (= 2024.11.18.00) - - React-Core/RCTVibrationHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - ReactCommon - - React-rendererconsistency (0.79.6) - - React-renderercss (0.79.6): - - React-debug - - React-utils - - React-rendererdebug (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - RCT-Folly (= 2024.11.18.00) - - React-debug - - React-rncore (0.79.6) - - React-RuntimeApple (0.79.6): - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-callinvoker - - React-Core/Default - - React-CoreModules - - React-cxxreact - - React-featureflags - - React-jserrorhandler - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-Mapbuffer - - React-NativeModulesApple - - React-RCTFabric - - React-RCTFBReactNativeSpec - - React-RuntimeCore - - React-runtimeexecutor - - React-RuntimeHermes - - React-runtimescheduler - - React-utils - - React-RuntimeCore (0.79.6): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-cxxreact - - React-Fabric - - React-featureflags - - React-hermes - - React-jserrorhandler - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-performancetimeline - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - React-runtimeexecutor (0.79.6): - - React-jsi (= 0.79.6) - - React-RuntimeHermes (0.79.6): - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-featureflags - - React-hermes - - React-jsi - - React-jsinspector - - React-jsinspectortracing - - React-jsitooling - - React-jsitracing - - React-RuntimeCore - - React-utils - - React-runtimescheduler (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker - - React-cxxreact - - React-debug - - React-featureflags - - React-hermes - - React-jsi - - React-jsinspectortracing - - React-performancetimeline - - React-rendererconsistency - - React-rendererdebug - - React-runtimeexecutor - - React-timing - - React-utils - - React-timing (0.79.6) - - React-utils (0.79.6): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-debug - - React-hermes - - React-jsi (= 0.79.6) - - ReactAppDependencyProvider (0.79.6): - - ReactCodegen - - ReactCodegen (0.79.6): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-FabricImage - - React-featureflags - - React-graphics - - React-hermes - - React-jsi - - React-jsiexecutor - - React-NativeModulesApple - - React-RCTAppDelegate - - React-rendererdebug - - React-utils - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - ReactCommon (0.79.6): - - ReactCommon/turbomodule (= 0.79.6) - - ReactCommon/turbomodule (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.79.6) - - React-cxxreact (= 0.79.6) - - React-jsi (= 0.79.6) - - React-logger (= 0.79.6) - - React-perflogger (= 0.79.6) - - ReactCommon/turbomodule/bridging (= 0.79.6) - - ReactCommon/turbomodule/core (= 0.79.6) - - ReactCommon/turbomodule/bridging (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.79.6) - - React-cxxreact (= 0.79.6) - - React-jsi (= 0.79.6) - - React-logger (= 0.79.6) - - React-perflogger (= 0.79.6) - - ReactCommon/turbomodule/core (0.79.6): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.79.6) - - React-cxxreact (= 0.79.6) - - React-debug (= 0.79.6) - - React-featureflags (= 0.79.6) - - React-jsi (= 0.79.6) - - React-logger (= 0.79.6) - - React-perflogger (= 0.79.6) - - React-utils (= 0.79.6) - - SDWebImage (5.21.1): - - SDWebImage/Core (= 5.21.1) - - SDWebImage/Core (5.21.1) - - SDWebImageAVIFCoder (0.11.0): - - libavif/core (>= 0.11.0) - - SDWebImage (~> 5.10) - - SDWebImageSVGCoder (1.7.0): - - SDWebImage/Core (~> 5.6) - - SDWebImageWebPCoder (0.14.6): - - libwebp (~> 1.0) - - SDWebImage/Core (~> 5.17) - - SocketRocket (0.7.1) - - Yoga (0.0.0) - -DEPENDENCIES: - - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - - EASClient (from `../node_modules/expo-eas-client/ios`) - - EXApplication (from `../node_modules/expo-application/ios`) - - EXConstants (from `../node_modules/expo-constants/ios`) - - EXImageLoader (from `../node_modules/expo-image-loader/ios`) - - EXJSONUtils (from `../node_modules/expo-json-utils/ios`) - - EXManifests (from `../node_modules/expo-manifests/ios`) - - EXNotifications (from `../node_modules/expo-notifications/ios`) - - Expo (from `../node_modules/expo`) - - "ExpoAdapterGoogleSignIn (from `../node_modules/@react-native-google-signin/google-signin/expo/ios`)" - - ExpoAsset (from `../node_modules/expo-asset/ios`) - - ExpoBlur (from `../node_modules/expo-blur/ios`) - - ExpoCrypto (from `../node_modules/expo-crypto/ios`) - - ExpoDevice (from `../node_modules/expo-device/ios`) - - ExpoDocumentPicker (from `../node_modules/expo-document-picker/ios`) - - ExpoFileSystem (from `../node_modules/expo-file-system/ios`) - - ExpoFont (from `../node_modules/expo-font/ios`) - - ExpoHaptics (from `../node_modules/expo-haptics/ios`) - - ExpoHead (from `../node_modules/expo-router/ios`) - - ExpoImage (from `../node_modules/expo-image/ios`) - - ExpoImagePicker (from `../node_modules/expo-image-picker/ios`) - - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) - - ExpoLinearGradient (from `../node_modules/expo-linear-gradient/ios`) - - ExpoLinking (from `../node_modules/expo-linking/ios`) - - ExpoLocation (from `../node_modules/expo-location/ios`) - - ExpoModulesCore (from `../node_modules/expo-modules-core`) - - ExpoSecureStore (from `../node_modules/expo-secure-store/ios`) - - ExpoSplashScreen (from `../node_modules/expo-splash-screen/ios`) - - ExpoSymbols (from `../node_modules/expo-symbols/ios`) - - ExpoSystemUI (from `../node_modules/expo-system-ui/ios`) - - ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`) - - EXStructuredHeaders (from `../node_modules/expo-structured-headers/ios`) - - EXUpdates (from `../node_modules/expo-updates/ios`) - - EXUpdatesInterface (from `../node_modules/expo-updates-interface/ios`) - - fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`) - - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) - - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) - - RCTRequired (from `../node_modules/react-native/Libraries/Required`) - - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) - - React (from `../node_modules/react-native/`) - - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - - React-Core (from `../node_modules/react-native/`) - - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) - - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) - - React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) - - React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`) - - React-Fabric (from `../node_modules/react-native/ReactCommon`) - - React-FabricComponents (from `../node_modules/react-native/ReactCommon`) - - React-FabricImage (from `../node_modules/react-native/ReactCommon`) - - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`) - - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) - - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) - - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) - - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) - - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) - - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) - - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) - - React-jsinspectortracing (from `../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`) - - React-jsitooling (from `../node_modules/react-native/ReactCommon/jsitooling`) - - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) - - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) - - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) - - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - - React-oscompat (from `../node_modules/react-native/ReactCommon/oscompat`) - - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) - - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) - - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) - - React-RCTFabric (from `../node_modules/react-native/React`) - - React-RCTFBReactNativeSpec (from `../node_modules/react-native/React`) - - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) - - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) - - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) - - React-RCTRuntime (from `../node_modules/react-native/React/Runtime`) - - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) - - React-RCTText (from `../node_modules/react-native/Libraries/Text`) - - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) - - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`) - - React-renderercss (from `../node_modules/react-native/ReactCommon/react/renderer/css`) - - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) - - React-rncore (from `../node_modules/react-native/ReactCommon`) - - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) - - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) - - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) - - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) - - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) - - React-timing (from `../node_modules/react-native/ReactCommon/react/timing`) - - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) - - ReactAppDependencyProvider (from `build/generated/ios`) - - ReactCodegen (from `build/generated/ios`) - - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) - -SPEC REPOS: - trunk: - - AppAuth - - AppCheckCore - - GoogleSignIn - - GoogleUtilities - - GTMAppAuth - - GTMSessionFetcher - - libavif - - libdav1d - - libwebp - - PromisesObjC - - ReachabilitySwift - - SDWebImage - - SDWebImageAVIFCoder - - SDWebImageSVGCoder - - SDWebImageWebPCoder - - SocketRocket - -EXTERNAL SOURCES: - boost: - :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" - DoubleConversion: - :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" - EASClient: - :path: "../node_modules/expo-eas-client/ios" - EXApplication: - :path: "../node_modules/expo-application/ios" - EXConstants: - :path: "../node_modules/expo-constants/ios" - EXImageLoader: - :path: "../node_modules/expo-image-loader/ios" - EXJSONUtils: - :path: "../node_modules/expo-json-utils/ios" - EXManifests: - :path: "../node_modules/expo-manifests/ios" - EXNotifications: - :path: "../node_modules/expo-notifications/ios" - Expo: - :path: "../node_modules/expo" - ExpoAdapterGoogleSignIn: - :path: "../node_modules/@react-native-google-signin/google-signin/expo/ios" - ExpoAsset: - :path: "../node_modules/expo-asset/ios" - ExpoBlur: - :path: "../node_modules/expo-blur/ios" - ExpoCrypto: - :path: "../node_modules/expo-crypto/ios" - ExpoDevice: - :path: "../node_modules/expo-device/ios" - ExpoDocumentPicker: - :path: "../node_modules/expo-document-picker/ios" - ExpoFileSystem: - :path: "../node_modules/expo-file-system/ios" - ExpoFont: - :path: "../node_modules/expo-font/ios" - ExpoHaptics: - :path: "../node_modules/expo-haptics/ios" - ExpoHead: - :path: "../node_modules/expo-router/ios" - ExpoImage: - :path: "../node_modules/expo-image/ios" - ExpoImagePicker: - :path: "../node_modules/expo-image-picker/ios" - ExpoKeepAwake: - :path: "../node_modules/expo-keep-awake/ios" - ExpoLinearGradient: - :path: "../node_modules/expo-linear-gradient/ios" - ExpoLinking: - :path: "../node_modules/expo-linking/ios" - ExpoLocation: - :path: "../node_modules/expo-location/ios" - ExpoModulesCore: - :path: "../node_modules/expo-modules-core" - ExpoSecureStore: - :path: "../node_modules/expo-secure-store/ios" - ExpoSplashScreen: - :path: "../node_modules/expo-splash-screen/ios" - ExpoSymbols: - :path: "../node_modules/expo-symbols/ios" - ExpoSystemUI: - :path: "../node_modules/expo-system-ui/ios" - ExpoWebBrowser: - :path: "../node_modules/expo-web-browser/ios" - EXStructuredHeaders: - :path: "../node_modules/expo-structured-headers/ios" - EXUpdates: - :path: "../node_modules/expo-updates/ios" - EXUpdatesInterface: - :path: "../node_modules/expo-updates-interface/ios" - fast_float: - :podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec" - FBLazyVector: - :path: "../node_modules/react-native/Libraries/FBLazyVector" - fmt: - :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" - glog: - :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" - hermes-engine: - :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" - :tag: hermes-2025-06-04-RNv0.79.3-7f9a871eefeb2c3852365ee80f0b6733ec12ac3b - RCT-Folly: - :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" - RCTDeprecation: - :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" - RCTRequired: - :path: "../node_modules/react-native/Libraries/Required" - RCTTypeSafety: - :path: "../node_modules/react-native/Libraries/TypeSafety" - React: - :path: "../node_modules/react-native/" - React-callinvoker: - :path: "../node_modules/react-native/ReactCommon/callinvoker" - React-Core: - :path: "../node_modules/react-native/" - React-CoreModules: - :path: "../node_modules/react-native/React/CoreModules" - React-cxxreact: - :path: "../node_modules/react-native/ReactCommon/cxxreact" - React-debug: - :path: "../node_modules/react-native/ReactCommon/react/debug" - React-defaultsnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults" - React-domnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom" - React-Fabric: - :path: "../node_modules/react-native/ReactCommon" - React-FabricComponents: - :path: "../node_modules/react-native/ReactCommon" - React-FabricImage: - :path: "../node_modules/react-native/ReactCommon" - React-featureflags: - :path: "../node_modules/react-native/ReactCommon/react/featureflags" - React-featureflagsnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" - React-graphics: - :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" - React-hermes: - :path: "../node_modules/react-native/ReactCommon/hermes" - React-idlecallbacksnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" - React-ImageManager: - :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" - React-jserrorhandler: - :path: "../node_modules/react-native/ReactCommon/jserrorhandler" - React-jsi: - :path: "../node_modules/react-native/ReactCommon/jsi" - React-jsiexecutor: - :path: "../node_modules/react-native/ReactCommon/jsiexecutor" - React-jsinspector: - :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" - React-jsinspectortracing: - :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" - React-jsitooling: - :path: "../node_modules/react-native/ReactCommon/jsitooling" - React-jsitracing: - :path: "../node_modules/react-native/ReactCommon/hermes/executor/" - React-logger: - :path: "../node_modules/react-native/ReactCommon/logger" - React-Mapbuffer: - :path: "../node_modules/react-native/ReactCommon" - React-microtasksnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" - React-NativeModulesApple: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" - React-oscompat: - :path: "../node_modules/react-native/ReactCommon/oscompat" - React-perflogger: - :path: "../node_modules/react-native/ReactCommon/reactperflogger" - React-performancetimeline: - :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" - React-RCTActionSheet: - :path: "../node_modules/react-native/Libraries/ActionSheetIOS" - React-RCTAnimation: - :path: "../node_modules/react-native/Libraries/NativeAnimation" - React-RCTAppDelegate: - :path: "../node_modules/react-native/Libraries/AppDelegate" - React-RCTBlob: - :path: "../node_modules/react-native/Libraries/Blob" - React-RCTFabric: - :path: "../node_modules/react-native/React" - React-RCTFBReactNativeSpec: - :path: "../node_modules/react-native/React" - React-RCTImage: - :path: "../node_modules/react-native/Libraries/Image" - React-RCTLinking: - :path: "../node_modules/react-native/Libraries/LinkingIOS" - React-RCTNetwork: - :path: "../node_modules/react-native/Libraries/Network" - React-RCTRuntime: - :path: "../node_modules/react-native/React/Runtime" - React-RCTSettings: - :path: "../node_modules/react-native/Libraries/Settings" - React-RCTText: - :path: "../node_modules/react-native/Libraries/Text" - React-RCTVibration: - :path: "../node_modules/react-native/Libraries/Vibration" - React-rendererconsistency: - :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency" - React-renderercss: - :path: "../node_modules/react-native/ReactCommon/react/renderer/css" - React-rendererdebug: - :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" - React-rncore: - :path: "../node_modules/react-native/ReactCommon" - React-RuntimeApple: - :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" - React-RuntimeCore: - :path: "../node_modules/react-native/ReactCommon/react/runtime" - React-runtimeexecutor: - :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" - React-RuntimeHermes: - :path: "../node_modules/react-native/ReactCommon/react/runtime" - React-runtimescheduler: - :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" - React-timing: - :path: "../node_modules/react-native/ReactCommon/react/timing" - React-utils: - :path: "../node_modules/react-native/ReactCommon/react/utils" - ReactAppDependencyProvider: - :path: build/generated/ios - ReactCodegen: - :path: build/generated/ios - ReactCommon: - :path: "../node_modules/react-native/ReactCommon" - Yoga: - :path: "../node_modules/react-native/ReactCommon/yoga" - -SPEC CHECKSUMS: - AppAuth: 1c1a8afa7e12f2ec3a294d9882dfa5ab7d3cb063 - AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f - boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 - DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb - EASClient: fe396f88189ce51edd819abe12df16c99e98bcd2 - EXApplication: 1e06972201838375ca1ec1ba34d586a98a5dc718 - EXConstants: d3d551cb154718f5161c4247304e96aa59f6cca7 - EXImageLoader: 4d3d3284141f1a45006cc4d0844061c182daf7ee - EXJSONUtils: 1d3e4590438c3ee593684186007028a14b3686cd - EXManifests: 691a779b04e4f2c96da46fb9bef4f86174fefcb5 - EXNotifications: be5e949edf1d60b70e77178b81aa505298fadd07 - Expo: a9aaba7e05fb1445c5605b2b1be1904efa2aaaff - ExpoAdapterGoogleSignIn: 5965ec283d2c0f53c483c4e2080ea055a881dfe9 - ExpoAsset: ef06e880126c375f580d4923fdd1cdf4ee6ee7d6 - ExpoBlur: 3c8885b9bf9eef4309041ec87adec48b5f1986a9 - ExpoCrypto: a9f1d75baeea6ef8b03c1660621585196c382e85 - ExpoDevice: 7082f03af1c588333ef1417d5aa8287081d94b24 - ExpoDocumentPicker: b263a279685b6640b8c8bc70d71c83067aeaae55 - ExpoFileSystem: 7f92f7be2f5c5ed40a7c9efc8fa30821181d9d63 - ExpoFont: cf508bc2e6b70871e05386d71cab927c8524cc8e - ExpoHaptics: 0ff6e0d83cd891178a306e548da1450249d54500 - ExpoHead: f85951372332180434f1aae973f6e3c94fccbed4 - ExpoImage: b0b4a838c62bb9d5438bb475cccc85619a5f59dc - ExpoImagePicker: 0963da31800c906e01c03e25d7c849f16ebf02a2 - ExpoKeepAwake: bf0811570c8da182bfb879169437d4de298376e7 - ExpoLinearGradient: 7734c8059972fcf691fb4330bcdf3390960a152d - ExpoLinking: d5c183998ca6ada66ff45e407e0f965b398a8902 - ExpoLocation: a43df2ff15f2fae9504b23a77060e7cd16b3e326 - ExpoModulesCore: 00a1b5c73248465bd0b93f59f8538c4573dac579 - ExpoSecureStore: 3f1b632d6d40bcc62b4983ef9199cd079592a50a - ExpoSplashScreen: 0ad5acac1b5d2953c6e00d4319f16d616f70d4dd - ExpoSymbols: c5612a90fb9179cdaebcd19bea9d8c69e5d3b859 - ExpoSystemUI: 433a971503b99020318518ed30a58204288bab2d - ExpoWebBrowser: dc39a88485f007e61a3dff05d6a75f22ab4a2e92 - EXStructuredHeaders: 32bec6771c2db18c4cd47cecae530d1d06cdf972 - EXUpdates: 004cca5223d04b5a0702b5712fbd5d9318024d47 - EXUpdatesInterface: 7ff005b7af94ee63fa452ea7bb95d7a8ff40277a - fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6 - FBLazyVector: 07309209b7b914451b8f822544a18e2a0a85afff - fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd - glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 - GoogleSignIn: c7f09cfbc85a1abf69187be091997c317cc33b77 - GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 - GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238 - GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 - hermes-engine: 44bb6fe76a6eb400d3a992e2d0b21946ae999fa9 - libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7 - libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f - libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 - PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82 - RCTDeprecation: 9bc64754b40b86fa5e32f293ab3ea8eea2248339 - RCTRequired: ee36c1ce9a5e65a3f629c13f38a85308eb8eebda - RCTTypeSafety: 7c0b654b92ef732fffc2a3992a02d10dc8f94bfd - ReachabilitySwift: 32793e867593cfc1177f5d16491e3a197d2fccda - React: bc28da5a227fa5e7b43e7ed68061f34740d4c880 - React-callinvoker: b78b18b44bc2c6634f7e594ad4fd206e624d41e3 - React-Core: 790dbe4191ce86ac1f45fb883f20d3b1d3cd9c17 - React-CoreModules: ee0b89806b53e36ccd02e5bf2f5743a902d7bf4b - React-cxxreact: 58b3e3e5242d59e0f4d1f8995a08c63a046db793 - React-debug: 1b32edb3610b3d4b9e864735d69c4d62d990626a - React-defaultsnativemodule: 69581e337102405a41d9fcd69e744af1a2ad749d - React-domnativemodule: 6923696d9fcc650c86c433da3259100f51ccb42b - React-Fabric: 920a0cdaffff29b9594c72b32b473b59cac91646 - React-FabricComponents: 640047a26d0583ed29a47f4e3366ae2834ec9b0c - React-FabricImage: 5e1a24378d80292ecd3d5ea61b647b7bca1cb723 - React-featureflags: f1e4a1a2c5cb631c59f24b1ae819466f40af2b87 - React-featureflagsnativemodule: 9f816b65e3e34147926638860bb840b3521bccda - React-graphics: 2511996f601a82b010bdff6727796de1c36c7b52 - React-hermes: 35f643c32d754a1b2b53cad842f23cfaa99f8d8f - React-idlecallbacksnativemodule: 2c5995a960001a809d41ee137e8fa5ed7832a24e - React-ImageManager: 4b728f466be07fe93835ec2eabd5b5a9c599eaf4 - React-jserrorhandler: f5718c89f923da34ab08737e4e6158baf51bb59b - React-jsi: 6a616bbcb9d9120a026b725ecce4f35f98f09ba1 - React-jsiexecutor: 57d3e09d0f1d3768ac5e2939995943d39bb9654f - React-jsinspector: 52941cbf108af39b69937626acc05aa5a7c8865e - React-jsinspectortracing: ba5099d65fbbcab3f3784762665efa5bce7c56a9 - React-jsitooling: db1d148e43965fa061664f250db24a12aba75f4c - React-jsitracing: 9a758dc710bdc5a479f5f977305d6819a0329cfb - React-logger: 1426d04b594a2e68b0ac2add21d45422d06397a3 - React-Mapbuffer: 70a29536f84ddffca4a91097651d2b8f194f7c67 - React-microtasksnativemodule: ff05e894231c44c21135d1d23a82b87656d98eeb - React-NativeModulesApple: d94850b316446b0c39a82eb278d6efaa1a634055 - React-oscompat: 56b4766e96b06843a3af49a6763ef40992e720aa - React-perflogger: 8fe9ec5f9ddbab1b8906c1aec159aa946e0ba041 - React-performancetimeline: 5759074986ec30b429c8392390dd4b662c65d801 - React-RCTActionSheet: 5eeca393823ffd882b0345e3237d79f886f45f39 - React-RCTAnimation: 8682725461a95efc7e14733a8c39395ca4919325 - React-RCTAppDelegate: c62b4b4edef06862ecd0338b38120e949618521c - React-RCTBlob: eea4f351d8ab91228bc520643c5c9d58ee399361 - React-RCTFabric: 715dd242313db6b659667d29962fd8242f119bac - React-RCTFBReactNativeSpec: 7974dac2a57ac00b7fec2c004ba1bb5e510b169e - React-RCTImage: 22fe53e2d833e6686b9ca87fb7d2d9cdaf642e32 - React-RCTLinking: 03282f3e8d12602a1ba8cf0805576c8b24da6c37 - React-RCTNetwork: e1abf95b6f01437abaf650a287093f34d1e2ee42 - React-RCTRuntime: 1ba02e904c795e01f0700004b848b2af1b9cb403 - React-RCTSettings: ed75f2bbce6a1827afc359df54bfcb931d5f1a8c - React-RCTText: 1c3233668a4b3df7180b630d55fdca54b54afa5e - React-RCTVibration: 71215147f2651948e303698e1b7397f7f72143a7 - React-rendererconsistency: 8e23097806742469937ecf8f3c401776b506f668 - React-renderercss: 8fa4bab51bf46d6925e9a1146d5f07000d9a7a34 - React-rendererdebug: 1eecc52d788acbf1d811804fe3c3db13cacda365 - React-rncore: ee835a70f528b2f08328eab8ad01a895b42ea62a - React-RuntimeApple: 32eb3ae01e58942c93670ae4c69f3aa317ac1f87 - React-RuntimeCore: 96f2ebad51fd037ff97e49e859fb821d123c3485 - React-runtimeexecutor: 86f4ae22d81c71b192f245140734caf657351e2c - React-RuntimeHermes: c1e92515c0cce33caea3255841cca5c6e4cbf784 - React-runtimescheduler: d33446b8b3e2889abb065c94651fe1645988a24c - React-timing: 9d2043040066c5b287ebc74d36f714ec0ba3eab9 - React-utils: dbd11170fa16d415eed989d75428af6fda5b712a - ReactAppDependencyProvider: ae0be24eb18014a031b4b220cb3973d07c3cbaf8 - ReactCodegen: 06cf663b23a161f42a2e14087269753f422885c0 - ReactCommon: 44c86ec3ace664c0f33b7a2ac89aced8304ef25e - SDWebImage: f29024626962457f3470184232766516dee8dfea - SDWebImageAVIFCoder: 00310d246aab3232ce77f1d8f0076f8c4b021d90 - SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c - SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 - SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: dc7c21200195acacb62fa920c588e7c2106de45e - -PODFILE CHECKSUM: b990e6c13064be75856e8524f3491ead4c163c17 - -COCOAPODS: 1.16.2 diff --git a/ios/Podfile.properties.json b/ios/Podfile.properties.json deleted file mode 100644 index de9f7b7..0000000 --- a/ios/Podfile.properties.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "expo.jsEngine": "hermes", - "EX_DEV_CLIENT_NETWORK_INSPECTOR": "true" -} diff --git a/ios/meatfarmermonorepo.xcodeproj/project.pbxproj b/ios/meatfarmermonorepo.xcodeproj/project.pbxproj deleted file mode 100644 index bf04a8a..0000000 --- a/ios/meatfarmermonorepo.xcodeproj/project.pbxproj +++ /dev/null @@ -1,567 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 2C4FDEE95846910CE44B063B /* libPods-meatfarmermonorepo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 37BA16CD265ED7F72409550D /* libPods-meatfarmermonorepo.a */; }; - 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; - BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; - D20664F10ED8090F4983CFB0 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EB8BC3528ACACFE6A3CFB5D /* ExpoModulesProvider.swift */; }; - E5B462C85E4DB34FCCD3D04E /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = F66C424AA0E1347CF8253669 /* PrivacyInfo.xcprivacy */; }; - F11748422D0307B40044C1D9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F11748412D0307B40044C1D9 /* AppDelegate.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 13B07F961A680F5B00A75B9A /* meatfarmermonorepo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = meatfarmermonorepo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = meatfarmermonorepo/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = meatfarmermonorepo/Info.plist; sourceTree = ""; }; - 338F04D2CAE7495C1D7CD233 /* Pods-meatfarmermonorepo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-meatfarmermonorepo.debug.xcconfig"; path = "Target Support Files/Pods-meatfarmermonorepo/Pods-meatfarmermonorepo.debug.xcconfig"; sourceTree = ""; }; - 37BA16CD265ED7F72409550D /* libPods-meatfarmermonorepo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-meatfarmermonorepo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3EB8BC3528ACACFE6A3CFB5D /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-meatfarmermonorepo/ExpoModulesProvider.swift"; sourceTree = ""; }; - 533CB49887DAADE200BAF1EB /* Pods-meatfarmermonorepo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-meatfarmermonorepo.release.xcconfig"; path = "Target Support Files/Pods-meatfarmermonorepo/Pods-meatfarmermonorepo.release.xcconfig"; sourceTree = ""; }; - AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = meatfarmermonorepo/SplashScreen.storyboard; sourceTree = ""; }; - BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; }; - ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; - F11748412D0307B40044C1D9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = meatfarmermonorepo/AppDelegate.swift; sourceTree = ""; }; - F11748442D0722820044C1D9 /* meatfarmermonorepo-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "meatfarmermonorepo-Bridging-Header.h"; path = "meatfarmermonorepo/meatfarmermonorepo-Bridging-Header.h"; sourceTree = ""; }; - F66C424AA0E1347CF8253669 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = meatfarmermonorepo/PrivacyInfo.xcprivacy; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 2C4FDEE95846910CE44B063B /* libPods-meatfarmermonorepo.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 13B07FAE1A68108700A75B9A /* meatfarmermonorepo */ = { - isa = PBXGroup; - children = ( - F11748412D0307B40044C1D9 /* AppDelegate.swift */, - F11748442D0722820044C1D9 /* meatfarmermonorepo-Bridging-Header.h */, - BB2F792B24A3F905000567C9 /* Supporting */, - 13B07FB51A68108700A75B9A /* Images.xcassets */, - 13B07FB61A68108700A75B9A /* Info.plist */, - AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */, - F66C424AA0E1347CF8253669 /* PrivacyInfo.xcprivacy */, - ); - name = meatfarmermonorepo; - sourceTree = ""; - }; - 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { - isa = PBXGroup; - children = ( - ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - 37BA16CD265ED7F72409550D /* libPods-meatfarmermonorepo.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 3742C5BD2E66753B5F39026B /* ExpoModulesProviders */ = { - isa = PBXGroup; - children = ( - 4DACB6B6CCC8B1A8CBF98D1D /* meatfarmermonorepo */, - ); - name = ExpoModulesProviders; - sourceTree = ""; - }; - 4DACB6B6CCC8B1A8CBF98D1D /* meatfarmermonorepo */ = { - isa = PBXGroup; - children = ( - 3EB8BC3528ACACFE6A3CFB5D /* ExpoModulesProvider.swift */, - ); - name = meatfarmermonorepo; - sourceTree = ""; - }; - 832341AE1AAA6A7D00B99B32 /* Libraries */ = { - isa = PBXGroup; - children = ( - ); - name = Libraries; - sourceTree = ""; - }; - 83CBB9F61A601CBA00E9B192 = { - isa = PBXGroup; - children = ( - 13B07FAE1A68108700A75B9A /* meatfarmermonorepo */, - 832341AE1AAA6A7D00B99B32 /* Libraries */, - 83CBBA001A601CBA00E9B192 /* Products */, - 2D16E6871FA4F8E400B85C8A /* Frameworks */, - D7B1D84C142A04E96F6A3A3D /* Pods */, - 3742C5BD2E66753B5F39026B /* ExpoModulesProviders */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - usesTabs = 0; - }; - 83CBBA001A601CBA00E9B192 /* Products */ = { - isa = PBXGroup; - children = ( - 13B07F961A680F5B00A75B9A /* meatfarmermonorepo.app */, - ); - name = Products; - sourceTree = ""; - }; - BB2F792B24A3F905000567C9 /* Supporting */ = { - isa = PBXGroup; - children = ( - BB2F792C24A3F905000567C9 /* Expo.plist */, - ); - name = Supporting; - path = meatfarmermonorepo/Supporting; - sourceTree = ""; - }; - D7B1D84C142A04E96F6A3A3D /* Pods */ = { - isa = PBXGroup; - children = ( - 338F04D2CAE7495C1D7CD233 /* Pods-meatfarmermonorepo.debug.xcconfig */, - 533CB49887DAADE200BAF1EB /* Pods-meatfarmermonorepo.release.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 13B07F861A680F5B00A75B9A /* meatfarmermonorepo */ = { - isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "meatfarmermonorepo" */; - buildPhases = ( - 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */, - 5BC667EA2551B13AA89D9A66 /* [Expo] Configure project */, - 13B07F871A680F5B00A75B9A /* Sources */, - 13B07F8C1A680F5B00A75B9A /* Frameworks */, - 13B07F8E1A680F5B00A75B9A /* Resources */, - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, - DAF2E4EA15761DC5FE4C4A8B /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = meatfarmermonorepo; - productName = meatfarmermonorepo; - productReference = 13B07F961A680F5B00A75B9A /* meatfarmermonorepo.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83CBB9F71A601CBA00E9B192 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1130; - TargetAttributes = { - 13B07F861A680F5B00A75B9A = { - LastSwiftMigration = 1250; - }; - }; - }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "meatfarmermonorepo" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 83CBB9F61A601CBA00E9B192; - productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 13B07F861A680F5B00A75B9A /* meatfarmermonorepo */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 13B07F8E1A680F5B00A75B9A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BB2F792D24A3F905000567C9 /* Expo.plist in Resources */, - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */, - E5B462C85E4DB34FCCD3D04E /* PrivacyInfo.xcprivacy in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Bundle React Native code and images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios absolute | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n# Source .xcode.env.updates if it exists to allow\n# SKIP_BUNDLING to be unset if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.updates\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.updates\"\nfi\n# Source local changes to allow overrides\n# if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n"; - }; - 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-meatfarmermonorepo-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 5BC667EA2551B13AA89D9A66 /* [Expo] Configure project */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "[Expo] Configure project"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-meatfarmermonorepo/expo-configure-project.sh\"\n"; - }; - 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-meatfarmermonorepo/Pods-meatfarmermonorepo-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/AppAuth/AppAuthCore_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/EXApplication/ExpoApplication_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/ExpoConstants_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/EXNotifications/ExpoNotifications_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/EXUpdates/EXUpdates.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/ExpoDevice/ExpoDevice_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/ExpoSystemUI/ExpoSystemUI_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth/GTMAppAuth_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher/GTMSessionFetcher_Core_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleSignIn/GoogleSignIn.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RCT-Folly/RCT-Folly_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/ReachabilitySwift.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/boost/boost_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/glog/glog_privacy.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AppAuthCore_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoApplication_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoConstants_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoNotifications_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXUpdates.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoDevice_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoSystemUI_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GTMAppAuth_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GTMSessionFetcher_Core_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCT-Folly_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ReachabilitySwift.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/boost_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/glog_privacy.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-meatfarmermonorepo/Pods-meatfarmermonorepo-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - DAF2E4EA15761DC5FE4C4A8B /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-meatfarmermonorepo/Pods-meatfarmermonorepo-frameworks.sh", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-meatfarmermonorepo/Pods-meatfarmermonorepo-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 13B07F871A680F5B00A75B9A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - F11748422D0307B40044C1D9 /* AppDelegate.swift in Sources */, - D20664F10ED8090F4983CFB0 /* ExpoModulesProvider.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 13B07F941A680F5B00A75B9A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 338F04D2CAE7495C1D7CD233 /* Pods-meatfarmermonorepo.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = meatfarmermonorepo/meatfarmermonorepo.entitlements; - CURRENT_PROJECT_VERSION = 1; - ENABLE_BITCODE = NO; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "FB_SONARKIT_ENABLED=1", - ); - INFOPLIST_FILE = meatfarmermonorepo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; - PRODUCT_BUNDLE_IDENTIFIER = "com.mohammedshafiuddin54.meat-farmer-monorepo"; - PRODUCT_NAME = meatfarmermonorepo; - SWIFT_OBJC_BRIDGING_HEADER = "meatfarmermonorepo/meatfarmermonorepo-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 13B07F951A680F5B00A75B9A /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 533CB49887DAADE200BAF1EB /* Pods-meatfarmermonorepo.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = meatfarmermonorepo/meatfarmermonorepo.entitlements; - CURRENT_PROJECT_VERSION = 1; - INFOPLIST_FILE = meatfarmermonorepo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; - PRODUCT_BUNDLE_IDENTIFIER = "com.mohammedshafiuddin54.meat-farmer-monorepo"; - PRODUCT_NAME = meatfarmermonorepo; - SWIFT_OBJC_BRIDGING_HEADER = "meatfarmermonorepo/meatfarmermonorepo-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; - 83CBBA201A601CBA00E9B192 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++20"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD_RUNPATH_SEARCH_PATHS = ( - /usr/lib/swift, - "$(inherited)", - ); - LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = ( - "$(inherited)", - " ", - ); - REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; - USE_HERMES = true; - }; - name = Debug; - }; - 83CBBA211A601CBA00E9B192 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++20"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD_RUNPATH_SEARCH_PATHS = ( - /usr/lib/swift, - "$(inherited)", - ); - LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ( - "$(inherited)", - " ", - ); - REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; - SDKROOT = iphoneos; - USE_HERMES = true; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "meatfarmermonorepo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 13B07F941A680F5B00A75B9A /* Debug */, - 13B07F951A680F5B00A75B9A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "meatfarmermonorepo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83CBBA201A601CBA00E9B192 /* Debug */, - 83CBBA211A601CBA00E9B192 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; -} diff --git a/ios/meatfarmermonorepo.xcodeproj/xcshareddata/xcschemes/meatfarmermonorepo.xcscheme b/ios/meatfarmermonorepo.xcodeproj/xcshareddata/xcschemes/meatfarmermonorepo.xcscheme deleted file mode 100644 index 0efc0b2..0000000 --- a/ios/meatfarmermonorepo.xcodeproj/xcshareddata/xcschemes/meatfarmermonorepo.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/meatfarmermonorepo.xcworkspace/contents.xcworkspacedata b/ios/meatfarmermonorepo.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 84e0859..0000000 --- a/ios/meatfarmermonorepo.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/ios/meatfarmermonorepo/AppDelegate.swift b/ios/meatfarmermonorepo/AppDelegate.swift deleted file mode 100644 index a7887e1..0000000 --- a/ios/meatfarmermonorepo/AppDelegate.swift +++ /dev/null @@ -1,70 +0,0 @@ -import Expo -import React -import ReactAppDependencyProvider - -@UIApplicationMain -public class AppDelegate: ExpoAppDelegate { - var window: UIWindow? - - var reactNativeDelegate: ExpoReactNativeFactoryDelegate? - var reactNativeFactory: RCTReactNativeFactory? - - public override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil - ) -> Bool { - let delegate = ReactNativeDelegate() - let factory = ExpoReactNativeFactory(delegate: delegate) - delegate.dependencyProvider = RCTAppDependencyProvider() - - reactNativeDelegate = delegate - reactNativeFactory = factory - bindReactNativeFactory(factory) - -#if os(iOS) || os(tvOS) - window = UIWindow(frame: UIScreen.main.bounds) - factory.startReactNative( - withModuleName: "main", - in: window, - launchOptions: launchOptions) -#endif - - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } - - // Linking API - public override func application( - _ app: UIApplication, - open url: URL, - options: [UIApplication.OpenURLOptionsKey: Any] = [:] - ) -> Bool { - return super.application(app, open: url, options: options) || RCTLinkingManager.application(app, open: url, options: options) - } - - // Universal Links - public override func application( - _ application: UIApplication, - continue userActivity: NSUserActivity, - restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void - ) -> Bool { - let result = RCTLinkingManager.application(application, continue: userActivity, restorationHandler: restorationHandler) - return super.application(application, continue: userActivity, restorationHandler: restorationHandler) || result - } -} - -class ReactNativeDelegate: ExpoReactNativeFactoryDelegate { - // Extension point for config-plugins - - override func sourceURL(for bridge: RCTBridge) -> URL? { - // needed to return the correct URL for expo-dev-client. - bridge.bundleURL ?? bundleURL() - } - - override func bundleURL() -> URL? { -#if DEBUG - return RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: ".expo/.virtual-metro-entry") -#else - return Bundle.main.url(forResource: "main", withExtension: "jsbundle") -#endif - } -} diff --git a/ios/meatfarmermonorepo/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png b/ios/meatfarmermonorepo/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png deleted file mode 100644 index ac881f6..0000000 Binary files a/ios/meatfarmermonorepo/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png and /dev/null differ diff --git a/ios/meatfarmermonorepo/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/meatfarmermonorepo/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 90d8d4c..0000000 --- a/ios/meatfarmermonorepo/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "images": [ - { - "filename": "App-Icon-1024x1024@1x.png", - "idiom": "universal", - "platform": "ios", - "size": "1024x1024" - } - ], - "info": { - "version": 1, - "author": "expo" - } -} \ No newline at end of file diff --git a/ios/meatfarmermonorepo/Images.xcassets/Contents.json b/ios/meatfarmermonorepo/Images.xcassets/Contents.json deleted file mode 100644 index ed285c2..0000000 --- a/ios/meatfarmermonorepo/Images.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "expo" - } -} diff --git a/ios/meatfarmermonorepo/Images.xcassets/SplashScreenBackground.colorset/Contents.json b/ios/meatfarmermonorepo/Images.xcassets/SplashScreenBackground.colorset/Contents.json deleted file mode 100644 index 15f02ab..0000000 --- a/ios/meatfarmermonorepo/Images.xcassets/SplashScreenBackground.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors": [ - { - "color": { - "components": { - "alpha": "1.000", - "blue": "1.00000000000000", - "green": "1.00000000000000", - "red": "1.00000000000000" - }, - "color-space": "srgb" - }, - "idiom": "universal" - } - ], - "info": { - "version": 1, - "author": "expo" - } -} \ No newline at end of file diff --git a/ios/meatfarmermonorepo/Info.plist b/ios/meatfarmermonorepo/Info.plist deleted file mode 100644 index 8982020..0000000 --- a/ios/meatfarmermonorepo/Info.plist +++ /dev/null @@ -1,75 +0,0 @@ - - - - - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - meat-farmer-monorepo - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleURLSchemes - - com.mohammedshafiuddin54.meat-farmer-monorepo - - - - CFBundleURLSchemes - - exp+meat-farmer-monorepo - - - - CFBundleVersion - 1 - LSMinimumSystemVersion - 12.0 - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - NSAllowsLocalNetworking - - - UILaunchStoryboardName - SplashScreen - UIRequiredDeviceCapabilities - - arm64 - - UIRequiresFullScreen - - UIStatusBarStyle - UIStatusBarStyleDefault - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIUserInterfaceStyle - Light - UIViewControllerBasedStatusBarAppearance - - - \ No newline at end of file diff --git a/ios/meatfarmermonorepo/SplashScreen.storyboard b/ios/meatfarmermonorepo/SplashScreen.storyboard deleted file mode 100644 index 81f3d72..0000000 --- a/ios/meatfarmermonorepo/SplashScreen.storyboard +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ios/meatfarmermonorepo/Supporting/Expo.plist b/ios/meatfarmermonorepo/Supporting/Expo.plist deleted file mode 100644 index 750be02..0000000 --- a/ios/meatfarmermonorepo/Supporting/Expo.plist +++ /dev/null @@ -1,12 +0,0 @@ - - - - - EXUpdatesCheckOnLaunch - ALWAYS - EXUpdatesEnabled - - EXUpdatesLaunchWaitMs - 0 - - \ No newline at end of file diff --git a/ios/meatfarmermonorepo/meatfarmermonorepo-Bridging-Header.h b/ios/meatfarmermonorepo/meatfarmermonorepo-Bridging-Header.h deleted file mode 100644 index 8361941..0000000 --- a/ios/meatfarmermonorepo/meatfarmermonorepo-Bridging-Header.h +++ /dev/null @@ -1,3 +0,0 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 64a526b..0000000 --- a/package-lock.json +++ /dev/null @@ -1,25628 +0,0 @@ -{ - "name": "meat-farmer-monorepo", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "meat-farmer-monorepo", - "version": "1.0.0", - "workspaces": [ - "apps/*", - "packages/*" - ], - "dependencies": { - "@react-native/virtualized-lists": "^0.79.6", - "@react-three/drei": "^10.7.7", - "@react-three/fiber": "^9.5.0", - "@types/three": "^0.182.0", - "admin-ui": "^1.0.0", - "backend": "^1.0.0", - "canvas-confetti": "^1.9.4", - "drizzle-orm": "^0.45.1", - "expo": "~53.0.22", - "expo-auth-session": "~6.2.1", - "expo-crypto": "~14.1.5", - "expo-server-sdk": "^5.0.0", - "expo-web-browser": "~14.2.0", - "node-cron": "^4.2.1", - "pg": "^8.20.0", - "react": "19.0.0", - "react-native": "0.79.6", - "three": "^0.182.0", - "user-ui": "^1.0.0", - "zustand": "^5.0.9" - }, - "devDependencies": { - "@babel/core": "^7.25.2", - "@types/canvas-confetti": "^1.9.0", - "@types/react": "~19.0.10", - "@types/react-native-razorpay": "^2.2.6", - "eslint": "^9.25.0", - "eslint-config-expo": "~9.2.0", - "turbo": "^2.0.0", - "typescript": "~5.8.3" - } - }, - "apps/admin-ui": { - "version": "1.0.0", - "dependencies": { - "@expo/vector-icons": "^14.1.0", - "@react-native-community/datetimepicker": "8.4.1", - "@react-native-picker/picker": "2.11.1", - "@react-navigation/bottom-tabs": "^7.3.10", - "@react-navigation/drawer": "^7.3.9", - "@react-navigation/elements": "^2.3.8", - "@react-navigation/material-top-tabs": "^7.4.11", - "@react-navigation/native": "^7.1.6", - "@tanstack/react-query": "^5.85.9", - "@trpc/client": "^11.6.0", - "@trpc/react-query": "^11.6.0", - "axios": "^1.11.0", - "buffer": "^6.0.3", - "date-fns": "^4.1.0", - "dayjs": "^1.11.18", - "expo": "~53.0.22", - "expo-blur": "~14.1.5", - "expo-constants": "~17.1.7", - "expo-device": "~7.1.4", - "expo-document-picker": "~13.1.6", - "expo-font": "~13.3.2", - "expo-haptics": "~14.1.4", - "expo-image": "~2.4.0", - "expo-image-picker": "~16.1.4", - "expo-linear-gradient": "~14.1.5", - "expo-linking": "~7.1.7", - "expo-location": "^19.0.8", - "expo-notifications": "~0.31.4", - "expo-router": "~5.1.5", - "expo-secure-store": "~14.2.4", - "expo-splash-screen": "~0.30.10", - "expo-status-bar": "~2.2.3", - "expo-symbols": "~0.4.5", - "expo-system-ui": "~5.0.11", - "expo-updates": "~0.28.17", - "expo-web-browser": "~14.2.0", - "formik": "^2.4.6", - "jwt-decode": "^4.0.0", - "react": "19.0.0", - "react-dom": "19.0.0", - "react-hook-form": "^7.62.0", - "react-native": "0.79.6", - "react-native-draggable-flatlist": "^4.0.3", - "react-native-element-dropdown": "^2.12.4", - "react-native-gesture-handler": "~2.24.0", - "react-native-pager-view": "6.7.1", - "react-native-paper": "^5.14.5", - "react-native-reanimated": "~3.17.4", - "react-native-safe-area-context": "5.4.0", - "react-native-screens": "~4.11.1", - "react-native-tab-view": "^4.1.3", - "react-native-toast-message": "^2.3.3", - "react-native-web": "~0.20.0", - "react-native-webview": "13.13.5", - "twrnc": "^4.9.1", - "yup": "^1.7.0" - }, - "devDependencies": { - "@babel/core": "^7.25.2", - "@types/react": "~19.0.10", - "@types/react-native-razorpay": "^2.2.6", - "eslint": "^9.25.0", - "eslint-config-expo": "~9.2.0", - "typescript": "~5.8.3" - } - }, - "apps/admin-ui/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "apps/admin-ui/node_modules/expo-location": { - "version": "19.0.8", - "resolved": "https://registry.npmjs.org/expo-location/-/expo-location-19.0.8.tgz", - "integrity": "sha512-H/FI75VuJ1coodJbbMu82pf+Zjess8X8Xkiv9Bv58ZgPKS/2ztjC1YO1/XMcGz7+s9DrbLuMIw22dFuP4HqneA==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, - "apps/admin-ui/node_modules/react-native-pager-view": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.7.1.tgz", - "integrity": "sha512-cBSr6xw4g5N7Kd3VGWcf+kmaH7iBWb0DXAf2bVo3bXkzBcBbTOmYSvc0LVLHhUPW8nEq5WjT9LCIYAzgF++EXw==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "apps/backend": { - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@aws-sdk/client-s3": "^3.888.0", - "@aws-sdk/s3-request-presigner": "^3.888.0", - "@trpc/server": "^11.6.0", - "@turf/turf": "^7.2.0", - "@types/bcryptjs": "^2.4.6", - "@types/cors": "^2.8.19", - "@types/jsonwebtoken": "^9.0.10", - "@types/multer": "^2.0.0", - "axios": "^1.11.0", - "bcryptjs": "^3.0.2", - "bullmq": "^5.63.0", - "cors": "^2.8.5", - "dayjs": "^1.11.18", - "dotenv": "^17.2.1", - "drizzle-orm": "^0.44.5", - "expo-server-sdk": "^4.0.0", - "express": "^5.1.0", - "fuse.js": "^7.1.0", - "jsonwebtoken": "^9.0.2", - "multer": "^2.0.2", - "node-cron": "^4.2.1", - "pg": "^8.16.3", - "pg-sdk-node": "https://phonepe.mycloudrepo.io/public/repositories/phonepe-pg-sdk-node/releases/v2/phonepe-pg-sdk-node.tgz", - "razorpay": "^2.9.6", - "redis": "^5.9.0", - "zod": "^4.1.12" - }, - "devDependencies": { - "@types/express": "^5.0.3", - "@types/node": "^24.5.2", - "@types/pg": "^8.15.5", - "drizzle-kit": "^0.31.4", - "rimraf": "^6.1.2", - "ts-node-dev": "^2.0.0", - "tsc-alias": "^1.8.16", - "tsx": "^4.20.5", - "typescript": "^5.9.2" - } - }, - "apps/backend/node_modules/drizzle-orm": { - "version": "0.44.7", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.44.7.tgz", - "integrity": "sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ==", - "license": "Apache-2.0", - "peerDependencies": { - "@aws-sdk/client-rds-data": ">=3", - "@cloudflare/workers-types": ">=4", - "@electric-sql/pglite": ">=0.2.0", - "@libsql/client": ">=0.10.0", - "@libsql/client-wasm": ">=0.10.0", - "@neondatabase/serverless": ">=0.10.0", - "@op-engineering/op-sqlite": ">=2", - "@opentelemetry/api": "^1.4.1", - "@planetscale/database": ">=1.13", - "@prisma/client": "*", - "@tidbcloud/serverless": "*", - "@types/better-sqlite3": "*", - "@types/pg": "*", - "@types/sql.js": "*", - "@upstash/redis": ">=1.34.7", - "@vercel/postgres": ">=0.8.0", - "@xata.io/client": "*", - "better-sqlite3": ">=7", - "bun-types": "*", - "expo-sqlite": ">=14.0.0", - "gel": ">=2", - "knex": "*", - "kysely": "*", - "mysql2": ">=2", - "pg": ">=8", - "postgres": ">=3", - "sql.js": ">=1", - "sqlite3": ">=5" - }, - "peerDependenciesMeta": { - "@aws-sdk/client-rds-data": { - "optional": true - }, - "@cloudflare/workers-types": { - "optional": true - }, - "@electric-sql/pglite": { - "optional": true - }, - "@libsql/client": { - "optional": true - }, - "@libsql/client-wasm": { - "optional": true - }, - "@neondatabase/serverless": { - "optional": true - }, - "@op-engineering/op-sqlite": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@prisma/client": { - "optional": true - }, - "@tidbcloud/serverless": { - "optional": true - }, - "@types/better-sqlite3": { - "optional": true - }, - "@types/pg": { - "optional": true - }, - "@types/sql.js": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/postgres": { - "optional": true - }, - "@xata.io/client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "bun-types": { - "optional": true - }, - "expo-sqlite": { - "optional": true - }, - "gel": { - "optional": true - }, - "knex": { - "optional": true - }, - "kysely": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "postgres": { - "optional": true - }, - "prisma": { - "optional": true - }, - "sql.js": { - "optional": true - }, - "sqlite3": { - "optional": true - } - } - }, - "apps/backend/node_modules/expo-server-sdk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/expo-server-sdk/-/expo-server-sdk-4.0.0.tgz", - "integrity": "sha512-zi83XtG2pqyP3gyn1JIRYkydo2i6HU3CYaWo/VvhZG/F29U+QIDv6LBEUsWf4ddZlVE7c9WN1N8Be49rHgO8OQ==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.0", - "promise-limit": "^2.7.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": ">=20" - } - }, - "apps/backend/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "apps/fallback-ui": { - "version": "0.1.0", - "dependencies": { - "@radix-ui/react-slot": "^1.1.2", - "@tanstack/react-query": "^5.59.16", - "@tanstack/react-router": "^1.92.8", - "@tanstack/router-devtools": "^1.92.8", - "@trpc/client": "^11.6.0", - "@trpc/react-query": "^11.6.0", - "axios": "^1.7.9", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.1", - "dayjs": "^1.11.19", - "formik": "^2.4.9", - "jwt-decode": "^4.0.0", - "maplibre-gl": "^4.7.0", - "react": "19.0.0", - "react-dom": "19.0.0", - "superjson": "^2.2.1", - "tailwind-merge": "^2.5.5", - "yup": "^1.7.1", - "zod": "^3.24.1", - "zustand": "^5.0.10" - }, - "devDependencies": { - "@types/node": "^20.17.10", - "@types/react": "~19.0.10", - "@types/react-dom": "~19.0.4", - "@typescript-eslint/eslint-plugin": "^8.18.1", - "@typescript-eslint/parser": "^8.18.1", - "@vitejs/plugin-react-swc": "^3.7.2", - "autoprefixer": "^10.4.20", - "eslint": "^9.25.0", - "eslint-plugin-react-hooks": "^5.1.0", - "eslint-plugin-react-refresh": "^0.4.9", - "postcss": "^8.4.49", - "tailwindcss": "^3.4.16", - "tailwindcss-animate": "^1.0.7", - "typescript": "~5.8.3", - "vite": "^6.0.5" - } - }, - "apps/fallback-ui/node_modules/@types/node": { - "version": "20.19.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.26.tgz", - "integrity": "sha512-0l6cjgF0XnihUpndDhk+nyD3exio3iKaYROSgvh/qSevPXax3L8p5DBRFjbvalnwatGgHEQn2R88y2fA3g4irg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "apps/fallback-ui/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "apps/info-site": { - "name": "symbuyote-info-site", - "version": "1.0.0", - "dependencies": { - "express": "^4.18.2", - "pug": "^3.0.2" - } - }, - "apps/info-site/node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.14.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "apps/user-ui": { - "version": "1.0.0", - "dependencies": { - "@expo/vector-icons": "^14.1.0", - "@react-native-community/datetimepicker": "8.4.1", - "@react-native-google-signin/google-signin": "^16.0.0", - "@react-native-picker/picker": "2.11.1", - "@react-navigation/bottom-tabs": "^7.3.10", - "@react-navigation/drawer": "^7.3.9", - "@react-navigation/elements": "^2.3.8", - "@react-navigation/native": "^7.1.6", - "@tanstack/react-query": "^5.85.9", - "@trpc/client": "^11.6.0", - "@trpc/react-query": "^11.6.0", - "axios": "^1.11.0", - "buffer": "^6.0.3", - "dayjs": "^1.11.18", - "expo": "~53.0.22", - "expo-blur": "~14.1.5", - "expo-constants": "~17.1.7", - "expo-crypto": "~14.1.5", - "expo-device": "~7.1.4", - "expo-document-picker": "~13.1.6", - "expo-font": "~13.3.2", - "expo-haptics": "~14.1.4", - "expo-image": "2.4.1", - "expo-image-picker": "~16.1.4", - "expo-linear-gradient": "~14.1.5", - "expo-linking": "~7.1.7", - "expo-location": "~18.1.6", - "expo-notifications": "~0.31.4", - "expo-router": "~5.1.5", - "expo-secure-store": "~14.2.4", - "expo-splash-screen": "~0.30.10", - "expo-status-bar": "~2.2.3", - "expo-symbols": "~0.4.5", - "expo-system-ui": "~5.0.11", - "expo-updates": "~0.28.17", - "expo-web-browser": "~14.2.0", - "formik": "^2.4.6", - "jwt-decode": "^4.0.0", - "react": "19.0.0", - "react-dom": "19.0.0", - "react-hook-form": "^7.62.0", - "react-native": "0.79.6", - "react-native-element-dropdown": "^2.12.4", - "react-native-gesture-handler": "~2.24.0", - "react-native-pager-view": "6.7.1", - "react-native-paper": "^5.14.5", - "react-native-razorpay": "^2.3.1", - "react-native-reanimated": "~3.17.4", - "react-native-safe-area-context": "5.4.0", - "react-native-screens": "~4.11.1", - "react-native-svg": "15.11.2", - "react-native-tab-view": "^4.1.3", - "react-native-toast-message": "^2.3.3", - "react-native-web": "~0.20.0", - "react-native-webview": "13.13.5", - "twrnc": "^4.9.1", - "yup": "^1.7.0" - }, - "devDependencies": { - "@babel/core": "^7.25.2", - "@types/react": "~19.0.10", - "@types/react-native-razorpay": "^2.2.6", - "eslint": "^9.25.0", - "eslint-config-expo": "~9.2.0", - "typescript": "~5.8.3" - } - }, - "apps/user-ui/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "apps/user-ui/node_modules/react-native-pager-view": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.7.1.tgz", - "integrity": "sha512-cBSr6xw4g5N7Kd3VGWcf+kmaH7iBWb0DXAf2bVo3bXkzBcBbTOmYSvc0LVLHhUPW8nEq5WjT9LCIYAzgF++EXw==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/@0no-co/graphql.web": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", - "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", - "license": "MIT", - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - }, - "peerDependenciesMeta": { - "graphql": { - "optional": true - } - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@aws-crypto/crc32": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", - "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/crc32c": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", - "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", - "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-s3": { - "version": "3.948.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.948.0.tgz", - "integrity": "sha512-uvEjds8aYA9SzhBS8RKDtsDUhNV9VhqKiHTcmvhM7gJO92q0WTn8/QeFTdNyLc6RxpiDyz+uBxS7PcdNiZzqfA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha1-browser": "5.2.0", - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.947.0", - "@aws-sdk/credential-provider-node": "3.948.0", - "@aws-sdk/middleware-bucket-endpoint": "3.936.0", - "@aws-sdk/middleware-expect-continue": "3.936.0", - "@aws-sdk/middleware-flexible-checksums": "3.947.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-location-constraint": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.948.0", - "@aws-sdk/middleware-sdk-s3": "3.947.0", - "@aws-sdk/middleware-ssec": "3.936.0", - "@aws-sdk/middleware-user-agent": "3.947.0", - "@aws-sdk/region-config-resolver": "3.936.0", - "@aws-sdk/signature-v4-multi-region": "3.947.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.947.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.7", - "@smithy/eventstream-serde-browser": "^4.2.5", - "@smithy/eventstream-serde-config-resolver": "^4.3.5", - "@smithy/eventstream-serde-node": "^4.2.5", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-blob-browser": "^4.2.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/hash-stream-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/md5-js": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.14", - "@smithy/middleware-retry": "^4.4.14", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.10", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.13", - "@smithy/util-defaults-mode-node": "^4.2.16", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/util-stream": "^4.5.6", - "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.948.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.948.0.tgz", - "integrity": "sha512-iWjchXy8bIAVBUsKnbfKYXRwhLgRg3EqCQ5FTr3JbR+QR75rZm4ZOYXlvHGztVTmtAZ+PQVA1Y4zO7v7N87C0A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.947.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.948.0", - "@aws-sdk/middleware-user-agent": "3.947.0", - "@aws-sdk/region-config-resolver": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.947.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.7", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.14", - "@smithy/middleware-retry": "^4.4.14", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.10", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.13", - "@smithy/util-defaults-mode-node": "^4.2.16", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.947.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.947.0.tgz", - "integrity": "sha512-Khq4zHhuAkvCFuFbgcy3GrZTzfSX7ZIjIcW1zRDxXRLZKRtuhnZdonqTUfaWi5K42/4OmxkYNpsO7X7trQOeHw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.936.0", - "@aws-sdk/xml-builder": "3.930.0", - "@smithy/core": "^3.18.7", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/signature-v4": "^5.3.5", - "@smithy/smithy-client": "^4.9.10", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.947.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.947.0.tgz", - "integrity": "sha512-VR2V6dRELmzwAsCpK4GqxUi6UW5WNhAXS9F9AzWi5jvijwJo3nH92YNJUP4quMpgFZxJHEWyXLWgPjh9u0zYOA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.947.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.947.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.947.0.tgz", - "integrity": "sha512-inF09lh9SlHj63Vmr5d+LmwPXZc2IbK8lAruhOr3KLsZAIHEgHgGPXWDC2ukTEMzg0pkexQ6FOhXXad6klK4RA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.947.0", - "@aws-sdk/types": "3.936.0", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.10", - "@smithy/types": "^4.9.0", - "@smithy/util-stream": "^4.5.6", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.948.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.948.0.tgz", - "integrity": "sha512-Cl//Qh88e8HBL7yYkJNpF5eq76IO6rq8GsatKcfVBm7RFVxCqYEPSSBtkHdbtNwQdRQqAMXc6E/lEB/CZUDxnA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.947.0", - "@aws-sdk/credential-provider-env": "3.947.0", - "@aws-sdk/credential-provider-http": "3.947.0", - "@aws-sdk/credential-provider-login": "3.948.0", - "@aws-sdk/credential-provider-process": "3.947.0", - "@aws-sdk/credential-provider-sso": "3.948.0", - "@aws-sdk/credential-provider-web-identity": "3.948.0", - "@aws-sdk/nested-clients": "3.948.0", - "@aws-sdk/types": "3.936.0", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.948.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.948.0.tgz", - "integrity": "sha512-gcKO2b6eeTuZGp3Vvgr/9OxajMrD3W+FZ2FCyJox363ZgMoYJsyNid1vuZrEuAGkx0jvveLXfwiVS0UXyPkgtw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.947.0", - "@aws-sdk/nested-clients": "3.948.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.948.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.948.0.tgz", - "integrity": "sha512-ep5vRLnrRdcsP17Ef31sNN4g8Nqk/4JBydcUJuFRbGuyQtrZZrVT81UeH2xhz6d0BK6ejafDB9+ZpBjXuWT5/Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.947.0", - "@aws-sdk/credential-provider-http": "3.947.0", - "@aws-sdk/credential-provider-ini": "3.948.0", - "@aws-sdk/credential-provider-process": "3.947.0", - "@aws-sdk/credential-provider-sso": "3.948.0", - "@aws-sdk/credential-provider-web-identity": "3.948.0", - "@aws-sdk/types": "3.936.0", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.947.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.947.0.tgz", - "integrity": "sha512-WpanFbHe08SP1hAJNeDdBDVz9SGgMu/gc0XJ9u3uNpW99nKZjDpvPRAdW7WLA4K6essMjxWkguIGNOpij6Do2Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.947.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.948.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.948.0.tgz", - "integrity": "sha512-gqLhX1L+zb/ZDnnYbILQqJ46j735StfWV5PbDjxRzBKS7GzsiYoaf6MyHseEopmWrez5zl5l6aWzig7UpzSeQQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-sso": "3.948.0", - "@aws-sdk/core": "3.947.0", - "@aws-sdk/token-providers": "3.948.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.948.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.948.0.tgz", - "integrity": "sha512-MvYQlXVoJyfF3/SmnNzOVEtANRAiJIObEUYYyjTqKZTmcRIVVky0tPuG26XnB8LmTYgtESwJIZJj/Eyyc9WURQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.947.0", - "@aws-sdk/nested-clients": "3.948.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", - "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-arn-parser": "3.893.0", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-config-provider": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", - "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.947.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.947.0.tgz", - "integrity": "sha512-kXXxS2raNESNO+zR0L4YInVjhcGGNI2Mx0AE1ThRhDkAt2se3a+rGf9equ9YvOqA1m8Jl/GSI8cXYvSxXmS9Ag==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@aws-crypto/crc32c": "5.2.0", - "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.947.0", - "@aws-sdk/types": "3.936.0", - "@smithy/is-array-buffer": "^4.2.0", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-stream": "^4.5.6", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.936.0.tgz", - "integrity": "sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", - "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.936.0.tgz", - "integrity": "sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.948.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.948.0.tgz", - "integrity": "sha512-Qa8Zj+EAqA0VlAVvxpRnpBpIWJI9KUwaioY1vkeNVwXPlNaz9y9zCKVM9iU9OZ5HXpoUg6TnhATAHXHAE8+QsQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.936.0", - "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.947.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.947.0.tgz", - "integrity": "sha512-DS2tm5YBKhPW2PthrRBDr6eufChbwXe0NjtTZcYDfUCXf0OR+W6cIqyKguwHMJ+IyYdey30AfVw9/Lb5KB8U8A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.947.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-arn-parser": "3.893.0", - "@smithy/core": "^3.18.7", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/signature-v4": "^5.3.5", - "@smithy/smithy-client": "^4.9.10", - "@smithy/types": "^4.9.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-stream": "^4.5.6", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", - "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.947.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.947.0.tgz", - "integrity": "sha512-7rpKV8YNgCP2R4F9RjWZFcD2R+SO/0R4VHIbY9iZJdH2MzzJ8ZG7h8dZ2m8QkQd1fjx4wrFJGGPJUTYXPV3baA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.947.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@smithy/core": "^3.18.7", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/nested-clients": { - "version": "3.948.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.948.0.tgz", - "integrity": "sha512-zcbJfBsB6h254o3NuoEkf0+UY1GpE9ioiQdENWv7odo69s8iaGBEQ4BDpsIMqcuiiUXw1uKIVNxCB1gUGYz8lw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.947.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.948.0", - "@aws-sdk/middleware-user-agent": "3.947.0", - "@aws-sdk/region-config-resolver": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.947.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.7", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.14", - "@smithy/middleware-retry": "^4.4.14", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.10", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.13", - "@smithy/util-defaults-mode-node": "^4.2.16", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.936.0.tgz", - "integrity": "sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.948.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.948.0.tgz", - "integrity": "sha512-tlQhMDsDWwUDUzzlo8XYGpmMfjGDmXgbysv1+h1v2xJe0A+ogv/nJ6KFVP94uf1j4ePmCN/gDdxEp2PWZMBPOQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/signature-v4-multi-region": "3.947.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-format-url": "3.936.0", - "@smithy/middleware-endpoint": "^4.3.14", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.10", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.947.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.947.0.tgz", - "integrity": "sha512-UaYmzoxf9q3mabIA2hc4T6x5YSFUG2BpNjAZ207EA1bnQMiK+d6vZvb83t7dIWL/U1de1sGV19c1C81Jf14rrA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.947.0", - "@aws-sdk/types": "3.936.0", - "@smithy/protocol-http": "^5.3.5", - "@smithy/signature-v4": "^5.3.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.948.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.948.0.tgz", - "integrity": "sha512-V487/kM4Teq5dcr1t5K6eoUKuqlGr9FRWL3MIMukMERJXHZvio6kox60FZ/YtciRHRI75u14YUqm2Dzddcu3+A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.947.0", - "@aws-sdk/nested-clients": "3.948.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.936.0.tgz", - "integrity": "sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", - "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.936.0.tgz", - "integrity": "sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-endpoints": "^3.2.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-format-url": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.936.0.tgz", - "integrity": "sha512-MS5eSEtDUFIAMHrJaMERiHAvDPdfxc/T869ZjDNFAIiZhyc037REw0aoTNeimNXDNy2txRNZJaAUn/kE4RwN+g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/querystring-builder": "^4.2.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz", - "integrity": "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.936.0.tgz", - "integrity": "sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.947.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.947.0.tgz", - "integrity": "sha512-+vhHoDrdbb+zerV4noQk1DHaUMNzWFWPpPYjVTwW2186k5BEJIecAMChYkghRrBVJ3KPWP1+JnZwOd72F3d4rQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-user-agent": "3.947.0", - "@aws-sdk/types": "3.936.0", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/xml-builder": { - "version": "3.930.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", - "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0", - "fast-xml-parser": "5.2.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/lambda-invoke-store": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.2.tgz", - "integrity": "sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/core/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", - "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.5", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "debug": "^4.4.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.10" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", - "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", - "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-decorators": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-default-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", - "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", - "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.27.1.tgz", - "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", - "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", - "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", - "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", - "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-flow": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", - "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", - "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", - "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", - "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", - "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", - "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", - "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz", - "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", - "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", - "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.28.0", - "@babel/plugin-transform-react-jsx": "^7.27.1", - "@babel/plugin-transform-react-jsx-development": "^7.27.1", - "@babel/plugin-transform-react-pure-annotations": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", - "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse--for-generate-function-map": { - "name": "@babel/traverse", - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse--for-generate-function-map/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/traverse--for-generate-function-map/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@callstack/react-theme-provider": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@callstack/react-theme-provider/-/react-theme-provider-3.0.9.tgz", - "integrity": "sha512-tTQ0uDSCL0ypeMa8T/E9wAZRGKWj8kXP7+6RYgPTfOPs9N07C9xM8P02GJ3feETap4Ux5S69D9nteq9mEj86NA==", - "license": "MIT", - "dependencies": { - "deepmerge": "^3.2.0", - "hoist-non-react-statics": "^3.3.0" - }, - "peerDependencies": { - "react": ">=16.3.0" - } - }, - "node_modules/@callstack/react-theme-provider/node_modules/deepmerge": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", - "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@dimforge/rapier3d-compat": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", - "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", - "license": "Apache-2.0" - }, - "node_modules/@drizzle-team/brocli": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz", - "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@egjs/hammerjs": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", - "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", - "license": "MIT", - "dependencies": { - "@types/hammerjs": "^2.0.36" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@emnapi/core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", - "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild-kit/core-utils": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", - "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", - "deprecated": "Merged into tsx: https://tsx.is", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.18.20", - "source-map-support": "^0.5.21" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/@esbuild-kit/esm-loader": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", - "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", - "deprecated": "Merged into tsx: https://tsx.is", - "dev": true, - "license": "MIT", - "dependencies": { - "@esbuild-kit/core-utils": "^3.3.2", - "get-tsconfig": "^4.7.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/config-array/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@expo/cli": { - "version": "0.24.23", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.24.23.tgz", - "integrity": "sha512-uIlgadw38yVOczYOm9BeW0wkWdC5rtcSP0+NHqOS31DAh2KNzOPRt9dnNuP0ErS+QJM3ymZSjZgo4hUvyFQ7Kw==", - "license": "MIT", - "dependencies": { - "@0no-co/graphql.web": "^1.0.8", - "@babel/runtime": "^7.20.0", - "@expo/code-signing-certificates": "^0.0.5", - "@expo/config": "~11.0.13", - "@expo/config-plugins": "~10.1.2", - "@expo/devcert": "^1.1.2", - "@expo/env": "~1.0.7", - "@expo/image-utils": "^0.7.6", - "@expo/json-file": "^9.1.5", - "@expo/metro-config": "~0.20.18", - "@expo/osascript": "^2.2.5", - "@expo/package-manager": "^1.8.6", - "@expo/plist": "^0.3.5", - "@expo/prebuild-config": "^9.0.12", - "@expo/schema-utils": "^0.1.0", - "@expo/spawn-async": "^1.7.2", - "@expo/ws-tunnel": "^1.0.1", - "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.79.6", - "@urql/core": "^5.0.6", - "@urql/exchange-retry": "^1.3.0", - "accepts": "^1.3.8", - "arg": "^5.0.2", - "better-opn": "~3.0.2", - "bplist-creator": "0.1.0", - "bplist-parser": "^0.3.1", - "chalk": "^4.0.0", - "ci-info": "^3.3.0", - "compression": "^1.7.4", - "connect": "^3.7.0", - "debug": "^4.3.4", - "env-editor": "^0.4.1", - "freeport-async": "^2.0.0", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "lan-network": "^0.1.6", - "minimatch": "^9.0.0", - "node-forge": "^1.3.1", - "npm-package-arg": "^11.0.0", - "ora": "^3.4.0", - "picomatch": "^3.0.1", - "pretty-bytes": "^5.6.0", - "pretty-format": "^29.7.0", - "progress": "^2.0.3", - "prompts": "^2.3.2", - "qrcode-terminal": "0.11.0", - "require-from-string": "^2.0.2", - "requireg": "^0.2.2", - "resolve": "^1.22.2", - "resolve-from": "^5.0.0", - "resolve.exports": "^2.0.3", - "semver": "^7.6.0", - "send": "^0.19.0", - "slugify": "^1.3.4", - "source-map-support": "~0.5.21", - "stacktrace-parser": "^0.1.10", - "structured-headers": "^0.4.1", - "tar": "^7.4.3", - "terminal-link": "^2.1.1", - "undici": "^6.18.2", - "wrap-ansi": "^7.0.0", - "ws": "^8.12.1" - }, - "bin": { - "expo-internal": "build/bin/cli" - } - }, - "node_modules/@expo/cli/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@expo/cli/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/@expo/cli/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/code-signing-certificates": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", - "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", - "license": "MIT", - "dependencies": { - "node-forge": "^1.2.1", - "nullthrows": "^1.1.1" - } - }, - "node_modules/@expo/config": { - "version": "11.0.13", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-11.0.13.tgz", - "integrity": "sha512-TnGb4u/zUZetpav9sx/3fWK71oCPaOjZHoVED9NaEncktAd0Eonhq5NUghiJmkUGt3gGSjRAEBXiBbbY9/B1LA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~10.1.2", - "@expo/config-types": "^53.0.5", - "@expo/json-file": "^9.1.5", - "deepmerge": "^4.3.1", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0", - "resolve-workspace-root": "^2.0.0", - "semver": "^7.6.0", - "slugify": "^1.3.4", - "sucrase": "3.35.0" - } - }, - "node_modules/@expo/config-plugins": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-10.1.2.tgz", - "integrity": "sha512-IMYCxBOcnuFStuK0Ay+FzEIBKrwW8OVUMc65+v0+i7YFIIe8aL342l7T4F8lR4oCfhXn7d6M5QPgXvjtc/gAcw==", - "license": "MIT", - "dependencies": { - "@expo/config-types": "^53.0.5", - "@expo/json-file": "~9.1.5", - "@expo/plist": "^0.3.5", - "@expo/sdk-runtime-versions": "^1.0.0", - "chalk": "^4.1.2", - "debug": "^4.3.5", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "resolve-from": "^5.0.0", - "semver": "^7.5.4", - "slash": "^3.0.0", - "slugify": "^1.6.6", - "xcode": "^3.0.1", - "xml2js": "0.6.0" - } - }, - "node_modules/@expo/config-plugins/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@expo/config-plugins/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/@expo/config-plugins/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/config-types": { - "version": "53.0.5", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-53.0.5.tgz", - "integrity": "sha512-kqZ0w44E+HEGBjy+Lpyn0BVL5UANg/tmNixxaRMLS6nf37YsDrLk2VMAmeKMMk5CKG0NmOdVv3ngeUjRQMsy9g==", - "license": "MIT" - }, - "node_modules/@expo/config/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@expo/config/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/devcert": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", - "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", - "license": "MIT", - "dependencies": { - "@expo/sudo-prompt": "^9.3.1", - "debug": "^3.1.0" - } - }, - "node_modules/@expo/devcert/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@expo/devcert/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/@expo/env": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-1.0.7.tgz", - "integrity": "sha512-qSTEnwvuYJ3umapO9XJtrb1fAqiPlmUUg78N0IZXXGwQRt+bkp0OBls+Y5Mxw/Owj8waAM0Z3huKKskRADR5ow==", - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "debug": "^4.3.4", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0" - } - }, - "node_modules/@expo/env/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@expo/env/node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/@expo/env/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/@expo/fingerprint": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.13.4.tgz", - "integrity": "sha512-MYfPYBTMfrrNr07DALuLhG6EaLVNVrY/PXjEzsjWdWE4ZFn0yqI0IdHNkJG7t1gePT8iztHc7qnsx+oo/rDo6w==", - "license": "MIT", - "dependencies": { - "@expo/spawn-async": "^1.7.2", - "arg": "^5.0.2", - "chalk": "^4.1.2", - "debug": "^4.3.4", - "find-up": "^5.0.0", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "ignore": "^5.3.1", - "minimatch": "^9.0.0", - "p-limit": "^3.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.6.0" - }, - "bin": { - "fingerprint": "bin/cli.js" - } - }, - "node_modules/@expo/fingerprint/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@expo/fingerprint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@expo/fingerprint/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/@expo/fingerprint/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/image-utils": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.7.6.tgz", - "integrity": "sha512-GKnMqC79+mo/1AFrmAcUcGfbsXXTRqOMNS1umebuevl3aaw+ztsYEFEiuNhHZW7PQ3Xs3URNT513ZxKhznDscw==", - "license": "MIT", - "dependencies": { - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.0.0", - "getenv": "^2.0.0", - "jimp-compact": "0.16.1", - "parse-png": "^2.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "temp-dir": "~2.0.0", - "unique-string": "~2.0.0" - } - }, - "node_modules/@expo/image-utils/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/json-file": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-9.1.5.tgz", - "integrity": "sha512-prWBhLUlmcQtvN6Y7BpW2k9zXGd3ySa3R6rAguMJkp1z22nunLN64KYTUWfijFlprFoxm9r2VNnGkcbndAlgKA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "~7.10.4", - "json5": "^2.2.3" - } - }, - "node_modules/@expo/json-file/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@expo/metro-config": { - "version": "0.20.18", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.20.18.tgz", - "integrity": "sha512-qPYq3Cq61KQO1CppqtmxA1NGKpzFOmdiL7WxwLhEVnz73LPSgneW7dV/3RZwVFkjThzjA41qB4a9pxDqtpepPg==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@babel/parser": "^7.20.0", - "@babel/types": "^7.20.0", - "@expo/config": "~11.0.13", - "@expo/env": "~1.0.7", - "@expo/json-file": "~9.1.5", - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "jsc-safe-url": "^0.2.4", - "lightningcss": "~1.27.0", - "minimatch": "^9.0.0", - "postcss": "~8.4.32", - "resolve-from": "^5.0.0" - } - }, - "node_modules/@expo/metro-config/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@expo/metro-config/node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/@expo/metro-config/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/@expo/metro-config/node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/@expo/metro-runtime": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-5.0.5.tgz", - "integrity": "sha512-P8UFTi+YsmiD1BmdTdiIQITzDMcZgronsA3RTQ4QKJjHM3bas11oGzLQOnFaIZnlEV8Rrr3m1m+RHxvnpL+t/A==", - "license": "MIT", - "peerDependencies": { - "react-native": "*" - } - }, - "node_modules/@expo/osascript": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz", - "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", - "license": "MIT", - "dependencies": { - "@expo/spawn-async": "^1.7.2", - "exec-async": "^2.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@expo/package-manager": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.9.tgz", - "integrity": "sha512-Nv5THOwXzPprMJwbnXU01iXSrCp3vJqly9M4EJ2GkKko9Ifer2ucpg7x6OUsE09/lw+npaoUnHMXwkw7gcKxlg==", - "license": "MIT", - "dependencies": { - "@expo/json-file": "^10.0.8", - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.0.0", - "npm-package-arg": "^11.0.0", - "ora": "^3.4.0", - "resolve-workspace-root": "^2.0.0" - } - }, - "node_modules/@expo/package-manager/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@expo/package-manager/node_modules/@expo/json-file": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", - "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "~7.10.4", - "json5": "^2.2.3" - } - }, - "node_modules/@expo/plist": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.3.5.tgz", - "integrity": "sha512-9RYVU1iGyCJ7vWfg3e7c/NVyMFs8wbl+dMWZphtFtsqyN9zppGREU3ctlD3i8KUE0sCUTVnLjCWr+VeUIDep2g==", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.2.3", - "xmlbuilder": "^15.1.1" - } - }, - "node_modules/@expo/prebuild-config": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-9.0.12.tgz", - "integrity": "sha512-AKH5Scf+gEMgGxZZaimrJI2wlUJlRoqzDNn7/rkhZa5gUTnO4l6slKak2YdaH+nXlOWCNfAQWa76NnpQIfmv6Q==", - "license": "MIT", - "dependencies": { - "@expo/config": "~11.0.13", - "@expo/config-plugins": "~10.1.2", - "@expo/config-types": "^53.0.5", - "@expo/image-utils": "^0.7.6", - "@expo/json-file": "^9.1.5", - "@react-native/normalize-colors": "0.79.6", - "debug": "^4.3.1", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "xml2js": "0.6.0" - } - }, - "node_modules/@expo/prebuild-config/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@expo/prebuild-config/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/@expo/prebuild-config/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/schema-utils": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", - "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", - "license": "MIT" - }, - "node_modules/@expo/sdk-runtime-versions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", - "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", - "license": "MIT" - }, - "node_modules/@expo/server": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@expo/server/-/server-0.6.3.tgz", - "integrity": "sha512-Ea7NJn9Xk1fe4YeJ86rObHSv/bm3u/6WiQPXEqXJ2GrfYpVab2Swoh9/PnSM3KjR64JAgKjArDn1HiPjITCfHA==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "debug": "^4.3.4", - "source-map-support": "~0.5.21", - "undici": "^6.18.2 || ^7.0.0" - } - }, - "node_modules/@expo/server/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@expo/server/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/@expo/spawn-async": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", - "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@expo/sudo-prompt": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", - "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", - "license": "MIT" - }, - "node_modules/@expo/vector-icons": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-14.1.0.tgz", - "integrity": "sha512-7T09UE9h8QDTsUeMGymB4i+iqvtEeaO5VvUjryFB4tugDTG/bkzViWA74hm5pfjjDEhYMXWaX112mcvhccmIwQ==", - "license": "MIT", - "peerDependencies": { - "expo-font": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/@expo/ws-tunnel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", - "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", - "license": "MIT" - }, - "node_modules/@expo/xcpretty": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz", - "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/code-frame": "7.10.4", - "chalk": "^4.1.0", - "find-up": "^5.0.0", - "js-yaml": "^4.1.0" - }, - "bin": { - "excpretty": "build/cli.js" - } - }, - "node_modules/@expo/xcpretty/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@ide/backoff": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@ide/backoff/-/backoff-1.0.0.tgz", - "integrity": "sha512-F0YfUDjvT+Mtt/R4xdl2X0EYCHMMiJqNLdxHD++jDT5ydEFIyqbCHh51Qx2E211dgZprPKhV7sHmnXKpLuvc5g==", - "license": "MIT" - }, - "node_modules/@ioredis/commands": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.4.0.tgz", - "integrity": "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==", - "license": "MIT" - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@isaacs/ttlcache": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", - "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", - "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mapbox/geojson-rewind": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", - "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", - "license": "ISC", - "dependencies": { - "get-stream": "^6.0.1", - "minimist": "^1.2.6" - }, - "bin": { - "geojson-rewind": "geojson-rewind" - } - }, - "node_modules/@mapbox/jsonlint-lines-primitives": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", - "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", - "license": "ISC" - }, - "node_modules/@mapbox/tiny-sdf": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.7.tgz", - "integrity": "sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug==", - "license": "BSD-2-Clause" - }, - "node_modules/@mapbox/unitbezier": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", - "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", - "license": "BSD-2-Clause" - }, - "node_modules/@mapbox/vector-tile": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", - "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", - "license": "BSD-3-Clause", - "dependencies": { - "@mapbox/point-geometry": "~0.1.0" - } - }, - "node_modules/@mapbox/whoots-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", - "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", - "license": "ISC", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@maplibre/maplibre-gl-style-spec": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.4.0.tgz", - "integrity": "sha512-AzBy3095fTFPjDjmWpR2w6HVRAZJ6hQZUCwk5Plz6EyfnfuQW1odeW5i2Ai47Y6TBA2hQnC+azscjBSALpaWgw==", - "license": "ISC", - "dependencies": { - "@mapbox/jsonlint-lines-primitives": "~2.0.2", - "@mapbox/unitbezier": "^0.0.1", - "json-stringify-pretty-compact": "^4.0.0", - "minimist": "^1.2.8", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "tinyqueue": "^3.0.0" - }, - "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" - } - }, - "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/tinyqueue": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", - "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", - "license": "ISC" - }, - "node_modules/@mediapipe/tasks-vision": { - "version": "0.10.17", - "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz", - "integrity": "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==", - "license": "Apache-2.0" - }, - "node_modules/@monogrid/gainmap-js": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.4.0.tgz", - "integrity": "sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg==", - "license": "MIT", - "dependencies": { - "promise-worker-transferable": "^1.0.4" - }, - "peerDependencies": { - "three": ">= 0.159.0" - } - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", - "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@react-native-community/datetimepicker": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@react-native-community/datetimepicker/-/datetimepicker-8.4.1.tgz", - "integrity": "sha512-DrK+CUS5fZnz8dhzBezirkzQTcNDdaXer3oDLh0z4nc2tbdIdnzwvXCvi8IEOIvleoc9L95xS5tKUl0/Xv71Mg==", - "license": "MIT", - "dependencies": { - "invariant": "^2.2.4" - }, - "peerDependencies": { - "expo": ">=52.0.0", - "react": "*", - "react-native": "*", - "react-native-windows": "*" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - }, - "react-native-windows": { - "optional": true - } - } - }, - "node_modules/@react-native-google-signin/google-signin": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@react-native-google-signin/google-signin/-/google-signin-16.0.0.tgz", - "integrity": "sha512-jVuzPo8odREekFc0b4RK3YsqCvedtLIM2P6NSszFr9cYyhKrUNikffPapL6LmkL9qkb8K6pDeb5CXg4qALOc0g==", - "license": "MIT", - "peerDependencies": { - "expo": ">=52.0.40", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - } - } - }, - "node_modules/@react-native-picker/picker": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/@react-native-picker/picker/-/picker-2.11.1.tgz", - "integrity": "sha512-ThklnkK4fV3yynnIIRBkxxjxR4IFbdMNJVF6tlLdOJ/zEFUEFUEdXY0KmH0iYzMwY8W4/InWsLiA7AkpAbnexA==", - "license": "MIT", - "workspaces": [ - "example" - ], - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/@react-native/assets-registry": { - "version": "0.79.6", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.79.6.tgz", - "integrity": "sha512-UVSP1224PWg0X+mRlZNftV5xQwZGfawhivuW8fGgxNK9MS/U84xZ+16lkqcPh1ank6MOt239lIWHQ1S33CHgqA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.79.6", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.79.6.tgz", - "integrity": "sha512-CS5OrgcMPixOyUJ/Sk/HSsKsKgyKT5P7y3CojimOQzWqRZBmoQfxdST4ugj7n1H+ebM2IKqbgovApFbqXsoX0g==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.79.6" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/babel-preset": { - "version": "0.79.6", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.79.6.tgz", - "integrity": "sha512-H+FRO+r2Ql6b5IwfE0E7D52JhkxjeGSBSUpCXAI5zQ60zSBJ54Hwh2bBJOohXWl4J+C7gKYSAd2JHMUETu+c/A==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.25.2", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.79.6", - "babel-plugin-syntax-hermes-parser": "0.25.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/codegen": { - "version": "0.79.6", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.79.6.tgz", - "integrity": "sha512-iRBX8Lgbqypwnfba7s6opeUwVyaR23mowh9ILw7EcT2oLz3RqMmjJdrbVpWhGSMGq2qkPfqAH7bhO8C7O+xfjQ==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/parser": "^7.25.3", - "glob": "^7.1.1", - "hermes-parser": "0.25.1", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/codegen/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@react-native/codegen/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@react-native/codegen/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.79.6", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.79.6.tgz", - "integrity": "sha512-ZHVst9vByGsegeaddkD2YbZ6NvYb4n3pD9H7Pit94u+NlByq2uBJghoOjT6EKqg+UVl8tLRdi88cU2pDPwdHqA==", - "license": "MIT", - "dependencies": { - "@react-native/dev-middleware": "0.79.6", - "chalk": "^4.0.0", - "debug": "^2.2.0", - "invariant": "^2.2.4", - "metro": "^0.82.0", - "metro-config": "^0.82.0", - "metro-core": "^0.82.0", - "semver": "^7.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@react-native-community/cli": "*" - }, - "peerDependenciesMeta": { - "@react-native-community/cli": { - "optional": true - } - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native/debugger-frontend": { - "version": "0.79.6", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.79.6.tgz", - "integrity": "sha512-lIK/KkaH7ueM22bLO0YNaQwZbT/oeqhaghOvmZacaNVbJR1Cdh/XAqjT8FgCS+7PUnbxA8B55NYNKGZG3O2pYw==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware": { - "version": "0.79.6", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.79.6.tgz", - "integrity": "sha512-BK3GZBa9c7XSNR27EDRtxrgyyA3/mf1j3/y+mPk7Ac0Myu85YNrXnC9g3mL5Ytwo0g58TKrAIgs1fF2Q5Mn6mQ==", - "license": "MIT", - "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.79.6", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^6.2.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/@react-native/gradle-plugin": { - "version": "0.79.6", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.79.6.tgz", - "integrity": "sha512-C5odetI6py3CSELeZEVz+i00M+OJuFZXYnjVD4JyvpLn462GesHRh+Se8mSkU5QSaz9cnpMnyFLJAx05dokWbA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/js-polyfills": { - "version": "0.79.6", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.79.6.tgz", - "integrity": "sha512-6wOaBh1namYj9JlCNgX2ILeGUIwc6OP6MWe3Y5jge7Xz9fVpRqWQk88Q5Y9VrAtTMTcxoX3CvhrfRr3tGtSfQw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/normalize-colors": { - "version": "0.79.6", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.79.6.tgz", - "integrity": "sha512-0v2/ruY7eeKun4BeKu+GcfO+SHBdl0LJn4ZFzTzjHdWES0Cn+ONqKljYaIv8p9MV2Hx/kcdEvbY4lWI34jC/mQ==", - "license": "MIT" - }, - "node_modules/@react-native/virtualized-lists": { - "version": "0.79.6", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.79.6.tgz", - "integrity": "sha512-khA/Hrbb+rB68YUHrLubfLgMOD9up0glJhw25UE3Kntj32YDyuO0Tqc81ryNTcCekFKJ8XrAaEjcfPg81zBGPw==", - "license": "MIT", - "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^19.0.0", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@react-navigation/bottom-tabs": { - "version": "7.8.12", - "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-7.8.12.tgz", - "integrity": "sha512-efVt5ydHK+b4ZtjmN81iduaO5dPCmzhLBFwjCR8pV4x4VzUfJmtUJizLqTXpT3WatHdeon2gDPwhhoelsvu/JA==", - "license": "MIT", - "dependencies": { - "@react-navigation/elements": "^2.9.2", - "color": "^4.2.3", - "sf-symbols-typescript": "^2.1.0" - }, - "peerDependencies": { - "@react-navigation/native": "^7.1.25", - "react": ">= 18.2.0", - "react-native": "*", - "react-native-safe-area-context": ">= 4.0.0", - "react-native-screens": ">= 4.0.0" - } - }, - "node_modules/@react-navigation/core": { - "version": "7.13.7", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-7.13.7.tgz", - "integrity": "sha512-k2ABo3250vq1ovOh/iVwXS6Hwr5PVRGXoPh/ewVFOOuEKTvOx9i//OBzt8EF+HokBxS2HBRlR2b+aCOmscRqBw==", - "license": "MIT", - "dependencies": { - "@react-navigation/routers": "^7.5.3", - "escape-string-regexp": "^4.0.0", - "fast-deep-equal": "^3.1.3", - "nanoid": "^3.3.11", - "query-string": "^7.1.3", - "react-is": "^19.1.0", - "use-latest-callback": "^0.2.4", - "use-sync-external-store": "^1.5.0" - }, - "peerDependencies": { - "react": ">= 18.2.0" - } - }, - "node_modules/@react-navigation/core/node_modules/react-is": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.3.tgz", - "integrity": "sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==", - "license": "MIT" - }, - "node_modules/@react-navigation/drawer": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@react-navigation/drawer/-/drawer-7.7.9.tgz", - "integrity": "sha512-xmGe0VkB7LW6g20iH7jB6iaCJ/cLZYBQmE7BYsEp1JGJG7tJHofICayXkpKavJwyx6NAWUItWE1HEo/xVaFEog==", - "license": "MIT", - "dependencies": { - "@react-navigation/elements": "^2.9.2", - "color": "^4.2.3", - "react-native-drawer-layout": "^4.2.0", - "use-latest-callback": "^0.2.4" - }, - "peerDependencies": { - "@react-navigation/native": "^7.1.25", - "react": ">= 18.2.0", - "react-native": "*", - "react-native-gesture-handler": ">= 2.0.0", - "react-native-reanimated": ">= 2.0.0", - "react-native-safe-area-context": ">= 4.0.0", - "react-native-screens": ">= 4.0.0" - } - }, - "node_modules/@react-navigation/elements": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-2.9.3.tgz", - "integrity": "sha512-3+eyvWiVPIEf6tN9UdduhOEHcTuNe3R5WovgiVkfH9+jApHMTZDc2loePTpY/i2HDJhObhhChpJzO6BVjrpdYQ==", - "license": "MIT", - "dependencies": { - "color": "^4.2.3", - "use-latest-callback": "^0.2.4", - "use-sync-external-store": "^1.5.0" - }, - "peerDependencies": { - "@react-native-masked-view/masked-view": ">= 0.2.0", - "@react-navigation/native": "^7.1.26", - "react": ">= 18.2.0", - "react-native": "*", - "react-native-safe-area-context": ">= 4.0.0" - }, - "peerDependenciesMeta": { - "@react-native-masked-view/masked-view": { - "optional": true - } - } - }, - "node_modules/@react-navigation/material-top-tabs": { - "version": "7.4.11", - "resolved": "https://registry.npmjs.org/@react-navigation/material-top-tabs/-/material-top-tabs-7.4.11.tgz", - "integrity": "sha512-RSC/f1bSpodnx1oSXw7jNrwe83JddRhb12ehCY8oZZDtrNhm3atSHzlfvHN37i3E8cln7Tmc1ieLxjWrU65n/Q==", - "license": "MIT", - "dependencies": { - "@react-navigation/elements": "^2.9.3", - "color": "^4.2.3", - "react-native-tab-view": "^4.2.2" - }, - "peerDependencies": { - "@react-navigation/native": "^7.1.26", - "react": ">= 18.2.0", - "react-native": "*", - "react-native-pager-view": ">= 6.0.0", - "react-native-safe-area-context": ">= 4.0.0" - } - }, - "node_modules/@react-navigation/native": { - "version": "7.1.26", - "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-7.1.26.tgz", - "integrity": "sha512-RhKmeD0E2ejzKS6z8elAfdfwShpcdkYY8zJzvHYLq+wv183BBcElTeyMLcIX6wIn7QutXeI92Yi21t7aUWfqNQ==", - "license": "MIT", - "dependencies": { - "@react-navigation/core": "^7.13.7", - "escape-string-regexp": "^4.0.0", - "fast-deep-equal": "^3.1.3", - "nanoid": "^3.3.11", - "use-latest-callback": "^0.2.4" - }, - "peerDependencies": { - "react": ">= 18.2.0", - "react-native": "*" - } - }, - "node_modules/@react-navigation/native-stack": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-7.8.6.tgz", - "integrity": "sha512-eBY92xb4H53c9jiWriKMOZmQ/Tu9w1qcUrgOA/qjQOvJFbgKF9D6y3e4UuBaDQzjWjLEDZLaiwXe8cwXRb46mg==", - "license": "MIT", - "dependencies": { - "@react-navigation/elements": "^2.9.2", - "color": "^4.2.3", - "sf-symbols-typescript": "^2.1.0", - "warn-once": "^0.1.1" - }, - "peerDependencies": { - "@react-navigation/native": "^7.1.25", - "react": ">= 18.2.0", - "react-native": "*", - "react-native-safe-area-context": ">= 4.0.0", - "react-native-screens": ">= 4.0.0" - } - }, - "node_modules/@react-navigation/routers": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-7.5.3.tgz", - "integrity": "sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg==", - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11" - } - }, - "node_modules/@react-three/drei": { - "version": "10.7.7", - "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-10.7.7.tgz", - "integrity": "sha512-ff+J5iloR0k4tC++QtD/j9u3w5fzfgFAWDtAGQah9pF2B1YgOq/5JxqY0/aVoQG5r3xSZz0cv5tk2YuBob4xEQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.26.0", - "@mediapipe/tasks-vision": "0.10.17", - "@monogrid/gainmap-js": "^3.0.6", - "@use-gesture/react": "^10.3.1", - "camera-controls": "^3.1.0", - "cross-env": "^7.0.3", - "detect-gpu": "^5.0.56", - "glsl-noise": "^0.0.0", - "hls.js": "^1.5.17", - "maath": "^0.10.8", - "meshline": "^3.3.1", - "stats-gl": "^2.2.8", - "stats.js": "^0.17.0", - "suspend-react": "^0.1.3", - "three-mesh-bvh": "^0.8.3", - "three-stdlib": "^2.35.6", - "troika-three-text": "^0.52.4", - "tunnel-rat": "^0.1.2", - "use-sync-external-store": "^1.4.0", - "utility-types": "^3.11.0", - "zustand": "^5.0.1" - }, - "peerDependencies": { - "@react-three/fiber": "^9.0.0", - "react": "^19", - "react-dom": "^19", - "three": ">=0.159" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.5.0.tgz", - "integrity": "sha512-FiUzfYW4wB1+PpmsE47UM+mCads7j2+giRBltfwH7SNhah95rqJs3ltEs9V3pP8rYdS0QlNne+9Aj8dS/SiaIA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@types/webxr": "*", - "base64-js": "^1.5.1", - "buffer": "^6.0.3", - "its-fine": "^2.0.0", - "react-use-measure": "^2.1.7", - "scheduler": "^0.27.0", - "suspend-react": "^0.1.3", - "use-sync-external-store": "^1.4.0", - "zustand": "^5.0.3" - }, - "peerDependencies": { - "expo": ">=43.0", - "expo-asset": ">=8.4", - "expo-file-system": ">=11.0", - "expo-gl": ">=11.0", - "react": ">=19 <19.3", - "react-dom": ">=19 <19.3", - "react-native": ">=0.78", - "three": ">=0.156" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - }, - "expo-asset": { - "optional": true - }, - "expo-file-system": { - "optional": true - }, - "expo-gl": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/@react-three/fiber/node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/@redis/bloom": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.10.0.tgz", - "integrity": "sha512-doIF37ob+l47n0rkpRNgU8n4iacBlKM9xLiP1LtTZTvz8TloJB8qx/MgvhMhKdYG+CvCY2aPBnN2706izFn/4A==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@redis/client": "^5.10.0" - } - }, - "node_modules/@redis/client": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.10.0.tgz", - "integrity": "sha512-JXmM4XCoso6C75Mr3lhKA3eNxSzkYi3nCzxDIKY+YOszYsJjuKbFgVtguVPbLMOttN4iu2fXoc2BGhdnYhIOxA==", - "license": "MIT", - "dependencies": { - "cluster-key-slot": "1.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@redis/json": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.10.0.tgz", - "integrity": "sha512-B2G8XlOmTPUuZtD44EMGbtoepQG34RCDXLZbjrtON1Djet0t5Ri7/YPXvL9aomXqP8lLTreaprtyLKF4tmXEEA==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@redis/client": "^5.10.0" - } - }, - "node_modules/@redis/search": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.10.0.tgz", - "integrity": "sha512-3SVcPswoSfp2HnmWbAGUzlbUPn7fOohVu2weUQ0S+EMiQi8jwjL+aN2p6V3TI65eNfVsJ8vyPvqWklm6H6esmg==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@redis/client": "^5.10.0" - } - }, - "node_modules/@redis/time-series": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.10.0.tgz", - "integrity": "sha512-cPkpddXH5kc/SdRhF0YG0qtjL+noqFT0AcHbQ6axhsPsO7iqPi1cjxgdkE9TNeKiBUUdCaU1DbqkR/LzbzPBhg==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@redis/client": "^5.10.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", - "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", - "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", - "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", - "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", - "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", - "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", - "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", - "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", - "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", - "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", - "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", - "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", - "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", - "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", - "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", - "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", - "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", - "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", - "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", - "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", - "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", - "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@smithy/abort-controller": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", - "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", - "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader-native": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz", - "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-base64": "^4.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", - "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "3.18.7", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.7.tgz", - "integrity": "sha512-axG9MvKhMWOhFbvf5y2DuyTxQueO0dkedY9QC3mAfndLosRI/9LJv8WaL0mw7ubNhsO4IuXX9/9dYGPFvHrqlw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^4.2.6", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-stream": "^4.5.6", - "@smithy/util-utf8": "^4.2.0", - "@smithy/uuid": "^1.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", - "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.5.tgz", - "integrity": "sha512-Ogt4Zi9hEbIP17oQMd68qYOHUzmH47UkK7q7Gl55iIm9oKt27MUGrC5JfpMroeHjdkOliOA4Qt3NQ1xMq/nrlA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.9.0", - "@smithy/util-hex-encoding": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.5.tgz", - "integrity": "sha512-HohfmCQZjppVnKX2PnXlf47CW3j92Ki6T/vkAT2DhBR47e89pen3s4fIa7otGTtrVxmj7q+IhH0RnC5kpR8wtw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.5.tgz", - "integrity": "sha512-ibjQjM7wEXtECiT6my1xfiMH9IcEczMOS6xiCQXoUIYSj5b1CpBbJ3VYbdwDy8Vcg5JHN7eFpOCGk8nyZAltNQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-node": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.5.tgz", - "integrity": "sha512-+elOuaYx6F2H6x1/5BQP5ugv12nfJl66GhxON8+dWVUEDJ9jah/A0tayVdkLRP0AeSac0inYkDz5qBFKfVp2Gg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.5.tgz", - "integrity": "sha512-G9WSqbST45bmIFaeNuP/EnC19Rhp54CcVdX9PDL1zyEB514WsDVXhlyihKlGXnRycmHNmVv88Bvvt4EYxWef/Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-codec": "^4.2.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", - "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.5", - "@smithy/querystring-builder": "^4.2.5", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-blob-browser": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.6.tgz", - "integrity": "sha512-8P//tA8DVPk+3XURk2rwcKgYwFvwGwmJH/wJqQiSKwXZtf/LiZK+hbUZmPj/9KzM+OVSwe4o85KTp5x9DUZTjw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/chunked-blob-reader": "^5.2.0", - "@smithy/chunked-blob-reader-native": "^4.2.1", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-node": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", - "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-stream-node": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.5.tgz", - "integrity": "sha512-6+do24VnEyvWcGdHXomlpd0m8bfZePpUKBy7m311n+JuRwug8J4dCanJdTymx//8mi0nlkflZBvJe+dEO/O12Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", - "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", - "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/md5-js": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.5.tgz", - "integrity": "sha512-Bt6jpSTMWfjCtC0s79gZ/WZ1w90grfmopVOWqkI2ovhjpD5Q2XRXuecIPB9689L2+cCySMbaXDhBPU56FKNDNg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", - "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.14.tgz", - "integrity": "sha512-v0q4uTKgBM8dsqGjqsabZQyH85nFaTnFcgpWU1uydKFsdyyMzfvOkNum9G7VK+dOP01vUnoZxIeRiJ6uD0kjIg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.18.7", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-middleware": "^4.2.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "4.4.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.14.tgz", - "integrity": "sha512-Z2DG8Ej7FyWG1UA+7HceINtSLzswUgs2np3sZX0YBBxCt+CXG4QUxv88ZDS3+2/1ldW7LqtSY1UO/6VQ1pND8Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/service-error-classification": "^4.2.5", - "@smithy/smithy-client": "^4.9.10", - "@smithy/types": "^4.9.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/uuid": "^1.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", - "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", - "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", - "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", - "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/querystring-builder": "^4.2.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", - "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", - "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", - "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0", - "@smithy/util-uri-escape": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", - "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", - "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", - "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", - "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-uri-escape": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "4.9.10", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.10.tgz", - "integrity": "sha512-Jaoz4Jw1QYHc1EFww/E6gVtNjhoDU+gwRKqXP6C3LKYqqH2UQhP8tMP3+t/ePrhaze7fhLE8vS2q6vVxBANFTQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.18.7", - "@smithy/middleware-endpoint": "^4.3.14", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-stream": "^4.5.6", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", - "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", - "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/querystring-parser": "^4.2.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-base64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", - "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", - "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", - "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", - "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", - "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.13", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.13.tgz", - "integrity": "sha512-hlVLdAGrVfyNei+pKIgqDTxfu/ZI2NSyqj4IDxKd5bIsIqwR/dSlkxlPaYxFiIaDVrBy0he8orsFy+Cz119XvA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.2.5", - "@smithy/smithy-client": "^4.9.10", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.16.tgz", - "integrity": "sha512-F1t22IUiJLHrxW9W1CQ6B9PN+skZ9cqSuzB18Eh06HrJPbjsyZ7ZHecAKw80DQtyGTRcVfeukKaCRYebFwclbg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^4.4.3", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/smithy-client": "^4.9.10", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", - "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", - "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", - "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", - "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/service-error-classification": "^4.2.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", - "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", - "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", - "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-waiter": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.5.tgz", - "integrity": "sha512-Dbun99A3InifQdIrsXZ+QLcC0PGBPAdrl4cj1mTgJvyc9N2zf7QSxg8TBkzsCmGJdE3TLbO9ycwpY0EkWahQ/g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^4.2.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/uuid": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", - "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@swc/core": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.3.tgz", - "integrity": "sha512-Qd8eBPkUFL4eAONgGjycZXj1jFCBW8Fd+xF0PzdTlBCWQIV1xnUT7B93wUANtW3KGjl3TRcOyxwSx/u/jyKw/Q==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.25" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.15.3", - "@swc/core-darwin-x64": "1.15.3", - "@swc/core-linux-arm-gnueabihf": "1.15.3", - "@swc/core-linux-arm64-gnu": "1.15.3", - "@swc/core-linux-arm64-musl": "1.15.3", - "@swc/core-linux-x64-gnu": "1.15.3", - "@swc/core-linux-x64-musl": "1.15.3", - "@swc/core-win32-arm64-msvc": "1.15.3", - "@swc/core-win32-ia32-msvc": "1.15.3", - "@swc/core-win32-x64-msvc": "1.15.3" - }, - "peerDependencies": { - "@swc/helpers": ">=0.5.17" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.3.tgz", - "integrity": "sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.3.tgz", - "integrity": "sha512-p68OeCz1ui+MZYG4wmfJGvcsAcFYb6Sl25H9TxWl+GkBgmNimIiRdnypK9nBGlqMZAcxngNPtnG3kEMNnvoJ2A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.3.tgz", - "integrity": "sha512-Nuj5iF4JteFgwrai97mUX+xUOl+rQRHqTvnvHMATL/l9xE6/TJfPBpd3hk/PVpClMXG3Uvk1MxUFOEzM1JrMYg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.3.tgz", - "integrity": "sha512-2Nc/s8jE6mW2EjXWxO/lyQuLKShcmTrym2LRf5Ayp3ICEMX6HwFqB1EzDhwoMa2DcUgmnZIalesq2lG3krrUNw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.3.tgz", - "integrity": "sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.3.tgz", - "integrity": "sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.3.tgz", - "integrity": "sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.3.tgz", - "integrity": "sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.3.tgz", - "integrity": "sha512-B8UtogMzErUPDWUoKONSVBdsgKYd58rRyv2sHJWKOIMCHfZ22FVXICR4O/VwIYtlnZ7ahERcjayBHDlBZpR0aw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.3.tgz", - "integrity": "sha512-SpZKMR9QBTecHeqpzJdYEfgw30Oo8b/Xl6rjSzBt1g0ZsXyy60KLXrp6IagQyfTYqNYE/caDvwtF2FPn7pomog==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@swc/types": { - "version": "0.1.25", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", - "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, - "node_modules/@tanstack/history": { - "version": "1.141.0", - "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.141.0.tgz", - "integrity": "sha512-LS54XNyxyTs5m/pl1lkwlg7uZM3lvsv2FIIV1rsJgnfwVCnI+n4ZGZ2CcjNT13BPu/3hPP+iHmliBSscJxW5FQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/query-core": { - "version": "5.90.12", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.12.tgz", - "integrity": "sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.90.12", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.12.tgz", - "integrity": "sha512-graRZspg7EoEaw0a8faiUASCyJrqjKPdqJ9EwuDRUF9mEYJ1YPczI9H+/agJ0mOJkPCJDk0lsz5QTrLZ/jQ2rg==", - "license": "MIT", - "dependencies": { - "@tanstack/query-core": "5.90.12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" - } - }, - "node_modules/@tanstack/react-router": { - "version": "1.141.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.141.1.tgz", - "integrity": "sha512-pLQ6ZFCh5s86ewZIAu2wQc2svf+DqttD7CFd1NPSxdEU20KvMMj9RPQdDHj/pbf2VvB3i1nEDxjli/Z0PBvnCQ==", - "license": "MIT", - "dependencies": { - "@tanstack/history": "1.141.0", - "@tanstack/react-store": "^0.8.0", - "@tanstack/router-core": "1.141.1", - "isbot": "^5.1.22", - "tiny-invariant": "^1.3.3", - "tiny-warning": "^1.0.3" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0" - } - }, - "node_modules/@tanstack/react-router-devtools": { - "version": "1.141.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-router-devtools/-/react-router-devtools-1.141.1.tgz", - "integrity": "sha512-+XCn9cXSe1fZAD9jRrezEYE0ojn9U+Y0lRTRFdR8n51wx0UzJ6xe/Pewtw0rp03h/zmBR0pX+HRNU9NJDneWGA==", - "license": "MIT", - "dependencies": { - "@tanstack/router-devtools-core": "1.141.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@tanstack/react-router": "^1.141.1", - "@tanstack/router-core": "^1.141.1", - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0" - }, - "peerDependenciesMeta": { - "@tanstack/router-core": { - "optional": true - } - } - }, - "node_modules/@tanstack/react-store": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.8.0.tgz", - "integrity": "sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow==", - "license": "MIT", - "dependencies": { - "@tanstack/store": "0.8.0", - "use-sync-external-store": "^1.6.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@tanstack/router-core": { - "version": "1.141.1", - "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.141.1.tgz", - "integrity": "sha512-fR1GGpp6v3dVKu4KIAjEh+Sd0qGLQd/wvCOVHeopSY6aFidXKCzwrS5cBOBqoPPWTKmn6CdW1a0CzFr5Furdog==", - "license": "MIT", - "dependencies": { - "@tanstack/history": "1.141.0", - "@tanstack/store": "^0.8.0", - "cookie-es": "^2.0.0", - "seroval": "^1.4.0", - "seroval-plugins": "^1.4.0", - "tiny-invariant": "^1.3.3", - "tiny-warning": "^1.0.3" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/router-devtools": { - "version": "1.141.1", - "resolved": "https://registry.npmjs.org/@tanstack/router-devtools/-/router-devtools-1.141.1.tgz", - "integrity": "sha512-Yetxpaog2LK4N9GjYTRiIF9ME4vkqLoNPQhvuuF+O5HHAeixOdqKL5fz8zU2eaM3gfw6d549+96vzCuNhBmScA==", - "license": "MIT", - "dependencies": { - "@tanstack/react-router-devtools": "1.141.1", - "clsx": "^2.1.1", - "goober": "^2.1.16" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@tanstack/react-router": "^1.141.1", - "csstype": "^3.0.10", - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0" - }, - "peerDependenciesMeta": { - "csstype": { - "optional": true - } - } - }, - "node_modules/@tanstack/router-devtools-core": { - "version": "1.141.1", - "resolved": "https://registry.npmjs.org/@tanstack/router-devtools-core/-/router-devtools-core-1.141.1.tgz", - "integrity": "sha512-wD9yRvOk6FI+thiNBplhkGutPIPBlXvWu9ttU/obdFY5oXQj9WYgNS+IO9BEe8Pz5rNEu8zE/oLn4RUGIVdtnw==", - "license": "MIT", - "dependencies": { - "clsx": "^2.1.1", - "goober": "^2.1.16", - "tiny-invariant": "^1.3.3" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@tanstack/router-core": "^1.141.1", - "csstype": "^3.0.10", - "solid-js": ">=1.9.5" - }, - "peerDependenciesMeta": { - "csstype": { - "optional": true - } - } - }, - "node_modules/@tanstack/store": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.8.0.tgz", - "integrity": "sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@trpc/client": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@trpc/client/-/client-11.7.2.tgz", - "integrity": "sha512-OQxqUMfpDvjcszo9dbnqWQXnW2L5IbrKSz2H7l8s+mVM3EvYw7ztQ/gjFIN3iy0NcamiQfd4eE6qjcb9Lm+63A==", - "funding": [ - "https://trpc.io/sponsor" - ], - "license": "MIT", - "peerDependencies": { - "@trpc/server": "11.7.2", - "typescript": ">=5.7.2" - } - }, - "node_modules/@trpc/react-query": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@trpc/react-query/-/react-query-11.7.2.tgz", - "integrity": "sha512-IcLDMqx2mvlGRxkr0/m37TtPvRQ8nonITH3EwYv436x0Igx8eduR9z4tdgGBsjJY9e5W1G7cZ4zKCwrizSimFQ==", - "funding": [ - "https://trpc.io/sponsor" - ], - "license": "MIT", - "peerDependencies": { - "@tanstack/react-query": "^5.80.3", - "@trpc/client": "11.7.2", - "@trpc/server": "11.7.2", - "react": ">=18.2.0", - "react-dom": ">=18.2.0", - "typescript": ">=5.7.2" - } - }, - "node_modules/@trpc/server": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@trpc/server/-/server-11.7.2.tgz", - "integrity": "sha512-AgB26PXY69sckherIhCacKLY49rxE2XP5h38vr/KMZTbLCL1p8IuIoKPjALTcugC2kbyQ7Lbqo2JDVfRSmPmfQ==", - "funding": [ - "https://trpc.io/sponsor" - ], - "license": "MIT", - "peerDependencies": { - "typescript": ">=5.7.2" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@turf/along": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/along/-/along-7.3.1.tgz", - "integrity": "sha512-z84b9PKsUB69BhkeHA6oPqRO7VaJHwTid1SpuIbwWzDqHTpq8buJBKlrKgHIIthuVr5P/AZiEXmf3R4ifRhDmw==", - "license": "MIT", - "dependencies": { - "@turf/bearing": "7.3.1", - "@turf/destination": "7.3.1", - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/angle": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/angle/-/angle-7.3.1.tgz", - "integrity": "sha512-Pcb0Fg8WHsOMKFvIPaYfORrlLYdytWjVAkVTnAqJdmGI+2n+eLROPjJO2sJbpX9yU/dlBgujOB7a1d0PJjhHyQ==", - "license": "MIT", - "dependencies": { - "@turf/bearing": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/rhumb-bearing": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/area": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/area/-/area-7.3.1.tgz", - "integrity": "sha512-9nSiwt4zB5QDMcSoTxF28WpK1f741MNKcpUJDiHVRX08CZ4qfGWGV9ZIPQ8TVEn5RE4LyYkFuQ47Z9pdEUZE9Q==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/bbox": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.3.1.tgz", - "integrity": "sha512-/IyMKoS7P9B0ch5PIlQ6gMfoE8gRr48+cSbzlyexvEjuDuaAV1VURjH1jAthS0ipFG8RrFxFJKnp7TLL1Skong==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/bbox-clip": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/bbox-clip/-/bbox-clip-7.3.1.tgz", - "integrity": "sha512-YUeITFtp5QLbpSS0XyQa0GlgMqK4PMgjOeOGOTlWsfDYaqc5SErf7o5UyCOsLAPQW16QZVxJ26uTAE20YkluAA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/bbox-polygon": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/bbox-polygon/-/bbox-polygon-7.3.1.tgz", - "integrity": "sha512-2NvwPfuRtwJk7w5HIC/Knei3mUXrVT+t/0FB1zStgDbakmXrqKISaftlIh4YTOVlUsVnvq0tggjFMLZ/Xxo+lQ==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/bearing": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-7.3.1.tgz", - "integrity": "sha512-ex78l/LiY6uO6jO8AJepyWE6/tiWEbXjKLOgqUfJSkW23UcMVlhbAKzXDjbsdz9T66sXFC/6QNAh8oaZzmoo6w==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/bezier-spline": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/bezier-spline/-/bezier-spline-7.3.1.tgz", - "integrity": "sha512-7Mal/d8ttTQ5eu/mwgC53iH9eYBRTBHXsIqEEiTVHChh1iajNuS4/bwYdaxsQsRXKVaFfx+4dCy0cRmqhjgTrw==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-clockwise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/boolean-clockwise/-/boolean-clockwise-7.3.1.tgz", - "integrity": "sha512-ik9j0CCrsp/JZ42tbCnyZg86YFoavEU/nyal3HsEgdY5WFYq43aMYqLPRi6yNqE48THEk3fl1BcfgJqAiUhDFA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-concave": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/boolean-concave/-/boolean-concave-7.3.1.tgz", - "integrity": "sha512-jAAt5MhqXSKmRmX7l09oeo9dObf7bMDuzfeUSSNAK+yAi9TE5QWlP4JtzOWC5+gKXsL8dvzE8mvsQj38FzQdEA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-contains": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/boolean-contains/-/boolean-contains-7.3.1.tgz", - "integrity": "sha512-VvytV9ZcUgnitzm5ILVWIoOhoZOh8VZ4dnweUJM3N+A77CzXXFk8e4NqPNZ6tZVPY3ehxzDXrq1+iN87pMcB7g==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/boolean-point-on-line": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-crosses": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/boolean-crosses/-/boolean-crosses-7.3.1.tgz", - "integrity": "sha512-Fn99AxTXQORiQjclUqUYQcA40oJJoJxMBFx/Vycd7v949Lnplt1qrUkBpbZNXQlvHF2gxrgirSfgBDaUnUJjzQ==", - "license": "MIT", - "dependencies": { - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/line-intersect": "7.3.1", - "@turf/polygon-to-line": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-disjoint": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/boolean-disjoint/-/boolean-disjoint-7.3.1.tgz", - "integrity": "sha512-bqVo+eAYaCq0lcr09zsZdWIAdv22UzGc/h2CCfaBwP5r4o/rFudNFLU9gb9BcM6dBUzrtTgBguShAZr7k3cGbw==", - "license": "MIT", - "dependencies": { - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/line-intersect": "7.3.1", - "@turf/meta": "7.3.1", - "@turf/polygon-to-line": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-equal": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/boolean-equal/-/boolean-equal-7.3.1.tgz", - "integrity": "sha512-nEsmmNdwD1nzYZLsO6hPC/X/Uag+eT0yuWamD0XxJAQhXBsnSATxKisCJXVJgXvO8M0qvEMW1zZrUGB6Fjfzzw==", - "license": "MIT", - "dependencies": { - "@turf/clean-coords": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "geojson-equality-ts": "^1.0.2", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-intersects": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/boolean-intersects/-/boolean-intersects-7.3.1.tgz", - "integrity": "sha512-nc6W8qFdzFkfsR6p506HINGu85nHk/Skm+cw3TRQZ5/A44hjf0kYnbhvS3qrCAws3bR+/FKK8O1bsO/Udk8kkg==", - "license": "MIT", - "dependencies": { - "@turf/boolean-disjoint": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-overlap": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/boolean-overlap/-/boolean-overlap-7.3.1.tgz", - "integrity": "sha512-QhhsgCLzkwXIeZhaCmgE3H8yTANJGZatJ5IzQG3xnPTx7LiNAaa/ReN2/NroEv++8Yc0sr5Bkh6xWZOtew1dvQ==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/line-intersect": "7.3.1", - "@turf/line-overlap": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "geojson-equality-ts": "^1.0.2", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-parallel": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/boolean-parallel/-/boolean-parallel-7.3.1.tgz", - "integrity": "sha512-SXPyYiuaRB1ES/LtcUP11HWyloMJGzN1nYaCLG7H+6l2OKjVJl025qR6uxVElWCzAdElek9nGNeNya1hd9ZHaw==", - "license": "MIT", - "dependencies": { - "@turf/clean-coords": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/line-segment": "7.3.1", - "@turf/rhumb-bearing": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-point-in-polygon": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-7.3.1.tgz", - "integrity": "sha512-BUPW63vE43LctwkgannjmEFTX1KFR/18SS7WzFahJWK1ZoP0s1jrfxGX+pi0BH/3Dd9mA71hkGKDDnj1Ndcz0g==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "point-in-polygon-hao": "^1.1.0", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-point-on-line": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/boolean-point-on-line/-/boolean-point-on-line-7.3.1.tgz", - "integrity": "sha512-8Hywuv7XFpSc8nfH0BJBtt+XTcJ7OjfjpX2Sz+ty8gyiY/2nCLLqq6amu3ebr67ruqZTDpPNQoGGUbUePjF3rA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-touches": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/boolean-touches/-/boolean-touches-7.3.1.tgz", - "integrity": "sha512-XqrQzYGTakoTWeTWT274pfObpbIpAM7L8CzGUa04rJD0l3bv3VK4TUw0v6+bywi5ea6TnJzvOzgvzTb1DtvBKA==", - "license": "MIT", - "dependencies": { - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/boolean-point-on-line": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-valid": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/boolean-valid/-/boolean-valid-7.3.1.tgz", - "integrity": "sha512-lpw4J5HaV4Tv033s2j/i6QHt6Zx/8Lc90DTfOU0axgRSrs127kbKNJsmDEGvtmV7YjNp8aPbIG1wwAX9wg/dMA==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/boolean-crosses": "7.3.1", - "@turf/boolean-disjoint": "7.3.1", - "@turf/boolean-overlap": "7.3.1", - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/boolean-point-on-line": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/line-intersect": "7.3.1", - "@types/geojson": "^7946.0.10", - "geojson-polygon-self-intersections": "^1.2.1", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-within": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/boolean-within/-/boolean-within-7.3.1.tgz", - "integrity": "sha512-oxP4VU81RRCf59TXCBhVWEyJ5Lsr+wrqvqSAFxyBuur5oLmBqZdYyvL7FQJmYvG0uOxX7ohyHmSJMaTe4EhGDA==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/boolean-point-on-line": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/buffer": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/buffer/-/buffer-7.3.1.tgz", - "integrity": "sha512-jtdI0Ir3GwPyY1V2dFX039HNhD8MIYLX39c7b9AZdLh7kBuD2VgXJmPvhtnivqMV2SmRlS4fd9cKzNj369/cGg==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/center": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/jsts": "^2.7.1", - "@turf/meta": "7.3.1", - "@turf/projection": "7.3.1", - "@types/geojson": "^7946.0.10", - "d3-geo": "1.7.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/center": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/center/-/center-7.3.1.tgz", - "integrity": "sha512-czqNKLGGdik3phYsWCK5SHKBRkDulUArMlG4v62IQcNcRFq9MbOGqyN21GSshSMO792ynDeWzdXdcKmycQ14Yg==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/center-mean": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/center-mean/-/center-mean-7.3.1.tgz", - "integrity": "sha512-koVenhCl8JPEvtDwH6nhZpLAm9+7XOXosqKdkXyK1uDae3NRyoQQeIYD7nIJHJPCOyeacw6buWzAEoAleBj0XA==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/center-median": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/center-median/-/center-median-7.3.1.tgz", - "integrity": "sha512-XIvxqnSdcUFOev4WO8AEQth4U3uzfQkxYVkKhZrxpVitqEeSDm5v3ANUeVGYqQ/QNTWvFAFn4zB5+XRRd8tayA==", - "license": "MIT", - "dependencies": { - "@turf/center-mean": "7.3.1", - "@turf/centroid": "7.3.1", - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/center-of-mass": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/center-of-mass/-/center-of-mass-7.3.1.tgz", - "integrity": "sha512-w2O7RLc0tSs+eEsZCaWa1lYiACsaQTJtie/a4bj5ta1TDTAEjyxC6Rp6br4mN1XPzeSFbEuNw+q9/VdSXU/mGA==", - "license": "MIT", - "dependencies": { - "@turf/centroid": "7.3.1", - "@turf/convex": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/centroid": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-7.3.1.tgz", - "integrity": "sha512-hRnsDdVBH4pX9mAjYympb2q5W8TCMUMNEjcRrAF7HTCyjIuRmjJf8vUtlzf7TTn9RXbsvPc1vtm3kLw20Jm8DQ==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/circle": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/circle/-/circle-7.3.1.tgz", - "integrity": "sha512-UY2OM1OK7IuyrtN3YE8026ZM3xM9VIkqZ0vRZln8g33D0AogrJVJ/I9T81/VpRPlxTnrbDpzQxJQBH+3vPG/Ow==", - "license": "MIT", - "dependencies": { - "@turf/destination": "7.3.1", - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/clean-coords": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/clean-coords/-/clean-coords-7.3.1.tgz", - "integrity": "sha512-uNo4lnTekvkw8dUCXIVCc38nZiHBrpy5jn0T8hlodZo/A4XAChFtLQi8NLcX8rtXcaNxeJo+yaPfpP3PSVI2jw==", - "license": "MIT", - "dependencies": { - "@turf/boolean-point-on-line": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/clone": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-7.3.1.tgz", - "integrity": "sha512-r7xDOfw9ohA7PhZW+8X9RMsO4szB4YqkhEROaELJyLtQ1bo8VNFtndpZdE6YHQpD7Pjlvlb6i99q8w1QLisEPg==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/clusters": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/clusters/-/clusters-7.3.1.tgz", - "integrity": "sha512-ZELehyYnsozw+AHOc426abmPaGJOt46BHnCN+hwtPOkqEbvdZYu+16Y+cjiFnY7FwbvzBjDMb9HRtKJFlAmupg==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/clusters-dbscan": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/clusters-dbscan/-/clusters-dbscan-7.3.1.tgz", - "integrity": "sha512-rY1wbQlljRhX5e+XM/yw4dKs2HniN45v+Xf5Xde6nv23WyEf/LLjpyD5yrsLa1awfJjD/NmD6axGVebnBBn9YA==", - "license": "MIT", - "dependencies": { - "@turf/clone": "7.3.1", - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "rbush": "^3.0.1", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/clusters-kmeans": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/clusters-kmeans/-/clusters-kmeans-7.3.1.tgz", - "integrity": "sha512-HYvRninBY/b5ftkIkoVWjV/wHilNE56cdr6gTlrxuvm4EClilsLDSVYjeiMYU0pjI3xDTc7PlicQDGdnIavUqQ==", - "license": "MIT", - "dependencies": { - "@turf/clone": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "skmeans": "0.9.7", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/collect": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/collect/-/collect-7.3.1.tgz", - "integrity": "sha512-yVDz5YLcRGFipttb60Y4IAd7zWfbQk6mNW5Kt6/wa8+YueHFzsKJdtbErWfozCVuiKplQZWT5r+9J9g6RnhpjQ==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "rbush": "^3.0.1", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/combine": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/combine/-/combine-7.3.1.tgz", - "integrity": "sha512-iZBe36sKRq08fY3Ars0JpfYJm8N3LtLLnNzdTxHp8Ry2ORJGHvZHpcv3lQXWL7gyJwDPAye7pyrX7S99IB/1VA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/concave": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/concave/-/concave-7.3.1.tgz", - "integrity": "sha512-vZWqyAYH4qzOuiqPb+bj2jvpIGzYAH8byUhfFJ2gRFRL3/RfV8jdXL2r0Y6VFScqE6OLVGvtM3ITzXX1/9wTaA==", - "license": "MIT", - "dependencies": { - "@turf/clone": "7.3.1", - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@turf/tin": "7.3.1", - "@types/geojson": "^7946.0.10", - "topojson-client": "3.x", - "topojson-server": "3.x", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/convex": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/convex/-/convex-7.3.1.tgz", - "integrity": "sha512-k2T8QVSie4w+KhwUxjzi/6S6VFr33H9gnUawOh4chCGAgje9PljUZLCGbktHgDfAjX1FVzyUyriH+dm86Z7njQ==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "concaveman": "^1.2.1", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/destination": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/destination/-/destination-7.3.1.tgz", - "integrity": "sha512-yyiJtbQJ4AB9Ny/FKDDNuWI9Sg4Jtd2PMpQPqOV3AFq8NNkg0xJSNmDHDxupb3oPqPWYPxyfVI3tBoF+Xhhoig==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/difference": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/difference/-/difference-7.3.1.tgz", - "integrity": "sha512-Ne2AR+1AdeH8aqY2VHcws+Z/1MHl8SlSbSWHBNVZUVEfvyzTrRg8/E+OC5vFaSUvNZXkB/OUufTCM9xsatLKXQ==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "polyclip-ts": "^0.16.8", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/dissolve": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/dissolve/-/dissolve-7.3.1.tgz", - "integrity": "sha512-Xmjl4E1aGRMdJjq+HfsiAXZtfMKruq7O+8xvsqnHM6E8iBWlJNSw8ucrNB5RZME8BUojx0q8bvXgS3k68koGyw==", - "license": "MIT", - "dependencies": { - "@turf/flatten": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "polyclip-ts": "^0.16.8", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/distance": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-7.3.1.tgz", - "integrity": "sha512-DK//doTGgYYjBkcWUywAe7wbZYcdP97hdEJ6rXYVYRoULwGGR3lhY96GNjozg6gaW9q2eSNYnZLpcL5iFVHqgw==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/distance-weight": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/distance-weight/-/distance-weight-7.3.1.tgz", - "integrity": "sha512-h82qLPeMxOfgN62ZysscQCu9IYB5AO+duw7peAQnMtFobpbcQK58158P0cNzxAoTVJXSO/mfR9dI9Zdz7NF75w==", - "license": "MIT", - "dependencies": { - "@turf/centroid": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/ellipse": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/ellipse/-/ellipse-7.3.1.tgz", - "integrity": "sha512-tcGbS+U7EktZg+UJad17LRU+8C067XDWdmURPCmycaib2zRxeNrImh2Y/589us6wsldlYYoBYRxDY/c1oxIUCA==", - "license": "MIT", - "dependencies": { - "@turf/destination": "7.3.1", - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/transform-rotate": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/envelope": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/envelope/-/envelope-7.3.1.tgz", - "integrity": "sha512-Sp3ct/LpWyHN5tTfPOcKXFoVDI1QH9BXtQ+aQzABFp3U5nY2Sz8LFg8SeFQm3K7PpoCnUwSfwDFA4aa+z+4l1g==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/bbox-polygon": "7.3.1", - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/explode": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/explode/-/explode-7.3.1.tgz", - "integrity": "sha512-H0Q8NnmrPoWKhsYYmVmkuT5F4t50N53ByGBf6Ys1n5B9YrFyrT+/aLDXF2C05r+QnW8nFtkM4lFG3ZSBHiq4Xg==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/flatten": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/flatten/-/flatten-7.3.1.tgz", - "integrity": "sha512-cM/uuQP8oZ4IDJG342uOlqQ8yD9RsAY9Gg9nsDOgJn6tN065aigRCNy2lfrNyLdK/CPTVEWQzx1EQa+zXGSgAg==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/flip": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/flip/-/flip-7.3.1.tgz", - "integrity": "sha512-6sF41pWY8Tw7w72hYc87sR9zzDei7UZ4Db/z0mKuNKueyzl4iTQ/H2JVd/XLZ7Tasz7H8htmrbUO0GR8GY7qiQ==", - "license": "MIT", - "dependencies": { - "@turf/clone": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/geojson-rbush": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/geojson-rbush/-/geojson-rbush-7.3.1.tgz", - "integrity": "sha512-EsrBBftZS5TvzRP2opLzwfnPXfmJi45KkGUcKSSFD0bxQe3BQUSmBrZbHMT8avB2s/XHrS/MniqsyeVOMwc35Q==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "rbush": "^3.0.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/great-circle": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/great-circle/-/great-circle-7.3.1.tgz", - "integrity": "sha512-pfs7PzBRgYEEyecM0ni6iEF19grn9FmbHyaLz7voYInmc2ZHfWQaxuY4dcf9cziWDaiPlbuyr/RyE6envg1xpw==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/helpers": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.3.1.tgz", - "integrity": "sha512-zkL34JVhi5XhsuMEO0MUTIIFEJ8yiW1InMu4hu/oRqamlY4mMoZql0viEmH6Dafh/p+zOl8OYvMJ3Vm3rFshgg==", - "license": "MIT", - "dependencies": { - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/hex-grid": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/hex-grid/-/hex-grid-7.3.1.tgz", - "integrity": "sha512-cWAKxlU1aa06976C3RhpcilDzLnWwXkH/atNIWKGpLV/HubHrMXxhp9VMBKWaqsLbdn5x2uJjv4MxwWw9/373g==", - "license": "MIT", - "dependencies": { - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/intersect": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/interpolate": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/interpolate/-/interpolate-7.3.1.tgz", - "integrity": "sha512-dquwDplzkSANMQdvxAu0dRF69EBIIlW/1zTPOB/BQfb/s7j6t8RskgbuV8ew1KpJPMmj7EbexejiMBtRWXTu4Q==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/centroid": "7.3.1", - "@turf/clone": "7.3.1", - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/hex-grid": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@turf/point-grid": "7.3.1", - "@turf/square-grid": "7.3.1", - "@turf/triangle-grid": "7.3.1", - "@types/geojson": "^7946.0.10" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/intersect": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/intersect/-/intersect-7.3.1.tgz", - "integrity": "sha512-676688YnF9wpprMioQWvxPlUMhtTvYITzw4XoG3lQmLjd/yt2cByanQHWpzWauLfYUlfuL13AeRGdqXRhSkhTQ==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "polyclip-ts": "^0.16.8", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/invariant": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.3.1.tgz", - "integrity": "sha512-IdZJfDjIDCLH+Gu2yLFoSM7H23sdetIo5t4ET1/25X8gi3GE2XSqbZwaGjuZgNh02nisBewLqNiJs2bo+hrqZA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/isobands": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/isobands/-/isobands-7.3.1.tgz", - "integrity": "sha512-An6+yUSrOStQSpZwKW9XN891kCW6eagtuofyudZ2BkoxcYRJ0vcDXo7RoiXuf9nHaG4k/xwhAzTqe8hdO1ltWA==", - "license": "MIT", - "dependencies": { - "@turf/area": "7.3.1", - "@turf/bbox": "7.3.1", - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/explode": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/isolines": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/isolines/-/isolines-7.3.1.tgz", - "integrity": "sha512-TcwbTd7Z4BffYe1PtpXUtZvWCwTffta8VxqryGU30CbqKjNJYqrFbEQXS0mo4l3BEPPmT1lfMskUQ2g97O2MWQ==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/jsts": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@turf/jsts/-/jsts-2.7.2.tgz", - "integrity": "sha512-zAezGlwWHPyU0zxwcX2wQY3RkRpwuoBmhhNE9HY9kWhFDkCxZ3aWK5URKwa/SWKJbj9aztO+8vtdiBA28KVJFg==", - "license": "(EDL-1.0 OR EPL-1.0)", - "dependencies": { - "jsts": "2.7.1" - } - }, - "node_modules/@turf/kinks": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/kinks/-/kinks-7.3.1.tgz", - "integrity": "sha512-gGXNrhlF7zvLwRX672S0Be7bmYjbZEoZYnOGN6RvhyBFSSLFIbne+I74I+lWRzAzG/NhAMBXma5TpB09iTH06Q==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/length": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/length/-/length-7.3.1.tgz", - "integrity": "sha512-QOr4qS3yi6qWIfQ/KLcy4rDLdemGCYpqz2YDh29R46seE+arSvlBI0KXvI36rPzgEMcUbQuVQyO65sOSqPaEjQ==", - "license": "MIT", - "dependencies": { - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-arc": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/line-arc/-/line-arc-7.3.1.tgz", - "integrity": "sha512-QSuVP0YWcfl76QjPb5Y2GJqXnziSJ2AuaJm5RKEFt5ELugXdEcHkRtydkGov+ZRPmI93jVmXoEE0UXwQx7aYHA==", - "license": "MIT", - "dependencies": { - "@turf/circle": "7.3.1", - "@turf/destination": "7.3.1", - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-chunk": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/line-chunk/-/line-chunk-7.3.1.tgz", - "integrity": "sha512-fbJw/7Qlqz0XRMz0TgtFUivFHr51+++ZUBrARgs3w/pogeAdkrcWKBbuT2cowEsUkXDHaQ7MMpmuV8Uteru1qw==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/length": "7.3.1", - "@turf/line-slice-along": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-intersect": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/line-intersect/-/line-intersect-7.3.1.tgz", - "integrity": "sha512-HFPH4Hi+rG7XZ5rijkYL5C9JGVKd6gz6TToShVfqOt/qgGY9/bLYQxymgum/MG7sRhIa8xcKff2d57JrIVuSWA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "sweepline-intersections": "^1.5.0", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-offset": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/line-offset/-/line-offset-7.3.1.tgz", - "integrity": "sha512-PyElfSyXETXcI8OKRsAJNdOcxlM718EG0d+b9zeO2uRztf2IlSb5w3lYiTIUSslEDA1gMQE31cJE8sAW40+nhg==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-overlap": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/line-overlap/-/line-overlap-7.3.1.tgz", - "integrity": "sha512-xIhTfPhJMwz57DvM+/JuzG2BUL/gR/pJfH6w+vofI3akej33LTR8b296h2dhcJjDixxprVVH062AD1Q3AGKyfg==", - "license": "MIT", - "dependencies": { - "@turf/boolean-point-on-line": "7.3.1", - "@turf/geojson-rbush": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/line-segment": "7.3.1", - "@turf/meta": "7.3.1", - "@turf/nearest-point-on-line": "7.3.1", - "@types/geojson": "^7946.0.10", - "fast-deep-equal": "^3.1.3", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-segment": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/line-segment/-/line-segment-7.3.1.tgz", - "integrity": "sha512-hHz1fM2LigNKmnhyHDXtbRrkBqltH/lYEvhgSmv3laZ9PsEYL8jvA3o7+IhLM9B4KPa8N6VGim6ZR5YA5bhLvQ==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-slice": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/line-slice/-/line-slice-7.3.1.tgz", - "integrity": "sha512-bp1L4sc7ZOYC4fwxpfWu+IR/COvLFGm5mjbLPK8VBJYa+kUNrzNcB3QE3A8yFRjwPtlUTCm5fDMLSoGtiJcy2g==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/nearest-point-on-line": "7.3.1", - "@types/geojson": "^7946.0.10" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-slice-along": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/line-slice-along/-/line-slice-along-7.3.1.tgz", - "integrity": "sha512-RizIhPytHxEewCyUCSMrZ5a58sQev0kZ0jzAV/9iTzvGfRD1VU/RG2ThLpSEqXYKBBSty98rTeSlnwsvZpAraA==", - "license": "MIT", - "dependencies": { - "@turf/bearing": "7.3.1", - "@turf/destination": "7.3.1", - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-split": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/line-split/-/line-split-7.3.1.tgz", - "integrity": "sha512-Ee4NRN+eYKYX8vJDNvMpyZFjOntKFokQ/E8yFtKMcN++vG7RbnPOo2/ag6TMZaIHsahj4UR2yhqJbHTaB6Dp+g==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/geojson-rbush": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/line-intersect": "7.3.1", - "@turf/line-segment": "7.3.1", - "@turf/meta": "7.3.1", - "@turf/nearest-point-on-line": "7.3.1", - "@turf/truncate": "7.3.1", - "@types/geojson": "^7946.0.10" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-to-polygon": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/line-to-polygon/-/line-to-polygon-7.3.1.tgz", - "integrity": "sha512-GL4fjbdYYjfOmwTu4dtllNHm18E7+hoXqyca2Rqb2ZzXj++NHvifJ9iYHUSdpV4/mkvVD3U2rU6jzNkjQeXIaA==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/clone": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/mask": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/mask/-/mask-7.3.1.tgz", - "integrity": "sha512-rSNS6wNuBiaUR1aU7tobgkzHpot5v9GKCn+n5gQ3ad7KWqwwqLWfcCPeyHBWkWEoEwc2yfPqikMQugZbmxrorg==", - "license": "MIT", - "dependencies": { - "@turf/clone": "7.3.1", - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "polyclip-ts": "^0.16.8", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/meta": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.3.1.tgz", - "integrity": "sha512-NWsfOE5RVtWpLQNkfOF/RrYvLRPwwruxhZUV0UFIzHqfiRJ50aO9Y6uLY4bwCUe2TumLJQSR4yaoA72Rmr2mnQ==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/midpoint": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/midpoint/-/midpoint-7.3.1.tgz", - "integrity": "sha512-hx3eT9ut0Qyl8fyitCREp9l+v5Q4uBILht5+VKQS3p5eK2ijLEsKw4VikNZhh2rZ7bHGrs6obG5/P5ZqDTObiA==", - "license": "MIT", - "dependencies": { - "@turf/bearing": "7.3.1", - "@turf/destination": "7.3.1", - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/moran-index": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/moran-index/-/moran-index-7.3.1.tgz", - "integrity": "sha512-9t70AjBB0bycJWLVprqS7mtRU+Ha+U4ji5lkKzyg31ZWAr0IwuawY2VQ/ydsodFMLCqmIf8QbWsltV/I/bRdjQ==", - "license": "MIT", - "dependencies": { - "@turf/distance-weight": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/nearest-neighbor-analysis": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/nearest-neighbor-analysis/-/nearest-neighbor-analysis-7.3.1.tgz", - "integrity": "sha512-qwZON/7v1NbD1H1v3kTHJfLLml2/TNj5QQFRFBJiXRSCydMJT1sKEs5BwJe/9cBbmd0ln3gBWXCkG7Sk3sPgOQ==", - "license": "MIT", - "dependencies": { - "@turf/area": "7.3.1", - "@turf/bbox": "7.3.1", - "@turf/bbox-polygon": "7.3.1", - "@turf/centroid": "7.3.1", - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@turf/nearest-point": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/nearest-point": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/nearest-point/-/nearest-point-7.3.1.tgz", - "integrity": "sha512-hLKGFzwAEop5z04X5BeurJvz0oVPHQX0rjeL3v83kgIjR/eavQucXKO3XkJBoF1AaT9Dv0mgB8rmj/qrwroWgg==", - "license": "MIT", - "dependencies": { - "@turf/clone": "7.3.1", - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/nearest-point-on-line": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/nearest-point-on-line/-/nearest-point-on-line-7.3.1.tgz", - "integrity": "sha512-FialyHfXXZWLayKQcUtdOtKv3ulOQ9FSI45kSmkDl8b96+VFWHX983Pc94tTrSTSg89+XX7MDr6gRl0yowmF4Q==", - "license": "MIT", - "dependencies": { - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/nearest-point-to-line": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/nearest-point-to-line/-/nearest-point-to-line-7.3.1.tgz", - "integrity": "sha512-7zvhE15vlKBW7F3gYmxZMrnsS2HhXIt0Mpdymy6Y1oMWAXrYIqSeHl1Y/h2CiDh0v91K1KJXf2WyRYacosWiNA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@turf/point-to-line-distance": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/planepoint": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/planepoint/-/planepoint-7.3.1.tgz", - "integrity": "sha512-/DVTAZcOsSW54B9XDYUXyiL000vJ8WfONCF4FoM71VMeLS7PM3e+4W9gzN21q15XRn3nUftH12tJhqKEqDouvw==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/point-grid": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/point-grid/-/point-grid-7.3.1.tgz", - "integrity": "sha512-KqBlGgBzI/M7/awK25o9p8Q+mRjQDRU4mpHtqNzqNxgidk4JxnUnGybYTnsjp3n1Zid3yASv5kARJ4i/Jc5F7w==", - "license": "MIT", - "dependencies": { - "@turf/boolean-within": "7.3.1", - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/point-on-feature": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/point-on-feature/-/point-on-feature-7.3.1.tgz", - "integrity": "sha512-uX15wjujBMeMKAN7OLK4RV6KCLxsoQiFRB9kMtbTeZj13mDo+Bz5SyNN+M2AXqrdsQI9+4h0UTwu3EjcXj/nEw==", - "license": "MIT", - "dependencies": { - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/center": "7.3.1", - "@turf/explode": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/nearest-point": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/point-to-line-distance": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/point-to-line-distance/-/point-to-line-distance-7.3.1.tgz", - "integrity": "sha512-vynnX3zIMmJY633fyAIKnzlsmL7OBhbk05YhWVSjCKvSQV8C2xMA9pWaLFacn1xu4nfMSVDUaNOrcAqwubN9pg==", - "license": "MIT", - "dependencies": { - "@turf/bearing": "7.3.1", - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@turf/nearest-point-on-line": "7.3.1", - "@turf/projection": "7.3.1", - "@turf/rhumb-bearing": "7.3.1", - "@turf/rhumb-distance": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/point-to-polygon-distance": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/point-to-polygon-distance/-/point-to-polygon-distance-7.3.1.tgz", - "integrity": "sha512-A2hTQjMKO2VEMdgOariICLCjt0BDc1wAQ7Mzqc4vFuol1/GlAed4JqyLg1zXuOVlZcojvXDk/XRuZwXDlRJkBA==", - "license": "MIT", - "dependencies": { - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@turf/point-to-line-distance": "7.3.1", - "@turf/polygon-to-line": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/points-within-polygon": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/points-within-polygon/-/points-within-polygon-7.3.1.tgz", - "integrity": "sha512-tVcQVykc1vvSqz+l/PA4EKVWfMrGtA3ZUxDYBoD2tSaM79EpdTcY1BzfxT5O2582SQ0AdNFXDXRTf7VI6u/+2Q==", - "license": "MIT", - "dependencies": { - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/polygon-smooth": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/polygon-smooth/-/polygon-smooth-7.3.1.tgz", - "integrity": "sha512-CNi4SdpOycZRSBr4o0MlrFdC6x5xcXP6jKx2yXZf9FPrOWamHsDXa+NrywCOAPhgZKnBodRF6usKWudVMyPIgg==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/polygon-tangents": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/polygon-tangents/-/polygon-tangents-7.3.1.tgz", - "integrity": "sha512-XPLeCLQAcU2xco+3kS5Mp4AKmCKjOGzyZoC6oy8BuvHg1HaaEs0ZRzcmf0x17cq7bruhJ7n/QkcudnAueae5mg==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/boolean-within": "7.3.1", - "@turf/explode": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/nearest-point": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/polygon-to-line": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/polygon-to-line/-/polygon-to-line-7.3.1.tgz", - "integrity": "sha512-qTOFzn7SLQ0TcKBsPFAFYz7iiq34ijqinpjyr9fHQlFHRHeWzUXiWyIn5a2uOHazkdhHCEXNX8JPkt6hjdZ/fQ==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/polygonize": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/polygonize/-/polygonize-7.3.1.tgz", - "integrity": "sha512-BSamH4eDSbREtye/RZiIyt488KI/hO3+2FiDB8JUoHNESe3VNWk4KEy+sL6oqfhOZcRWndHtJ6MOi3HFptyJrw==", - "license": "MIT", - "dependencies": { - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/envelope": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/projection": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/projection/-/projection-7.3.1.tgz", - "integrity": "sha512-nDM3LG2j37B1tCpF4xL4rUBrQJcG585IRyDIxL2QEvP1LLv6dcm4fodw70HcGAj05Ux8bJr7IOXQXnobOJrlRA==", - "license": "MIT", - "dependencies": { - "@turf/clone": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/quadrat-analysis": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/quadrat-analysis/-/quadrat-analysis-7.3.1.tgz", - "integrity": "sha512-Kwqtih5CnijULGoTobS0pXdzh/Yr3iGatJcKks4IaxA4+hlJ6Z+Mj47QfKvUtl/IP3lZpVzezewJ51Y989YtVg==", - "license": "MIT", - "dependencies": { - "@turf/area": "7.3.1", - "@turf/bbox": "7.3.1", - "@turf/bbox-polygon": "7.3.1", - "@turf/centroid": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/point-grid": "7.3.1", - "@turf/random": "7.3.1", - "@turf/square-grid": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/random": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/random/-/random-7.3.1.tgz", - "integrity": "sha512-Iruica0gfdAuuqWG3SLe1MQOEP4IOGelPp81Cu552AamhHJmkEZCaiis2n28qdOlAbDs1NJZeJhRFNkiopiy+Q==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/rectangle-grid": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/rectangle-grid/-/rectangle-grid-7.3.1.tgz", - "integrity": "sha512-3/fwd1dzeGApxGXAzyVINFylmn8trYTPLG6jtqOgriAdiHPMTtPqSW58wpScC43oKbK3Bps9dSZ43jvcbrfGxw==", - "license": "MIT", - "dependencies": { - "@turf/boolean-intersects": "7.3.1", - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/rewind": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/rewind/-/rewind-7.3.1.tgz", - "integrity": "sha512-gD2TGPNq3SE6IlpDwkVHQthZ2U2MElh6X4Vfld3K7VsBHJv4eBct6OOgSWZLkVVPHuWNlVFTNtcRh2LAznMtgw==", - "license": "MIT", - "dependencies": { - "@turf/boolean-clockwise": "7.3.1", - "@turf/clone": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/rhumb-bearing": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/rhumb-bearing/-/rhumb-bearing-7.3.1.tgz", - "integrity": "sha512-GA/EUSOMapLp6qK5kOX+PkFg2MMUHzUSm/jVezv6Fted0dAlCgXHOrKgLm0tN8PqbH7Oj9xQhv9+3/1ze7W8YA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/rhumb-destination": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/rhumb-destination/-/rhumb-destination-7.3.1.tgz", - "integrity": "sha512-HjtAFr5DTISUn9b4oaZpX79tYl72r4EyAj40HKwjQeV6KkwIe5/h4zryOSEpnvAK2Gnkmu1GxYeTGfM5z3J9JA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/rhumb-distance": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/rhumb-distance/-/rhumb-distance-7.3.1.tgz", - "integrity": "sha512-9ZvXU0ii2aywdphLhiawl3uxMEHucMmXCBiRj3WhmssTY9CZkFii9iImbJEqz5glxh6/gzXDcz1CCFQUdNP2xA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/sample": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/sample/-/sample-7.3.1.tgz", - "integrity": "sha512-s9IkXrrtaHRllgk9X2tmg8+SJKLG6orQwf0p1wZX8WxnHXvmnHaju465A3nmtGGVDI/RSD8KwU9aqPcc4AinNw==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/sector": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/sector/-/sector-7.3.1.tgz", - "integrity": "sha512-3BYJk7pQaqVr1Ji1ors6FUnhCJVHuobNf4bYW2yAUW1rxL+snuo6aTCsu39hpkwLj4BBknYt5w4MIOy5b8+QKg==", - "license": "MIT", - "dependencies": { - "@turf/circle": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/line-arc": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/shortest-path": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/shortest-path/-/shortest-path-7.3.1.tgz", - "integrity": "sha512-B0j6MoTSeGw1inRJPfj+6lU4WVXBNFAafqs/BkccScnCHLLK+vMnsOkyQoDX2vdZnhPTEaGj7TEL1SIjV6IMgA==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/bbox-polygon": "7.3.1", - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/clean-coords": "7.3.1", - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@turf/transform-scale": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/simplify": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/simplify/-/simplify-7.3.1.tgz", - "integrity": "sha512-8LRITQAyNAdvVInjm8pal3J7ZAZZBYrYd5oApXqHlIFK7gEiE21Hx9CZyog6AHDjxZCinwnEoGkzDxORh/mNMg==", - "license": "MIT", - "dependencies": { - "@turf/clean-coords": "7.3.1", - "@turf/clone": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/square": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/square/-/square-7.3.1.tgz", - "integrity": "sha512-LvMkII6bbHaFHp67jI029xHjWFK3pnqwF8c2pUNU+0dL+45KgrO2jaFTnNQdsjexPymI+uaNLlG809Y0aGGQlw==", - "license": "MIT", - "dependencies": { - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/square-grid": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/square-grid/-/square-grid-7.3.1.tgz", - "integrity": "sha512-WYCX8+nrqHyAhKBSBHFp1eU1gWrcojz9uVvhCbDO8NO14SLHowzWOgB61Gv8KlLXCUBjDr+rYWCt3ymyPzU5TA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/rectangle-grid": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/standard-deviational-ellipse": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/standard-deviational-ellipse/-/standard-deviational-ellipse-7.3.1.tgz", - "integrity": "sha512-u9ojpWyv3rnFioYZyya6VXVDrRPYymNROVKwGqnQzffYE1MdxhJ6ik/CvdcChzCNvSNVBJQUvnjjPq2C2uOsLA==", - "license": "MIT", - "dependencies": { - "@turf/center-mean": "7.3.1", - "@turf/ellipse": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@turf/points-within-polygon": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/tag": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/tag/-/tag-7.3.1.tgz", - "integrity": "sha512-Y7G2EWm0/j78ss5wCnjGWKfmPbXw9yKJFg93EuMnwggIsDfKdQi/vdUInjQ0462RIQA87StlydPG09X/8bquwQ==", - "license": "MIT", - "dependencies": { - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/clone": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/tesselate": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/tesselate/-/tesselate-7.3.1.tgz", - "integrity": "sha512-iJnatp9RcJvyffBjqJaw5GbKE/PQosT8DH2kgG7pv4Re0xl3h/QvCjvTlCTEmJ5cNY4geZVKUXDvkkCkgQQVuA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "earcut": "^2.2.4", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/tin": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/tin/-/tin-7.3.1.tgz", - "integrity": "sha512-pDtHE8rLXvV4zAC9mWmwToDDda2ZTty8IZqZIoUqTnlf6AJjzF7TJrhoE3a+zukRTUI1wowTFqe2NvwgNX0yew==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/transform-rotate": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/transform-rotate/-/transform-rotate-7.3.1.tgz", - "integrity": "sha512-KAYebOkk7IT2j7S8M+ZxDAmyqeni9ZZGU9ouD6mvd/hTpDOlGG+ORRmg312RxG0NiThzCHLyeG1Nea1nEud6bg==", - "license": "MIT", - "dependencies": { - "@turf/centroid": "7.3.1", - "@turf/clone": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@turf/rhumb-bearing": "7.3.1", - "@turf/rhumb-destination": "7.3.1", - "@turf/rhumb-distance": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/transform-scale": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/transform-scale/-/transform-scale-7.3.1.tgz", - "integrity": "sha512-e8jBSWEn0BMxG0HR8ZMvkHgBgdwNrFRzbhy8DqQwZDgUN59fMeWGbjX5QR5Exl2gZBPaBXkgbDgEhh/JD3kYhw==", - "license": "MIT", - "dependencies": { - "@turf/bbox": "7.3.1", - "@turf/center": "7.3.1", - "@turf/centroid": "7.3.1", - "@turf/clone": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@turf/rhumb-bearing": "7.3.1", - "@turf/rhumb-destination": "7.3.1", - "@turf/rhumb-distance": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/transform-translate": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/transform-translate/-/transform-translate-7.3.1.tgz", - "integrity": "sha512-yeaW1EqfuuY4l5VBWSsItglaZ9qdTFD0QEIUW1ooOYuQvtKQ2MTKrcQIKLXZckxQrrNq4TXsZDaBbFs+U1wtcQ==", - "license": "MIT", - "dependencies": { - "@turf/clone": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/meta": "7.3.1", - "@turf/rhumb-destination": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/triangle-grid": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/triangle-grid/-/triangle-grid-7.3.1.tgz", - "integrity": "sha512-lhZyqnQC/M8x8DgQURHNZP/HaJIqrL5We5ZvzJBX+lrH2u4DO831awJcuDniRuJ5e0QE5n4yMsBJO77KMNdKfw==", - "license": "MIT", - "dependencies": { - "@turf/distance": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/intersect": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/truncate": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/truncate/-/truncate-7.3.1.tgz", - "integrity": "sha512-rcXHM2m17hyKoW1dJpOvTgUUWFOKluTKKsoLmhEE6aRAYwtuVetkcInt4qBtS1bv7MaL//glbvq0kdEGR0YaOA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/turf": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/turf/-/turf-7.3.1.tgz", - "integrity": "sha512-0uKkNnM6Bo6cIzZcJ6wQ+FjFioTFXWS3woGDvQ5R7EPehNfdr4HTS39m1seE+HdI8lGItMZehb6fb0jtjP4Clg==", - "license": "MIT", - "dependencies": { - "@turf/along": "7.3.1", - "@turf/angle": "7.3.1", - "@turf/area": "7.3.1", - "@turf/bbox": "7.3.1", - "@turf/bbox-clip": "7.3.1", - "@turf/bbox-polygon": "7.3.1", - "@turf/bearing": "7.3.1", - "@turf/bezier-spline": "7.3.1", - "@turf/boolean-clockwise": "7.3.1", - "@turf/boolean-concave": "7.3.1", - "@turf/boolean-contains": "7.3.1", - "@turf/boolean-crosses": "7.3.1", - "@turf/boolean-disjoint": "7.3.1", - "@turf/boolean-equal": "7.3.1", - "@turf/boolean-intersects": "7.3.1", - "@turf/boolean-overlap": "7.3.1", - "@turf/boolean-parallel": "7.3.1", - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/boolean-point-on-line": "7.3.1", - "@turf/boolean-touches": "7.3.1", - "@turf/boolean-valid": "7.3.1", - "@turf/boolean-within": "7.3.1", - "@turf/buffer": "7.3.1", - "@turf/center": "7.3.1", - "@turf/center-mean": "7.3.1", - "@turf/center-median": "7.3.1", - "@turf/center-of-mass": "7.3.1", - "@turf/centroid": "7.3.1", - "@turf/circle": "7.3.1", - "@turf/clean-coords": "7.3.1", - "@turf/clone": "7.3.1", - "@turf/clusters": "7.3.1", - "@turf/clusters-dbscan": "7.3.1", - "@turf/clusters-kmeans": "7.3.1", - "@turf/collect": "7.3.1", - "@turf/combine": "7.3.1", - "@turf/concave": "7.3.1", - "@turf/convex": "7.3.1", - "@turf/destination": "7.3.1", - "@turf/difference": "7.3.1", - "@turf/dissolve": "7.3.1", - "@turf/distance": "7.3.1", - "@turf/distance-weight": "7.3.1", - "@turf/ellipse": "7.3.1", - "@turf/envelope": "7.3.1", - "@turf/explode": "7.3.1", - "@turf/flatten": "7.3.1", - "@turf/flip": "7.3.1", - "@turf/geojson-rbush": "7.3.1", - "@turf/great-circle": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/hex-grid": "7.3.1", - "@turf/interpolate": "7.3.1", - "@turf/intersect": "7.3.1", - "@turf/invariant": "7.3.1", - "@turf/isobands": "7.3.1", - "@turf/isolines": "7.3.1", - "@turf/kinks": "7.3.1", - "@turf/length": "7.3.1", - "@turf/line-arc": "7.3.1", - "@turf/line-chunk": "7.3.1", - "@turf/line-intersect": "7.3.1", - "@turf/line-offset": "7.3.1", - "@turf/line-overlap": "7.3.1", - "@turf/line-segment": "7.3.1", - "@turf/line-slice": "7.3.1", - "@turf/line-slice-along": "7.3.1", - "@turf/line-split": "7.3.1", - "@turf/line-to-polygon": "7.3.1", - "@turf/mask": "7.3.1", - "@turf/meta": "7.3.1", - "@turf/midpoint": "7.3.1", - "@turf/moran-index": "7.3.1", - "@turf/nearest-neighbor-analysis": "7.3.1", - "@turf/nearest-point": "7.3.1", - "@turf/nearest-point-on-line": "7.3.1", - "@turf/nearest-point-to-line": "7.3.1", - "@turf/planepoint": "7.3.1", - "@turf/point-grid": "7.3.1", - "@turf/point-on-feature": "7.3.1", - "@turf/point-to-line-distance": "7.3.1", - "@turf/point-to-polygon-distance": "7.3.1", - "@turf/points-within-polygon": "7.3.1", - "@turf/polygon-smooth": "7.3.1", - "@turf/polygon-tangents": "7.3.1", - "@turf/polygon-to-line": "7.3.1", - "@turf/polygonize": "7.3.1", - "@turf/projection": "7.3.1", - "@turf/quadrat-analysis": "7.3.1", - "@turf/random": "7.3.1", - "@turf/rectangle-grid": "7.3.1", - "@turf/rewind": "7.3.1", - "@turf/rhumb-bearing": "7.3.1", - "@turf/rhumb-destination": "7.3.1", - "@turf/rhumb-distance": "7.3.1", - "@turf/sample": "7.3.1", - "@turf/sector": "7.3.1", - "@turf/shortest-path": "7.3.1", - "@turf/simplify": "7.3.1", - "@turf/square": "7.3.1", - "@turf/square-grid": "7.3.1", - "@turf/standard-deviational-ellipse": "7.3.1", - "@turf/tag": "7.3.1", - "@turf/tesselate": "7.3.1", - "@turf/tin": "7.3.1", - "@turf/transform-rotate": "7.3.1", - "@turf/transform-scale": "7.3.1", - "@turf/transform-translate": "7.3.1", - "@turf/triangle-grid": "7.3.1", - "@turf/truncate": "7.3.1", - "@turf/union": "7.3.1", - "@turf/unkink-polygon": "7.3.1", - "@turf/voronoi": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/union": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/union/-/union-7.3.1.tgz", - "integrity": "sha512-Fk8HvP2gRrRJz8xefeoFJJUeLwhih3HoPPKlqaDf/6L43jwAzBD6BPu59+AwRXOlaZeOUMNMGzgSgx0KKrBwBg==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "polyclip-ts": "^0.16.8", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/unkink-polygon": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/unkink-polygon/-/unkink-polygon-7.3.1.tgz", - "integrity": "sha512-6NVFkCpJUT2P4Yf3z/FI2uGDXqVdEqZqKGl2hYitmH7mNiKhU4bAvvcw7nCSfNG3sUyNhibbtOEopYMRgwimPw==", - "license": "MIT", - "dependencies": { - "@turf/area": "7.3.1", - "@turf/boolean-point-in-polygon": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "rbush": "^3.0.1", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/voronoi": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/voronoi/-/voronoi-7.3.1.tgz", - "integrity": "sha512-yS+0EDwSIOizEXI+05qixw/OGZalpfsz9xzBWbCBA3Gu2boLMXErFZ73qzfu39Vwk+ILbu5em0p+VhULBzvH9w==", - "license": "MIT", - "dependencies": { - "@turf/clone": "7.3.1", - "@turf/helpers": "7.3.1", - "@turf/invariant": "7.3.1", - "@types/d3-voronoi": "^1.1.12", - "@types/geojson": "^7946.0.10", - "d3-voronoi": "1.1.2", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@tweenjs/tween.js": { - "version": "23.1.3", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", - "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/bcryptjs": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", - "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", - "license": "MIT" - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/canvas-confetti": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@types/canvas-confetti/-/canvas-confetti-1.9.0.tgz", - "integrity": "sha512-aBGj/dULrimR1XDZLtG9JwxX1b4HPRF6CX9Yfwh3NvstZEm1ZL7RBnel4keCPSqs1ANRu1u2Aoz9R+VmtjYuTg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/d3-voronoi": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.12.tgz", - "integrity": "sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw==", - "license": "MIT" - }, - "node_modules/@types/draco3d": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", - "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^2" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", - "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, - "node_modules/@types/geojson-vt": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz", - "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/hammerjs": { - "version": "2.0.46", - "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz", - "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==", - "license": "MIT" - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", - "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", - "license": "MIT", - "dependencies": { - "hoist-non-react-statics": "^3.3.0" - }, - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", - "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", - "license": "MIT", - "dependencies": { - "@types/ms": "*", - "@types/node": "*" - } - }, - "node_modules/@types/mapbox__point-geometry": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", - "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==", - "license": "MIT" - }, - "node_modules/@types/mapbox__vector-tile": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz", - "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*", - "@types/mapbox__point-geometry": "*", - "@types/pbf": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/multer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-2.0.0.tgz", - "integrity": "sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==", - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/node": { - "version": "24.10.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.3.tgz", - "integrity": "sha512-gqkrWUsS8hcm0r44yn7/xZeV1ERva/nLgrLxFRUGb7aoNMIJfZJ3AC261zDQuOAKC7MiXai1WCpYc48jAHoShQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/node/node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "license": "MIT" - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", - "license": "MIT" - }, - "node_modules/@types/pbf": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", - "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==", - "license": "MIT" - }, - "node_modules/@types/pg": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.16.0.tgz", - "integrity": "sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.0.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.14.tgz", - "integrity": "sha512-ixLZ7zG7j1fM0DijL9hDArwhwcCb4vqmePgwtV0GfnkHRSCUEv4LvzarcTdhoqgyMznUx/EhoTUv31CKZzkQlw==", - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.6.tgz", - "integrity": "sha512-lo6MuY+rFr8kIiFnr+7TzO+Av0wUPcEcepiPV4epGP0eTQpkDfp9czudg73isV8UxKauCUNlL1N8fXhcnx4iBw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.0.0" - } - }, - "node_modules/@types/react-native-razorpay": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@types/react-native-razorpay/-/react-native-razorpay-2.2.6.tgz", - "integrity": "sha512-8CqZvL53bqs51aLaNXssEaBFN5a09WB5nWEOa1RtNXTnuh9zDyMZ9yKqjN+buVFFOAH4mE9IpB7J1V1I3REnMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-reconciler": { - "version": "0.28.9", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", - "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "license": "MIT" - }, - "node_modules/@types/stats.js": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", - "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", - "license": "MIT" - }, - "node_modules/@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/supercluster": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", - "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/three": { - "version": "0.182.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.182.0.tgz", - "integrity": "sha512-WByN9V3Sbwbe2OkWuSGyoqQO8Du6yhYaXtXLoA5FkKTUJorZ+yOHBZ35zUUPQXlAKABZmbYp5oAqpA4RBjtJ/Q==", - "license": "MIT", - "dependencies": { - "@dimforge/rapier3d-compat": "~0.12.0", - "@tweenjs/tween.js": "~23.1.3", - "@types/stats.js": "*", - "@types/webxr": ">=0.5.17", - "@webgpu/types": "*", - "fflate": "~0.8.2", - "meshoptimizer": "~0.22.0" - } - }, - "node_modules/@types/validator": { - "version": "13.15.10", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", - "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==", - "license": "MIT" - }, - "node_modules/@types/webxr": { - "version": "0.5.24", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", - "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.49.0.tgz", - "integrity": "sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.49.0", - "@typescript-eslint/type-utils": "8.49.0", - "@typescript-eslint/utils": "8.49.0", - "@typescript-eslint/visitor-keys": "8.49.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.49.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.49.0.tgz", - "integrity": "sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.49.0", - "@typescript-eslint/types": "8.49.0", - "@typescript-eslint/typescript-estree": "8.49.0", - "@typescript-eslint/visitor-keys": "8.49.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.49.0.tgz", - "integrity": "sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.49.0", - "@typescript-eslint/types": "^8.49.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/project-service/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.49.0.tgz", - "integrity": "sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.49.0", - "@typescript-eslint/visitor-keys": "8.49.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.49.0.tgz", - "integrity": "sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.49.0.tgz", - "integrity": "sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.49.0", - "@typescript-eslint/typescript-estree": "8.49.0", - "@typescript-eslint/utils": "8.49.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/types": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.49.0.tgz", - "integrity": "sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.49.0.tgz", - "integrity": "sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.49.0", - "@typescript-eslint/tsconfig-utils": "8.49.0", - "@typescript-eslint/types": "8.49.0", - "@typescript-eslint/visitor-keys": "8.49.0", - "debug": "^4.3.4", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.49.0.tgz", - "integrity": "sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.49.0", - "@typescript-eslint/types": "8.49.0", - "@typescript-eslint/typescript-estree": "8.49.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.49.0.tgz", - "integrity": "sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.49.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@urql/core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", - "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", - "license": "MIT", - "dependencies": { - "@0no-co/graphql.web": "^1.0.13", - "wonka": "^6.3.2" - } - }, - "node_modules/@urql/exchange-retry": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", - "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", - "license": "MIT", - "dependencies": { - "@urql/core": "^5.1.2", - "wonka": "^6.3.2" - }, - "peerDependencies": { - "@urql/core": "^5.0.0" - } - }, - "node_modules/@use-gesture/core": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", - "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", - "license": "MIT" - }, - "node_modules/@use-gesture/react": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", - "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", - "license": "MIT", - "dependencies": { - "@use-gesture/core": "10.3.1" - }, - "peerDependencies": { - "react": ">= 16.8.0" - } - }, - "node_modules/@vitejs/plugin-react-swc": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.11.0.tgz", - "integrity": "sha512-YTJCGFdNMHCMfjODYtxRNVAYmTWQ1Lb8PulP/2/f/oEEtglw8oKxKIZmmRkyXrVrHfsKOaVkAc3NT9/dMutO5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "1.0.0-beta.27", - "@swc/core": "^1.12.11" - }, - "peerDependencies": { - "vite": "^4 || ^5 || ^6 || ^7" - } - }, - "node_modules/@webgpu/types": { - "version": "0.1.69", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.69.tgz", - "integrity": "sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/admin-ui": { - "resolved": "apps/admin-ui", - "link": true - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "license": "MIT" - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", - "license": "MIT" - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT" - }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, - "node_modules/assert-never": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.4.0.tgz", - "integrity": "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==", - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "license": "MIT" - }, - "node_modules/async-mutex": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", - "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/autoprefixer": { - "version": "10.4.22", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", - "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001754", - "fraction.js": "^5.3.4", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axios-retry": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.9.1.tgz", - "integrity": "sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.15.4", - "is-retry-allowed": "^2.2.0" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-react-native-web": { - "version": "0.19.13", - "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.19.13.tgz", - "integrity": "sha512-4hHoto6xaN23LCyZgL9LJZc3olmAxd7b6jDzlZnKXAh4rRAbZRKNBJoOOdp46OBqgy+K0t0guTj5/mhA8inymQ==", - "license": "MIT" - }, - "node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.25.1.tgz", - "integrity": "sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ==", - "license": "MIT", - "dependencies": { - "hermes-parser": "0.25.1" - } - }, - "node_modules/babel-plugin-transform-flow-enums": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", - "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-flow": "^7.12.1" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-expo": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-13.2.4.tgz", - "integrity": "sha512-3IKORo3KR+4qtLdCkZNDj8KeA43oBn7RRQejFGWfiZgu/NeaRUSri8YwYjZqybm7hn3nmMv9OLahlvXBX23o5Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/plugin-proposal-decorators": "^7.12.9", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-react": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.79.6", - "babel-plugin-react-native-web": "~0.19.13", - "babel-plugin-syntax-hermes-parser": "^0.25.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "debug": "^4.3.4", - "react-refresh": "^0.14.2", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "babel-plugin-react-compiler": "^19.0.0-beta-e993439-20250405" - }, - "peerDependenciesMeta": { - "babel-plugin-react-compiler": { - "optional": true - } - } - }, - "node_modules/babel-preset-expo/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/babel-preset-expo/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-walk": { - "version": "3.0.0-canary-5", - "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", - "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.9.6" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/backend": { - "resolved": "apps/backend", - "link": true - }, - "node_modules/badgin": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/badgin/-/badgin-1.2.3.tgz", - "integrity": "sha512-NQGA7LcfCpSzIbGRbkgjgdWkjy7HI+Th5VLxTJfW5EeaAf3fnS+xWQaQOCYiny+q6QSvxqoSO04vCx+4u++EJw==", - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.7.tgz", - "integrity": "sha512-k9xFKplee6KIio3IDbwj+uaCLpqzOwakOgmqzPezM0sFJlFKcg30vk2wOiAJtkTSfx0SSQDSe8q+mWA/fSH5Zg==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/bcryptjs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.3.tgz", - "integrity": "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==", - "license": "BSD-3-Clause", - "bin": { - "bcrypt": "bin/bcrypt" - } - }, - "node_modules/better-opn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", - "license": "MIT", - "dependencies": { - "open": "^8.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/better-opn/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.14.0", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/bowser": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", - "integrity": "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==", - "license": "MIT" - }, - "node_modules/bplist-creator": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", - "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", - "license": "MIT", - "dependencies": { - "stream-buffers": "2.2.x" - } - }, - "node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/bullmq": { - "version": "5.66.0", - "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.66.0.tgz", - "integrity": "sha512-LSe8yEiVTllOOq97Q0C/EhczKS5Yd0AUJleGJCIh0cyJE5nWUqEpGC/uZQuuAYniBSoMT8LqwrxE7N5MZVrLoQ==", - "license": "MIT", - "dependencies": { - "cron-parser": "^4.9.0", - "ioredis": "^5.8.2", - "msgpackr": "^1.11.2", - "node-abort-controller": "^3.1.1", - "semver": "^7.5.4", - "tslib": "^2.0.0", - "uuid": "^11.1.0" - } - }, - "node_modules/bullmq/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", - "license": "MIT", - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", - "license": "MIT", - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/camera-controls": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-3.1.0.tgz", - "integrity": "sha512-w5oULNpijgTRH0ARFJJ0R5ct1nUM3R3WP7/b8A6j9uTGpRfnsypc/RBMPQV8JQDPayUe37p/TZZY1PcUr4czOQ==", - "license": "MIT", - "engines": { - "node": ">=20.11.0", - "npm": ">=10.8.2" - }, - "peerDependencies": { - "three": ">=0.126.1" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001760", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", - "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/canvas-confetti": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/canvas-confetti/-/canvas-confetti-1.9.4.tgz", - "integrity": "sha512-yxQbJkAVrFXWNbTUjPqjF7G+g6pDotOUHGbkZq2NELZUMDpiJ85rIEazVb8GTaAptNW2miJAXbs1BtioA251Pw==", - "license": "ISC", - "funding": { - "type": "donate", - "url": "https://www.paypal.me/kirilvatev" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", - "license": "MIT", - "dependencies": { - "is-regex": "^1.0.3" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/chromium-edge-launcher": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", - "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "node_modules/chromium-edge-launcher/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/chromium-edge-launcher/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/chromium-edge-launcher/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chromium-edge-launcher/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/class-transformer": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", - "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==", - "license": "MIT" - }, - "node_modules/class-transformer-validator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/class-transformer-validator/-/class-transformer-validator-0.9.1.tgz", - "integrity": "sha512-83/KFCyd6UiiwH6PlQS5y17O5TTx58CawvNI+XdrMs0Ig9QI5kiuzRqGcC/WrEpd1F7i4KIxCwdn6m4B6fl0jw==", - "license": "MIT", - "peerDependencies": { - "class-transformer": ">=0.2.3", - "class-validator": ">=0.12.0" - } - }, - "node_modules/class-validator": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz", - "integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==", - "license": "MIT", - "dependencies": { - "@types/validator": "^13.15.3", - "libphonenumber-js": "^1.11.1", - "validator": "^13.15.20" - } - }, - "node_modules/class-variance-authority": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", - "license": "Apache-2.0", - "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" - } - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/common-ui": { - "resolved": "packages/ui", - "link": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "engines": [ - "node >= 6.0" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concaveman": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/concaveman/-/concaveman-1.2.1.tgz", - "integrity": "sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==", - "license": "ISC", - "dependencies": { - "point-in-polygon": "^1.1.0", - "rbush": "^3.0.1", - "robust-predicates": "^2.0.4", - "tinyqueue": "^2.0.3" - } - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/constantinople": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", - "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.1" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-es": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-2.0.0.tgz", - "integrity": "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==", - "license": "MIT" - }, - "node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "license": "MIT" - }, - "node_modules/copy-anything": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", - "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", - "license": "MIT", - "dependencies": { - "is-what": "^5.2.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/core-js-compat": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", - "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "license": "MIT", - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/cosmiconfig/node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", - "license": "MIT", - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/cosmiconfig/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cron-parser": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", - "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", - "license": "MIT", - "dependencies": { - "luxon": "^3.2.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-fetch": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", - "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.7.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-in-js-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", - "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", - "license": "MIT", - "dependencies": { - "hyphenate-style-name": "^1.0.3" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-tree/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-geo": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz", - "integrity": "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1" - } - }, - "node_modules/d3-voronoi": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz", - "integrity": "sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==", - "license": "BSD-3-Clause" - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/date-fns": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", - "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/dayjs": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", - "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-gpu": { - "version": "5.0.70", - "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.70.tgz", - "integrity": "sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==", - "license": "MIT", - "dependencies": { - "webgl-constants": "^1.1.1" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "license": "Apache-2.0", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" - }, - "node_modules/diff": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" - }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", - "license": "MIT" - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", - "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", - "license": "BSD-2-Clause", - "dependencies": { - "dotenv": "^16.4.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand/node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/draco3d": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", - "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", - "license": "Apache-2.0" - }, - "node_modules/drizzle-kit": { - "version": "0.31.8", - "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.8.tgz", - "integrity": "sha512-O9EC/miwdnRDY10qRxM8P3Pg8hXe3LyU4ZipReKOgTwn4OqANmftj8XJz1UPUAS6NMHf0E2htjsbQujUTkncCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@drizzle-team/brocli": "^0.10.2", - "@esbuild-kit/esm-loader": "^2.5.5", - "esbuild": "^0.25.4", - "esbuild-register": "^3.5.0" - }, - "bin": { - "drizzle-kit": "bin.cjs" - } - }, - "node_modules/drizzle-orm": { - "version": "0.45.1", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.1.tgz", - "integrity": "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==", - "license": "Apache-2.0", - "peerDependencies": { - "@aws-sdk/client-rds-data": ">=3", - "@cloudflare/workers-types": ">=4", - "@electric-sql/pglite": ">=0.2.0", - "@libsql/client": ">=0.10.0", - "@libsql/client-wasm": ">=0.10.0", - "@neondatabase/serverless": ">=0.10.0", - "@op-engineering/op-sqlite": ">=2", - "@opentelemetry/api": "^1.4.1", - "@planetscale/database": ">=1.13", - "@prisma/client": "*", - "@tidbcloud/serverless": "*", - "@types/better-sqlite3": "*", - "@types/pg": "*", - "@types/sql.js": "*", - "@upstash/redis": ">=1.34.7", - "@vercel/postgres": ">=0.8.0", - "@xata.io/client": "*", - "better-sqlite3": ">=7", - "bun-types": "*", - "expo-sqlite": ">=14.0.0", - "gel": ">=2", - "knex": "*", - "kysely": "*", - "mysql2": ">=2", - "pg": ">=8", - "postgres": ">=3", - "sql.js": ">=1", - "sqlite3": ">=5" - }, - "peerDependenciesMeta": { - "@aws-sdk/client-rds-data": { - "optional": true - }, - "@cloudflare/workers-types": { - "optional": true - }, - "@electric-sql/pglite": { - "optional": true - }, - "@libsql/client": { - "optional": true - }, - "@libsql/client-wasm": { - "optional": true - }, - "@neondatabase/serverless": { - "optional": true - }, - "@op-engineering/op-sqlite": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@prisma/client": { - "optional": true - }, - "@tidbcloud/serverless": { - "optional": true - }, - "@types/better-sqlite3": { - "optional": true - }, - "@types/pg": { - "optional": true - }, - "@types/sql.js": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/postgres": { - "optional": true - }, - "@xata.io/client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "bun-types": { - "optional": true - }, - "expo-sqlite": { - "optional": true - }, - "gel": { - "optional": true - }, - "knex": { - "optional": true - }, - "kysely": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "postgres": { - "optional": true - }, - "prisma": { - "optional": true - }, - "sql.js": { - "optional": true - }, - "sqlite3": { - "optional": true - } - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/dynamic-dedupe": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", - "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" - } - }, - "node_modules/earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", - "license": "ISC" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-editor": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", - "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "license": "MIT" - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "license": "MIT", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/esbuild-register": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", - "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "peerDependencies": { - "esbuild": ">=0.12 <1" - } - }, - "node_modules/esbuild-register/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/esbuild-register/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-expo": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-expo/-/eslint-config-expo-9.2.0.tgz", - "integrity": "sha512-TQgmSx+2mRM7qUS0hB5kTDrHcSC35rA1UzOSgK5YRLmSkSMlKLmXkUrhwOpnyo9D/nHdf4ERRAySRYxgA6dlrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "^8.18.2", - "@typescript-eslint/parser": "^8.18.2", - "eslint-import-resolver-typescript": "^3.6.3", - "eslint-plugin-expo": "^0.1.4", - "eslint-plugin-import": "^2.30.0", - "eslint-plugin-react": "^7.37.3", - "eslint-plugin-react-hooks": "^5.1.0", - "globals": "^16.0.0" - }, - "peerDependencies": { - "eslint": ">=8.10" - } - }, - "node_modules/eslint-config-expo/node_modules/globals": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", - "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", - "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.4.0", - "get-tsconfig": "^4.10.0", - "is-bun-module": "^2.0.0", - "stable-hash": "^0.0.5", - "tinyglobby": "^0.2.13", - "unrs-resolver": "^1.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-import-resolver-typescript" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint-plugin-expo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-expo/-/eslint-plugin-expo-0.1.4.tgz", - "integrity": "sha512-YA7yiMacQbLJySuyJA0Eb5V65obqp6fVOWtw1JdYDRWC5MeToPrnNvhGDpk01Bv3Vm4ownuzUfvi89MXi1d6cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "^8.29.1", - "@typescript-eslint/utils": "^8.29.1", - "eslint": "^9.24.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "eslint": ">=8.10" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.24.tgz", - "integrity": "sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": ">=8.40" - } - }, - "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/exec-async": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", - "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", - "license": "MIT" - }, - "node_modules/expo": { - "version": "53.0.25", - "resolved": "https://registry.npmjs.org/expo/-/expo-53.0.25.tgz", - "integrity": "sha512-KMaIMAd0vKl2ooiDB9XMKTuRAhSmrLdPOEON8Ck9mPmSrJB1FHBs6gb63d5IJTQAE1jBZLZj0JBg6rqRBOrTjg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.0", - "@expo/cli": "0.24.23", - "@expo/config": "~11.0.13", - "@expo/config-plugins": "~10.1.2", - "@expo/fingerprint": "0.13.4", - "@expo/metro-config": "0.20.18", - "@expo/vector-icons": "^14.0.0", - "babel-preset-expo": "~13.2.4", - "expo-asset": "~11.1.7", - "expo-constants": "~17.1.8", - "expo-file-system": "~18.1.11", - "expo-font": "~13.3.2", - "expo-keep-awake": "~14.1.4", - "expo-modules-autolinking": "2.1.14", - "expo-modules-core": "2.5.0", - "react-native-edge-to-edge": "1.6.0", - "whatwg-url-without-unicode": "8.0.0-3" - }, - "bin": { - "expo": "bin/cli", - "expo-modules-autolinking": "bin/autolinking", - "fingerprint": "bin/fingerprint" - }, - "peerDependencies": { - "@expo/dom-webview": "*", - "@expo/metro-runtime": "*", - "react": "*", - "react-native": "*", - "react-native-webview": "*" - }, - "peerDependenciesMeta": { - "@expo/dom-webview": { - "optional": true - }, - "@expo/metro-runtime": { - "optional": true - }, - "react-native-webview": { - "optional": true - } - } - }, - "node_modules/expo-application": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/expo-application/-/expo-application-6.1.5.tgz", - "integrity": "sha512-ToImFmzw8luY043pWFJhh2ZMm4IwxXoHXxNoGdlhD4Ym6+CCmkAvCglg0FK8dMLzAb+/XabmOE7Rbm8KZb6NZg==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-asset": { - "version": "11.1.7", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-11.1.7.tgz", - "integrity": "sha512-b5P8GpjUh08fRCf6m5XPVAh7ra42cQrHBIMgH2UXP+xsj4Wufl6pLy6jRF5w6U7DranUMbsXm8TOyq4EHy7ADg==", - "license": "MIT", - "dependencies": { - "@expo/image-utils": "^0.7.6", - "expo-constants": "~17.1.7" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-auth-session": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/expo-auth-session/-/expo-auth-session-6.2.1.tgz", - "integrity": "sha512-9KgqrGpW7PoNOhxJ7toofi/Dz5BU2TE4Q+ktJZsmDXLoFcNOcvBokh2+mkhG58Qvd/xJ9Z5sAt/5QoOFaPb9wA==", - "license": "MIT", - "dependencies": { - "expo-application": "~6.1.5", - "expo-constants": "~17.1.7", - "expo-crypto": "~14.1.5", - "expo-linking": "~7.1.7", - "expo-web-browser": "~14.2.0", - "invariant": "^2.2.4" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-blur": { - "version": "14.1.5", - "resolved": "https://registry.npmjs.org/expo-blur/-/expo-blur-14.1.5.tgz", - "integrity": "sha512-CCLJHxN4eoAl06ESKT3CbMasJ98WsjF9ZQEJnuxtDb9ffrYbZ+g9ru84fukjNUOTtc8A8yXE5z8NgY1l0OMrmQ==", - "license": "MIT", - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-constants": { - "version": "17.1.8", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-17.1.8.tgz", - "integrity": "sha512-sOCeMN/BWLA7hBP6lMwoEQzFNgTopk6YY03sBAmwT216IHyL54TjNseg8CRU1IQQ/+qinJ2fYWCl7blx2TiNcA==", - "license": "MIT", - "dependencies": { - "@expo/config": "~11.0.13", - "@expo/env": "~1.0.7" - }, - "peerDependencies": { - "expo": "*", - "react-native": "*" - } - }, - "node_modules/expo-crypto": { - "version": "14.1.5", - "resolved": "https://registry.npmjs.org/expo-crypto/-/expo-crypto-14.1.5.tgz", - "integrity": "sha512-ZXJoUMoUeiMNEoSD4itItFFz3cKrit6YJ/BR0hjuwNC+NczbV9rorvhvmeJmrU9O2cFQHhJQQR1fjQnt45Vu4Q==", - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.0" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-dev-client": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-5.2.4.tgz", - "integrity": "sha512-s/N/nK5LPo0QZJpV4aPijxyrzV4O49S3dN8D2fljqrX2WwFZzWwFO6dX1elPbTmddxumdcpczsdUPY+Ms8g43g==", - "license": "MIT", - "dependencies": { - "expo-dev-launcher": "5.1.16", - "expo-dev-menu": "6.1.14", - "expo-dev-menu-interface": "1.10.0", - "expo-manifests": "~0.16.6", - "expo-updates-interface": "~1.1.0" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-dev-launcher": { - "version": "5.1.16", - "resolved": "https://registry.npmjs.org/expo-dev-launcher/-/expo-dev-launcher-5.1.16.tgz", - "integrity": "sha512-tbCske9pvbozaEblyxoyo/97D6od9Ma4yAuyUnXtRET1CKAPKYS+c4fiZ+I3B4qtpZwN3JNFUjG3oateN0y6Hg==", - "license": "MIT", - "dependencies": { - "ajv": "8.11.0", - "expo-dev-menu": "6.1.14", - "expo-manifests": "~0.16.6", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-dev-launcher/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/expo-dev-launcher/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/expo-dev-menu": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/expo-dev-menu/-/expo-dev-menu-6.1.14.tgz", - "integrity": "sha512-yonNMg2GHJZtuisVowdl1iQjZfYP85r1D1IO+ar9D9zlrBPBJhq2XEju52jd1rDmDkmDuEhBSbPNhzIcsBNiPg==", - "license": "MIT", - "dependencies": { - "expo-dev-menu-interface": "1.10.0" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-dev-menu-interface": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/expo-dev-menu-interface/-/expo-dev-menu-interface-1.10.0.tgz", - "integrity": "sha512-NxtM/qot5Rh2cY333iOE87dDg1S8CibW+Wu4WdLua3UMjy81pXYzAGCZGNOeY7k9GpNFqDPNDXWyBSlk9r2pBg==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-device": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/expo-device/-/expo-device-7.1.4.tgz", - "integrity": "sha512-HS04IiE1Fy0FRjBLurr9e5A6yj3kbmQB+2jCZvbSGpsjBnCLdSk/LCii4f5VFhPIBWJLyYuN5QqJyEAw6BcS4Q==", - "license": "MIT", - "dependencies": { - "ua-parser-js": "^0.7.33" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-document-picker": { - "version": "13.1.6", - "resolved": "https://registry.npmjs.org/expo-document-picker/-/expo-document-picker-13.1.6.tgz", - "integrity": "sha512-8FTQPDOkyCvFN/i4xyqzH7ELW4AsB6B3XBZQjn1FEdqpozo6rpNJRr7sWFU/93WrLgA9FJEKpKbyr6XxczK6BA==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-eas-client": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/expo-eas-client/-/expo-eas-client-0.14.4.tgz", - "integrity": "sha512-TSL1BbBFIuXchJmPgbPnB7cGpOOuSGJcQ/L7gij/+zPjExwvKm5ckA5dlSulwoFhH8zQt4vb7bfISPSAWQVWBw==", - "license": "MIT" - }, - "node_modules/expo-file-system": { - "version": "18.1.11", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-18.1.11.tgz", - "integrity": "sha512-HJw/m0nVOKeqeRjPjGdvm+zBi5/NxcdPf8M8P3G2JFvH5Z8vBWqVDic2O58jnT1OFEy0XXzoH9UqFu7cHg9DTQ==", - "license": "MIT", - "peerDependencies": { - "expo": "*", - "react-native": "*" - } - }, - "node_modules/expo-font": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-13.3.2.tgz", - "integrity": "sha512-wUlMdpqURmQ/CNKK/+BIHkDA5nGjMqNlYmW0pJFXY/KE/OG80Qcavdu2sHsL4efAIiNGvYdBS10WztuQYU4X0A==", - "license": "MIT", - "dependencies": { - "fontfaceobserver": "^2.1.0" - }, - "peerDependencies": { - "expo": "*", - "react": "*" - } - }, - "node_modules/expo-haptics": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/expo-haptics/-/expo-haptics-14.1.4.tgz", - "integrity": "sha512-QZdE3NMX74rTuIl82I+n12XGwpDWKb8zfs5EpwsnGi/D/n7O2Jd4tO5ivH+muEG/OCJOMq5aeaVDqqaQOhTkcA==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-image": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/expo-image/-/expo-image-2.4.1.tgz", - "integrity": "sha512-yHp0Cy4ylOYyLR21CcH6i70DeRyLRPc0yAIPFPn4BT/BpkJNaX5QMXDppcHa58t4WI3Bb8QRJRLuAQaeCtDF8A==", - "license": "MIT", - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*", - "react-native-web": "*" - }, - "peerDependenciesMeta": { - "react-native-web": { - "optional": true - } - } - }, - "node_modules/expo-image-loader": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-5.1.0.tgz", - "integrity": "sha512-sEBx3zDQIODWbB5JwzE7ZL5FJD+DK3LVLWBVJy6VzsqIA6nDEnSFnsnWyCfCTSvbGigMATs1lgkC2nz3Jpve1Q==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-image-picker": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-16.1.4.tgz", - "integrity": "sha512-bTmmxtw1AohUT+HxEBn2vYwdeOrj1CLpMXKjvi9FKSoSbpcarT4xxI0z7YyGwDGHbrJqyyic3I9TTdP2J2b4YA==", - "license": "MIT", - "dependencies": { - "expo-image-loader": "~5.1.0" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-json-utils": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-0.15.0.tgz", - "integrity": "sha512-duRT6oGl80IDzH2LD2yEFWNwGIC2WkozsB6HF3cDYNoNNdUvFk6uN3YiwsTsqVM/D0z6LEAQ01/SlYvN+Fw0JQ==", - "license": "MIT" - }, - "node_modules/expo-keep-awake": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-14.1.4.tgz", - "integrity": "sha512-wU9qOnosy4+U4z/o4h8W9PjPvcFMfZXrlUoKTMBW7F4pLqhkkP/5G4EviPZixv4XWFMjn1ExQ5rV6BX8GwJsWA==", - "license": "MIT", - "peerDependencies": { - "expo": "*", - "react": "*" - } - }, - "node_modules/expo-linear-gradient": { - "version": "14.1.5", - "resolved": "https://registry.npmjs.org/expo-linear-gradient/-/expo-linear-gradient-14.1.5.tgz", - "integrity": "sha512-BSN3MkSGLZoHMduEnAgfhoj3xqcDWaoICgIr4cIYEx1GcHfKMhzA/O4mpZJ/WC27BP1rnAqoKfbclk1eA70ndQ==", - "license": "MIT", - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-linking": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-7.1.7.tgz", - "integrity": "sha512-ZJaH1RIch2G/M3hx2QJdlrKbYFUTOjVVW4g39hfxrE5bPX9xhZUYXqxqQtzMNl1ylAevw9JkgEfWbBWddbZ3UA==", - "license": "MIT", - "dependencies": { - "expo-constants": "~17.1.7", - "invariant": "^2.2.4" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-location": { - "version": "18.1.6", - "resolved": "https://registry.npmjs.org/expo-location/-/expo-location-18.1.6.tgz", - "integrity": "sha512-l5dQQ2FYkrBgNzaZN1BvSmdhhcztFOUucu2kEfDBMV4wSIuTIt/CKsho+F3RnAiWgvui1wb1WTTf80E8zq48hA==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-manifests": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/expo-manifests/-/expo-manifests-0.16.6.tgz", - "integrity": "sha512-1A+do6/mLUWF9xd3uCrlXr9QFDbjbfqAYmUy8UDLOjof1lMrOhyeC4Yi6WexA/A8dhZEpIxSMCKfn7G4aHAh4w==", - "license": "MIT", - "dependencies": { - "@expo/config": "~11.0.12", - "expo-json-utils": "~0.15.0" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-modules-autolinking": { - "version": "2.1.14", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-2.1.14.tgz", - "integrity": "sha512-nT5ERXwc+0ZT/pozDoJjYZyUQu5RnXMk9jDGm5lg+PiKvsrCTSA/2/eftJGMxLkTjVI2MXp5WjSz3JRjbA7UXA==", - "license": "MIT", - "dependencies": { - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "find-up": "^5.0.0", - "glob": "^10.4.2", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0" - }, - "bin": { - "expo-modules-autolinking": "bin/expo-modules-autolinking.js" - } - }, - "node_modules/expo-modules-core": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-2.5.0.tgz", - "integrity": "sha512-aIbQxZE2vdCKsolQUl6Q9Farlf8tjh/ROR4hfN1qT7QBGPl1XrJGnaOKkcgYaGrlzCPg/7IBe0Np67GzKMZKKQ==", - "license": "MIT", - "dependencies": { - "invariant": "^2.2.4" - } - }, - "node_modules/expo-notifications": { - "version": "0.31.4", - "resolved": "https://registry.npmjs.org/expo-notifications/-/expo-notifications-0.31.4.tgz", - "integrity": "sha512-NnGKIFGpgZU66qfiFUyjEBYsS77VahURpSSeWEOLt+P1zOaUFlgx2XqS+dxH3/Bn1Vm7TMj04qKsK5KvzR/8Lw==", - "license": "MIT", - "dependencies": { - "@expo/image-utils": "^0.7.6", - "@ide/backoff": "^1.0.0", - "abort-controller": "^3.0.0", - "assert": "^2.0.0", - "badgin": "^1.1.5", - "expo-application": "~6.1.5", - "expo-constants": "~17.1.7" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-router": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/expo-router/-/expo-router-5.1.10.tgz", - "integrity": "sha512-Txi2KX5iF5D+60n8vhgWFlmbxHOjaAO7y/VuQa+WdCh0nuyEJkJEmza2kt+nvH/JCi8sYIGU2ZDNNejObN6sDg==", - "license": "MIT", - "dependencies": { - "@expo/metro-runtime": "5.0.5", - "@expo/schema-utils": "^0.1.0", - "@expo/server": "^0.6.3", - "@radix-ui/react-slot": "1.2.0", - "@react-navigation/bottom-tabs": "^7.3.10", - "@react-navigation/native": "^7.1.6", - "@react-navigation/native-stack": "^7.3.10", - "client-only": "^0.0.1", - "invariant": "^2.2.4", - "react-fast-compare": "^3.2.2", - "react-native-is-edge-to-edge": "^1.1.6", - "semver": "~7.6.3", - "server-only": "^0.0.1", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "@react-navigation/drawer": "^7.3.9", - "expo": "*", - "expo-constants": "*", - "expo-linking": "*", - "react-native-reanimated": "*", - "react-native-safe-area-context": "*", - "react-native-screens": "*", - "react-server-dom-webpack": "~19.0.3 || ~19.1.4 || ~19.2.3" - }, - "peerDependenciesMeta": { - "@react-navigation/drawer": { - "optional": true - }, - "@testing-library/jest-native": { - "optional": true - }, - "react-native-reanimated": { - "optional": true - }, - "react-server-dom-webpack": { - "optional": true - } - } - }, - "node_modules/expo-router/node_modules/@radix-ui/react-slot": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz", - "integrity": "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/expo-router/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/expo-secure-store": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/expo-secure-store/-/expo-secure-store-14.2.4.tgz", - "integrity": "sha512-ePaz4fnTitJJZjAiybaVYGfLWWyaEtepZC+vs9ZBMhQMfG5HUotIcVsDaSo3FnwpHmgwsLVPY2qFeryI6AtULw==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-server-sdk": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/expo-server-sdk/-/expo-server-sdk-5.0.0.tgz", - "integrity": "sha512-GEp1XYLU80iS/hdRo3c2n092E8TgTXcHSuw6Lw68dSoWaAgiLPI2R+e5hp5+hGF1TtJZOi2nxtJX63+XA3iz9g==", - "license": "MIT", - "dependencies": { - "promise-limit": "^2.7.0", - "promise-retry": "^2.0.1", - "undici": "^7.2.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/expo-server-sdk/node_modules/undici": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.21.0.tgz", - "integrity": "sha512-Hn2tCQpoDt1wv23a68Ctc8Cr/BHpUSfaPYrkajTXOS9IKpxVRx/X5m1K2YkbK2ipgZgxXSgsUinl3x+2YdSSfg==", - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/expo-splash-screen": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.30.10.tgz", - "integrity": "sha512-Tt9va/sLENQDQYeOQ6cdLdGvTZ644KR3YG9aRlnpcs2/beYjOX1LHT510EGzVN9ljUTg+1ebEo5GGt2arYtPjw==", - "license": "MIT", - "dependencies": { - "@expo/prebuild-config": "^9.0.10" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-status-bar": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-2.2.3.tgz", - "integrity": "sha512-+c8R3AESBoduunxTJ8353SqKAKpxL6DvcD8VKBuh81zzJyUUbfB4CVjr1GufSJEKsMzNPXZU+HJwXx7Xh7lx8Q==", - "license": "MIT", - "dependencies": { - "react-native-edge-to-edge": "1.6.0", - "react-native-is-edge-to-edge": "^1.1.6" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-structured-headers": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/expo-structured-headers/-/expo-structured-headers-4.1.0.tgz", - "integrity": "sha512-2X+aUNzC/qaw7/WyUhrVHNDB0uQ5rE12XA2H/rJXaAiYQSuOeU90ladaN0IJYV9I2XlhYrjXLktLXWbO7zgbag==", - "license": "MIT" - }, - "node_modules/expo-symbols": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/expo-symbols/-/expo-symbols-0.4.5.tgz", - "integrity": "sha512-ZbgvJfACPfWaJxJrUd0YzDmH9X0Ci7vb5m0/ZpDz/tnF1vQJlkovvpFEHLUmCDSLIN7/fNK8t696KSpzfm8/kg==", - "license": "MIT", - "dependencies": { - "sf-symbols-typescript": "^2.0.0" - }, - "peerDependencies": { - "expo": "*", - "react-native": "*" - } - }, - "node_modules/expo-system-ui": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-5.0.11.tgz", - "integrity": "sha512-PG5VdaG5cwBe1Rj02mJdnsihKl9Iw/w/a6+qh2mH3f2K/IvQ+Hf7aG2kavSADtkGNCNj7CEIg7Rn4DQz/SE5rQ==", - "license": "MIT", - "dependencies": { - "@react-native/normalize-colors": "0.79.6", - "debug": "^4.3.2" - }, - "peerDependencies": { - "expo": "*", - "react-native": "*", - "react-native-web": "*" - }, - "peerDependenciesMeta": { - "react-native-web": { - "optional": true - } - } - }, - "node_modules/expo-system-ui/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/expo-system-ui/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/expo-updates": { - "version": "0.28.17", - "resolved": "https://registry.npmjs.org/expo-updates/-/expo-updates-0.28.17.tgz", - "integrity": "sha512-OiKDrKk6EoBRP9AoK7/4tyj9lVtHw2IfaETIFeUCHMgx5xjgKGX/jjSwqhk8N9BJgLDIy0oD0Sb0MaEbSBb3lg==", - "license": "MIT", - "dependencies": { - "@expo/code-signing-certificates": "0.0.5", - "@expo/config": "~11.0.13", - "@expo/config-plugins": "~10.1.2", - "@expo/spawn-async": "^1.7.2", - "arg": "4.1.0", - "chalk": "^4.1.2", - "expo-eas-client": "~0.14.4", - "expo-manifests": "~0.16.6", - "expo-structured-headers": "~4.1.0", - "expo-updates-interface": "~1.1.0", - "glob": "^10.4.2", - "ignore": "^5.3.1", - "resolve-from": "^5.0.0" - }, - "bin": { - "expo-updates": "bin/cli.js" - }, - "peerDependencies": { - "expo": "*", - "react": "*" - } - }, - "node_modules/expo-updates-interface": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-1.1.0.tgz", - "integrity": "sha512-DeB+fRe0hUDPZhpJ4X4bFMAItatFBUPjw/TVSbJsaf3Exeami+2qbbJhWkcTMoYHOB73nOIcaYcWXYJnCJXO0w==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-updates/node_modules/arg": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", - "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", - "license": "MIT" - }, - "node_modules/expo-updates/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/expo-web-browser": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/expo-web-browser/-/expo-web-browser-14.2.0.tgz", - "integrity": "sha512-6S51d8pVlDRDsgGAp8BPpwnxtyKiMWEFdezNz+5jVIyT+ctReW42uxnjRgtsdn5sXaqzhaX+Tzk/CWaKCyC0hw==", - "license": "MIT", - "peerDependencies": { - "expo": "*", - "react-native": "*" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "license": "Apache-2.0" - }, - "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/body-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/express/node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/iconv-lite": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", - "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/express/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/express/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/express/node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/express/node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/express/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fallback-ui": { - "resolved": "apps/fallback-ui", - "link": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^2.1.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fbjs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", - "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", - "license": "MIT", - "dependencies": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^1.0.35" - } - }, - "node_modules/fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", - "license": "MIT" - }, - "node_modules/fbjs/node_modules/ua-parser-js": { - "version": "1.0.41", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", - "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "MIT", - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "license": "MIT" - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/flow-enums-runtime": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", - "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "license": "MIT" - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/fontfaceobserver": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", - "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", - "license": "BSD-2-Clause" - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formik": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/formik/-/formik-2.4.9.tgz", - "integrity": "sha512-5nI94BMnlFDdQRBY4Sz39WkhxajZJ57Fzs8wVbtsQlm5ScKIR1QLYqv/ultBnobObtlUyxpxoLodpixrsf36Og==", - "funding": [ - { - "type": "individual", - "url": "https://opencollective.com/formik" - } - ], - "license": "Apache-2.0", - "dependencies": { - "@types/hoist-non-react-statics": "^3.3.1", - "deepmerge": "^2.1.1", - "hoist-non-react-statics": "^3.3.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "react-fast-compare": "^2.0.1", - "tiny-warning": "^1.0.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/formik/node_modules/deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/formik/node_modules/react-fast-compare": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", - "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==", - "license": "MIT" - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/freeport-async": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", - "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/fuse.js": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz", - "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/geojson-equality-ts": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/geojson-equality-ts/-/geojson-equality-ts-1.0.2.tgz", - "integrity": "sha512-h3Ryq+0mCSN/7yLs0eDgrZhvc9af23o/QuC4aTiuuzP/MRCtd6mf5rLsLRY44jX0RPUfM8c4GqERQmlUxPGPoQ==", - "license": "MIT", - "dependencies": { - "@types/geojson": "^7946.0.14" - } - }, - "node_modules/geojson-polygon-self-intersections": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/geojson-polygon-self-intersections/-/geojson-polygon-self-intersections-1.2.1.tgz", - "integrity": "sha512-/QM1b5u2d172qQVO//9CGRa49jEmclKEsYOQmWP9ooEjj63tBM51m2805xsbxkzlEELQ2REgTf700gUhhlegxA==", - "license": "MIT", - "dependencies": { - "rbush": "^2.0.1" - } - }, - "node_modules/geojson-polygon-self-intersections/node_modules/quickselect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz", - "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==", - "license": "ISC" - }, - "node_modules/geojson-polygon-self-intersections/node_modules/rbush": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz", - "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==", - "license": "MIT", - "dependencies": { - "quickselect": "^1.0.1" - } - }, - "node_modules/geojson-vt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", - "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==", - "license": "ISC" - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/getenv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", - "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/gl-matrix": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", - "integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==", - "license": "MIT" - }, - "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-prefix": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", - "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", - "license": "MIT", - "dependencies": { - "ini": "^4.1.3", - "kind-of": "^6.0.3", - "which": "^4.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/global-prefix/node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/global-prefix/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/glsl-noise": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", - "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==", - "license": "MIT" - }, - "node_modules/goober": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.18.tgz", - "integrity": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==", - "license": "MIT", - "peerDependencies": { - "csstype": "^3.0.10" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hermes-estree": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "license": "MIT" - }, - "node_modules/hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "license": "MIT", - "dependencies": { - "hermes-estree": "0.25.1" - } - }, - "node_modules/hls.js": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.15.tgz", - "integrity": "sha512-E3a5VwgXimGHwpRGV+WxRTKeSp2DW5DI5MWv34ulL3t5UNmyJWCQ1KmLEHbYzcfThfXG8amBL+fCYPneGHC4VA==", - "license": "Apache-2.0" - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/hyphenate-style-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", - "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", - "license": "BSD-3-Clause" - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", - "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", - "license": "MIT", - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/inline-style-prefixer": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz", - "integrity": "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==", - "license": "MIT", - "dependencies": { - "css-in-js-utils": "^3.1.0" - } - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ioredis": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.8.2.tgz", - "integrity": "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==", - "license": "MIT", - "dependencies": { - "@ioredis/commands": "1.4.0", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, - "node_modules/ioredis/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/ioredis/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bun-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", - "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.7.1" - } - }, - "node_modules/is-bun-module/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-expression": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", - "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "object-assign": "^4.1.1" - } - }, - "node_modules/is-expression/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-retry-allowed": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", - "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-what": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", - "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isbot": { - "version": "5.1.32", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.32.tgz", - "integrity": "sha512-VNfjM73zz2IBZmdShMfAUg10prm6t7HFUQmNAEOAVS4YH92ZrZcvkMcGX6cIgBJAzWDzPent/EeAtYEHNPNPBQ==", - "license": "Unlicense", - "engines": { - "node": ">=18" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/its-fine": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-2.0.0.tgz", - "integrity": "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==", - "license": "MIT", - "dependencies": { - "@types/react-reconciler": "^0.28.9" - }, - "peerDependencies": { - "react": "^19.0.0" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jimp-compact": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", - "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", - "license": "MIT" - }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", - "license": "MIT" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsc-safe-url": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", - "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "license": "0BSD" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-pretty-compact": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", - "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", - "license": "MIT", - "dependencies": { - "jws": "^4.0.1", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jstransformer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", - "license": "MIT", - "dependencies": { - "is-promise": "^2.0.0", - "promise": "^7.0.1" - } - }, - "node_modules/jsts": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/jsts/-/jsts-2.7.1.tgz", - "integrity": "sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==", - "license": "(EDL-1.0 OR EPL-1.0)", - "engines": { - "node": ">= 12" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwt-decode": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", - "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/kdbush": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", - "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==", - "license": "ISC" - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lan-network": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", - "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", - "license": "MIT", - "bin": { - "lan-network": "dist/lan-network-cli.js" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/libphonenumber-js": { - "version": "1.12.31", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.31.tgz", - "integrity": "sha512-Z3IhgVgrqO1S5xPYM3K5XwbkDasU67/Vys4heW+lfSBALcUZjeIIzI8zCLifY+OCzSq+fpDdywMDa7z+4srJPQ==", - "license": "MIT" - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lightningcss": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.27.0.tgz", - "integrity": "sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==", - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.27.0", - "lightningcss-darwin-x64": "1.27.0", - "lightningcss-freebsd-x64": "1.27.0", - "lightningcss-linux-arm-gnueabihf": "1.27.0", - "lightningcss-linux-arm64-gnu": "1.27.0", - "lightningcss-linux-arm64-musl": "1.27.0", - "lightningcss-linux-x64-gnu": "1.27.0", - "lightningcss-linux-x64-musl": "1.27.0", - "lightningcss-win32-arm64-msvc": "1.27.0", - "lightningcss-win32-x64-msvc": "1.27.0" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.27.0.tgz", - "integrity": "sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.27.0.tgz", - "integrity": "sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.27.0.tgz", - "integrity": "sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.27.0.tgz", - "integrity": "sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.27.0.tgz", - "integrity": "sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.27.0.tgz", - "integrity": "sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.27.0.tgz", - "integrity": "sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.27.0.tgz", - "integrity": "sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.27.0.tgz", - "integrity": "sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz", - "integrity": "sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", - "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "license": "MIT" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT" - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "license": "MIT", - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/log-symbols/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/luxon": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/maath": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", - "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", - "license": "MIT", - "peerDependencies": { - "@types/three": ">=0.134.0", - "three": ">=0.134.0" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/maplibre-gl": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.7.1.tgz", - "integrity": "sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA==", - "license": "BSD-3-Clause", - "dependencies": { - "@mapbox/geojson-rewind": "^0.5.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^2.0.6", - "@mapbox/unitbezier": "^0.0.1", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "@maplibre/maplibre-gl-style-spec": "^20.3.1", - "@types/geojson": "^7946.0.14", - "@types/geojson-vt": "3.2.5", - "@types/mapbox__point-geometry": "^0.1.4", - "@types/mapbox__vector-tile": "^1.3.4", - "@types/pbf": "^3.0.5", - "@types/supercluster": "^7.1.3", - "earcut": "^3.0.0", - "geojson-vt": "^4.0.2", - "gl-matrix": "^3.4.3", - "global-prefix": "^4.0.0", - "kdbush": "^4.0.2", - "murmurhash-js": "^1.0.0", - "pbf": "^3.3.0", - "potpack": "^2.0.0", - "quickselect": "^3.0.0", - "supercluster": "^8.0.1", - "tinyqueue": "^3.0.0", - "vt-pbf": "^3.1.3" - }, - "engines": { - "node": ">=16.14.0", - "npm": ">=8.1.0" - }, - "funding": { - "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" - } - }, - "node_modules/maplibre-gl/node_modules/earcut": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", - "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", - "license": "ISC" - }, - "node_modules/maplibre-gl/node_modules/quickselect": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", - "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", - "license": "ISC" - }, - "node_modules/maplibre-gl/node_modules/tinyqueue": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", - "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", - "license": "ISC" - }, - "node_modules/marky": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", - "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "license": "Apache-2.0" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "license": "CC0-1.0" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "license": "MIT" - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/meshline": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", - "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", - "license": "MIT", - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/meshoptimizer": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.22.0.tgz", - "integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==", - "license": "MIT" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/metro": { - "version": "0.82.5", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.82.5.tgz", - "integrity": "sha512-8oAXxL7do8QckID/WZEKaIFuQJFUTLzfVcC48ghkHhNK2RGuQq8Xvf4AVd+TUA0SZtX0q8TGNXZ/eba1ckeGCg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "@babel/types": "^7.25.2", - "accepts": "^1.3.7", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "error-stack-parser": "^2.0.6", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.29.1", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.82.5", - "metro-cache": "0.82.5", - "metro-cache-key": "0.82.5", - "metro-config": "0.82.5", - "metro-core": "0.82.5", - "metro-file-map": "0.82.5", - "metro-resolver": "0.82.5", - "metro-runtime": "0.82.5", - "metro-source-map": "0.82.5", - "metro-symbolicate": "0.82.5", - "metro-transform-plugins": "0.82.5", - "metro-transform-worker": "0.82.5", - "mime-types": "^2.1.27", - "nullthrows": "^1.1.1", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "throat": "^5.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "bin": { - "metro": "src/cli.js" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-babel-transformer": { - "version": "0.82.5", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.82.5.tgz", - "integrity": "sha512-W/scFDnwJXSccJYnOFdGiYr9srhbHPdxX9TvvACOFsIXdLilh3XuxQl/wXW6jEJfgIb0jTvoTlwwrqvuwymr6Q==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.29.1", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", - "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "license": "MIT" - }, - "node_modules/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", - "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", - "license": "MIT", - "dependencies": { - "hermes-estree": "0.29.1" - } - }, - "node_modules/metro-cache": { - "version": "0.82.5", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.82.5.tgz", - "integrity": "sha512-AwHV9607xZpedu1NQcjUkua8v7HfOTKfftl6Vc9OGr/jbpiJX6Gpy8E/V9jo/U9UuVYX2PqSUcVNZmu+LTm71Q==", - "license": "MIT", - "dependencies": { - "exponential-backoff": "^3.1.1", - "flow-enums-runtime": "^0.0.6", - "https-proxy-agent": "^7.0.5", - "metro-core": "0.82.5" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-cache-key": { - "version": "0.82.5", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.82.5.tgz", - "integrity": "sha512-qpVmPbDJuRLrT4kcGlUouyqLGssJnbTllVtvIgXfR7ZuzMKf0mGS+8WzcqzNK8+kCyakombQWR0uDd8qhWGJcA==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-config": { - "version": "0.82.5", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.82.5.tgz", - "integrity": "sha512-/r83VqE55l0WsBf8IhNmc/3z71y2zIPe5kRSuqA5tY/SL/ULzlHUJEMd1szztd0G45JozLwjvrhAzhDPJ/Qo/g==", - "license": "MIT", - "dependencies": { - "connect": "^3.6.5", - "cosmiconfig": "^5.0.5", - "flow-enums-runtime": "^0.0.6", - "jest-validate": "^29.7.0", - "metro": "0.82.5", - "metro-cache": "0.82.5", - "metro-core": "0.82.5", - "metro-runtime": "0.82.5" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-core": { - "version": "0.82.5", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.82.5.tgz", - "integrity": "sha512-OJL18VbSw2RgtBm1f2P3J5kb892LCVJqMvslXxuxjAPex8OH7Eb8RBfgEo7VZSjgb/LOf4jhC4UFk5l5tAOHHA==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.82.5" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-file-map": { - "version": "0.82.5", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.82.5.tgz", - "integrity": "sha512-vpMDxkGIB+MTN8Af5hvSAanc6zXQipsAUO+XUx3PCQieKUfLwdoa8qaZ1WAQYRpaU+CJ8vhBcxtzzo3d9IsCIQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "fb-watchman": "^2.0.0", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-file-map/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/metro-file-map/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/metro-minify-terser": { - "version": "0.82.5", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.82.5.tgz", - "integrity": "sha512-v6Nx7A4We6PqPu/ta1oGTqJ4Usz0P7c+3XNeBxW9kp8zayS3lHUKR0sY0wsCHInxZlNAEICx791x+uXytFUuwg==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "terser": "^5.15.0" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-resolver": { - "version": "0.82.5", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.82.5.tgz", - "integrity": "sha512-kFowLnWACt3bEsuVsaRNgwplT8U7kETnaFHaZePlARz4Fg8tZtmRDUmjaD68CGAwc0rwdwNCkWizLYpnyVcs2g==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-runtime": { - "version": "0.82.5", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.82.5.tgz", - "integrity": "sha512-rQZDoCUf7k4Broyw3Ixxlq5ieIPiR1ULONdpcYpbJQ6yQ5GGEyYjtkztGD+OhHlw81LCR2SUAoPvtTus2WDK5g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.0", - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-source-map": { - "version": "0.82.5", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.82.5.tgz", - "integrity": "sha512-wH+awTOQJVkbhn2SKyaw+0cd+RVSCZ3sHVgyqJFQXIee/yLs3dZqKjjeKKhhVeudgjXo7aE/vSu/zVfcQEcUfw==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.3", - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-symbolicate": "0.82.5", - "nullthrows": "^1.1.1", - "ob1": "0.82.5", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-symbolicate": { - "version": "0.82.5", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.82.5.tgz", - "integrity": "sha512-1u+07gzrvYDJ/oNXuOG1EXSvXZka/0JSW1q2EYBWerVKMOhvv9JzDGyzmuV7hHbF2Hg3T3S2uiM36sLz1qKsiw==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-source-map": "0.82.5", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "bin": { - "metro-symbolicate": "src/index.js" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-transform-plugins": { - "version": "0.82.5", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.82.5.tgz", - "integrity": "sha512-57Bqf3rgq9nPqLrT2d9kf/2WVieTFqsQ6qWHpEng5naIUtc/Iiw9+0bfLLWSAw0GH40iJ4yMjFcFJDtNSYynMA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "flow-enums-runtime": "^0.0.6", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-transform-worker": { - "version": "0.82.5", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.82.5.tgz", - "integrity": "sha512-mx0grhAX7xe+XUQH6qoHHlWedI8fhSpDGsfga7CpkO9Lk9W+aPitNtJWNGrW8PfjKEWbT9Uz9O50dkI8bJqigw==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "metro": "0.82.5", - "metro-babel-transformer": "0.82.5", - "metro-cache": "0.82.5", - "metro-cache-key": "0.82.5", - "metro-minify-terser": "0.82.5", - "metro-source-map": "0.82.5", - "metro-transform-plugins": "0.82.5", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "license": "MIT" - }, - "node_modules/metro/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/metro/node_modules/hermes-estree": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", - "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "license": "MIT" - }, - "node_modules/metro/node_modules/hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", - "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", - "license": "MIT", - "dependencies": { - "hermes-estree": "0.29.1" - } - }, - "node_modules/metro/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/metro/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/msgpackr": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.5.tgz", - "integrity": "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==", - "license": "MIT", - "optionalDependencies": { - "msgpackr-extract": "^3.0.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.2.2" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" - } - }, - "node_modules/multer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", - "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", - "license": "MIT", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.6.0", - "concat-stream": "^2.0.0", - "mkdirp": "^0.5.6", - "object-assign": "^4.1.1", - "type-is": "^1.6.18", - "xtend": "^4.0.2" - }, - "engines": { - "node": ">= 10.16.0" - } - }, - "node_modules/multer/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/murmurhash-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", - "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", - "license": "MIT" - }, - "node_modules/mylas": { - "version": "2.1.14", - "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.14.tgz", - "integrity": "sha512-BzQguy9W9NJgoVn2mRWzbFrFWWztGCcng2QI9+41frfk+Athwgx3qhqhvStz7ExeUUu7Kzw427sNzHpEZNINog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/raouldeheer" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-postinstall": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", - "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/nested-error-stacks": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", - "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", - "license": "MIT" - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "license": "MIT" - }, - "node_modules/node-cron": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-4.2.1.tgz", - "integrity": "sha512-lgimEHPE/QDgFlywTd8yTR61ptugX3Qer29efeyWw2rv259HtGBNn1vZVmp8lB9uo9wC0t/AT4iGqXxia+CJFg==", - "license": "ISC", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", - "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.1" - }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/node-gyp-build-optional-packages/node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-package-arg": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "license": "MIT" - }, - "node_modules/ob1": { - "version": "0.82.5", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.82.5.tgz", - "integrity": "sha512-QyQQ6e66f+Ut/qUVjEce0E/wux5nAGLXYZDn1jr15JWstHsCH3l6VVrg8NKDptW9NEiBXKOJeGF/ydxeSDF3IQ==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", - "license": "MIT", - "dependencies": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/ora/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ora/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/parse-png": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", - "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", - "license": "MIT", - "dependencies": { - "pngjs": "^3.3.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pbf": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", - "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", - "license": "BSD-3-Clause", - "dependencies": { - "ieee754": "^1.1.12", - "resolve-protobuf-schema": "^2.1.0" - }, - "bin": { - "pbf": "bin/pbf" - } - }, - "node_modules/pg": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", - "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", - "license": "MIT", - "dependencies": { - "pg-connection-string": "^2.12.0", - "pg-pool": "^3.13.0", - "pg-protocol": "^1.13.0", - "pg-types": "2.2.0", - "pgpass": "1.0.5" - }, - "engines": { - "node": ">= 16.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.3.0" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, - "node_modules/pg-cloudflare": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz", - "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==", - "license": "MIT", - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.12.0.tgz", - "integrity": "sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==", - "license": "MIT" - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "license": "ISC", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-pool": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.13.0.tgz", - "integrity": "sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==", - "license": "MIT", - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.13.0.tgz", - "integrity": "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==", - "license": "MIT" - }, - "node_modules/pg-sdk-node": { - "version": "2.0.3", - "resolved": "https://phonepe.mycloudrepo.io/public/repositories/phonepe-pg-sdk-node/releases/v2/phonepe-pg-sdk-node.tgz", - "integrity": "sha512-LrSmv/sNidJa99RmPqfDgGg8X7RUkawhgzkJhZ8dd8rk4zqa5p1oFjp52jDehbfp1KwU+TxPqWQq5AvJAqMskw==", - "license": "Apache-2.0", - "dependencies": { - "async-mutex": "^0.5.0", - "axios": "^1.2.1", - "axios-retry": "^3.2.0", - "class-transformer": "^0.4.0", - "class-transformer-validator": "^0.9.1", - "class-validator": "^0.14.1" - } - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "license": "MIT", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "license": "MIT", - "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", - "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/plimit-lit": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", - "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "queue-lit": "^1.5.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/point-in-polygon": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz", - "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==", - "license": "MIT" - }, - "node_modules/point-in-polygon-hao": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/point-in-polygon-hao/-/point-in-polygon-hao-1.2.4.tgz", - "integrity": "sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ==", - "license": "MIT", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, - "node_modules/point-in-polygon-hao/node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", - "license": "Unlicense" - }, - "node_modules/polyclip-ts": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/polyclip-ts/-/polyclip-ts-0.16.8.tgz", - "integrity": "sha512-JPtKbDRuPEuAjuTdhR62Gph7Is2BS1Szx69CFOO3g71lpJDFo78k4tFyi+qFOMVPePEzdSKkpGU3NBXPHHjvKQ==", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.1.0", - "splaytree-ts": "^1.0.2" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", - "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/potpack": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.1.0.tgz", - "integrity": "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==", - "license": "ISC" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "license": "MIT", - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/promise-limit": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/promise-limit/-/promise-limit-2.7.0.tgz", - "integrity": "sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==", - "license": "ISC" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/promise-worker-transferable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", - "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", - "license": "Apache-2.0", - "dependencies": { - "is-promise": "^2.1.0", - "lie": "^3.0.2" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/property-expr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", - "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==", - "license": "MIT" - }, - "node_modules/protocol-buffers-schema": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", - "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", - "license": "MIT" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pug": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", - "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", - "license": "MIT", - "dependencies": { - "pug-code-gen": "^3.0.3", - "pug-filters": "^4.0.0", - "pug-lexer": "^5.0.1", - "pug-linker": "^4.0.0", - "pug-load": "^3.0.0", - "pug-parser": "^6.0.0", - "pug-runtime": "^3.0.1", - "pug-strip-comments": "^2.0.0" - } - }, - "node_modules/pug-attrs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", - "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", - "license": "MIT", - "dependencies": { - "constantinople": "^4.0.1", - "js-stringify": "^1.0.2", - "pug-runtime": "^3.0.0" - } - }, - "node_modules/pug-code-gen": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", - "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", - "license": "MIT", - "dependencies": { - "constantinople": "^4.0.1", - "doctypes": "^1.1.0", - "js-stringify": "^1.0.2", - "pug-attrs": "^3.0.0", - "pug-error": "^2.1.0", - "pug-runtime": "^3.0.1", - "void-elements": "^3.1.0", - "with": "^7.0.0" - } - }, - "node_modules/pug-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", - "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==", - "license": "MIT" - }, - "node_modules/pug-filters": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", - "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", - "license": "MIT", - "dependencies": { - "constantinople": "^4.0.1", - "jstransformer": "1.0.0", - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0", - "resolve": "^1.15.1" - } - }, - "node_modules/pug-lexer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", - "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", - "license": "MIT", - "dependencies": { - "character-parser": "^2.2.0", - "is-expression": "^4.0.0", - "pug-error": "^2.0.0" - } - }, - "node_modules/pug-linker": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", - "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", - "license": "MIT", - "dependencies": { - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0" - } - }, - "node_modules/pug-load": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", - "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.1", - "pug-walk": "^2.0.0" - } - }, - "node_modules/pug-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", - "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", - "license": "MIT", - "dependencies": { - "pug-error": "^2.0.0", - "token-stream": "1.0.0" - } - }, - "node_modules/pug-runtime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", - "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", - "license": "MIT" - }, - "node_modules/pug-strip-comments": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", - "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", - "license": "MIT", - "dependencies": { - "pug-error": "^2.0.0" - } - }, - "node_modules/pug-walk": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", - "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qrcode-terminal": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", - "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/query-string": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", - "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", - "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.2.2", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "license": "MIT", - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/queue-lit": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", - "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/quickselect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", - "license": "ISC" - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/razorpay": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/razorpay/-/razorpay-2.9.6.tgz", - "integrity": "sha512-zsHAQzd6e1Cc6BNoCNZQaf65ElL6O6yw0wulxmoG5VQDr363fZC90Mp1V5EktVzG45yPyNomNXWlf4cQ3622gQ==", - "license": "MIT", - "dependencies": { - "axios": "^1.6.8" - } - }, - "node_modules/rbush": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", - "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", - "license": "MIT", - "dependencies": { - "quickselect": "^2.0.0" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", - "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-devtools-core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", - "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", - "license": "MIT", - "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" - } - }, - "node_modules/react-devtools-core/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/react-dom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", - "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.25.0" - }, - "peerDependencies": { - "react": "^19.0.0" - } - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", - "license": "MIT" - }, - "node_modules/react-freeze": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.4.tgz", - "integrity": "sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": ">=17.0.0" - } - }, - "node_modules/react-hook-form": { - "version": "7.68.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.68.0.tgz", - "integrity": "sha512-oNN3fjrZ/Xo40SWlHf1yCjlMK417JxoSJVUXQjGdvdRCU07NTFei1i1f8ApUAts+IVh14e4EdakeLEA+BEAs/Q==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18 || ^19" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, - "node_modules/react-native": { - "version": "0.79.6", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.79.6.tgz", - "integrity": "sha512-kvIWSmf4QPfY41HC25TR285N7Fv0Pyn3DAEK8qRL9dA35usSaxsJkHfw+VqnonqJjXOaoKCEanwudRAJ60TBGA==", - "license": "MIT", - "dependencies": { - "@jest/create-cache-key-function": "^29.7.0", - "@react-native/assets-registry": "0.79.6", - "@react-native/codegen": "0.79.6", - "@react-native/community-cli-plugin": "0.79.6", - "@react-native/gradle-plugin": "0.79.6", - "@react-native/js-polyfills": "0.79.6", - "@react-native/normalize-colors": "0.79.6", - "@react-native/virtualized-lists": "0.79.6", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "0.25.1", - "base64-js": "^1.5.1", - "chalk": "^4.0.0", - "commander": "^12.0.0", - "event-target-shim": "^5.0.1", - "flow-enums-runtime": "^0.0.6", - "glob": "^7.1.1", - "invariant": "^2.2.4", - "jest-environment-node": "^29.7.0", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.82.0", - "metro-source-map": "^0.82.0", - "nullthrows": "^1.1.1", - "pretty-format": "^29.7.0", - "promise": "^8.3.0", - "react-devtools-core": "^6.1.1", - "react-refresh": "^0.14.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.25.0", - "semver": "^7.1.3", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0", - "ws": "^6.2.3", - "yargs": "^17.6.2" - }, - "bin": { - "react-native": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^19.0.0", - "react": "^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-native-draggable-flatlist": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/react-native-draggable-flatlist/-/react-native-draggable-flatlist-4.0.3.tgz", - "integrity": "sha512-2F4x5BFieWdGq9SetD2nSAR7s7oQCSgNllYgERRXXtNfSOuAGAVbDb/3H3lP0y5f7rEyNwabKorZAD/SyyNbDw==", - "license": "MIT", - "dependencies": { - "@babel/preset-typescript": "^7.17.12" - }, - "peerDependencies": { - "react-native": ">=0.64.0", - "react-native-gesture-handler": ">=2.0.0", - "react-native-reanimated": ">=2.8.0" - } - }, - "node_modules/react-native-drawer-layout": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/react-native-drawer-layout/-/react-native-drawer-layout-4.2.0.tgz", - "integrity": "sha512-XFGK5RMcVhEqr2F4iH/cTXrcTm1uK3gIBNFPqHNO7rCXuXZTPBbQYA5yc9/Lqgw2KNQ3sAeHKvW6/WoTURo/eA==", - "license": "MIT", - "dependencies": { - "color": "^4.2.3", - "use-latest-callback": "^0.2.4" - }, - "peerDependencies": { - "react": ">= 18.2.0", - "react-native": "*", - "react-native-gesture-handler": ">= 2.0.0", - "react-native-reanimated": ">= 2.0.0" - } - }, - "node_modules/react-native-edge-to-edge": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/react-native-edge-to-edge/-/react-native-edge-to-edge-1.6.0.tgz", - "integrity": "sha512-2WCNdE3Qd6Fwg9+4BpbATUxCLcouF6YRY7K+J36KJ4l3y+tWN6XCqAC4DuoGblAAbb2sLkhEDp4FOlbOIot2Og==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-element-dropdown": { - "version": "2.12.4", - "resolved": "https://registry.npmjs.org/react-native-element-dropdown/-/react-native-element-dropdown-2.12.4.tgz", - "integrity": "sha512-abZc5SVji9FIt7fjojRYrbuvp03CoeZJrgvezQoDoSOrpiTqkX69ix5m+j06W2AVncA0VWvbT+vCMam8SoVadw==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.21" - }, - "engines": { - "node": ">= 16.0.0" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-gesture-handler": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.24.0.tgz", - "integrity": "sha512-ZdWyOd1C8axKJHIfYxjJKCcxjWEpUtUWgTOVY2wynbiveSQDm8X/PDyAKXSer/GOtIpjudUbACOndZXCN3vHsw==", - "license": "MIT", - "dependencies": { - "@egjs/hammerjs": "^2.0.17", - "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.2.4" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-iphone-x-helper": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.3.1.tgz", - "integrity": "sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg==", - "license": "MIT", - "peerDependencies": { - "react-native": ">=0.42.0" - } - }, - "node_modules/react-native-is-edge-to-edge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz", - "integrity": "sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-keyboard-aware-scroll-view": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/react-native-keyboard-aware-scroll-view/-/react-native-keyboard-aware-scroll-view-0.9.5.tgz", - "integrity": "sha512-XwfRn+T/qBH9WjTWIBiJD2hPWg0yJvtaEw6RtPCa5/PYHabzBaWxYBOl0usXN/368BL1XktnZPh8C2lmTpOREA==", - "license": "MIT", - "dependencies": { - "prop-types": "^15.6.2", - "react-native-iphone-x-helper": "^1.0.3" - }, - "peerDependencies": { - "react-native": ">=0.48.4" - } - }, - "node_modules/react-native-pager-view": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.9.1.tgz", - "integrity": "sha512-uUT0MMMbNtoSbxe9pRvdJJKEi9snjuJ3fXlZhG8F2vVMOBJVt/AFtqMPUHu9yMflmqOr08PewKzj9EPl/Yj+Gw==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-paper": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/react-native-paper/-/react-native-paper-5.14.5.tgz", - "integrity": "sha512-eaIH5bUQjJ/mYm4AkI6caaiyc7BcHDwX6CqNDi6RIxfxfWxROsHpll1oBuwn/cFvknvA8uEAkqLk/vzVihI3AQ==", - "license": "MIT", - "workspaces": [ - "example", - "docs" - ], - "dependencies": { - "@callstack/react-theme-provider": "^3.0.9", - "color": "^3.1.2", - "use-latest-callback": "^0.2.3" - }, - "peerDependencies": { - "react": "*", - "react-native": "*", - "react-native-safe-area-context": "*" - } - }, - "node_modules/react-native-paper/node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/react-native-paper/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/react-native-paper/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/react-native-phonepe-pg": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/react-native-phonepe-pg/-/react-native-phonepe-pg-3.1.1.tgz", - "integrity": "sha512-Qd2IS9cPQzYoB1D1YGEKMChMX87+nBL1Nv7eOXpQorv/UZmL+Mypv1N87jro1uiHUbz4ZsDNWyJih2TjNNMUmQ==", - "license": "MIT", - "engines": { - "node": ">= 16.0.0" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-razorpay": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/react-native-razorpay/-/react-native-razorpay-2.3.1.tgz", - "integrity": "sha512-aEod2YigiWx9Vik+2YRpTh9kNKK9KZbfhrRpk5tU8z8ZPDdLt57rRsqd7lVuDybqqO6nLY6ughPjMN+FPyX8Ag==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0", - "react-native": ">=0.66.0" - } - }, - "node_modules/react-native-reanimated": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.17.5.tgz", - "integrity": "sha512-SxBK7wQfJ4UoWoJqQnmIC7ZjuNgVb9rcY5Xc67upXAFKftWg0rnkknTw6vgwnjRcvYThrjzUVti66XoZdDJGtw==", - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-arrow-functions": "^7.0.0-0", - "@babel/plugin-transform-class-properties": "^7.0.0-0", - "@babel/plugin-transform-classes": "^7.0.0-0", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0", - "@babel/plugin-transform-optional-chaining": "^7.0.0-0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", - "@babel/plugin-transform-template-literals": "^7.0.0-0", - "@babel/plugin-transform-unicode-regex": "^7.0.0-0", - "@babel/preset-typescript": "^7.16.7", - "convert-source-map": "^2.0.0", - "invariant": "^2.2.4", - "react-native-is-edge-to-edge": "1.1.7" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0", - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-reanimated/node_modules/react-native-is-edge-to-edge": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.1.7.tgz", - "integrity": "sha512-EH6i7E8epJGIcu7KpfXYXiV2JFIYITtq+rVS8uEb+92naMRBdxhTuS8Wn2Q7j9sqyO0B+Xbaaf9VdipIAmGW4w==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-safe-area-context": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.4.0.tgz", - "integrity": "sha512-JaEThVyJcLhA+vU0NU8bZ0a1ih6GiF4faZ+ArZLqpYbL6j7R3caRqj+mE3lEtKCuHgwjLg3bCxLL1GPUJZVqUA==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-screens": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.11.1.tgz", - "integrity": "sha512-F0zOzRVa3ptZfLpD0J8ROdo+y1fEPw+VBFq1MTY/iyDu08al7qFUO5hLMd+EYMda5VXGaTFCa8q7bOppUszhJw==", - "license": "MIT", - "dependencies": { - "react-freeze": "^1.0.0", - "react-native-is-edge-to-edge": "^1.1.7", - "warn-once": "^0.1.0" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-svg": { - "version": "15.11.2", - "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.11.2.tgz", - "integrity": "sha512-+YfF72IbWQUKzCIydlijV1fLuBsQNGMT6Da2kFlo1sh+LE3BIm/2Q7AR1zAAR6L0BFLi1WaQPLfFUC9bNZpOmw==", - "license": "MIT", - "dependencies": { - "css-select": "^5.1.0", - "css-tree": "^1.1.3", - "warn-once": "0.1.1" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-tab-view": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/react-native-tab-view/-/react-native-tab-view-4.2.2.tgz", - "integrity": "sha512-NXtrG6OchvbGjsvbySJGVocXxo4Y2vA17ph4rAaWtA2jh+AasD8OyikKBRg2SmllEfeQ+GEhcKe8kulHv8BhTg==", - "license": "MIT", - "dependencies": { - "use-latest-callback": "^0.2.4" - }, - "peerDependencies": { - "react": ">= 18.2.0", - "react-native": "*", - "react-native-pager-view": ">= 6.0.0" - } - }, - "node_modules/react-native-toast-message": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/react-native-toast-message/-/react-native-toast-message-2.3.3.tgz", - "integrity": "sha512-4IIUHwUPvKHu4gjD0Vj2aGQzqPATiblL1ey8tOqsxOWRPGGu52iIbL8M/mCz4uyqecvPdIcMY38AfwRuUADfQQ==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-web": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.20.0.tgz", - "integrity": "sha512-OOSgrw+aON6R3hRosCau/xVxdLzbjEcsLysYedka0ZON4ZZe6n9xgeN9ZkoejhARM36oTlUgHIQqxGutEJ9Wxg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.6", - "@react-native/normalize-colors": "^0.74.1", - "fbjs": "^3.0.4", - "inline-style-prefixer": "^7.0.1", - "memoize-one": "^6.0.0", - "nullthrows": "^1.1.1", - "postcss-value-parser": "^4.2.0", - "styleq": "^0.1.3" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-native-web/node_modules/@react-native/normalize-colors": { - "version": "0.74.89", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.89.tgz", - "integrity": "sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==", - "license": "MIT" - }, - "node_modules/react-native-web/node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "license": "MIT" - }, - "node_modules/react-native-webview": { - "version": "13.13.5", - "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.13.5.tgz", - "integrity": "sha512-MfC2B+woL4Hlj2WCzcb1USySKk+SteXnUKmKktOk/H/AQy5+LuVdkPKm8SknJ0/RxaxhZ48WBoTRGaqgR137hw==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^4.0.0", - "invariant": "2.2.4" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/react-native/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/react-native/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/react-native/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/react-native/node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "license": "MIT", - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/react-native/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-native/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-use-measure": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz", - "integrity": "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.13", - "react-dom": ">=16.13" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/redis": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-5.10.0.tgz", - "integrity": "sha512-0/Y+7IEiTgVGPrLFKy8oAEArSyEJkU0zvgV5xyi9NzNQ+SLZmyFbUsWIbgPcd4UdUh00opXGKlXJwMmsis5Byw==", - "license": "MIT", - "dependencies": { - "@redis/bloom": "5.10.0", - "@redis/client": "5.10.0", - "@redis/json": "5.10.0", - "@redis/search": "5.10.0", - "@redis/time-series": "5.10.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "license": "MIT", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.1.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requireg": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", - "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", - "dependencies": { - "nested-error-stacks": "~2.0.1", - "rc": "~1.2.7", - "resolve": "~1.7.1" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/requireg/node_modules/resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "license": "MIT", - "dependencies": { - "path-parse": "^1.0.5" - } - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "devOptional": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/resolve-protobuf-schema": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", - "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", - "license": "MIT", - "dependencies": { - "protocol-buffers-schema": "^3.3.1" - } - }, - "node_modules/resolve-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", - "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", - "license": "MIT" - }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "license": "MIT", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", - "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "glob": "^13.0.0", - "package-json-from-dist": "^1.0.1" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", - "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/lru-cache": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", - "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/robust-predicates": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-2.0.4.tgz", - "integrity": "sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==", - "license": "Unlicense" - }, - "node_modules/rollup": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", - "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.3", - "@rollup/rollup-android-arm64": "4.53.3", - "@rollup/rollup-darwin-arm64": "4.53.3", - "@rollup/rollup-darwin-x64": "4.53.3", - "@rollup/rollup-freebsd-arm64": "4.53.3", - "@rollup/rollup-freebsd-x64": "4.53.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", - "@rollup/rollup-linux-arm-musleabihf": "4.53.3", - "@rollup/rollup-linux-arm64-gnu": "4.53.3", - "@rollup/rollup-linux-arm64-musl": "4.53.3", - "@rollup/rollup-linux-loong64-gnu": "4.53.3", - "@rollup/rollup-linux-ppc64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-musl": "4.53.3", - "@rollup/rollup-linux-s390x-gnu": "4.53.3", - "@rollup/rollup-linux-x64-gnu": "4.53.3", - "@rollup/rollup-linux-x64-musl": "4.53.3", - "@rollup/rollup-openharmony-arm64": "4.53.3", - "@rollup/rollup-win32-arm64-msvc": "4.53.3", - "@rollup/rollup-win32-ia32-msvc": "4.53.3", - "@rollup/rollup-win32-x64-gnu": "4.53.3", - "@rollup/rollup-win32-x64-msvc": "4.53.3", - "fsevents": "~2.3.2" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/router/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/router/node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/router/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/router/node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", - "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", - "license": "BlueOak-1.0.0" - }, - "node_modules/scheduler": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", - "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.1.tgz", - "integrity": "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/seroval": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.0.tgz", - "integrity": "sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/seroval-plugins": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.0.tgz", - "integrity": "sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "seroval": "^1.0" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serve-static/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/serve-static/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serve-static/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/server-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz", - "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==", - "license": "MIT" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/sf-symbols-typescript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sf-symbols-typescript/-/sf-symbols-typescript-2.2.0.tgz", - "integrity": "sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-plist": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", - "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", - "license": "MIT", - "dependencies": { - "bplist-creator": "0.1.0", - "bplist-parser": "0.3.1", - "plist": "^3.0.5" - } - }, - "node_modules/simple-plist/node_modules/bplist-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", - "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "license": "MIT" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, - "node_modules/skmeans": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/skmeans/-/skmeans-0.9.7.tgz", - "integrity": "sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg==", - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/slugify": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/solid-js": { - "version": "1.9.11", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.11.tgz", - "integrity": "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "csstype": "^3.1.0", - "seroval": "~1.5.0", - "seroval-plugins": "~1.5.0" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/splaytree-ts": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/splaytree-ts/-/splaytree-ts-1.0.2.tgz", - "integrity": "sha512-0kGecIZNIReCSiznK3uheYB8sbstLjCZLiwcQwbmLhgHJj2gz6OnSPkVzJQCMnmEz1BQ4gPK59ylhBoEWOhGNA==", - "license": "BDS-3-Clause" - }, - "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/stable-hash": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", - "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", - "dev": true, - "license": "MIT" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT" - }, - "node_modules/stacktrace-parser": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", - "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", - "license": "MIT" - }, - "node_modules/stats-gl": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz", - "integrity": "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==", - "license": "MIT", - "dependencies": { - "@types/three": "*", - "three": "^0.170.0" - }, - "peerDependencies": { - "@types/three": "*", - "three": "*" - } - }, - "node_modules/stats-gl/node_modules/three": { - "version": "0.170.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz", - "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==", - "license": "MIT" - }, - "node_modules/stats.js": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", - "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "license": "Unlicense", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", - "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/structured-headers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", - "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", - "license": "MIT" - }, - "node_modules/styleq": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/styleq/-/styleq-0.1.3.tgz", - "integrity": "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==", - "license": "MIT" - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/supercluster": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", - "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", - "license": "ISC", - "dependencies": { - "kdbush": "^4.0.2" - } - }, - "node_modules/superjson": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", - "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", - "license": "MIT", - "dependencies": { - "copy-anything": "^4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/suspend-react": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", - "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", - "license": "MIT", - "peerDependencies": { - "react": ">=17.0" - } - }, - "node_modules/sweepline-intersections": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sweepline-intersections/-/sweepline-intersections-1.5.0.tgz", - "integrity": "sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ==", - "license": "MIT", - "dependencies": { - "tinyqueue": "^2.0.0" - } - }, - "node_modules/symbuyote-info-site": { - "resolved": "apps/info-site", - "link": true - }, - "node_modules/tailwind-merge": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", - "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", - "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.7", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss-animate": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/tar": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", - "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.44.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", - "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/three": { - "version": "0.182.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.182.0.tgz", - "integrity": "sha512-GbHabT+Irv+ihI1/f5kIIsZ+Ef9Sl5A1Y7imvS5RQjWgtTPfPnZ43JmlYI7NtCRDK9zir20lQpfg8/9Yd02OvQ==", - "license": "MIT" - }, - "node_modules/three-mesh-bvh": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.8.3.tgz", - "integrity": "sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg==", - "license": "MIT", - "peerDependencies": { - "three": ">= 0.159.0" - } - }, - "node_modules/three-stdlib": { - "version": "2.36.1", - "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.36.1.tgz", - "integrity": "sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg==", - "license": "MIT", - "dependencies": { - "@types/draco3d": "^1.4.0", - "@types/offscreencanvas": "^2019.6.4", - "@types/webxr": "^0.5.2", - "draco3d": "^1.4.1", - "fflate": "^0.6.9", - "potpack": "^1.0.1" - }, - "peerDependencies": { - "three": ">=0.128.0" - } - }, - "node_modules/three-stdlib/node_modules/fflate": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", - "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", - "license": "MIT" - }, - "node_modules/three-stdlib/node_modules/potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", - "license": "ISC" - }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "license": "MIT" - }, - "node_modules/tiny-case": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", - "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==", - "license": "MIT" - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinyqueue": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", - "license": "ISC" - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "license": "BSD-3-Clause" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/token-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", - "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", - "license": "MIT" - }, - "node_modules/topojson-client": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", - "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", - "license": "ISC", - "dependencies": { - "commander": "2" - }, - "bin": { - "topo2geo": "bin/topo2geo", - "topomerge": "bin/topomerge", - "topoquantize": "bin/topoquantize" - } - }, - "node_modules/topojson-client/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/topojson-server": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/topojson-server/-/topojson-server-3.0.1.tgz", - "integrity": "sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==", - "license": "ISC", - "dependencies": { - "commander": "2" - }, - "bin": { - "geo2topo": "bin/geo2topo" - } - }, - "node_modules/topojson-server/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", - "license": "MIT" - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/troika-three-text": { - "version": "0.52.4", - "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.4.tgz", - "integrity": "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==", - "license": "MIT", - "dependencies": { - "bidi-js": "^1.0.2", - "troika-three-utils": "^0.52.4", - "troika-worker-utils": "^0.52.0", - "webgl-sdf-generator": "1.1.1" - }, - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-three-utils": { - "version": "0.52.4", - "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.52.4.tgz", - "integrity": "sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A==", - "license": "MIT", - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-worker-utils": { - "version": "0.52.0", - "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.52.0.tgz", - "integrity": "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==", - "license": "MIT" - }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node-dev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", - "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.1", - "dynamic-dedupe": "^0.3.0", - "minimist": "^1.2.6", - "mkdirp": "^1.0.4", - "resolve": "^1.0.0", - "rimraf": "^2.6.1", - "source-map-support": "^0.5.12", - "tree-kill": "^1.2.2", - "ts-node": "^10.4.0", - "tsconfig": "^7.0.0" - }, - "bin": { - "ts-node-dev": "lib/bin.js", - "tsnd": "lib/bin.js" - }, - "engines": { - "node": ">=0.8.0" - }, - "peerDependencies": { - "node-notifier": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/ts-node-dev/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/ts-node-dev/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ts-node-dev/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ts-node-dev/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ts-node/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tsc-alias": { - "version": "1.8.16", - "resolved": "https://registry.npmjs.org/tsc-alias/-/tsc-alias-1.8.16.tgz", - "integrity": "sha512-QjCyu55NFyRSBAl6+MTFwplpFcnm2Pq01rR/uxfqJoLMm6X3O14KEGtaSDZpJYaE1bJBGDjD0eSuiIWPe2T58g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.3", - "commander": "^9.0.0", - "get-tsconfig": "^4.10.0", - "globby": "^11.0.4", - "mylas": "^2.1.9", - "normalize-path": "^3.0.0", - "plimit-lit": "^1.2.6" - }, - "bin": { - "tsc-alias": "dist/bin/index.js" - }, - "engines": { - "node": ">=16.20.2" - } - }, - "node_modules/tsc-alias/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/strip-bom": "^3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", - "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", - "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", - "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", - "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", - "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", - "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", - "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", - "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", - "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", - "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", - "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", - "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", - "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", - "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", - "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", - "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.1.tgz", - "integrity": "sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", - "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", - "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", - "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", - "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", - "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", - "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", - "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", - "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", - "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/esbuild": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", - "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", - "devOptional": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.1", - "@esbuild/android-arm": "0.27.1", - "@esbuild/android-arm64": "0.27.1", - "@esbuild/android-x64": "0.27.1", - "@esbuild/darwin-arm64": "0.27.1", - "@esbuild/darwin-x64": "0.27.1", - "@esbuild/freebsd-arm64": "0.27.1", - "@esbuild/freebsd-x64": "0.27.1", - "@esbuild/linux-arm": "0.27.1", - "@esbuild/linux-arm64": "0.27.1", - "@esbuild/linux-ia32": "0.27.1", - "@esbuild/linux-loong64": "0.27.1", - "@esbuild/linux-mips64el": "0.27.1", - "@esbuild/linux-ppc64": "0.27.1", - "@esbuild/linux-riscv64": "0.27.1", - "@esbuild/linux-s390x": "0.27.1", - "@esbuild/linux-x64": "0.27.1", - "@esbuild/netbsd-arm64": "0.27.1", - "@esbuild/netbsd-x64": "0.27.1", - "@esbuild/openbsd-arm64": "0.27.1", - "@esbuild/openbsd-x64": "0.27.1", - "@esbuild/openharmony-arm64": "0.27.1", - "@esbuild/sunos-x64": "0.27.1", - "@esbuild/win32-arm64": "0.27.1", - "@esbuild/win32-ia32": "0.27.1", - "@esbuild/win32-x64": "0.27.1" - } - }, - "node_modules/tunnel-rat": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", - "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", - "license": "MIT", - "dependencies": { - "zustand": "^4.3.2" - } - }, - "node_modules/tunnel-rat/node_modules/zustand": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", - "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.2.2" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - }, - "node_modules/turbo": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.6.3.tgz", - "integrity": "sha512-bf6YKUv11l5Xfcmg76PyWoy/e2vbkkxFNBGJSnfdSXQC33ZiUfutYh6IXidc5MhsnrFkWfdNNLyaRk+kHMLlwA==", - "dev": true, - "license": "MIT", - "bin": { - "turbo": "bin/turbo" - }, - "optionalDependencies": { - "turbo-darwin-64": "2.6.3", - "turbo-darwin-arm64": "2.6.3", - "turbo-linux-64": "2.6.3", - "turbo-linux-arm64": "2.6.3", - "turbo-windows-64": "2.6.3", - "turbo-windows-arm64": "2.6.3" - } - }, - "node_modules/turbo-darwin-64": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.6.3.tgz", - "integrity": "sha512-BlJJDc1CQ7SK5Y5qnl7AzpkvKSnpkfPmnA+HeU/sgny3oHZckPV2776ebO2M33CYDSor7+8HQwaodY++IINhYg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/turbo-darwin-arm64": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.6.3.tgz", - "integrity": "sha512-MwVt7rBKiOK7zdYerenfCRTypefw4kZCue35IJga9CH1+S50+KTiCkT6LBqo0hHeoH2iKuI0ldTF2a0aB72z3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/turbo-linux-64": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.6.3.tgz", - "integrity": "sha512-cqpcw+dXxbnPtNnzeeSyWprjmuFVpHJqKcs7Jym5oXlu/ZcovEASUIUZVN3OGEM6Y/OTyyw0z09tOHNt5yBAVg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/turbo-linux-arm64": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.6.3.tgz", - "integrity": "sha512-MterpZQmjXyr4uM7zOgFSFL3oRdNKeflY7nsjxJb2TklsYqiu3Z9pQ4zRVFFH8n0mLGna7MbQMZuKoWqqHb45w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/turbo-windows-64": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.6.3.tgz", - "integrity": "sha512-biDU70v9dLwnBdLf+daoDlNJVvqOOP8YEjqNipBHzgclbQlXbsi6Gqqelp5er81Qo3BiRgmTNx79oaZQTPb07Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/turbo-windows-arm64": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.6.3.tgz", - "integrity": "sha512-dDHVKpSeukah3VsI/xMEKeTnV9V9cjlpFSUs4bmsUiLu3Yv2ENlgVEZv65wxbeE0bh0jjpmElDT+P1KaCxArQQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/twrnc": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/twrnc/-/twrnc-4.11.1.tgz", - "integrity": "sha512-iBLt2CBXig32Jg7opTZjhXYrT0fM7hFjLpddZBBhXhhFfyTI6WUaMojHoACKpM5ys8D/Kdum4s571BmctLUn1Q==", - "license": "MIT", - "dependencies": { - "tailwindcss": ">=2.0.0 <4.0.0" - }, - "peerDependencies": { - "react-native": ">=0.62.2" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.41", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", - "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "MIT", - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", - "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unrs-resolver": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.0" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.11.1", - "@unrs/resolver-binding-android-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-x64": "1.11.1", - "@unrs/resolver-binding-freebsd-x64": "1.11.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-musl": "1.11.1", - "@unrs/resolver-binding-wasm32-wasi": "1.11.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", - "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-latest-callback": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.6.tgz", - "integrity": "sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/user-ui": { - "resolved": "apps/user-ui", - "link": true - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/validator": { - "version": "13.15.23", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.23.tgz", - "integrity": "sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", - "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "license": "MIT" - }, - "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/vt-pbf": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", - "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", - "license": "MIT", - "dependencies": { - "@mapbox/point-geometry": "0.1.0", - "@mapbox/vector-tile": "^1.3.1", - "pbf": "^3.2.1" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/warn-once": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/warn-once/-/warn-once-0.1.1.tgz", - "integrity": "sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==", - "license": "MIT" - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webgl-constants": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", - "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" - }, - "node_modules/webgl-sdf-generator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", - "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==", - "license": "MIT" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "license": "MIT" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/whatwg-url-without-unicode": { - "version": "8.0.0-3", - "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", - "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", - "license": "MIT", - "dependencies": { - "buffer": "^5.4.3", - "punycode": "^2.1.1", - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/whatwg-url-without-unicode/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/with": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", - "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.9.6", - "@babel/types": "^7.9.6", - "assert-never": "^1.2.1", - "babel-walk": "3.0.0-canary-5" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/wonka": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", - "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", - "license": "MIT" - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xcode": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", - "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", - "license": "Apache-2.0", - "dependencies": { - "simple-plist": "^1.1.0", - "uuid": "^7.0.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/xcode/node_modules/uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/xml2js": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", - "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yup": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/yup/-/yup-1.7.1.tgz", - "integrity": "sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==", - "license": "MIT", - "dependencies": { - "property-expr": "^2.0.5", - "tiny-case": "^1.0.3", - "toposort": "^2.0.2", - "type-fest": "^2.19.0" - } - }, - "node_modules/yup/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", - "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zustand": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.10.tgz", - "integrity": "sha512-U1AiltS1O9hSy3rul+Ub82ut2fqIAefiSuwECWt6jlMVUGejvf+5omLcRBSzqbRagSM3hQZbtzdeRc6QVScXTg==", - "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } - } - }, - "packages/ui": { - "name": "common-ui", - "version": "1.0.0", - "dependencies": { - "@expo/vector-icons": "^14.1.0", - "@react-native-community/datetimepicker": "8.4.1", - "@react-native-google-signin/google-signin": "^16.0.0", - "@react-native-picker/picker": "2.11.1", - "@react-navigation/bottom-tabs": "^7.3.10", - "@react-navigation/drawer": "^7.5.8", - "@react-navigation/elements": "^2.3.8", - "@react-navigation/native": "^7.1.6", - "@tanstack/react-query": "^5.85.9", - "axios": "^1.11.0", - "buffer": "^6.0.3", - "dayjs": "^1.11.18", - "expo": "~53.0.22", - "expo-blur": "~14.1.5", - "expo-constants": "~17.1.7", - "expo-dev-client": "~5.2.4", - "expo-device": "~7.1.4", - "expo-document-picker": "~13.1.6", - "expo-font": "~13.3.2", - "expo-haptics": "~14.1.4", - "expo-image": "~2.4.0", - "expo-image-picker": "~16.1.4", - "expo-linear-gradient": "~14.1.5", - "expo-linking": "~7.1.7", - "expo-notifications": "~0.31.4", - "expo-router": "~5.1.5", - "expo-secure-store": "~14.2.4", - "expo-splash-screen": "~0.30.10", - "expo-status-bar": "~2.2.3", - "expo-symbols": "~0.4.5", - "expo-system-ui": "~5.0.11", - "expo-web-browser": "~14.2.0", - "formik": "^2.4.6", - "jwt-decode": "^4.0.0", - "react": "19.0.0", - "react-dom": "19.0.0", - "react-hook-form": "^7.62.0", - "react-native": "0.79.6", - "react-native-element-dropdown": "^2.12.4", - "react-native-gesture-handler": "~2.24.0", - "react-native-keyboard-aware-scroll-view": "^0.9.5", - "react-native-pager-view": "^6.9.1", - "react-native-paper": "^5.14.5", - "react-native-phonepe-pg": "^3.1.1", - "react-native-razorpay": "^2.3.0", - "react-native-reanimated": "~3.17.4", - "react-native-safe-area-context": "5.4.0", - "react-native-screens": "~4.11.1", - "react-native-tab-view": "^4.1.3", - "react-native-toast-message": "^2.3.3", - "react-native-web": "~0.20.0", - "react-native-webview": "13.13.5", - "twrnc": "^4.9.1", - "yup": "^1.7.0", - "zustand": "^5.0.10" - } - }, - "packages/ui/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - } - } -} diff --git a/package.json b/package.json index 569f52f..43fe317 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "meat-farmer-monorepo", "version": "1.0.0", "private": true, - "packageManager": "npm@10.8.1", + "packageManager": "bun@1.3.10", "scripts": { "build": "turbo run build", "dev": "turbo run dev --parallel", @@ -42,6 +42,7 @@ "expo-crypto": "~14.1.5", "expo-server-sdk": "^5.0.0", "expo-web-browser": "~14.2.0", + "fuse.js": "^7.1.0", "node-cron": "^4.2.1", "pg": "^8.20.0", "react": "19.0.0", diff --git a/packages/shared/index.ts b/packages/shared/index.ts new file mode 100644 index 0000000..dae4213 --- /dev/null +++ b/packages/shared/index.ts @@ -0,0 +1,9 @@ +export const CACHE_FILENAMES = { + products: 'products.json', + stores: 'stores.json', + slots: 'slots.json', + essentialConsts: 'essential-consts.json', + banners: 'banners.json', +} as const + +export type CacheFilename = typeof CACHE_FILENAMES[keyof typeof CACHE_FILENAMES] diff --git a/packages/shared/package.json b/packages/shared/package.json new file mode 100644 index 0000000..2d0a30b --- /dev/null +++ b/packages/shared/package.json @@ -0,0 +1,7 @@ +{ + "name": "@packages/shared", + "version": "1.0.0", + "main": "index.ts", + "types": "index.ts", + "private": true +} diff --git a/packages/ui/index.ts b/packages/ui/index.ts index 30549a9..e333601 100755 --- a/packages/ui/index.ts +++ b/packages/ui/index.ts @@ -25,6 +25,7 @@ import ImageCarousel from "./src/components/ImageCarousel"; import ImageGallery from "./src/components/ImageGallery"; import ImageGalleryWithDelete from "./src/components/ImageGalleryWithDelete"; import ImageUploader from "./src/components/ImageUploader"; +import ImageUploaderNeo from "./src/components/ImageUploaderNeo"; import ProfileImage from "./src/components/profile-image"; import Checkbox from "./src/components/checkbox"; import AppContainer from "./src/components/app-container"; @@ -63,10 +64,13 @@ const isDevMode = Constants.executionEnvironment !== "standalone"; // const BASE_API_URL = API_URL; // const BASE_API_URL = 'http://10.0.2.2:4000'; // const BASE_API_URL = 'http://192.168.100.101:4000'; -// const BASE_API_URL = 'http://192.168.1.5:4000'; -let BASE_API_URL = "https://mf.freshyo.in"; +const BASE_API_URL = 'http://192.168.1.5:4000'; +// let BASE_API_URL = "https://mf.freshyo.in"; // let BASE_API_URL = "https://freshyo.technocracy.ovh"; -// let BASE_API_URL = 'http://192.168.100.107:4000'; +// let BASE_API_URL = 'http://192.168.100.108:4000'; +// let BASE_API_URL = "https://raw.freshyo.in"; +// let BASE_API_URL = "https://freshyo.technocracy.ovh"; +// let BASE_API_URL = 'http://192.168.100.108:4000'; // let BASE_API_URL = 'http://192.168.29.176:4000'; // if(isDevMode) { @@ -100,6 +104,7 @@ export { ImageGallery, ImageGalleryWithDelete, ImageUploader, + ImageUploaderNeo, ProfileImage, Checkbox, AppContainer, diff --git a/packages/ui/src/components/ImageUploaderNeo.tsx b/packages/ui/src/components/ImageUploaderNeo.tsx new file mode 100644 index 0000000..66ed0d4 --- /dev/null +++ b/packages/ui/src/components/ImageUploaderNeo.tsx @@ -0,0 +1,89 @@ +import React from "react"; +import { View, TouchableOpacity } from "react-native"; +import { Image } from 'expo-image'; +import MyText from "./text"; +import tw from '../lib/tailwind'; +import Ionicons from "@expo/vector-icons/Ionicons"; +import { MaterialIcons } from "@expo/vector-icons"; + +interface ImageUploaderNeoProps { + images: { uri: string; mimeType: string }[]; + onUploadImage: () => void; + onRemoveImage: (image: { uri: string; mimeType: string }) => void; + allowMultiple?: boolean; + maxImages?: number; +} + +const ImageUploaderNeo: React.FC = ({ + images, + onUploadImage, + onRemoveImage, + allowMultiple = true, + maxImages, +}) => { + // const canUploadMore = allowMultiple && (!maxImages || images.length < maxImages); + const isMaxReached = maxImages && images.length >= maxImages; + const canUploadMore = !isMaxReached + // console.log({isMaxReached, canUploadMore}) + return ( + + + {/* Render images */} + {images.map((image, index) => ( + + + onRemoveImage(image)} + style={tw`absolute top-1 right-1 bg-red-500 rounded-full p-1`} + > + + + + ))} + + {/* Upload button */} + + + {isMaxReached ? ( + + + Max {maxImages} images + + + ) : !allowMultiple && images.length >= 1 ? ( + + + Only one image allowed + + + ) : ( + <> + + Upload + + )} + + + + + {/* Image count indicator */} + {images.length > 0 && ( + + {images.length} image{images.length !== 1 ? 's' : ''} selected + {maxImages ? ` (max ${maxImages})` : ''} + + )} + + ); +}; + +export default ImageUploaderNeo; diff --git a/sqlite.db b/sqlite.db new file mode 100644 index 0000000..d296495 Binary files /dev/null and b/sqlite.db differ diff --git a/test/.detoxrc.json b/test/.detoxrc.json new file mode 100644 index 0000000..38c73c7 --- /dev/null +++ b/test/.detoxrc.json @@ -0,0 +1,39 @@ +{ + "testRunner": { + "args": { + "$0": "jest", + "config": "jest.config.cjs" + } + }, + "apps": { + "admin.ios": { + "type": "ios.app", + "binaryPath": "appBinaries/admin.app", + "bundleId": "in.freshyo.adminui" + }, + "user.ios": { + "type": "ios.app", + "binaryPath": "appBinaries/user.app", + "bundleId": "com.freshyotrial.app" + } + + }, + "devices": { + "simulator": { + "type": "ios.simulator", + "device": { + "type": "iPhone 16 Pro Max" + } + } + }, + "configurations": { + "ios.user": { + "device": "simulator", + "app": "user.ios" + }, + "ios.admin": { + "device": "simulator", + "app": "admin.ios" + } + } +} diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 0000000..a14702c --- /dev/null +++ b/test/.gitignore @@ -0,0 +1,34 @@ +# dependencies (bun install) +node_modules + +# output +out +dist +*.tgz + +# code coverage +coverage +*.lcov + +# logs +logs +_.log +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# caches +.eslintcache +.cache +*.tsbuildinfo + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/test/Freshyo.app/AppAuthCore_Privacy.bundle/Info.plist b/test/Freshyo.app/AppAuthCore_Privacy.bundle/Info.plist new file mode 100644 index 0000000..5efbbc8 Binary files /dev/null and b/test/Freshyo.app/AppAuthCore_Privacy.bundle/Info.plist differ diff --git a/test/Freshyo.app/AppAuthCore_Privacy.bundle/PrivacyInfo.xcprivacy b/test/Freshyo.app/AppAuthCore_Privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..cc6746d --- /dev/null +++ b/test/Freshyo.app/AppAuthCore_Privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,16 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTrackingDomains + + NSPrivacyTracking + + + diff --git a/test/Freshyo.app/AppIcon60x60@2x.png b/test/Freshyo.app/AppIcon60x60@2x.png new file mode 100644 index 0000000..41ede9e Binary files /dev/null and b/test/Freshyo.app/AppIcon60x60@2x.png differ diff --git a/test/Freshyo.app/AppIcon76x76@2x~ipad.png b/test/Freshyo.app/AppIcon76x76@2x~ipad.png new file mode 100644 index 0000000..d99f9e1 Binary files /dev/null and b/test/Freshyo.app/AppIcon76x76@2x~ipad.png differ diff --git a/test/Freshyo.app/Assets.car b/test/Freshyo.app/Assets.car new file mode 100644 index 0000000..98c6e6f Binary files /dev/null and b/test/Freshyo.app/Assets.car differ diff --git a/test/Freshyo.app/EXConstants.bundle/Info.plist b/test/Freshyo.app/EXConstants.bundle/Info.plist new file mode 100644 index 0000000..c5d88cc Binary files /dev/null and b/test/Freshyo.app/EXConstants.bundle/Info.plist differ diff --git a/test/Freshyo.app/EXConstants.bundle/app.config b/test/Freshyo.app/EXConstants.bundle/app.config new file mode 100644 index 0000000..3e8ca2a --- /dev/null +++ b/test/Freshyo.app/EXConstants.bundle/app.config @@ -0,0 +1 @@ +{"name":"Freshyo","slug":"freshyo","version":"1.2.0","orientation":"portrait","icon":"./assets/images/freshyo-logo.png","scheme":"freshyo","userInterfaceStyle":"automatic","newArchEnabled":true,"ios":{"buildNumber":"1.1.0","supportsTablet":true,"bundleIdentifier":"com.freshyotrial.app","infoPlist":{"LSApplicationQueriesSchemes":["ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay"],"ITSAppUsesNonExemptEncryption":false,"NSPhotoLibraryUsageDescription":"This app uses photo library to allow users to upload pictures as a part or product's review and feedback.","NSLocationWhenInUseUsageDescription":"This app uses your location to decide if your place is serviceable or not."}},"android":{"softwareKeyboardLayoutMode":"resize","adaptiveIcon":{"foregroundImage":"./assets/images/freshyo-logo.png","backgroundColor":"#fff0f6"},"edgeToEdgeEnabled":true,"package":"in.freshyo.app","googleServicesFile":"./google-services.json"},"web":{"bundler":"metro","output":"static","favicon":"./assets/images/favicon.png"},"plugins":["expo-router",["expo-splash-screen",{"image":"./assets/images/freshyo-logo.png","imageWidth":200,"resizeMode":"contain","backgroundColor":"#ffffff"}],"expo-secure-store","expo-notifications"],"experiments":{"typedRoutes":true},"extra":{"router":{},"eas":{"projectId":"7f3e7611-f7a8-45f9-8a99-c2b1f6454d48"}},"runtimeVersion":{"policy":"appVersion"},"updates":{"url":"https://u.expo.dev/7f3e7611-f7a8-45f9-8a99-c2b1f6454d48"},"owner":"mohammedshafiuddin54","sdkVersion":"53.0.0","platforms":["ios","android","web"],"androidStatusBar":{"backgroundColor":"#ffffff"}} \ No newline at end of file diff --git a/test/Freshyo.app/EXUpdates.bundle/Info.plist b/test/Freshyo.app/EXUpdates.bundle/Info.plist new file mode 100644 index 0000000..2f4117e Binary files /dev/null and b/test/Freshyo.app/EXUpdates.bundle/Info.plist differ diff --git a/test/Freshyo.app/Expo.plist b/test/Freshyo.app/Expo.plist new file mode 100644 index 0000000..d4054e2 Binary files /dev/null and b/test/Freshyo.app/Expo.plist differ diff --git a/test/Freshyo.app/ExpoApplication_privacy.bundle/Info.plist b/test/Freshyo.app/ExpoApplication_privacy.bundle/Info.plist new file mode 100644 index 0000000..1464da4 Binary files /dev/null and b/test/Freshyo.app/ExpoApplication_privacy.bundle/Info.plist differ diff --git a/test/Freshyo.app/ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy b/test/Freshyo.app/ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..53bb32a --- /dev/null +++ b/test/Freshyo.app/ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + + diff --git a/test/Freshyo.app/ExpoConstants_privacy.bundle/Info.plist b/test/Freshyo.app/ExpoConstants_privacy.bundle/Info.plist new file mode 100644 index 0000000..7c3cf6b Binary files /dev/null and b/test/Freshyo.app/ExpoConstants_privacy.bundle/Info.plist differ diff --git a/test/Freshyo.app/ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy b/test/Freshyo.app/ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5f6aa38 --- /dev/null +++ b/test/Freshyo.app/ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/test/Freshyo.app/ExpoDevice_privacy.bundle/Info.plist b/test/Freshyo.app/ExpoDevice_privacy.bundle/Info.plist new file mode 100644 index 0000000..118e7ff Binary files /dev/null and b/test/Freshyo.app/ExpoDevice_privacy.bundle/Info.plist differ diff --git a/test/Freshyo.app/ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy b/test/Freshyo.app/ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..7d912e0 --- /dev/null +++ b/test/Freshyo.app/ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + + diff --git a/test/Freshyo.app/ExpoFileSystem_privacy.bundle/Info.plist b/test/Freshyo.app/ExpoFileSystem_privacy.bundle/Info.plist new file mode 100644 index 0000000..d549132 Binary files /dev/null and b/test/Freshyo.app/ExpoFileSystem_privacy.bundle/Info.plist differ diff --git a/test/Freshyo.app/ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy b/test/Freshyo.app/ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..2557cc1 --- /dev/null +++ b/test/Freshyo.app/ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,34 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + 0A2A.1 + 3B52.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryDiskSpace + NSPrivacyAccessedAPITypeReasons + + E174.1 + 85F4.1 + + + + + diff --git a/test/Freshyo.app/ExpoNotifications_privacy.bundle/Info.plist b/test/Freshyo.app/ExpoNotifications_privacy.bundle/Info.plist new file mode 100644 index 0000000..6a7a6a9 Binary files /dev/null and b/test/Freshyo.app/ExpoNotifications_privacy.bundle/Info.plist differ diff --git a/test/Freshyo.app/ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy b/test/Freshyo.app/ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5f6aa38 --- /dev/null +++ b/test/Freshyo.app/ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/test/Freshyo.app/ExpoSystemUI_privacy.bundle/Info.plist b/test/Freshyo.app/ExpoSystemUI_privacy.bundle/Info.plist new file mode 100644 index 0000000..9386958 Binary files /dev/null and b/test/Freshyo.app/ExpoSystemUI_privacy.bundle/Info.plist differ diff --git a/test/Freshyo.app/ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy b/test/Freshyo.app/ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5f6aa38 --- /dev/null +++ b/test/Freshyo.app/ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/test/Freshyo.app/FBLPromises_Privacy.bundle/Info.plist b/test/Freshyo.app/FBLPromises_Privacy.bundle/Info.plist new file mode 100644 index 0000000..0b25ae7 Binary files /dev/null and b/test/Freshyo.app/FBLPromises_Privacy.bundle/Info.plist differ diff --git a/test/Freshyo.app/FBLPromises_Privacy.bundle/PrivacyInfo.xcprivacy b/test/Freshyo.app/FBLPromises_Privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5397adc --- /dev/null +++ b/test/Freshyo.app/FBLPromises_Privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyAccessedAPITypes + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + diff --git a/test/Freshyo.app/Frameworks/Razorpay.framework/Info.plist b/test/Freshyo.app/Frameworks/Razorpay.framework/Info.plist new file mode 100644 index 0000000..4b9b7ea Binary files /dev/null and b/test/Freshyo.app/Frameworks/Razorpay.framework/Info.plist differ diff --git a/test/Freshyo.app/Frameworks/Razorpay.framework/Razorpay b/test/Freshyo.app/Frameworks/Razorpay.framework/Razorpay new file mode 100755 index 0000000..8edffe8 Binary files /dev/null and b/test/Freshyo.app/Frameworks/Razorpay.framework/Razorpay differ diff --git a/test/Freshyo.app/Frameworks/Razorpay.framework/_CodeSignature/CodeResources b/test/Freshyo.app/Frameworks/Razorpay.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..95e365c --- /dev/null +++ b/test/Freshyo.app/Frameworks/Razorpay.framework/_CodeSignature/CodeResources @@ -0,0 +1,101 @@ + + + + + files + + Info.plist + + m2+OcUVS+NCF/RaQ0NMeexAJIbU= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/test/Freshyo.app/Frameworks/RazorpayCore.framework/Info.plist b/test/Freshyo.app/Frameworks/RazorpayCore.framework/Info.plist new file mode 100644 index 0000000..309d8bc Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayCore.framework/Info.plist differ diff --git a/test/Freshyo.app/Frameworks/RazorpayCore.framework/RazorpayCore b/test/Freshyo.app/Frameworks/RazorpayCore.framework/RazorpayCore new file mode 100755 index 0000000..93b8297 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayCore.framework/RazorpayCore differ diff --git a/test/Freshyo.app/Frameworks/RazorpayCore.framework/_CodeSignature/CodeResources b/test/Freshyo.app/Frameworks/RazorpayCore.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..291ab93 --- /dev/null +++ b/test/Freshyo.app/Frameworks/RazorpayCore.framework/_CodeSignature/CodeResources @@ -0,0 +1,101 @@ + + + + + files + + Info.plist + + IgSq/mUvfi0nncHC2TAKVG0zPwA= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Assets.car b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Assets.car new file mode 100644 index 0000000..589fe13 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Assets.car differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/Info.plist b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/Info.plist new file mode 100644 index 0000000..26c814b Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/Info.plist differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/objects-11.0+.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/objects-11.0+.nib new file mode 100644 index 0000000..80579c1 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/objects-11.0+.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/runtime.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/runtime.nib new file mode 100644 index 0000000..80579c1 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/runtime.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/objects-11.0+.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/objects-11.0+.nib new file mode 100644 index 0000000..e777691 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/objects-11.0+.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/runtime.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/runtime.nib new file mode 100644 index 0000000..e777691 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/runtime.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/objects-11.0+.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/objects-11.0+.nib new file mode 100644 index 0000000..f6c81d2 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/objects-11.0+.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/runtime.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/runtime.nib new file mode 100644 index 0000000..e18633c Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/runtime.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/objects-11.0+.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/objects-11.0+.nib new file mode 100644 index 0000000..9073a45 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/objects-11.0+.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/runtime.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/runtime.nib new file mode 100644 index 0000000..6e202ea Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/runtime.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/objects-11.0+.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/objects-11.0+.nib new file mode 100644 index 0000000..2dbc02b Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/objects-11.0+.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/runtime.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/runtime.nib new file mode 100644 index 0000000..2dbc02b Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/runtime.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/objects-11.0+.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/objects-11.0+.nib new file mode 100644 index 0000000..069c006 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/objects-11.0+.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/runtime.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/runtime.nib new file mode 100644 index 0000000..069c006 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/runtime.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/objects-11.0+.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/objects-11.0+.nib new file mode 100644 index 0000000..ca94985 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/objects-11.0+.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/runtime.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/runtime.nib new file mode 100644 index 0000000..ca94985 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/runtime.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/objects-11.0+.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/objects-11.0+.nib new file mode 100644 index 0000000..03a2611 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/objects-11.0+.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/runtime.nib b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/runtime.nib new file mode 100644 index 0000000..776b6de Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/runtime.nib differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/CommonAssets/Razorpay_Logo.png b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/CommonAssets/Razorpay_Logo.png new file mode 100644 index 0000000..3e66db5 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/CommonAssets/Razorpay_Logo.png differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/CommonAssets/check_mark.png b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/CommonAssets/check_mark.png new file mode 100644 index 0000000..e5e6780 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/CommonAssets/check_mark.png differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/CommonAssets/warning.png b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/CommonAssets/warning.png new file mode 100644 index 0000000..ef818d2 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/CommonAssets/warning.png differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/EncryptedOtpelf.js b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/EncryptedOtpelf.js new file mode 100644 index 0000000..60d6c47 --- /dev/null +++ b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/EncryptedOtpelf.js @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Hash.txt b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Hash.txt new file mode 100644 index 0000000..e82cb2f --- /dev/null +++ b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Hash.txt @@ -0,0 +1 @@ +12bd975b82f23eb997a3ee2df03e4e33 \ No newline at end of file diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Info.plist b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Info.plist new file mode 100644 index 0000000..15baaa2 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/Info.plist differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/PrivacyInfo.xcprivacy b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..b9eb8d0 --- /dev/null +++ b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/PrivacyInfo.xcprivacy @@ -0,0 +1,150 @@ + + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypePhysicalAddress + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeOtherDiagnosticData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeCrashData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeProductInteraction + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeProductPersonalization + NSPrivacyCollectedDataTypePurposeAppFunctionality + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeDeviceID + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + NSPrivacyCollectedDataTypePurposeProductPersonalization + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypePaymentInfo + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + NSPrivacyCollectedDataTypePurposeAnalytics + NSPrivacyCollectedDataTypePurposeProductPersonalization + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypePhoneNumber + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + NSPrivacyCollectedDataTypePurposeAppFunctionality + NSPrivacyCollectedDataTypePurposeProductPersonalization + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeName + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeProductPersonalization + NSPrivacyCollectedDataTypePurposeAppFunctionality + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + Email address + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeProductPersonalization + NSPrivacyCollectedDataTypePurposeAnalytics + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyTracking + + + diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/RazorpayStandard b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/RazorpayStandard new file mode 100755 index 0000000..2bd9c59 Binary files /dev/null and b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/RazorpayStandard differ diff --git a/test/Freshyo.app/Frameworks/RazorpayStandard.framework/_CodeSignature/CodeResources b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..34fd4eb --- /dev/null +++ b/test/Freshyo.app/Frameworks/RazorpayStandard.framework/_CodeSignature/CodeResources @@ -0,0 +1,366 @@ + + + + + files + + Assets.car + + 9EtCg2Ey2Zi4Ua584kuKWTJN01U= + + Checkout.storyboardc/Info.plist + + DFcy10+V49NKtjJ4RLpByN10P1k= + + Checkout.storyboardc/MagicXNavController.nib/objects-11.0+.nib + + zRbA0UPDWTIRE/KMCArksV/vK2k= + + Checkout.storyboardc/MagicXNavController.nib/runtime.nib + + zRbA0UPDWTIRE/KMCArksV/vK2k= + + Checkout.storyboardc/OpinionatedAlertVC.nib/objects-11.0+.nib + + 0nbduMecK7uoslXovJgcjilOIB8= + + Checkout.storyboardc/OpinionatedAlertVC.nib/runtime.nib + + 0nbduMecK7uoslXovJgcjilOIB8= + + Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/objects-11.0+.nib + + c8N/593lOrAw9wwSo2JSseKACUI= + + Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/runtime.nib + + GAbF07uihY0DE3w15+txJ0RlSNw= + + Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/objects-11.0+.nib + + PcD+CIGNT4GNXBw18IEBAYmUl1A= + + Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/runtime.nib + + 1LYMZo3gzNiKkp3f7Nzh+lgBbPg= + + Checkout.storyboardc/RazorpayCheckoutVC.nib/objects-11.0+.nib + + ENBWg/fxi+P7OShg+NGXd0X+mWQ= + + Checkout.storyboardc/RazorpayCheckoutVC.nib/runtime.nib + + ENBWg/fxi+P7OShg+NGXd0X+mWQ= + + Checkout.storyboardc/RazorpayMagicxVC.nib/objects-11.0+.nib + + Ia0hGvI0wvIaseYa7wMvQf/q438= + + Checkout.storyboardc/RazorpayMagicxVC.nib/runtime.nib + + Ia0hGvI0wvIaseYa7wMvQf/q438= + + Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/objects-11.0+.nib + + 09suesko3lo0ihguFnxyvFMqd6g= + + Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/runtime.nib + + 09suesko3lo0ihguFnxyvFMqd6g= + + Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/objects-11.0+.nib + + GuaLaOgcxzpvPP6jj7CE6UW1x54= + + Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/runtime.nib + + Ucg3HkU3DNFIfnKf6gQlzd/zqTg= + + CommonAssets/Razorpay_Logo.png + + C/QPifs1kjcxzxgwUgDFDlLjpRw= + + CommonAssets/check_mark.png + + 6d4pPz33KoUobYRDPpGmnPiTVMs= + + CommonAssets/warning.png + + gxArEMTCcu4a+ueYNB3oMoIh48o= + + EncryptedOtpelf.js + + A893KbMpygzZy6/G1xrQkAudMxw= + + Hash.txt + + gN8QKnsfFYPlPa6NstmuiJETxJ8= + + Info.plist + + acRXxu68VWw8Pnzhk8Ky6zQaWHE= + + PrivacyInfo.xcprivacy + + 62HpNLqPh8tKsg+iNP/pSbF2S6M= + + + files2 + + Assets.car + + hash2 + + HcTTFmbApmRduIkc+LudaGbZclscDoJ6VJdjQDMk5z8= + + + Checkout.storyboardc/Info.plist + + hash2 + + XV+Km0uI0aCCx6b8FFBL8ctnAUqg/+iH2HKwpDJJDns= + + + Checkout.storyboardc/MagicXNavController.nib/objects-11.0+.nib + + hash2 + + /FTBuwa4eqDE4oW65Wzg7NRMxsEk6lrbA5gEQvxHMm8= + + + Checkout.storyboardc/MagicXNavController.nib/runtime.nib + + hash2 + + /FTBuwa4eqDE4oW65Wzg7NRMxsEk6lrbA5gEQvxHMm8= + + + Checkout.storyboardc/OpinionatedAlertVC.nib/objects-11.0+.nib + + hash2 + + TB5d1qjY2vLAC2ml/4EBTkBy3xnnLZQe6gxyjAuM7Hs= + + + Checkout.storyboardc/OpinionatedAlertVC.nib/runtime.nib + + hash2 + + TB5d1qjY2vLAC2ml/4EBTkBy3xnnLZQe6gxyjAuM7Hs= + + + Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/objects-11.0+.nib + + hash2 + + 9gbR1Bca1fy1VmXM6YTr9iMj/H9FiV5FH80kOSCS5cA= + + + Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/runtime.nib + + hash2 + + 0aP4/XYhE9pTrC1von5mej2B5hZzviQdM4PQj/nojlY= + + + Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/objects-11.0+.nib + + hash2 + + hg8U6PEGkuQ5LmSJ3QWnXPjAHQ9HR+iYMliJQBqIXsA= + + + Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/runtime.nib + + hash2 + + xzfMa2B7p6qD36vy7gfDE7AfItGacEFMLkGs19efnI0= + + + Checkout.storyboardc/RazorpayCheckoutVC.nib/objects-11.0+.nib + + hash2 + + 0D+N+GRb1ZrUQlq4dTQIQfubTWQC44SvjHUHVlVbgeg= + + + Checkout.storyboardc/RazorpayCheckoutVC.nib/runtime.nib + + hash2 + + 0D+N+GRb1ZrUQlq4dTQIQfubTWQC44SvjHUHVlVbgeg= + + + Checkout.storyboardc/RazorpayMagicxVC.nib/objects-11.0+.nib + + hash2 + + l6Hz4xHGp/8dMGEWk8KuCnewyrV7Y1XGhWysBUgItFY= + + + Checkout.storyboardc/RazorpayMagicxVC.nib/runtime.nib + + hash2 + + l6Hz4xHGp/8dMGEWk8KuCnewyrV7Y1XGhWysBUgItFY= + + + Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/objects-11.0+.nib + + hash2 + + bzY2zdca4b/GrxTr/LmNprdhD3SyIBsZG1W2z7TVW28= + + + Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/runtime.nib + + hash2 + + bzY2zdca4b/GrxTr/LmNprdhD3SyIBsZG1W2z7TVW28= + + + Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/objects-11.0+.nib + + hash2 + + I8p2+VocnQu/7nTAHxHwPLoZ9J+et+y957CgfHi+MQo= + + + Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/runtime.nib + + hash2 + + h05YMT+1oAA6um16sH5KVB2c6toLm935YPmV2d/ZDU8= + + + CommonAssets/Razorpay_Logo.png + + hash2 + + udRErjoaEwN536HIEl+2sH6KQ0Q2KzlKwLYCkQlBGKE= + + + CommonAssets/check_mark.png + + hash2 + + s+l4gXoMSGUj0xR2eSdXwQTHoyRU5F4+aTSVjO+I8wU= + + + CommonAssets/warning.png + + hash2 + + S7OOo4xdlAEiEgfkEuic4ap4JZlhvtYIwFSHWu034SA= + + + EncryptedOtpelf.js + + hash2 + + 85Tocsg1aPekBFPeMKMV2IruNGVkOyyV6xlbQkQOH3A= + + + Hash.txt + + hash2 + + B20CsAEe8H45a3Ivw23aBTWNU7qGh1JYKb/iAwwaIEQ= + + + PrivacyInfo.xcprivacy + + hash2 + + 0GK4q+J5XVD2O8agumlONknk2PSlkzr97y/P84XeCyg= + + + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/test/Freshyo.app/Frameworks/hermes.framework/Info.plist b/test/Freshyo.app/Frameworks/hermes.framework/Info.plist new file mode 100644 index 0000000..765e804 --- /dev/null +++ b/test/Freshyo.app/Frameworks/hermes.framework/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + hermes + CFBundleIconFile + + CFBundleIdentifier + dev.hermesengine.iphonesimulator + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.12.0 + CFBundleSignature + ???? + CFBundleVersion + 0.12.0 + CSResourcesFileMapped + + MinimumOSVersion + 15.1 + + diff --git a/test/Freshyo.app/Frameworks/hermes.framework/_CodeSignature/CodeResources b/test/Freshyo.app/Frameworks/hermes.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..da00154 --- /dev/null +++ b/test/Freshyo.app/Frameworks/hermes.framework/_CodeSignature/CodeResources @@ -0,0 +1,101 @@ + + + + + files + + Info.plist + + 4Hno0Ddszl7pNxmsMdj4eZ8APpg= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/test/Freshyo.app/Frameworks/hermes.framework/hermes b/test/Freshyo.app/Frameworks/hermes.framework/hermes new file mode 100755 index 0000000..c932c85 Binary files /dev/null and b/test/Freshyo.app/Frameworks/hermes.framework/hermes differ diff --git a/test/Freshyo.app/Freshyo b/test/Freshyo.app/Freshyo new file mode 100755 index 0000000..0f1327b Binary files /dev/null and b/test/Freshyo.app/Freshyo differ diff --git a/test/Freshyo.app/Freshyo.debug.dylib b/test/Freshyo.app/Freshyo.debug.dylib new file mode 100755 index 0000000..b70801f Binary files /dev/null and b/test/Freshyo.app/Freshyo.debug.dylib differ diff --git a/test/Freshyo.app/GTMAppAuth_Privacy.bundle/Info.plist b/test/Freshyo.app/GTMAppAuth_Privacy.bundle/Info.plist new file mode 100644 index 0000000..a1122dc Binary files /dev/null and b/test/Freshyo.app/GTMAppAuth_Privacy.bundle/Info.plist differ diff --git a/test/Freshyo.app/GTMAppAuth_Privacy.bundle/PrivacyInfo.xcprivacy b/test/Freshyo.app/GTMAppAuth_Privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..d37d627 --- /dev/null +++ b/test/Freshyo.app/GTMAppAuth_Privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyCollectedDataTypes + + NSPrivacyAccessedAPITypes + + NSPrivacyTrackingDomains + + NSPrivacyTracking + + + diff --git a/test/Freshyo.app/GTMSessionFetcher_Core_Privacy.bundle/Info.plist b/test/Freshyo.app/GTMSessionFetcher_Core_Privacy.bundle/Info.plist new file mode 100644 index 0000000..b28a0f9 Binary files /dev/null and b/test/Freshyo.app/GTMSessionFetcher_Core_Privacy.bundle/Info.plist differ diff --git a/test/Freshyo.app/GTMSessionFetcher_Core_Privacy.bundle/PrivacyInfo.xcprivacy b/test/Freshyo.app/GTMSessionFetcher_Core_Privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..0a95d09 --- /dev/null +++ b/test/Freshyo.app/GTMSessionFetcher_Core_Privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,23 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + diff --git a/test/Freshyo.app/GoogleSignIn.bundle/Info.plist b/test/Freshyo.app/GoogleSignIn.bundle/Info.plist new file mode 100644 index 0000000..38171da Binary files /dev/null and b/test/Freshyo.app/GoogleSignIn.bundle/Info.plist differ diff --git a/test/Freshyo.app/GoogleSignIn.bundle/PrivacyInfo.xcprivacy b/test/Freshyo.app/GoogleSignIn.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..010fc33 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,122 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeName + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeEmailAddress + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypePhoneNumber + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeOtherDataTypes + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeCoarseLocation + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeUserID + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeDeviceID + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeOtherUsageData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + + + + diff --git a/test/Freshyo.app/GoogleSignIn.bundle/Roboto-Bold.ttf b/test/Freshyo.app/GoogleSignIn.bundle/Roboto-Bold.ttf new file mode 100755 index 0000000..68822ca Binary files /dev/null and b/test/Freshyo.app/GoogleSignIn.bundle/Roboto-Bold.ttf differ diff --git a/test/Freshyo.app/GoogleSignIn.bundle/ar.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/ar.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..d122eb7 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/ar.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "تسجيل الدخول"; + +/* Long form sign-in button text */ +"Sign in with Google" = "تسجيل الدخول باستخدام Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "موافق"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "إلغاء"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "إعدادات"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "يتعذَّر تسجيل الدخول إلى الحساب"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "يطلب منك المشرف تعيين رمز مرور على هذا الجهاز للدخول إلى هذا الحساب. يُرجى تعيين رمز المرور وإعادة المحاولة."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "لا يتوافق هذا الجهاز مع سياسة الأمان التي أعدها مشرفك"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "هل تريد الربط بتطبيق Device Policy؟"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "يجب الربط مع تطبيق Device Policy قبل تسجيل الدخول لحماية بيانات مؤسستك."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "ربط"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/ca.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/ca.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..8a1c13e --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/ca.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Inicia la sessió"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Inicia la sessió amb Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "D’acord"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancel·la"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Configuració"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "No es pot iniciar la sessió al compte"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "L'administrador requereix que estableixis una contrasenya en aquest dispositiu per accedir al compte. Estableix una contrasenya i torna-ho a provar."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "El dispositiu no compleix la política de seguretat establerta pel teu administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vols connectar-te amb l'aplicació Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Per protegir les dades de la teva organització, t'has de connectar amb l'aplicació Device Policy abans d'iniciar la sessió."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Vull connectar-me"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/cs.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/cs.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..4443b22 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/cs.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Přihlásit se"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Přihlásit se účtem Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Zrušit"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Nastavení"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nelze se přihlásit k účtu"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administrátor vyžaduje, abyste v tomto zařízení nastavili heslo pro přístup k tomuto účtu. Nastavte prosím heslo a zkuste to znovu."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Zařízení nevyhovuje bezpečnostním zásadám nastaveným administrátorem."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Propojit s aplikací Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Aby bylo možné chránit data vaší organizace, před přihlášením je nutné aktivovat propojení s aplikací Device Policy."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Propojit"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/da.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/da.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..cc44a71 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/da.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Log ind"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Log ind med Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Annuller"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Indstillinger"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Der kunne ikke logges ind på kontoen"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Din administrator kræver, at du angiver en adgangskode på enheden for at få adgang til kontoen. Angiv en adgangskode, og prøv igen."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Enheden overholder ikke den sikkerhedspolitik, der er angivet af din administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vil du oprette forbindelse til appen Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Du skal oprette forbindelse til appen Device Policy, inden du logger ind, for at beskytte din organisations data."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Opret forbindelse"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/de.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/de.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..b4e0963 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/de.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Anmelden"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Über Google anmelden"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Abbrechen"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Einstellungen"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Anmelden im Konto nicht möglich"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Ihr Administrator hat festgelegt, dass auf diesem Gerät ein Sicherheitscode eingerichtet werden muss, um auf dieses Konto zuzugreifen. Bitte legen Sie einen Sicherheitscode fest und versuchen Sie es noch einmal."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Das Gerät ist nicht mit den von Ihrem Administrator festgelegten Sicherheitsrichtlinien konform."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Mit der Device Policy App verknüpfen?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Zum Schutz der Daten Ihrer Organisation müssen Sie Ihr Gerät zuerst mit der Device Policy App verknüpfen, bevor Sie sich anmelden."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Verknüpfen"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/el.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/el.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..05bd7cc --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/el.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Σύνδεση"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Συνδεθείτε με το Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "ΟΚ"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Άκυρο"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Ρυθμίσεις"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Δεν είναι δυνατή η σύνδεση στον λογαριασμό"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Ο διαχειριστής σας απαιτεί να ορίσετε έναν κωδικό πρόσβασης στη συσκευή, για να έχετε πρόσβαση σε αυτόν τον λογαριασμό. Ορίστε έναν κωδικό πρόσβασης και δοκιμάστε ξανά."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Η συσκευή δεν συμμορφώνεται με την πολιτική ασφαλείας που έχει ορίσει ο διαχειριστής σας."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Σύνδεση με την εφαρμογή Device Policy;"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Προκειμένου να προστατεύσετε τα δεδομένα του οργανισμού σας, θα πρέπει να συνδεθείτε με την εφαρμογή Device Policy προτού συνδεθείτε στον λογαριασμό σας."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Σύνδεση"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/en.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/en.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..460ad64 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/en.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Sign in"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Sign in with Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancel"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Settings"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Unable to sign in to account"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Your administrator requires you to set a passcode on this device to access this account. Please set a passcode and try again."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "The device is not compliant with the security policy set by your administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Connect with Device Policy App?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "In order to protect your organization's data, you must connect with the Device Policy app before logging in."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Connect"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/en_GB.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/en_GB.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..f4e37db --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/en_GB.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Sign in"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Sign in with Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancel"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Settings"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Unable to sign in to account"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Your administrator requires you to set a passcode on this device to access this account. Please set a passcode and try again."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "The device is not compliant with the security policy set by your administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Connect with Device Policy App?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "In order to protect your organisation's data, you must connect with the Device Policy app before logging in."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Connect"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/es.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/es.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..f756140 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/es.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Iniciar sesión"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Iniciar sesión con Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Aceptar"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Configuración"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "No se ha podido iniciar sesión en la cuenta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "El administrador requiere que configures una contraseña en este dispositivo para acceder a esta cuenta. Inténtalo de nuevo cuando lo hayas hecho."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "El dispositivo no cumple la política de privacidad que ha definido tu administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "¿Has conectado tu dispositivo con la aplicación Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger los datos de tu organización, debes conectar tu dispositivo con la aplicación Device Policy antes de iniciar sesión."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectar"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/es_MX.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/es_MX.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..4cfb56d --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/es_MX.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Acceder"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Acceder con Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Aceptar"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Configuración"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "No es posible acceder a la cuenta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Para acceder a esta cuenta, tu administrador requiere que establezcas una contraseña en el dispositivo. Configúrala y vuelve a intentarlo."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "El dispositivo no cumple con la política de seguridad que estableció el administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "¿Deseas conectarte con la app de Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger los datos de tu organización, debes conectarte con la app de Device Policy antes de acceder."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectar"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/fi.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/fi.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..c0006f7 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/fi.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Kirjaudu sisään"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Kirjaudu Google-tilin tunnuksilla"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Peruuta"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Asetukset"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Kirjautuminen tilille ei onnistu"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Järjestelmänvalvoja edellyttää tunnuskoodin määrittämistä, ennen kuin voit käyttää tiliä tällä laitteella. Määritä tunnuskoodi ja yritä uudelleen."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Laite ei noudata järjestelmänvalvojan määrittämää verkkotunnuskäytäntöä."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Muodostetaanko yhteys Device Policy ‑sovellukseen?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Suojaa organisaatiosi dataa muodostamalla yhteys Device Policy ‑sovellukseen ennen kirjautumista."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Muodosta yhteys"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/fr.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/fr.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..06a30c1 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/fr.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Se connecter"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Se connecter avec Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Annuler"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Paramètres"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Impossible de se connecter au compte"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Votre administrateur exige que vous définissiez un mot de passe sur cet appareil pour accéder à ce compte. Veuillez définir un mot de passe, puis réessayer."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "L'appareil ne respecte pas les règles de sécurité définies par votre administrateur."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Se connecter à l'application Device Policy ?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Afin de protéger les données de votre organisation, vous devez vous connecter à l'application Device Policy avant de vous connecter à votre compte."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Connexion"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/fr_CA.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/fr_CA.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..29ca57e --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/fr_CA.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Se connecter"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Se connecter à Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Annuler"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Paramètres"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Impossible de se connecter au compte"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Pour que votre administrateur puisse accéder à ce compte, vous devez définir un mot de passe sur cet appareil. Veuillez définir un mot de passe et réessayer."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "L'appareil n'est pas conforme à la politique de sécurité définie par votre administrateur."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Connexion avec l'application Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Pour protéger les données de votre organisation, vous devez vous connecter à l'application Device Policy avant de vous connecter."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Connexion"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/google.png b/test/Freshyo.app/GoogleSignIn.bundle/google.png new file mode 100644 index 0000000..a13d4dc Binary files /dev/null and b/test/Freshyo.app/GoogleSignIn.bundle/google.png differ diff --git a/test/Freshyo.app/GoogleSignIn.bundle/google@2x.png b/test/Freshyo.app/GoogleSignIn.bundle/google@2x.png new file mode 100644 index 0000000..88a86b1 Binary files /dev/null and b/test/Freshyo.app/GoogleSignIn.bundle/google@2x.png differ diff --git a/test/Freshyo.app/GoogleSignIn.bundle/google@3x.png b/test/Freshyo.app/GoogleSignIn.bundle/google@3x.png new file mode 100644 index 0000000..b4d4645 Binary files /dev/null and b/test/Freshyo.app/GoogleSignIn.bundle/google@3x.png differ diff --git a/test/Freshyo.app/GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..da294c8 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "היכנס"; + +/* Long form sign-in button text */ +"Sign in with Google" = "היכנס באמצעות Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "אישור"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "ביטול"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "הגדרות"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "לא ניתן להיכנס לחשבון"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "מנהל המערכת דורש ממך להגדיר קוד סיסמה במכשיר זה כדי לגשת לחשבון זה. יש להגדיר קוד סיסמה ולנסות שוב."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "המכשיר אינו פועל בהתאם למדיניות האבטחה שנקבעה על-ידי מנהל המערכת."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "האם להתחבר באמצעות האפליקציית Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "על מנת להגן על נתוני הארגון שלך, יש להתחבר באמצעות אפליקציית Device Policy לפני הכניסה לחשבון."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "התחברות"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..bafc3f1 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "साइन इन करें"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Google के साथ साइन इन करें"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "ठीक"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "अभी नहीं"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "सेटिंग"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "खाते में साइन इन नहीं किया जा सका"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "आपके एडमिन के लिए ज़रूरी है कि आप यह खाता एक्सेस करने के लिए इस डिवाइस पर एक पासकोड सेट करें. कृपया पासकोड सेट करें और दोबारा कोशिश करें."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "डिवाइस आपके एडमिन के ज़रिए सेट की गई सुरक्षा नीति का अनुपालन नहीं करता है."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "क्या Device Policy ऐप्लिकेशन से कनेक्ट करना चाहते हैं?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "अपने संगठन डेटा की सुरक्षा के लिए, आपको लॉग-इन करने से पहले Device Policy ऐप्लिकेशन से कनेक्ट करना होगा."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "कनेक्ट करें"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..6304c00 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Prijava"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Prijavite se putem Googlea"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "U redu"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Odbaci"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Postavke"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Prijava na račun nije moguća"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Vaš administrator zahtijeva da postavite šifru zaporke na ovom uređaju da biste pristupili računu. Postavite šifru zaporke i pokušajte ponovo."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Uređaj nije usklađen sa sigurnosnim pravilima koja je postavio vaš administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Želite li se povezati s aplikacijom Pravila za uređaje?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Da biste zaštitili podatke svoje organizacije, morate se povezati s aplikacijom Pravila za uređaje prije prijave."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Poveži"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..4940e4c --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Bejelentkezés"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Bejelentkezés Google-fiókkal"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Mégse"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Beállítások"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nem sikerült bejelentkezni a fiókba"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Adminisztrátora biztonsági kód beállítását kéri ezen az eszközön a fiókhoz való hozzáféréshez. Kérjük, állítson be biztonsági kódot, majd próbálja újra."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Az eszköz nem felel meg a rendszergazda által beállított biztonsági házirendnek."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Csatlakozik a Device Policy alkalmazáshoz?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "A szervezet adatainak védelme érdekében a bejelentkezés előtt csatlakoznia kell a Device Policy alkalmazáshoz."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Csatlakozás"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..2ed96ba --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Masuk"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Masuk dengan Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Oke"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Batal"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Setelan"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Tidak dapat login ke akun"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administrator mengharuskan Anda menyetel kode sandi di perangkat ini untuk mengakses akun ini. Setel kode sandi dan coba lagi."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Perangkat ini tidak sesuai dengan kebijakan keamanan yang disetel oleh administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Sambungkan dengan Aplikasi Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Untuk melindungi data organisasi, Anda harus tersambung dengan aplikasi Device Policy sebelum login."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Sambungkan"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..b7c233c --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Accedi"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Accedi con Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Annulla"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Impostazioni"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Impossibile accedere all'account"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "L'amministratore richiede l'impostazione di un passcode sul dispositivo per accedere a questo account. Imposta un passcode e riprova."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Il dispositivo non è conforme alle norme di sicurezza stabilite dall'amministratore."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vuoi collegarti all'app Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Per proteggere i dati della tua organizzazione, devi collegarti all'app Device Policy prima di accedere."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Collega"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..16c62cb --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "ログイン"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Googleでログイン"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "キャンセル"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "設定"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "アカウントにログインできません"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "このアカウントにアクセスするには、この端末でパスコードを設定する必要があります。パスコードを設定してから、もう一度お試しください。"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "この端末は、管理者が設定したセキュリティ ポリシーに準拠していません。"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Device Policy アプリと接続しますか?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "組織のデータを保護するために、ログインする前に Device Policy アプリと接続する必要があります。"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "接続"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..c0faf96 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "로그인"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Google 계정으로 로그인"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "확인"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "취소"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "설정"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "계정에 로그인할 수 없음"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "관리자의 설정에 따라 이 계정에 액세스하려면 사용 중인 기기에 비밀번호를 설정해야 합니다. 비밀번호를 설정한 후 다시 시도해 주세요."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "관리자가 설정한 보안 정책을 준수하지 않는 기기입니다."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Device Policy 앱과 연결하시겠습니까?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "조직의 데이터를 보호하려면 로그인하기 전에 Device Policy 앱과 연결해야 합니다."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "연결"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..2fcb23e --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Log masuk"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Log masuk dengan Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Batal"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Tetapan"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Tidak dapat log masuk ke akaun"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Pentadbir menghendaki anda menetapkan kod laluan pada peranti ini untuk mengakses akaun ini. Sila tetapkan kod laluan, kemudian cuba lagi."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Peranti tidak mematuhi dasar keselamatan yang ditetapkan oleh pentadbir anda."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Berhubung dengan Apl Dasar Peranti?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Untuk melindungi data organisasi anda, anda mesti berhubung dengan apl Dasar Peranti sebelum log masuk."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Hubungkan"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..4ffeb75 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Logg på"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Logg på med Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Avbryt"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Innstillinger"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Kan ikke logge på kontoen"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administratoren din krever at du angir en adgangskode på denne enheten for å få tilgang til kontoen. Angi en adgangskode, og prøv på nytt."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Enheten overholder ikke retningslinjene for sikkerhet som ble angitt av administratoren din."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vil du koble til med Device Policy-appen?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "For å beskytte dataene til organisasjonen din må du koble til med Device Policy-appen før du logger på."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Koble til"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..f9d0b80 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Inloggen"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Inloggen met Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Annuleren"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Instellingen"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Kan niet inloggen op account"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Uw beheerder vereist dat u een toegangscode instelt op dit apparaat om toegang te krijgen tot dit account. Stel een toegangscode in en probeer het opnieuw."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Het apparaat voldoet niet aan het beveiligingsbeleid dat is ingesteld door uw beheerder."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Verbinden met Device Policy-app?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Ter bescherming van de gegevens van uw organisatie moet u verbinding maken met de Device Policy-app voordat u inlogt."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Verbinden"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..2317335 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Zaloguj się"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Zaloguj się przez Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Anuluj"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Ustawienia"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nie można zalogować się na konto"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administrator wymaga ustawienia kodu dostępu do konta na tym urządzeniu. Ustaw kod dostępu i spróbuj ponownie."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Urządzenie nie jest zgodne z zasadami bezpieczeństwa ustanowionymi przez Twojego administratora."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Połączyć z aplikacją Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Aby chronić dane organizacji, przed zalogowaniem musisz się połączyć z aplikacją Device Policy."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Połącz"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..8dc34f6 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Fazer login"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Fazer login com o Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Configurações"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Não foi possível fazer login na conta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Seu administrador exige que você defina uma senha neste dispositivo para acessar esta conta. Defina uma senha e tente novamente."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "O dispositivo não está em conformidade com a política de segurança definida pelo administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Conectar-se ao app Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger os dados da sua organização, você precisa se conectar ao app Device Policy antes de fazer login."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectar"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..8dc34f6 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Fazer login"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Fazer login com o Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Configurações"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Não foi possível fazer login na conta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Seu administrador exige que você defina uma senha neste dispositivo para acessar esta conta. Defina uma senha e tente novamente."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "O dispositivo não está em conformidade com a política de segurança definida pelo administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Conectar-se ao app Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger os dados da sua organização, você precisa se conectar ao app Device Policy antes de fazer login."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectar"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..23875ea --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Iniciar sessão"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Iniciar sessão com o Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Definições"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Não é possível iniciar sessão na conta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "O administrador requer a definição de um código secreto neste dispositivo para aceder a esta conta. Defina um código secreto e tente novamente."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "O dispositivo não está em conformidade com a política de segurança definida pelo seu administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Pretende ligar-se à aplicação Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger os dados da sua entidade, tem de se ligar à aplicação Device Policy antes de iniciar sessão."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Ligar"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..7f24cbd --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Conectați-vă"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Conectați-vă cu Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Anulați"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Setări"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nu vă puteți conecta la cont"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administratorul impune să setați o parolă pe acest dispozitiv ca să accesați contul. Setați o parolă și încercați din nou."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Dispozitivul nu respectă politica de securitate stabilită de administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vă conectați cu aplicația Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Pentru a vă proteja datele organizației, trebuie să vă conectați cu aplicația Device Policy înainte de a vă conecta."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectați"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..4041696 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Войти"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Войти в аккаунт Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "ОК"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Отмена"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Настройки"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Не удалось войти в аккаунт"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "В соответствии с требованиями администратора для входа в аккаунт необходимо установить на устройстве код доступа. Сделайте это и повторите попытку."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Устройство не соответствует правилам безопасности, которые установлены администратором."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Подключить приложение Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "В целях защиты корпоративных данных перед входом в аккаунт необходимо подключить приложение Device Policy."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Подключить"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..c516318 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Prihlásiť sa"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Prihlásiť sa pomocou účtu Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Zrušiť"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Nastavenia"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nedá sa prihlásiť do účtu"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Správca vyžaduje, aby ste v tomto zariadení nastavili vstupný kód na prístup do príslušného účtu. Nastavte vstupný kód a skúste to znova."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Zariadenie nespĺňa pravidlá zabezpečenia nastavené vaším správcom."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Prepojiť s aplikáciou Pravidlá pre zariadenie?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Na to, aby bolo možné chrániť dáta vašej organizácie, je nutné pred prihlásením aktivovať prepojenie s aplikáciou Pravidlá pre zariadenie."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Prepojiť"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..46ada2b --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Logga in"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Logga in med Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Ok"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Avbryt"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Inställningar"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Det gick inte att logga in på kontot"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administratören kräver att du anger ett lösenord på den här enheten för att få åtkomst till kontot. Ange ett lösenord och försök igen."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Säkerhetspolicyn som administratören har angett efterlevs inte på enheten."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vill du ansluta med appen Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Du måste ansluta med appen Device Policy innan du loggar in för att skydda organisationens data."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Anslut"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..125c39d --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "ลงชื่อเข้าใช้"; + +/* Long form sign-in button text */ +"Sign in with Google" = "ลงชื่อเข้าใช้ด้วย Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "ตกลง"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "ยกเลิก"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "การตั้งค่า"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "ลงชื่อเข้าใช้บัญชีไม่ได้"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "ผู้ดูแลระบบกำหนดให้คุณตั้งรหัสผ่านในอุปกรณ์นี้เพื่อเข้าถึงบัญชีนี้ โปรดตั้งรหัสผ่าน แล้วลองอีกครั้ง"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "อุปกรณ์ไม่ตรงตามนโยบายความปลอดภัยที่กำหนดโดยผู้ดูแลระบบของคุณ"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "เชื่อมต่อแอป Device Policy ไหม"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "เพื่อปกป้องข้อมูลขององค์กร คุณต้องเชื่อมต่อแอป Device Policy ก่อนลงชื่อเข้าสู่ระบบ"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "เชื่อมต่อ"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..fb22b60 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Oturum aç"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Google ile oturum aç"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Tamam"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "İptal"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Ayarlar"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Hesapta oturum açılamıyor"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Yöneticiniz, bu hesaba erişmek için bu cihazda bir şifre kodu ayarlamanızı gerektiriyor. Lütfen şifre kodu ayarlayın ve tekrar deneyin."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Bu cihaz, yöneticinizin ayarladığı güvenlik politikasıyla uyumlu değil."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Cihaz Politika Uygulamasına bağlanılsın mı?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Kuruluşunuzun verilerini korumak için, giriş yapmadan önce Cihaz Politikası uygulamasına bağlanmalısınız."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Bağlan"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..8d5b841 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Увійти"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Увійти в обліковий запис Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Скасувати"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Налаштування"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Не вдається ввійти в обліковий запис"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Щоб увійти в обліковий запис, потрібно налаштувати код доступу на пристрої. Зробіть це й повторіть спробу."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Пристрій не відповідає правилу безпеки, яке налаштував адміністратор."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "З’єднатися з додатком Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Щоб захистити дані організації, потрібно з’єднатися з додатком Device Policy, перш ніж увійти."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "З’єднатися"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..11427e0 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Đăng nhập"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Đăng nhập bằng Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Hủy"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Cài đặt"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Không thể đăng nhập vào tài khoản"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Quản trị viên của bạn yêu cầu bạn phải đặt mật mã trên thiết bị này để truy cập vào tài khoản này. Hãy đặt mật mã và thử lại."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Thiết bị này không tuân thủ chính sách bảo mật do quản trị viên của bạn thiết lập."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Kết nối với ứng dụng Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Để bảo vệ dữ liệu của tổ chức của mình, bạn phải kết nối với ứng dụng Device Policy trước khi đăng nhập."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Kết nối"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..5c57160 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "登录"; + +/* Long form sign-in button text */ +"Sign in with Google" = "使用 Google 帐号登录"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "确定"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "取消"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "设置"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "无法登录帐号"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "您的管理员要求您必须先在此设备上设置密码,然后才能访问此帐号。请设置密码并重试。"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "该设备不符合管理员设置的安全政策。"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "要关联 Device Policy 应用吗?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "要保护您组织的数据,您必须在登录前关联 Device Policy 应用。"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "关联"; diff --git a/test/Freshyo.app/GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings b/test/Freshyo.app/GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..a51c525 --- /dev/null +++ b/test/Freshyo.app/GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "登入"; + +/* Long form sign-in button text */ +"Sign in with Google" = "登入 Google 帳戶"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "確定"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "取消"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "設定"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "無法登入帳戶"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "管理員要求您必須為這個裝置設定通行碼,才能存取這個帳戶。請設定通行碼,然後再試一次。"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "這部裝置不符合您的管理員所設定的安全性政策規定。"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "要連結 Device Policy 應用程式嗎?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "為了保護貴機構的資料,您必須在登入前連結 Device Policy 應用程式。"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "連結"; diff --git a/test/Freshyo.app/GoogleUtilities_Privacy.bundle/Info.plist b/test/Freshyo.app/GoogleUtilities_Privacy.bundle/Info.plist new file mode 100644 index 0000000..0c1b5bc Binary files /dev/null and b/test/Freshyo.app/GoogleUtilities_Privacy.bundle/Info.plist differ diff --git a/test/Freshyo.app/GoogleUtilities_Privacy.bundle/PrivacyInfo.xcprivacy b/test/Freshyo.app/GoogleUtilities_Privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..1c9e1a6 --- /dev/null +++ b/test/Freshyo.app/GoogleUtilities_Privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,34 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + NSPrivacyCollectedDataTypes + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + C56D.1 + + + + + + diff --git a/test/Freshyo.app/Info.plist b/test/Freshyo.app/Info.plist new file mode 100644 index 0000000..db4efd4 Binary files /dev/null and b/test/Freshyo.app/Info.plist differ diff --git a/test/Freshyo.app/PkgInfo b/test/Freshyo.app/PkgInfo new file mode 100644 index 0000000..bd04210 --- /dev/null +++ b/test/Freshyo.app/PkgInfo @@ -0,0 +1 @@ +APPL???? \ No newline at end of file diff --git a/ios/meatfarmermonorepo/PrivacyInfo.xcprivacy b/test/Freshyo.app/PrivacyInfo.xcprivacy similarity index 100% rename from ios/meatfarmermonorepo/PrivacyInfo.xcprivacy rename to test/Freshyo.app/PrivacyInfo.xcprivacy diff --git a/test/Freshyo.app/RCT-Folly_privacy.bundle/Info.plist b/test/Freshyo.app/RCT-Folly_privacy.bundle/Info.plist new file mode 100644 index 0000000..8b4064e Binary files /dev/null and b/test/Freshyo.app/RCT-Folly_privacy.bundle/Info.plist differ diff --git a/test/Freshyo.app/RNSVGFilters.bundle/Info.plist b/test/Freshyo.app/RNSVGFilters.bundle/Info.plist new file mode 100644 index 0000000..90569c8 Binary files /dev/null and b/test/Freshyo.app/RNSVGFilters.bundle/Info.plist differ diff --git a/test/Freshyo.app/RNSVGFilters.bundle/RNSVGArithmeticFilter.iphoneos.metallib b/test/Freshyo.app/RNSVGFilters.bundle/RNSVGArithmeticFilter.iphoneos.metallib new file mode 100644 index 0000000..47668d1 Binary files /dev/null and b/test/Freshyo.app/RNSVGFilters.bundle/RNSVGArithmeticFilter.iphoneos.metallib differ diff --git a/test/Freshyo.app/RNSVGFilters.bundle/RNSVGCompositeXor.iphoneos.metallib b/test/Freshyo.app/RNSVGFilters.bundle/RNSVGCompositeXor.iphoneos.metallib new file mode 100644 index 0000000..0d0f406 Binary files /dev/null and b/test/Freshyo.app/RNSVGFilters.bundle/RNSVGCompositeXor.iphoneos.metallib differ diff --git a/test/Freshyo.app/ReachabilitySwift.bundle/Info.plist b/test/Freshyo.app/ReachabilitySwift.bundle/Info.plist new file mode 100644 index 0000000..5145da4 Binary files /dev/null and b/test/Freshyo.app/ReachabilitySwift.bundle/Info.plist differ diff --git a/ios/meatfarmermonorepo/meatfarmermonorepo.entitlements b/test/Freshyo.app/ReachabilitySwift.bundle/PrivacyInfo.xcprivacy similarity index 71% rename from ios/meatfarmermonorepo/meatfarmermonorepo.entitlements rename to test/Freshyo.app/ReachabilitySwift.bundle/PrivacyInfo.xcprivacy index f683276..cfbe279 100644 --- a/ios/meatfarmermonorepo/meatfarmermonorepo.entitlements +++ b/test/Freshyo.app/ReachabilitySwift.bundle/PrivacyInfo.xcprivacy @@ -1,5 +1,8 @@ - - \ No newline at end of file + + NSPrivacyTracking + + + diff --git a/test/Freshyo.app/React-Core_privacy.bundle/Info.plist b/test/Freshyo.app/React-Core_privacy.bundle/Info.plist new file mode 100644 index 0000000..6281013 Binary files /dev/null and b/test/Freshyo.app/React-Core_privacy.bundle/Info.plist differ diff --git a/test/Freshyo.app/React-Core_privacy.bundle/PrivacyInfo.xcprivacy b/test/Freshyo.app/React-Core_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..d9d7d19 --- /dev/null +++ b/test/Freshyo.app/React-Core_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,29 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/test/Freshyo.app/React-cxxreact_privacy.bundle/Info.plist b/test/Freshyo.app/React-cxxreact_privacy.bundle/Info.plist new file mode 100644 index 0000000..a3fe2ce Binary files /dev/null and b/test/Freshyo.app/React-cxxreact_privacy.bundle/Info.plist differ diff --git a/test/Freshyo.app/React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy b/test/Freshyo.app/React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..6be0f26 --- /dev/null +++ b/test/Freshyo.app/React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,21 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/test/Freshyo.app/SDWebImage.bundle/Info.plist b/test/Freshyo.app/SDWebImage.bundle/Info.plist new file mode 100644 index 0000000..1f41d4d Binary files /dev/null and b/test/Freshyo.app/SDWebImage.bundle/Info.plist differ diff --git a/test/Freshyo.app/SDWebImage.bundle/PrivacyInfo.xcprivacy b/test/Freshyo.app/SDWebImage.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..276f761 --- /dev/null +++ b/test/Freshyo.app/SDWebImage.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,23 @@ + + + + + NSPrivacyTracking + + NSPrivacyCollectedDataTypes + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + + diff --git a/test/Freshyo.app/SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib b/test/Freshyo.app/SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib new file mode 100644 index 0000000..8417215 Binary files /dev/null and b/test/Freshyo.app/SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib differ diff --git a/test/Freshyo.app/SplashScreen.storyboardc/Info.plist b/test/Freshyo.app/SplashScreen.storyboardc/Info.plist new file mode 100644 index 0000000..79f4412 Binary files /dev/null and b/test/Freshyo.app/SplashScreen.storyboardc/Info.plist differ diff --git a/test/Freshyo.app/SplashScreen.storyboardc/SplashScreenViewController.nib b/test/Freshyo.app/SplashScreen.storyboardc/SplashScreenViewController.nib new file mode 100644 index 0000000..eb6f55c Binary files /dev/null and b/test/Freshyo.app/SplashScreen.storyboardc/SplashScreenViewController.nib differ diff --git a/test/Freshyo.app/_CodeSignature/CodeResources b/test/Freshyo.app/_CodeSignature/CodeResources new file mode 100644 index 0000000..14f8021 --- /dev/null +++ b/test/Freshyo.app/_CodeSignature/CodeResources @@ -0,0 +1,1791 @@ + + + + + files + + AppAuthCore_Privacy.bundle/Info.plist + + MMDsBP6hdSYQ+aM0n7vZID0NVj8= + + AppAuthCore_Privacy.bundle/PrivacyInfo.xcprivacy + + MCDRptixYfA+qALBX9b4uxq3rwo= + + AppIcon60x60@2x.png + + EQAVkhSkPneAAzA/TC5okiIQCSY= + + AppIcon76x76@2x~ipad.png + + tERi/ybfFIrfA27Agwt+FaZ7lxI= + + Assets.car + + AEZBobR0IrgkOukQGSKh1p3ApLU= + + EXConstants.bundle/Info.plist + + Hlxsc20/U0owoVLTeqzSm5ybNIs= + + EXConstants.bundle/app.config + + gu2+gHdifrBUPqzAXQIYvdydX0g= + + EXUpdates.bundle/Info.plist + + wjdfAxEpgfQFinoWBfIM8p9jaw8= + + Expo.plist + + nD4OmzKel1DrphyqWIqjyzbx31E= + + ExpoApplication_privacy.bundle/Info.plist + + 8BRDaa8J7FLCzhVYdsGF90Fhe6A= + + ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy + + mUc2YHiDtobIhFXi+Mvm12TXeb8= + + ExpoConstants_privacy.bundle/Info.plist + + gHWCze8PybGkM8T+sLc+3tpj/QE= + + ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy + + dHAsEQehwJCS8hMOpBoz7emiNj8= + + ExpoDevice_privacy.bundle/Info.plist + + 6hGpMQ+NbBTY+ghWXzsUw8XJGyM= + + ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy + + hWEgzzi+YPgmddeTqWfAi6jGQ0E= + + ExpoFileSystem_privacy.bundle/Info.plist + + WIOt6Nu0S3BZ/+6OsBQFrMyXaNE= + + ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy + + UieOpg4b1PxYR6jA3/cs9mU9rdo= + + ExpoNotifications_privacy.bundle/Info.plist + + BwASpOTXQeKbJUrAWQFpwRpHkM8= + + ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy + + dHAsEQehwJCS8hMOpBoz7emiNj8= + + ExpoSystemUI_privacy.bundle/Info.plist + + ZY9+IxqDzlo+4baYZWU5AcIgICQ= + + ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy + + dHAsEQehwJCS8hMOpBoz7emiNj8= + + FBLPromises_Privacy.bundle/Info.plist + + ztyhBobmo4oPJ7w3hvsEnTQECDE= + + FBLPromises_Privacy.bundle/PrivacyInfo.xcprivacy + + ZajnvEs/MYRS3X4TPLAhBWi8mc4= + + Frameworks/Razorpay.framework/Info.plist + + m2+OcUVS+NCF/RaQ0NMeexAJIbU= + + Frameworks/Razorpay.framework/Razorpay + + wCcAD+BVHmZyLCiEBtRTiY2MxbQ= + + Frameworks/Razorpay.framework/_CodeSignature/CodeResources + + E3MDTYxmYfAlrvDpjZsMJ6zJcBI= + + Frameworks/RazorpayCore.framework/Info.plist + + IgSq/mUvfi0nncHC2TAKVG0zPwA= + + Frameworks/RazorpayCore.framework/RazorpayCore + + mL4UiHKydfuhBF+vIJxOKz8FC0Y= + + Frameworks/RazorpayCore.framework/_CodeSignature/CodeResources + + Mg2KLhPZgXh3p1KXRuTns7jtDXI= + + Frameworks/RazorpayStandard.framework/Assets.car + + 9EtCg2Ey2Zi4Ua584kuKWTJN01U= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/Info.plist + + DFcy10+V49NKtjJ4RLpByN10P1k= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/objects-11.0+.nib + + zRbA0UPDWTIRE/KMCArksV/vK2k= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/runtime.nib + + zRbA0UPDWTIRE/KMCArksV/vK2k= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/objects-11.0+.nib + + 0nbduMecK7uoslXovJgcjilOIB8= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/runtime.nib + + 0nbduMecK7uoslXovJgcjilOIB8= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/objects-11.0+.nib + + c8N/593lOrAw9wwSo2JSseKACUI= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/runtime.nib + + GAbF07uihY0DE3w15+txJ0RlSNw= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/objects-11.0+.nib + + PcD+CIGNT4GNXBw18IEBAYmUl1A= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/runtime.nib + + 1LYMZo3gzNiKkp3f7Nzh+lgBbPg= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/objects-11.0+.nib + + ENBWg/fxi+P7OShg+NGXd0X+mWQ= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/runtime.nib + + ENBWg/fxi+P7OShg+NGXd0X+mWQ= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/objects-11.0+.nib + + Ia0hGvI0wvIaseYa7wMvQf/q438= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/runtime.nib + + Ia0hGvI0wvIaseYa7wMvQf/q438= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/objects-11.0+.nib + + 09suesko3lo0ihguFnxyvFMqd6g= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/runtime.nib + + 09suesko3lo0ihguFnxyvFMqd6g= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/objects-11.0+.nib + + GuaLaOgcxzpvPP6jj7CE6UW1x54= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/runtime.nib + + Ucg3HkU3DNFIfnKf6gQlzd/zqTg= + + Frameworks/RazorpayStandard.framework/CommonAssets/Razorpay_Logo.png + + C/QPifs1kjcxzxgwUgDFDlLjpRw= + + Frameworks/RazorpayStandard.framework/CommonAssets/check_mark.png + + 6d4pPz33KoUobYRDPpGmnPiTVMs= + + Frameworks/RazorpayStandard.framework/CommonAssets/warning.png + + gxArEMTCcu4a+ueYNB3oMoIh48o= + + Frameworks/RazorpayStandard.framework/EncryptedOtpelf.js + + A893KbMpygzZy6/G1xrQkAudMxw= + + Frameworks/RazorpayStandard.framework/Hash.txt + + gN8QKnsfFYPlPa6NstmuiJETxJ8= + + Frameworks/RazorpayStandard.framework/Info.plist + + acRXxu68VWw8Pnzhk8Ky6zQaWHE= + + Frameworks/RazorpayStandard.framework/PrivacyInfo.xcprivacy + + 62HpNLqPh8tKsg+iNP/pSbF2S6M= + + Frameworks/RazorpayStandard.framework/RazorpayStandard + + IdGPAM/47JeUvZn9deiVN/6Iv0s= + + Frameworks/RazorpayStandard.framework/_CodeSignature/CodeResources + + +XL7ApglNpkYeb23l63yQ4jQSSc= + + Frameworks/hermes.framework/Info.plist + + 4Hno0Ddszl7pNxmsMdj4eZ8APpg= + + Frameworks/hermes.framework/_CodeSignature/CodeResources + + UltW0Jw9IEI+gE7DBGy5/VsUBrw= + + Frameworks/hermes.framework/hermes + + zNwvRCO4iW9WNlr9JGQIrylk2Ko= + + Freshyo.debug.dylib + + 0wJL2nSLD2iEmJZBS3K8SZ2V60Y= + + GTMAppAuth_Privacy.bundle/Info.plist + + B9CynSkhRTwBcEXmzMf1Sn757Hg= + + GTMAppAuth_Privacy.bundle/PrivacyInfo.xcprivacy + + AL1dh5ctObXBjoBiabSJ86M3HQs= + + GTMSessionFetcher_Core_Privacy.bundle/Info.plist + + rJV8qyXvfTlettGz7pgbgb2SgqY= + + GTMSessionFetcher_Core_Privacy.bundle/PrivacyInfo.xcprivacy + + GqeAMkwbcNQeG0K4qQhQh2vHhHo= + + GoogleSignIn.bundle/Info.plist + + GTjO78FbEPbwvUpuwiVfbjuf7w8= + + GoogleSignIn.bundle/PrivacyInfo.xcprivacy + + Bpn4ciS1QfdDGVc7S27q+o0IUEM= + + GoogleSignIn.bundle/Roboto-Bold.ttf + + RzJ98PNefNfIZFh0iXp0SWl1RK4= + + GoogleSignIn.bundle/ar.lproj/GoogleSignIn.strings + + hash + + 1U4RM14vSknB5uPRHwbBf2P3L9k= + + optional + + + GoogleSignIn.bundle/ca.lproj/GoogleSignIn.strings + + hash + + GWFStbBzSsozR8ndnlnCGWrVgIE= + + optional + + + GoogleSignIn.bundle/cs.lproj/GoogleSignIn.strings + + hash + + rkKd2a1WbhspF12uj7jbNaxdcsw= + + optional + + + GoogleSignIn.bundle/da.lproj/GoogleSignIn.strings + + hash + + CH8u4ji0ph6g0lWmwFmjuWeHjcQ= + + optional + + + GoogleSignIn.bundle/de.lproj/GoogleSignIn.strings + + hash + + h9KGBhz6GBwN3U8va+ZhDVBbEsk= + + optional + + + GoogleSignIn.bundle/el.lproj/GoogleSignIn.strings + + hash + + Sa1DzFvme+rejqFjRGh0R8Wvi2U= + + optional + + + GoogleSignIn.bundle/en.lproj/GoogleSignIn.strings + + hash + + abhi3BU5/ZWaUMKlntWlHWqGpfk= + + optional + + + GoogleSignIn.bundle/en_GB.lproj/GoogleSignIn.strings + + hash + + iMO9o55MsPkZZzMfqxaQRohEIEs= + + optional + + + GoogleSignIn.bundle/es.lproj/GoogleSignIn.strings + + hash + + M6+vCrtORDxDSYRfCs0EQa/NF7E= + + optional + + + GoogleSignIn.bundle/es_MX.lproj/GoogleSignIn.strings + + hash + + rOsbQGNRZKkOBW4HhfQBTWwEQyI= + + optional + + + GoogleSignIn.bundle/fi.lproj/GoogleSignIn.strings + + hash + + gWfyNCqhd30Y2+42oIuL/HWmczg= + + optional + + + GoogleSignIn.bundle/fr.lproj/GoogleSignIn.strings + + hash + + uazilWliTrW6MuAL6umfC/8JA2w= + + optional + + + GoogleSignIn.bundle/fr_CA.lproj/GoogleSignIn.strings + + hash + + Esz3mlwnuaEJRGq9Kux4r37SBuQ= + + optional + + + GoogleSignIn.bundle/google.png + + aRs/zX73YrSGLLTP8EMEDJQGeTs= + + GoogleSignIn.bundle/google@2x.png + + xu0SOLMY2id0HRzRihn0qsuFhAc= + + GoogleSignIn.bundle/google@3x.png + + xbEbn7T4aiYsnIp0S2SVilad3d0= + + GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings + + hash + + ui2oaT67k0R8hevxOaYRPvkBncY= + + optional + + + GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings + + hash + + kZvr7XJerhHMM69PkXbnvBFp03o= + + optional + + + GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings + + hash + + f1AChdyqugygMHLDk8gT3Dci+JI= + + optional + + + GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings + + hash + + BSoNTBIf4kWxwJJhk3j4LqTytTQ= + + optional + + + GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings + + hash + + Frdz7EAjoTfEGLrt45QOxezjzXY= + + optional + + + GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings + + hash + + ip22TOlHApPdL0R4Op+px9lnPt4= + + optional + + + GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings + + hash + + sX0ftdSQz9WqdXlSCYZn0tktc/0= + + optional + + + GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings + + hash + + MXfc9JCBsSmgxmJ3xfMpVntvLfE= + + optional + + + GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings + + hash + + ZjmLydbxaQLSdIBGmX5LQQXMfhQ= + + optional + + + GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings + + hash + + 8kbG/vzCsprxXEBLWQPjsZYsmSM= + + optional + + + GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings + + hash + + /CN7CHAVyaosf4bXVc5GxzC2Zbc= + + optional + + + GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings + + hash + + IBrsi/T3mBKZccejeg+eKu+eLC8= + + optional + + + GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings + + hash + + a2Crth0x+hSdaEGM4YAiNqZxYKg= + + optional + + + GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings + + hash + + a2Crth0x+hSdaEGM4YAiNqZxYKg= + + optional + + + GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings + + hash + + d90ZsiztKcH6gT0M2GNhS9budLg= + + optional + + + GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings + + hash + + wH6Vf08sJ8KKd++qPXetaXtSSEg= + + optional + + + GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings + + hash + + dzPNIKMH551ZsL1tfx25Qj7g2fs= + + optional + + + GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings + + hash + + ltpfHSCCPpO3bQBP56jjt96+d90= + + optional + + + GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings + + hash + + 6zdaseAWNL3CgzM6rhievkeYLBY= + + optional + + + GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings + + hash + + jVVTwNkGABxQFM8h9aPRJ1fS2Pk= + + optional + + + GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings + + hash + + 4d5pvCFyTpDBY/o+3RsxJ8zqLdI= + + optional + + + GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings + + hash + + 7AbLARiohKfq0KKpDOoXJxq3L38= + + optional + + + GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings + + hash + + QTbqZVk6kNI316gFQkdgXuOnQpw= + + optional + + + GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings + + hash + + Sf0rT0s1gLnj2sAnAlTyCH4vbP0= + + optional + + + GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings + + hash + + lC5m5fk6gdtQtz8GphGC/3aPagU= + + optional + + + GoogleUtilities_Privacy.bundle/Info.plist + + HqEHDkN84aKrHgmPsfZz136rBCk= + + GoogleUtilities_Privacy.bundle/PrivacyInfo.xcprivacy + + 9Dge7JFNlx7Vk430tsjNsK3d0Ng= + + Info.plist + + 4FwzPzPDiNyfyKrk9QjFQZ4WLvM= + + PkgInfo + + n57qDP4tZfLD1rCS43W0B4LQjzE= + + PrivacyInfo.xcprivacy + + n3xideFfI0Ngl4cFAYwJums3KBo= + + RCT-Folly_privacy.bundle/Info.plist + + QV6mi/fThThHpU2soqgmADF/NUI= + + RNSVGFilters.bundle/Info.plist + + N/QZ+T1p+q4c422oQNZk4vh2p7k= + + RNSVGFilters.bundle/RNSVGArithmeticFilter.iphoneos.metallib + + +VLexPzHghS5+wGZ2o3Pb4hzkK4= + + RNSVGFilters.bundle/RNSVGCompositeXor.iphoneos.metallib + + uBh9rD7P0EEOLBtlduH9X3cREsM= + + ReachabilitySwift.bundle/Info.plist + + R1f4iy65ziHGDflHUDJ3rYb7QJw= + + ReachabilitySwift.bundle/PrivacyInfo.xcprivacy + + 0RESd+++ZxZWQhIEMSOOvP7phYs= + + React-Core_privacy.bundle/Info.plist + + bwZ/mVvwWYRpCtLUK8MTyiLp/JU= + + React-Core_privacy.bundle/PrivacyInfo.xcprivacy + + ZahcOiTSEcJJdvNh0xqgAKPqbMs= + + React-cxxreact_privacy.bundle/Info.plist + + DHapNtVVUNHS9BKJUN7HbkRj/0E= + + React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy + + dxJQFdQ77efnBkB0VBZmuIamJ4g= + + SDWebImage.bundle/Info.plist + + MiKmS7AM8ulTkag/cANN1izmsx4= + + SDWebImage.bundle/PrivacyInfo.xcprivacy + + PFHYbs0V3eUFDWQyYQcwEetuqEk= + + SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib + + +LtcMiEvVQs2QdoxGRtI33YPCYs= + + SplashScreen.storyboardc/Info.plist + + E68oTK3pecVBbvVw/Td2doSlDiA= + + SplashScreen.storyboardc/SplashScreenViewController.nib + + XO9GpHETPa/KEeOkIqhZoQ6OIvU= + + __preview.dylib + + RgwZ9QPuNGMOsLGsCQ8OENXgbgY= + + boost_privacy.bundle/Info.plist + + V94X3Cp8LSj+pZ/hfbsOD4huj5Q= + + glog_privacy.bundle/Info.plist + + MxuR75ZIsXAD5pxH3nEwX9uafJ0= + + + files2 + + AppAuthCore_Privacy.bundle/Info.plist + + hash2 + + XCH/1qDyZPjv/RjgenQU3TWe6MNYkehVq7O2FaqIweA= + + + AppAuthCore_Privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + Wt6WL6rqHt273QbEz4qHLOxVT2TFWgDgATYATTeOHO0= + + + AppIcon60x60@2x.png + + hash2 + + B4LhvxKM+Dl0yaKyJjJo0i4ihljLPSx7mJaiA1EVlNc= + + + AppIcon76x76@2x~ipad.png + + hash2 + + kuJvlgD9E3ttp1/o2kwRk48Elzw9ZLP7K00kBZ7Ljz0= + + + Assets.car + + hash2 + + I31WvyAqqDAj71Fb1vqIyYtBsNfYlqmP002v5kLMWp8= + + + EXConstants.bundle/Info.plist + + hash2 + + jZG3+Tzakbtg344R3nPmevDrI3G9hqlhuDM+DGKsmHY= + + + EXConstants.bundle/app.config + + hash2 + + y+ymJBSBSVsG9oYznl2AJAutqEJa7t8z7JbTxy+ugpk= + + + EXUpdates.bundle/Info.plist + + hash2 + + TSLIu7uoFgEkmWl6rOkXOLHgeB1Z/nLtqptH/f2Kzds= + + + Expo.plist + + hash2 + + kBYbyLwwA/TcEb1B6fZKAuAPVleaghLO3vFy4+u8Rn8= + + + ExpoApplication_privacy.bundle/Info.plist + + hash2 + + OF6pzmZB+LuE1u+wzImbqZDIJmhoflDtg2sTmrOtGiY= + + + ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + tIdj/9KcutgVElrlbhBzJz5BiuCGED/H3/fvvsFnWqo= + + + ExpoConstants_privacy.bundle/Info.plist + + hash2 + + MGRLpoZ+01WpddRUuE8TLN2RgOiqhzIDZEWy3MA1kNQ= + + + ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + Ky2O23HVHFsfGs5M2yipS68i/d6bvy4r/BfRh/97X0c= + + + ExpoDevice_privacy.bundle/Info.plist + + hash2 + + VW+4r911lj+g2ALGOJp8aFap1Y0t3bccy5wunDzTLDs= + + + ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + 2JioNW3Ie3zSsXkh1opGNtQkBns6dcg7eTX9eXcZycs= + + + ExpoFileSystem_privacy.bundle/Info.plist + + hash2 + + ByWljZT3TE7/EQIJQP/napK+gMwwBFaLiROcsjSHmJk= + + + ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + M7DgdPJz9YimS6VjKQnGqM8fFtuOTNhMaXi9Ii39Zb0= + + + ExpoNotifications_privacy.bundle/Info.plist + + hash2 + + tKJ+YduFArUfPD3zQIGLIPtXagl8rbk4RDDBfsLvJC8= + + + ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + Ky2O23HVHFsfGs5M2yipS68i/d6bvy4r/BfRh/97X0c= + + + ExpoSystemUI_privacy.bundle/Info.plist + + hash2 + + tGD6qrPgcjmHblKSEqq1CRuX18qzPmRBwHGfZltFSCw= + + + ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + Ky2O23HVHFsfGs5M2yipS68i/d6bvy4r/BfRh/97X0c= + + + FBLPromises_Privacy.bundle/Info.plist + + hash2 + + vjrjHLthqlPIFemDbmDUZpVTOJEFsAx/MHm8Tlo7deA= + + + FBLPromises_Privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + dLDNcvwjwe8wLyLuJ1P2GBfNxa8P96fy0GMrUk+4rOo= + + + Frameworks/Razorpay.framework/Info.plist + + hash2 + + wsFEo9G9DLEfTsFONS1IyzmIQnuwQMn2+IjPQ/sGaDU= + + + Frameworks/Razorpay.framework/Razorpay + + hash2 + + vCZkXi8fkCWuoAYOgBjpHMCgVTDB4eIyr6Fr9JCh8/E= + + + Frameworks/Razorpay.framework/_CodeSignature/CodeResources + + hash2 + + Indko2UICKEJAfyY8NjSLl5DJTBBhaHhs7bo2MegTMg= + + + Frameworks/RazorpayCore.framework/Info.plist + + hash2 + + tLxp/3dioDzPR4Pa54kDEwNxiqC6catKl1o+lXil6mM= + + + Frameworks/RazorpayCore.framework/RazorpayCore + + hash2 + + 1+k8h0FiRDrP4o7FjkjinUic2J21vc2Cc9lNZpMuxao= + + + Frameworks/RazorpayCore.framework/_CodeSignature/CodeResources + + hash2 + + FKBOlAIe/8zDrV0SEGCzMlyXFLYcFloNIHXf70gy6RY= + + + Frameworks/RazorpayStandard.framework/Assets.car + + hash2 + + HcTTFmbApmRduIkc+LudaGbZclscDoJ6VJdjQDMk5z8= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/Info.plist + + hash2 + + XV+Km0uI0aCCx6b8FFBL8ctnAUqg/+iH2HKwpDJJDns= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/objects-11.0+.nib + + hash2 + + /FTBuwa4eqDE4oW65Wzg7NRMxsEk6lrbA5gEQvxHMm8= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/runtime.nib + + hash2 + + /FTBuwa4eqDE4oW65Wzg7NRMxsEk6lrbA5gEQvxHMm8= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/objects-11.0+.nib + + hash2 + + TB5d1qjY2vLAC2ml/4EBTkBy3xnnLZQe6gxyjAuM7Hs= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/runtime.nib + + hash2 + + TB5d1qjY2vLAC2ml/4EBTkBy3xnnLZQe6gxyjAuM7Hs= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/objects-11.0+.nib + + hash2 + + 9gbR1Bca1fy1VmXM6YTr9iMj/H9FiV5FH80kOSCS5cA= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/runtime.nib + + hash2 + + 0aP4/XYhE9pTrC1von5mej2B5hZzviQdM4PQj/nojlY= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/objects-11.0+.nib + + hash2 + + hg8U6PEGkuQ5LmSJ3QWnXPjAHQ9HR+iYMliJQBqIXsA= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/runtime.nib + + hash2 + + xzfMa2B7p6qD36vy7gfDE7AfItGacEFMLkGs19efnI0= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/objects-11.0+.nib + + hash2 + + 0D+N+GRb1ZrUQlq4dTQIQfubTWQC44SvjHUHVlVbgeg= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/runtime.nib + + hash2 + + 0D+N+GRb1ZrUQlq4dTQIQfubTWQC44SvjHUHVlVbgeg= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/objects-11.0+.nib + + hash2 + + l6Hz4xHGp/8dMGEWk8KuCnewyrV7Y1XGhWysBUgItFY= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/runtime.nib + + hash2 + + l6Hz4xHGp/8dMGEWk8KuCnewyrV7Y1XGhWysBUgItFY= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/objects-11.0+.nib + + hash2 + + bzY2zdca4b/GrxTr/LmNprdhD3SyIBsZG1W2z7TVW28= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/runtime.nib + + hash2 + + bzY2zdca4b/GrxTr/LmNprdhD3SyIBsZG1W2z7TVW28= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/objects-11.0+.nib + + hash2 + + I8p2+VocnQu/7nTAHxHwPLoZ9J+et+y957CgfHi+MQo= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/runtime.nib + + hash2 + + h05YMT+1oAA6um16sH5KVB2c6toLm935YPmV2d/ZDU8= + + + Frameworks/RazorpayStandard.framework/CommonAssets/Razorpay_Logo.png + + hash2 + + udRErjoaEwN536HIEl+2sH6KQ0Q2KzlKwLYCkQlBGKE= + + + Frameworks/RazorpayStandard.framework/CommonAssets/check_mark.png + + hash2 + + s+l4gXoMSGUj0xR2eSdXwQTHoyRU5F4+aTSVjO+I8wU= + + + Frameworks/RazorpayStandard.framework/CommonAssets/warning.png + + hash2 + + S7OOo4xdlAEiEgfkEuic4ap4JZlhvtYIwFSHWu034SA= + + + Frameworks/RazorpayStandard.framework/EncryptedOtpelf.js + + hash2 + + 85Tocsg1aPekBFPeMKMV2IruNGVkOyyV6xlbQkQOH3A= + + + Frameworks/RazorpayStandard.framework/Hash.txt + + hash2 + + B20CsAEe8H45a3Ivw23aBTWNU7qGh1JYKb/iAwwaIEQ= + + + Frameworks/RazorpayStandard.framework/Info.plist + + hash2 + + FfZC9zqHYYEOUl+Q3MxcNvOApcNEda5ezP6/WETXyk4= + + + Frameworks/RazorpayStandard.framework/PrivacyInfo.xcprivacy + + hash2 + + 0GK4q+J5XVD2O8agumlONknk2PSlkzr97y/P84XeCyg= + + + Frameworks/RazorpayStandard.framework/RazorpayStandard + + hash2 + + nIwgs/PNh6GDUAxAzhbpvGvz4Oyd2ejvPx6TAW8Un48= + + + Frameworks/RazorpayStandard.framework/_CodeSignature/CodeResources + + hash2 + + zDX3ulxXCz6aKYfVoSfJ4B22CxdPnGgXw4mpZictVZI= + + + Frameworks/hermes.framework/Info.plist + + hash2 + + JXB+dif18YekowEWiL1F0bJhRmDJCNhC7Yuki1yxMK0= + + + Frameworks/hermes.framework/_CodeSignature/CodeResources + + hash2 + + 1oRx8Mn/IhJGRZOGyHTCY2w0MZ+C71dPBNeLWZ06EJk= + + + Frameworks/hermes.framework/hermes + + hash2 + + 0po9tSLjyYKKx+ArJ1vK4kNtKcwcCF1fCYfIP3UR8M8= + + + Freshyo.debug.dylib + + hash2 + + QWN2aMx84o0g9+dZRTrG4PX7kXPWGQxYGnJxcW2WV0s= + + + GTMAppAuth_Privacy.bundle/Info.plist + + hash2 + + +7QzFGMj4ALmBTsygMDQjde7n6FagDBE5zgiFiyzgV4= + + + GTMAppAuth_Privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + WpuPwM3bECAbtHzCgEs/AExyUUdmItJb/E61TtRuEIQ= + + + GTMSessionFetcher_Core_Privacy.bundle/Info.plist + + hash2 + + NVoq7ETtD09eHmWQth1U3bdRq/mzMUtGMzylcmAPOts= + + + GTMSessionFetcher_Core_Privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + PkqTy+hqzvfdfgY6KMhJmS9Vbn9SytxfN8HosOG1RoY= + + + GoogleSignIn.bundle/Info.plist + + hash2 + + wnHJcujy/UxzBYFM7RwGtQRTci1mpDfHY1BVx9/IaLc= + + + GoogleSignIn.bundle/PrivacyInfo.xcprivacy + + hash2 + + kwCXKFMJb31XDWxKS/cVKjbHmOicTw2B07TGtd+t39A= + + + GoogleSignIn.bundle/Roboto-Bold.ttf + + hash2 + + WU10pJ4we+fMnh7l8QI2hOaCDPEbzJaL7lkDkeGtWlo= + + + GoogleSignIn.bundle/ar.lproj/GoogleSignIn.strings + + hash2 + + ss+ejZ/IrQ+WELPlTvC4tJTwIbf6I6zvYJSyIFq+jHI= + + optional + + + GoogleSignIn.bundle/ca.lproj/GoogleSignIn.strings + + hash2 + + M+iP9QDcPbJGLirJM8EcKJKfrTUfV7Pm1irERhCtYao= + + optional + + + GoogleSignIn.bundle/cs.lproj/GoogleSignIn.strings + + hash2 + + UdoIYkwqed5HyBaDsp6KE0SkeIdWO+JW4ad6Z/a+NUQ= + + optional + + + GoogleSignIn.bundle/da.lproj/GoogleSignIn.strings + + hash2 + + 6CYblkbY6on3v3phpzrtzjD+UfaKqUfsvf6Mx+BNt9o= + + optional + + + GoogleSignIn.bundle/de.lproj/GoogleSignIn.strings + + hash2 + + Fs1BPfGrd+UJ33b4c6Wmh//PNgsfFQdD2TTFqzN3wig= + + optional + + + GoogleSignIn.bundle/el.lproj/GoogleSignIn.strings + + hash2 + + nMDBNJz2Zfx3MzDTGiYo9gCkPKqLXIgLA0pWZ/jw+rw= + + optional + + + GoogleSignIn.bundle/en.lproj/GoogleSignIn.strings + + hash2 + + xyajnDguPxp8H1js9HD4EtomN0n5MNqH98DDqg7GSMI= + + optional + + + GoogleSignIn.bundle/en_GB.lproj/GoogleSignIn.strings + + hash2 + + or14KgUbGgs8Q37Gox6b9/Z3iZWnKswyoOtKY5mtGsI= + + optional + + + GoogleSignIn.bundle/es.lproj/GoogleSignIn.strings + + hash2 + + UB5ExPO7nAWxMpfGAkD9Dhbnn4pj5vslGYII3LlCHKY= + + optional + + + GoogleSignIn.bundle/es_MX.lproj/GoogleSignIn.strings + + hash2 + + hNMnxxl7flSaHp6Ni7PhywLgKCxjI+X7Pd4KRzla9jQ= + + optional + + + GoogleSignIn.bundle/fi.lproj/GoogleSignIn.strings + + hash2 + + DpnzGonq2MwPxyrWq9zISr0m9pkmXu/2GoibNznadzs= + + optional + + + GoogleSignIn.bundle/fr.lproj/GoogleSignIn.strings + + hash2 + + tVE4d6zy15yPDq/3/N5KoWXzq7AWEbYGESYC/UQ3d7o= + + optional + + + GoogleSignIn.bundle/fr_CA.lproj/GoogleSignIn.strings + + hash2 + + 9xCSzz/bp+PgPQ2ZdIN4sRGUfKd6mRgw3dJMOZIrCG4= + + optional + + + GoogleSignIn.bundle/google.png + + hash2 + + KZYAxsP5lgvGgLduEjF901DWOgDsv13keDEb2UPphvY= + + + GoogleSignIn.bundle/google@2x.png + + hash2 + + YIMFDG4vd9yXjg4T1wcAtDC7Vreja1pcgKJzOsZgcqY= + + + GoogleSignIn.bundle/google@3x.png + + hash2 + + VqPZ1AQqGKWVpnftZGTeoQXx6Noy4Hw8XIQErzqqh4w= + + + GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings + + hash2 + + KtB1FmX6YQB2EQfECgjfBJBnQA7X2NP7QuPuxFZ6YLA= + + optional + + + GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings + + hash2 + + 3UHXJzarX0qX0J3bFMSADuQLm+0jadZPDF/6uWpiRh4= + + optional + + + GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings + + hash2 + + JA+ymYzp46eWqXkG/G+WClYRwHhNxzsWyukU+u0KW/4= + + optional + + + GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings + + hash2 + + GoRF+Zxo+7BfNxT4D3DtCIpiNxtbmIXjErRRbwfYnk8= + + optional + + + GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings + + hash2 + + PyRv43MvgTyToElSNlECqWWiJIriTlBPGVMTmFiLK/k= + + optional + + + GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings + + hash2 + + TtxpfPqTYA6LaQTYcihANVBXvLLpxiQmqXzstkL2M8g= + + optional + + + GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings + + hash2 + + hk3OYj6xqZvup+cqHbkAhhDEA8l1hXBMH3gLIIk4ERQ= + + optional + + + GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings + + hash2 + + AhqCmUXH5He26Jp82dpoP1opwP/AwBLug5uvUO96wBM= + + optional + + + GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings + + hash2 + + y2wRSAv0XEuZrBwtz9tnpfgqeZkXomMNT7PpYTV7XJM= + + optional + + + GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings + + hash2 + + AqDORhPvDCPsPxYdWdXEk+neYmyBsEvpMYChGkLK6rA= + + optional + + + GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings + + hash2 + + SQUYZcAGQO3tTDWbHoIOEdHxkQVdu0gFkfk5fTerXg0= + + optional + + + GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings + + hash2 + + zB70RS/MmKy+7SKVC9fwoipXngJaj1DHj9u2AO045V0= + + optional + + + GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings + + hash2 + + h4m5LhoUwf1F8mYZJzxXPRsQnjz0AOVugKWHC6rrzO4= + + optional + + + GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings + + hash2 + + h4m5LhoUwf1F8mYZJzxXPRsQnjz0AOVugKWHC6rrzO4= + + optional + + + GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings + + hash2 + + VgBP67jGl9/ChEtJOy0f2pT31xiBxen0V91QtDRgDpk= + + optional + + + GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings + + hash2 + + r4dFHw1YRkncNtW9F0rb86p6SQ53QicvL33YbiJi490= + + optional + + + GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings + + hash2 + + HTeXAqlR7PmIQ9lXCSqMSv7j7v6GamABZD47d3Vdxdw= + + optional + + + GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings + + hash2 + + P/cihlo8LmENm4TLBV2TYyC4PWbK+iTI64GTaNQdXaw= + + optional + + + GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings + + hash2 + + EB6TqcbOigHnqGM3qiEvaIEEVBHW5FJwF5/vJhhhQx4= + + optional + + + GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings + + hash2 + + 87AIPzi3JhCduSGnkEqY3kpQF7l4xbCahIDFRHo8T8c= + + optional + + + GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings + + hash2 + + DUnrVChJprfGiaclYvcgTKdFHOG+K+qtB0NSDZurgNI= + + optional + + + GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings + + hash2 + + Jhxu6B2f/rMv7vqp4r9JDKbb+lbniEMqlbSjM+LHru8= + + optional + + + GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings + + hash2 + + XdgQI6jed2yICWt5Lgc2Nmjlld6tS+jlIZu73Yg5j+A= + + optional + + + GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings + + hash2 + + UnRDQSf3cJY9kq+HAKK4OMrkkbt2CGQtT/KlF/uB1nc= + + optional + + + GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings + + hash2 + + 8K9LpcAznoYMsbk4Z5+PTNH5EEAbvqGHz7sjmrE7t+U= + + optional + + + GoogleUtilities_Privacy.bundle/Info.plist + + hash2 + + Etc9Ka9jHlKkiOdU4rQm4ncTX2FKxdGvUADnRlXMflQ= + + + GoogleUtilities_Privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + +Btc+PBDZicS7KnpeFdnJkzxkAJf5720l3cpbAaN5Tw= + + + PrivacyInfo.xcprivacy + + hash2 + + Qk5cgskUBuSahIgG5HlBCyGGMwSYrH3gLsC2b7WCNvU= + + + RCT-Folly_privacy.bundle/Info.plist + + hash2 + + 0dcC3Z35ltB1Rk2HWpjCzA4wPFt+2WaTjgv/z5AxE1E= + + + RNSVGFilters.bundle/Info.plist + + hash2 + + 9jpOxY3y8jSIucJzJ+fC3Idaug7W1Btg/C47UxQR4A4= + + + RNSVGFilters.bundle/RNSVGArithmeticFilter.iphoneos.metallib + + hash2 + + aRRl/fIr4pQqkGSCmYRAyw0/aGOTcpNrit0zlcC0Dtk= + + + RNSVGFilters.bundle/RNSVGCompositeXor.iphoneos.metallib + + hash2 + + IjeoZNeITsXaqYQpPXdb5hrqaJk+s2Qqy5e5V5lT//I= + + + ReachabilitySwift.bundle/Info.plist + + hash2 + + a0Ywukh2Qq/wQxGNTeIC7/8oN2YZMvE9YYIecPYUN1M= + + + ReachabilitySwift.bundle/PrivacyInfo.xcprivacy + + hash2 + + pwgfFQbJDo5nMQDlwWHnZbi3piREbiC9S9bvrKgICLg= + + + React-Core_privacy.bundle/Info.plist + + hash2 + + omnNUjXWFudh+cE0TJqsI2YDpTvWTixl77Voxv40Jf4= + + + React-Core_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + fAiWnkWWIabs7AQ8zbkBJlHxhYEZRfdVF8Yj2uLhFic= + + + React-cxxreact_privacy.bundle/Info.plist + + hash2 + + tKBcBEwmtUE9GGaNVVGdsi6/KnlaX4bi1D54dKd5mm4= + + + React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + BYfRVcVqb08GR+vGtqC9AmYVzWEO6PIJqXhrealq0zU= + + + SDWebImage.bundle/Info.plist + + hash2 + + ssr4wetNnB+bGHW2na0M24sSv1inTqC0ReqiCMf6fWU= + + + SDWebImage.bundle/PrivacyInfo.xcprivacy + + hash2 + + A7LHCDOjMaKx79Ef8WjtAqjq39Xn0fvzDuzHUJpK6kc= + + + SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib + + hash2 + + X+tAJBYf6l0fu6OOgc8+aot/0jOHh5N+R9T2CA7fpzw= + + + SplashScreen.storyboardc/Info.plist + + hash2 + + dNvO7WzwpeXGmDR5MyjJeD7Ksd5ILUlU4lfKITK3Q68= + + + SplashScreen.storyboardc/SplashScreenViewController.nib + + hash2 + + nBo0wSHSJHlAjPDqrLNJFUjO0WZVeZuuO19/I4AxS6g= + + + __preview.dylib + + hash2 + + UbBGRjm1oDTKLqt93m151cuAV0REsMWG8e/99ttskOw= + + + boost_privacy.bundle/Info.plist + + hash2 + + ewhZPFvqBmGCXr9cyPcgBgi1XfwdibD9dwEvGqRXAFc= + + + glog_privacy.bundle/Info.plist + + hash2 + + ppv2/Di+oXBAtgOAUjnelHqDc6Xxh7Ki3j5KlqckbEY= + + + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/test/Freshyo.app/__preview.dylib b/test/Freshyo.app/__preview.dylib new file mode 100755 index 0000000..a1510fd Binary files /dev/null and b/test/Freshyo.app/__preview.dylib differ diff --git a/test/Freshyo.app/boost_privacy.bundle/Info.plist b/test/Freshyo.app/boost_privacy.bundle/Info.plist new file mode 100644 index 0000000..e84af22 Binary files /dev/null and b/test/Freshyo.app/boost_privacy.bundle/Info.plist differ diff --git a/test/Freshyo.app/glog_privacy.bundle/Info.plist b/test/Freshyo.app/glog_privacy.bundle/Info.plist new file mode 100644 index 0000000..4e89bea Binary files /dev/null and b/test/Freshyo.app/glog_privacy.bundle/Info.plist differ diff --git a/test/README.md b/test/README.md new file mode 100644 index 0000000..67e7599 --- /dev/null +++ b/test/README.md @@ -0,0 +1,15 @@ +# test + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.2.10. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/test/SymbuyoteAdmin.app/AppIcon60x60@2x.png b/test/SymbuyoteAdmin.app/AppIcon60x60@2x.png new file mode 100644 index 0000000..b71b88d Binary files /dev/null and b/test/SymbuyoteAdmin.app/AppIcon60x60@2x.png differ diff --git a/test/SymbuyoteAdmin.app/AppIcon76x76@2x~ipad.png b/test/SymbuyoteAdmin.app/AppIcon76x76@2x~ipad.png new file mode 100644 index 0000000..09a9481 Binary files /dev/null and b/test/SymbuyoteAdmin.app/AppIcon76x76@2x~ipad.png differ diff --git a/test/SymbuyoteAdmin.app/Assets.car b/test/SymbuyoteAdmin.app/Assets.car new file mode 100644 index 0000000..9e48108 Binary files /dev/null and b/test/SymbuyoteAdmin.app/Assets.car differ diff --git a/test/SymbuyoteAdmin.app/EXConstants.bundle/Info.plist b/test/SymbuyoteAdmin.app/EXConstants.bundle/Info.plist new file mode 100644 index 0000000..c5d88cc Binary files /dev/null and b/test/SymbuyoteAdmin.app/EXConstants.bundle/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/EXConstants.bundle/app.config b/test/SymbuyoteAdmin.app/EXConstants.bundle/app.config new file mode 100644 index 0000000..6572464 --- /dev/null +++ b/test/SymbuyoteAdmin.app/EXConstants.bundle/app.config @@ -0,0 +1 @@ +{"name":"Symbuyote Admin","slug":"freshyoadmin","version":"1.0.0","orientation":"portrait","icon":"./assets/images/symbuyoteadmin.png","scheme":"freshyoadmin","userInterfaceStyle":"automatic","newArchEnabled":true,"ios":{"supportsTablet":true,"bundleIdentifier":"in.freshyo.adminui","infoPlist":{"LSApplicationQueriesSchemes":["ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay"],"ITSAppUsesNonExemptEncryption":false}},"android":{"adaptiveIcon":{"foregroundImage":"./assets/images/symbuyoteadmin.png","backgroundColor":"#fff0f6"},"edgeToEdgeEnabled":true,"package":"in.freshyo.adminui"},"web":{"bundler":"metro","output":"static","favicon":"./assets/images/favicon.png"},"plugins":["expo-router",["expo-splash-screen",{"image":"./assets/images/symbuyoteadmin.png","imageWidth":200,"resizeMode":"contain","backgroundColor":"#ffffff"}],"expo-secure-store"],"experiments":{"typedRoutes":true},"extra":{"router":{},"eas":{"projectId":"55e2f200-eb9d-4880-a193-70f59320e054"}},"runtimeVersion":{"policy":"appVersion"},"updates":{"url":"https://u.expo.dev/55e2f200-eb9d-4880-a193-70f59320e054"},"sdkVersion":"53.0.0","platforms":["ios","android","web"],"androidStatusBar":{"backgroundColor":"#ffffff"}} \ No newline at end of file diff --git a/test/SymbuyoteAdmin.app/EXUpdates.bundle/Info.plist b/test/SymbuyoteAdmin.app/EXUpdates.bundle/Info.plist new file mode 100644 index 0000000..2f4117e Binary files /dev/null and b/test/SymbuyoteAdmin.app/EXUpdates.bundle/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/Expo.plist b/test/SymbuyoteAdmin.app/Expo.plist new file mode 100644 index 0000000..e618273 Binary files /dev/null and b/test/SymbuyoteAdmin.app/Expo.plist differ diff --git a/test/SymbuyoteAdmin.app/ExpoApplication_privacy.bundle/Info.plist b/test/SymbuyoteAdmin.app/ExpoApplication_privacy.bundle/Info.plist new file mode 100644 index 0000000..1464da4 Binary files /dev/null and b/test/SymbuyoteAdmin.app/ExpoApplication_privacy.bundle/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy b/test/SymbuyoteAdmin.app/ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..53bb32a --- /dev/null +++ b/test/SymbuyoteAdmin.app/ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + + diff --git a/test/SymbuyoteAdmin.app/ExpoConstants_privacy.bundle/Info.plist b/test/SymbuyoteAdmin.app/ExpoConstants_privacy.bundle/Info.plist new file mode 100644 index 0000000..7c3cf6b Binary files /dev/null and b/test/SymbuyoteAdmin.app/ExpoConstants_privacy.bundle/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy b/test/SymbuyoteAdmin.app/ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5f6aa38 --- /dev/null +++ b/test/SymbuyoteAdmin.app/ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/test/SymbuyoteAdmin.app/ExpoDevice_privacy.bundle/Info.plist b/test/SymbuyoteAdmin.app/ExpoDevice_privacy.bundle/Info.plist new file mode 100644 index 0000000..118e7ff Binary files /dev/null and b/test/SymbuyoteAdmin.app/ExpoDevice_privacy.bundle/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy b/test/SymbuyoteAdmin.app/ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..7d912e0 --- /dev/null +++ b/test/SymbuyoteAdmin.app/ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + + diff --git a/test/SymbuyoteAdmin.app/ExpoFileSystem_privacy.bundle/Info.plist b/test/SymbuyoteAdmin.app/ExpoFileSystem_privacy.bundle/Info.plist new file mode 100644 index 0000000..d549132 Binary files /dev/null and b/test/SymbuyoteAdmin.app/ExpoFileSystem_privacy.bundle/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy b/test/SymbuyoteAdmin.app/ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..2557cc1 --- /dev/null +++ b/test/SymbuyoteAdmin.app/ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,34 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + 0A2A.1 + 3B52.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryDiskSpace + NSPrivacyAccessedAPITypeReasons + + E174.1 + 85F4.1 + + + + + diff --git a/test/SymbuyoteAdmin.app/ExpoNotifications_privacy.bundle/Info.plist b/test/SymbuyoteAdmin.app/ExpoNotifications_privacy.bundle/Info.plist new file mode 100644 index 0000000..6a7a6a9 Binary files /dev/null and b/test/SymbuyoteAdmin.app/ExpoNotifications_privacy.bundle/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy b/test/SymbuyoteAdmin.app/ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5f6aa38 --- /dev/null +++ b/test/SymbuyoteAdmin.app/ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/test/SymbuyoteAdmin.app/ExpoSystemUI_privacy.bundle/Info.plist b/test/SymbuyoteAdmin.app/ExpoSystemUI_privacy.bundle/Info.plist new file mode 100644 index 0000000..9386958 Binary files /dev/null and b/test/SymbuyoteAdmin.app/ExpoSystemUI_privacy.bundle/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy b/test/SymbuyoteAdmin.app/ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5f6aa38 --- /dev/null +++ b/test/SymbuyoteAdmin.app/ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/test/SymbuyoteAdmin.app/Frameworks/hermes.framework/Info.plist b/test/SymbuyoteAdmin.app/Frameworks/hermes.framework/Info.plist new file mode 100644 index 0000000..765e804 --- /dev/null +++ b/test/SymbuyoteAdmin.app/Frameworks/hermes.framework/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + hermes + CFBundleIconFile + + CFBundleIdentifier + dev.hermesengine.iphonesimulator + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.12.0 + CFBundleSignature + ???? + CFBundleVersion + 0.12.0 + CSResourcesFileMapped + + MinimumOSVersion + 15.1 + + diff --git a/test/SymbuyoteAdmin.app/Frameworks/hermes.framework/_CodeSignature/CodeResources b/test/SymbuyoteAdmin.app/Frameworks/hermes.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..da00154 --- /dev/null +++ b/test/SymbuyoteAdmin.app/Frameworks/hermes.framework/_CodeSignature/CodeResources @@ -0,0 +1,101 @@ + + + + + files + + Info.plist + + 4Hno0Ddszl7pNxmsMdj4eZ8APpg= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/test/SymbuyoteAdmin.app/Frameworks/hermes.framework/hermes b/test/SymbuyoteAdmin.app/Frameworks/hermes.framework/hermes new file mode 100755 index 0000000..c932c85 Binary files /dev/null and b/test/SymbuyoteAdmin.app/Frameworks/hermes.framework/hermes differ diff --git a/test/SymbuyoteAdmin.app/Info.plist b/test/SymbuyoteAdmin.app/Info.plist new file mode 100644 index 0000000..f2fec8f Binary files /dev/null and b/test/SymbuyoteAdmin.app/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/PkgInfo b/test/SymbuyoteAdmin.app/PkgInfo new file mode 100644 index 0000000..bd04210 --- /dev/null +++ b/test/SymbuyoteAdmin.app/PkgInfo @@ -0,0 +1 @@ +APPL???? \ No newline at end of file diff --git a/test/SymbuyoteAdmin.app/PrivacyInfo.xcprivacy b/test/SymbuyoteAdmin.app/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..c6b452e --- /dev/null +++ b/test/SymbuyoteAdmin.app/PrivacyInfo.xcprivacy @@ -0,0 +1,48 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + 0A2A.1 + 3B52.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryDiskSpace + NSPrivacyAccessedAPITypeReasons + + E174.1 + 85F4.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/test/SymbuyoteAdmin.app/RCT-Folly_privacy.bundle/Info.plist b/test/SymbuyoteAdmin.app/RCT-Folly_privacy.bundle/Info.plist new file mode 100644 index 0000000..8b4064e Binary files /dev/null and b/test/SymbuyoteAdmin.app/RCT-Folly_privacy.bundle/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/ReachabilitySwift.bundle/Info.plist b/test/SymbuyoteAdmin.app/ReachabilitySwift.bundle/Info.plist new file mode 100644 index 0000000..5145da4 Binary files /dev/null and b/test/SymbuyoteAdmin.app/ReachabilitySwift.bundle/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/ReachabilitySwift.bundle/PrivacyInfo.xcprivacy b/test/SymbuyoteAdmin.app/ReachabilitySwift.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..cfbe279 --- /dev/null +++ b/test/SymbuyoteAdmin.app/ReachabilitySwift.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,8 @@ + + + + + NSPrivacyTracking + + + diff --git a/test/SymbuyoteAdmin.app/React-Core_privacy.bundle/Info.plist b/test/SymbuyoteAdmin.app/React-Core_privacy.bundle/Info.plist new file mode 100644 index 0000000..6281013 Binary files /dev/null and b/test/SymbuyoteAdmin.app/React-Core_privacy.bundle/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/React-Core_privacy.bundle/PrivacyInfo.xcprivacy b/test/SymbuyoteAdmin.app/React-Core_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..d9d7d19 --- /dev/null +++ b/test/SymbuyoteAdmin.app/React-Core_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,29 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/test/SymbuyoteAdmin.app/React-cxxreact_privacy.bundle/Info.plist b/test/SymbuyoteAdmin.app/React-cxxreact_privacy.bundle/Info.plist new file mode 100644 index 0000000..a3fe2ce Binary files /dev/null and b/test/SymbuyoteAdmin.app/React-cxxreact_privacy.bundle/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy b/test/SymbuyoteAdmin.app/React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..6be0f26 --- /dev/null +++ b/test/SymbuyoteAdmin.app/React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,21 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/test/SymbuyoteAdmin.app/SDWebImage.bundle/Info.plist b/test/SymbuyoteAdmin.app/SDWebImage.bundle/Info.plist new file mode 100644 index 0000000..1f41d4d Binary files /dev/null and b/test/SymbuyoteAdmin.app/SDWebImage.bundle/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/SDWebImage.bundle/PrivacyInfo.xcprivacy b/test/SymbuyoteAdmin.app/SDWebImage.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..276f761 --- /dev/null +++ b/test/SymbuyoteAdmin.app/SDWebImage.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,23 @@ + + + + + NSPrivacyTracking + + NSPrivacyCollectedDataTypes + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + + diff --git a/test/SymbuyoteAdmin.app/SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib b/test/SymbuyoteAdmin.app/SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib new file mode 100644 index 0000000..8417215 Binary files /dev/null and b/test/SymbuyoteAdmin.app/SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib differ diff --git a/test/SymbuyoteAdmin.app/SplashScreen.storyboardc/Info.plist b/test/SymbuyoteAdmin.app/SplashScreen.storyboardc/Info.plist new file mode 100644 index 0000000..79f4412 Binary files /dev/null and b/test/SymbuyoteAdmin.app/SplashScreen.storyboardc/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/SplashScreen.storyboardc/SplashScreenViewController.nib b/test/SymbuyoteAdmin.app/SplashScreen.storyboardc/SplashScreenViewController.nib new file mode 100644 index 0000000..eb6f55c Binary files /dev/null and b/test/SymbuyoteAdmin.app/SplashScreen.storyboardc/SplashScreenViewController.nib differ diff --git a/test/SymbuyoteAdmin.app/SymbuyoteAdmin b/test/SymbuyoteAdmin.app/SymbuyoteAdmin new file mode 100755 index 0000000..8706ddb Binary files /dev/null and b/test/SymbuyoteAdmin.app/SymbuyoteAdmin differ diff --git a/test/SymbuyoteAdmin.app/SymbuyoteAdmin.debug.dylib b/test/SymbuyoteAdmin.app/SymbuyoteAdmin.debug.dylib new file mode 100755 index 0000000..6fa9d08 Binary files /dev/null and b/test/SymbuyoteAdmin.app/SymbuyoteAdmin.debug.dylib differ diff --git a/test/SymbuyoteAdmin.app/_CodeSignature/CodeResources b/test/SymbuyoteAdmin.app/_CodeSignature/CodeResources new file mode 100644 index 0000000..0336d9b --- /dev/null +++ b/test/SymbuyoteAdmin.app/_CodeSignature/CodeResources @@ -0,0 +1,535 @@ + + + + + files + + AppIcon60x60@2x.png + + 97LNT9kpa48T+CswHSue8trK1eE= + + AppIcon76x76@2x~ipad.png + + VzU6ZM8C95tff2IFjtvjPfEV8Vs= + + Assets.car + + LrIAJ0UWrloOF0ANfYZBMOddVeQ= + + EXConstants.bundle/Info.plist + + Hlxsc20/U0owoVLTeqzSm5ybNIs= + + EXConstants.bundle/app.config + + IFa3PxmiSkaJ0td8DhhIk/PexXY= + + EXUpdates.bundle/Info.plist + + wjdfAxEpgfQFinoWBfIM8p9jaw8= + + Expo.plist + + yXM53emO8rHxLh7yvjjxI7jUS4U= + + ExpoApplication_privacy.bundle/Info.plist + + 8BRDaa8J7FLCzhVYdsGF90Fhe6A= + + ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy + + mUc2YHiDtobIhFXi+Mvm12TXeb8= + + ExpoConstants_privacy.bundle/Info.plist + + gHWCze8PybGkM8T+sLc+3tpj/QE= + + ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy + + dHAsEQehwJCS8hMOpBoz7emiNj8= + + ExpoDevice_privacy.bundle/Info.plist + + 6hGpMQ+NbBTY+ghWXzsUw8XJGyM= + + ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy + + hWEgzzi+YPgmddeTqWfAi6jGQ0E= + + ExpoFileSystem_privacy.bundle/Info.plist + + WIOt6Nu0S3BZ/+6OsBQFrMyXaNE= + + ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy + + UieOpg4b1PxYR6jA3/cs9mU9rdo= + + ExpoNotifications_privacy.bundle/Info.plist + + BwASpOTXQeKbJUrAWQFpwRpHkM8= + + ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy + + dHAsEQehwJCS8hMOpBoz7emiNj8= + + ExpoSystemUI_privacy.bundle/Info.plist + + ZY9+IxqDzlo+4baYZWU5AcIgICQ= + + ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy + + dHAsEQehwJCS8hMOpBoz7emiNj8= + + Frameworks/hermes.framework/Info.plist + + 4Hno0Ddszl7pNxmsMdj4eZ8APpg= + + Frameworks/hermes.framework/_CodeSignature/CodeResources + + UltW0Jw9IEI+gE7DBGy5/VsUBrw= + + Frameworks/hermes.framework/hermes + + zNwvRCO4iW9WNlr9JGQIrylk2Ko= + + Info.plist + + 4ZwmTOgnIm01EgWvwwqDN/hpTVI= + + PkgInfo + + n57qDP4tZfLD1rCS43W0B4LQjzE= + + PrivacyInfo.xcprivacy + + QWVPQQrLs8XwFZWrDE5vARWvUdA= + + RCT-Folly_privacy.bundle/Info.plist + + QV6mi/fThThHpU2soqgmADF/NUI= + + ReachabilitySwift.bundle/Info.plist + + R1f4iy65ziHGDflHUDJ3rYb7QJw= + + ReachabilitySwift.bundle/PrivacyInfo.xcprivacy + + 0RESd+++ZxZWQhIEMSOOvP7phYs= + + React-Core_privacy.bundle/Info.plist + + bwZ/mVvwWYRpCtLUK8MTyiLp/JU= + + React-Core_privacy.bundle/PrivacyInfo.xcprivacy + + ZahcOiTSEcJJdvNh0xqgAKPqbMs= + + React-cxxreact_privacy.bundle/Info.plist + + DHapNtVVUNHS9BKJUN7HbkRj/0E= + + React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy + + dxJQFdQ77efnBkB0VBZmuIamJ4g= + + SDWebImage.bundle/Info.plist + + MiKmS7AM8ulTkag/cANN1izmsx4= + + SDWebImage.bundle/PrivacyInfo.xcprivacy + + PFHYbs0V3eUFDWQyYQcwEetuqEk= + + SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib + + +LtcMiEvVQs2QdoxGRtI33YPCYs= + + SplashScreen.storyboardc/Info.plist + + E68oTK3pecVBbvVw/Td2doSlDiA= + + SplashScreen.storyboardc/SplashScreenViewController.nib + + XO9GpHETPa/KEeOkIqhZoQ6OIvU= + + SymbuyoteAdmin.debug.dylib + + ZwTTt/x0U07XvLmnb3+tTdSeZn0= + + __preview.dylib + + NKNb0Q7QaNmfiMI7dnipVcSb6Bo= + + boost_privacy.bundle/Info.plist + + V94X3Cp8LSj+pZ/hfbsOD4huj5Q= + + glog_privacy.bundle/Info.plist + + MxuR75ZIsXAD5pxH3nEwX9uafJ0= + + + files2 + + AppIcon60x60@2x.png + + hash2 + + 1EdHEGg/ZaMS6Zip6Ie7YlVSaTP8FBbCsE+pAI+y0Yk= + + + AppIcon76x76@2x~ipad.png + + hash2 + + 0FSd2xHbBOAtgMQ4Et7BIh1mcFoPKKSNPELVi5SQJAc= + + + Assets.car + + hash2 + + VeXk52gO5+lQhdUDpJkX5HFitYSp/HTm9kpkxMmfwws= + + + EXConstants.bundle/Info.plist + + hash2 + + jZG3+Tzakbtg344R3nPmevDrI3G9hqlhuDM+DGKsmHY= + + + EXConstants.bundle/app.config + + hash2 + + KZQx0xB/v36dzA1NH6PtrZPUnlG5NMIASOIYzeC36j4= + + + EXUpdates.bundle/Info.plist + + hash2 + + TSLIu7uoFgEkmWl6rOkXOLHgeB1Z/nLtqptH/f2Kzds= + + + Expo.plist + + hash2 + + WwvRV3RJHdWPGFQnnyrsouAha0/2EaB+goHuQsVMZ2Q= + + + ExpoApplication_privacy.bundle/Info.plist + + hash2 + + OF6pzmZB+LuE1u+wzImbqZDIJmhoflDtg2sTmrOtGiY= + + + ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + tIdj/9KcutgVElrlbhBzJz5BiuCGED/H3/fvvsFnWqo= + + + ExpoConstants_privacy.bundle/Info.plist + + hash2 + + MGRLpoZ+01WpddRUuE8TLN2RgOiqhzIDZEWy3MA1kNQ= + + + ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + Ky2O23HVHFsfGs5M2yipS68i/d6bvy4r/BfRh/97X0c= + + + ExpoDevice_privacy.bundle/Info.plist + + hash2 + + VW+4r911lj+g2ALGOJp8aFap1Y0t3bccy5wunDzTLDs= + + + ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + 2JioNW3Ie3zSsXkh1opGNtQkBns6dcg7eTX9eXcZycs= + + + ExpoFileSystem_privacy.bundle/Info.plist + + hash2 + + ByWljZT3TE7/EQIJQP/napK+gMwwBFaLiROcsjSHmJk= + + + ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + M7DgdPJz9YimS6VjKQnGqM8fFtuOTNhMaXi9Ii39Zb0= + + + ExpoNotifications_privacy.bundle/Info.plist + + hash2 + + tKJ+YduFArUfPD3zQIGLIPtXagl8rbk4RDDBfsLvJC8= + + + ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + Ky2O23HVHFsfGs5M2yipS68i/d6bvy4r/BfRh/97X0c= + + + ExpoSystemUI_privacy.bundle/Info.plist + + hash2 + + tGD6qrPgcjmHblKSEqq1CRuX18qzPmRBwHGfZltFSCw= + + + ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + Ky2O23HVHFsfGs5M2yipS68i/d6bvy4r/BfRh/97X0c= + + + Frameworks/hermes.framework/Info.plist + + hash2 + + JXB+dif18YekowEWiL1F0bJhRmDJCNhC7Yuki1yxMK0= + + + Frameworks/hermes.framework/_CodeSignature/CodeResources + + hash2 + + 1oRx8Mn/IhJGRZOGyHTCY2w0MZ+C71dPBNeLWZ06EJk= + + + Frameworks/hermes.framework/hermes + + hash2 + + 0po9tSLjyYKKx+ArJ1vK4kNtKcwcCF1fCYfIP3UR8M8= + + + PrivacyInfo.xcprivacy + + hash2 + + 0iT0B29OMhTbiXYnweoynu+q6Im8gta4P/eeuquI8zU= + + + RCT-Folly_privacy.bundle/Info.plist + + hash2 + + 0dcC3Z35ltB1Rk2HWpjCzA4wPFt+2WaTjgv/z5AxE1E= + + + ReachabilitySwift.bundle/Info.plist + + hash2 + + a0Ywukh2Qq/wQxGNTeIC7/8oN2YZMvE9YYIecPYUN1M= + + + ReachabilitySwift.bundle/PrivacyInfo.xcprivacy + + hash2 + + pwgfFQbJDo5nMQDlwWHnZbi3piREbiC9S9bvrKgICLg= + + + React-Core_privacy.bundle/Info.plist + + hash2 + + omnNUjXWFudh+cE0TJqsI2YDpTvWTixl77Voxv40Jf4= + + + React-Core_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + fAiWnkWWIabs7AQ8zbkBJlHxhYEZRfdVF8Yj2uLhFic= + + + React-cxxreact_privacy.bundle/Info.plist + + hash2 + + tKBcBEwmtUE9GGaNVVGdsi6/KnlaX4bi1D54dKd5mm4= + + + React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + BYfRVcVqb08GR+vGtqC9AmYVzWEO6PIJqXhrealq0zU= + + + SDWebImage.bundle/Info.plist + + hash2 + + ssr4wetNnB+bGHW2na0M24sSv1inTqC0ReqiCMf6fWU= + + + SDWebImage.bundle/PrivacyInfo.xcprivacy + + hash2 + + A7LHCDOjMaKx79Ef8WjtAqjq39Xn0fvzDuzHUJpK6kc= + + + SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib + + hash2 + + X+tAJBYf6l0fu6OOgc8+aot/0jOHh5N+R9T2CA7fpzw= + + + SplashScreen.storyboardc/Info.plist + + hash2 + + dNvO7WzwpeXGmDR5MyjJeD7Ksd5ILUlU4lfKITK3Q68= + + + SplashScreen.storyboardc/SplashScreenViewController.nib + + hash2 + + nBo0wSHSJHlAjPDqrLNJFUjO0WZVeZuuO19/I4AxS6g= + + + SymbuyoteAdmin.debug.dylib + + hash2 + + bJ9FzLhQRgwj5TfBA8qj2AMq6UuOeEBnqpn4Mdj7YRc= + + + __preview.dylib + + hash2 + + JxYb3r7Pg5bMt+qPjY4ibIde7zNM5U7OL6HGGuldoTM= + + + boost_privacy.bundle/Info.plist + + hash2 + + ewhZPFvqBmGCXr9cyPcgBgi1XfwdibD9dwEvGqRXAFc= + + + glog_privacy.bundle/Info.plist + + hash2 + + ppv2/Di+oXBAtgOAUjnelHqDc6Xxh7Ki3j5KlqckbEY= + + + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/test/SymbuyoteAdmin.app/__preview.dylib b/test/SymbuyoteAdmin.app/__preview.dylib new file mode 100755 index 0000000..49d1dae Binary files /dev/null and b/test/SymbuyoteAdmin.app/__preview.dylib differ diff --git a/test/SymbuyoteAdmin.app/boost_privacy.bundle/Info.plist b/test/SymbuyoteAdmin.app/boost_privacy.bundle/Info.plist new file mode 100644 index 0000000..e84af22 Binary files /dev/null and b/test/SymbuyoteAdmin.app/boost_privacy.bundle/Info.plist differ diff --git a/test/SymbuyoteAdmin.app/glog_privacy.bundle/Info.plist b/test/SymbuyoteAdmin.app/glog_privacy.bundle/Info.plist new file mode 100644 index 0000000..4e89bea Binary files /dev/null and b/test/SymbuyoteAdmin.app/glog_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/admin.app/AppIcon60x60@2x.png b/test/appBinaries/admin.app/AppIcon60x60@2x.png new file mode 100644 index 0000000..b71b88d Binary files /dev/null and b/test/appBinaries/admin.app/AppIcon60x60@2x.png differ diff --git a/test/appBinaries/admin.app/AppIcon76x76@2x~ipad.png b/test/appBinaries/admin.app/AppIcon76x76@2x~ipad.png new file mode 100644 index 0000000..09a9481 Binary files /dev/null and b/test/appBinaries/admin.app/AppIcon76x76@2x~ipad.png differ diff --git a/test/appBinaries/admin.app/Assets.car b/test/appBinaries/admin.app/Assets.car new file mode 100644 index 0000000..9e48108 Binary files /dev/null and b/test/appBinaries/admin.app/Assets.car differ diff --git a/test/appBinaries/admin.app/EXConstants.bundle/Info.plist b/test/appBinaries/admin.app/EXConstants.bundle/Info.plist new file mode 100644 index 0000000..c5d88cc Binary files /dev/null and b/test/appBinaries/admin.app/EXConstants.bundle/Info.plist differ diff --git a/test/appBinaries/admin.app/EXConstants.bundle/app.config b/test/appBinaries/admin.app/EXConstants.bundle/app.config new file mode 100644 index 0000000..6572464 --- /dev/null +++ b/test/appBinaries/admin.app/EXConstants.bundle/app.config @@ -0,0 +1 @@ +{"name":"Symbuyote Admin","slug":"freshyoadmin","version":"1.0.0","orientation":"portrait","icon":"./assets/images/symbuyoteadmin.png","scheme":"freshyoadmin","userInterfaceStyle":"automatic","newArchEnabled":true,"ios":{"supportsTablet":true,"bundleIdentifier":"in.freshyo.adminui","infoPlist":{"LSApplicationQueriesSchemes":["ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay"],"ITSAppUsesNonExemptEncryption":false}},"android":{"adaptiveIcon":{"foregroundImage":"./assets/images/symbuyoteadmin.png","backgroundColor":"#fff0f6"},"edgeToEdgeEnabled":true,"package":"in.freshyo.adminui"},"web":{"bundler":"metro","output":"static","favicon":"./assets/images/favicon.png"},"plugins":["expo-router",["expo-splash-screen",{"image":"./assets/images/symbuyoteadmin.png","imageWidth":200,"resizeMode":"contain","backgroundColor":"#ffffff"}],"expo-secure-store"],"experiments":{"typedRoutes":true},"extra":{"router":{},"eas":{"projectId":"55e2f200-eb9d-4880-a193-70f59320e054"}},"runtimeVersion":{"policy":"appVersion"},"updates":{"url":"https://u.expo.dev/55e2f200-eb9d-4880-a193-70f59320e054"},"sdkVersion":"53.0.0","platforms":["ios","android","web"],"androidStatusBar":{"backgroundColor":"#ffffff"}} \ No newline at end of file diff --git a/test/appBinaries/admin.app/EXUpdates.bundle/Info.plist b/test/appBinaries/admin.app/EXUpdates.bundle/Info.plist new file mode 100644 index 0000000..2f4117e Binary files /dev/null and b/test/appBinaries/admin.app/EXUpdates.bundle/Info.plist differ diff --git a/test/appBinaries/admin.app/Expo.plist b/test/appBinaries/admin.app/Expo.plist new file mode 100644 index 0000000..e618273 Binary files /dev/null and b/test/appBinaries/admin.app/Expo.plist differ diff --git a/test/appBinaries/admin.app/ExpoApplication_privacy.bundle/Info.plist b/test/appBinaries/admin.app/ExpoApplication_privacy.bundle/Info.plist new file mode 100644 index 0000000..1464da4 Binary files /dev/null and b/test/appBinaries/admin.app/ExpoApplication_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/admin.app/ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/admin.app/ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..53bb32a --- /dev/null +++ b/test/appBinaries/admin.app/ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + + diff --git a/test/appBinaries/admin.app/ExpoConstants_privacy.bundle/Info.plist b/test/appBinaries/admin.app/ExpoConstants_privacy.bundle/Info.plist new file mode 100644 index 0000000..7c3cf6b Binary files /dev/null and b/test/appBinaries/admin.app/ExpoConstants_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/admin.app/ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/admin.app/ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5f6aa38 --- /dev/null +++ b/test/appBinaries/admin.app/ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/test/appBinaries/admin.app/ExpoDevice_privacy.bundle/Info.plist b/test/appBinaries/admin.app/ExpoDevice_privacy.bundle/Info.plist new file mode 100644 index 0000000..118e7ff Binary files /dev/null and b/test/appBinaries/admin.app/ExpoDevice_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/admin.app/ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/admin.app/ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..7d912e0 --- /dev/null +++ b/test/appBinaries/admin.app/ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + + diff --git a/test/appBinaries/admin.app/ExpoFileSystem_privacy.bundle/Info.plist b/test/appBinaries/admin.app/ExpoFileSystem_privacy.bundle/Info.plist new file mode 100644 index 0000000..d549132 Binary files /dev/null and b/test/appBinaries/admin.app/ExpoFileSystem_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/admin.app/ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/admin.app/ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..2557cc1 --- /dev/null +++ b/test/appBinaries/admin.app/ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,34 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + 0A2A.1 + 3B52.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryDiskSpace + NSPrivacyAccessedAPITypeReasons + + E174.1 + 85F4.1 + + + + + diff --git a/test/appBinaries/admin.app/ExpoNotifications_privacy.bundle/Info.plist b/test/appBinaries/admin.app/ExpoNotifications_privacy.bundle/Info.plist new file mode 100644 index 0000000..6a7a6a9 Binary files /dev/null and b/test/appBinaries/admin.app/ExpoNotifications_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/admin.app/ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/admin.app/ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5f6aa38 --- /dev/null +++ b/test/appBinaries/admin.app/ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/test/appBinaries/admin.app/ExpoSystemUI_privacy.bundle/Info.plist b/test/appBinaries/admin.app/ExpoSystemUI_privacy.bundle/Info.plist new file mode 100644 index 0000000..9386958 Binary files /dev/null and b/test/appBinaries/admin.app/ExpoSystemUI_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/admin.app/ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/admin.app/ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5f6aa38 --- /dev/null +++ b/test/appBinaries/admin.app/ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/test/appBinaries/admin.app/Frameworks/hermes.framework/Info.plist b/test/appBinaries/admin.app/Frameworks/hermes.framework/Info.plist new file mode 100644 index 0000000..765e804 --- /dev/null +++ b/test/appBinaries/admin.app/Frameworks/hermes.framework/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + hermes + CFBundleIconFile + + CFBundleIdentifier + dev.hermesengine.iphonesimulator + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.12.0 + CFBundleSignature + ???? + CFBundleVersion + 0.12.0 + CSResourcesFileMapped + + MinimumOSVersion + 15.1 + + diff --git a/test/appBinaries/admin.app/Frameworks/hermes.framework/_CodeSignature/CodeResources b/test/appBinaries/admin.app/Frameworks/hermes.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..da00154 --- /dev/null +++ b/test/appBinaries/admin.app/Frameworks/hermes.framework/_CodeSignature/CodeResources @@ -0,0 +1,101 @@ + + + + + files + + Info.plist + + 4Hno0Ddszl7pNxmsMdj4eZ8APpg= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/test/appBinaries/admin.app/Frameworks/hermes.framework/hermes b/test/appBinaries/admin.app/Frameworks/hermes.framework/hermes new file mode 100755 index 0000000..c932c85 Binary files /dev/null and b/test/appBinaries/admin.app/Frameworks/hermes.framework/hermes differ diff --git a/test/appBinaries/admin.app/Info.plist b/test/appBinaries/admin.app/Info.plist new file mode 100644 index 0000000..f2fec8f Binary files /dev/null and b/test/appBinaries/admin.app/Info.plist differ diff --git a/test/appBinaries/admin.app/PkgInfo b/test/appBinaries/admin.app/PkgInfo new file mode 100644 index 0000000..bd04210 --- /dev/null +++ b/test/appBinaries/admin.app/PkgInfo @@ -0,0 +1 @@ +APPL???? \ No newline at end of file diff --git a/test/appBinaries/admin.app/PrivacyInfo.xcprivacy b/test/appBinaries/admin.app/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..c6b452e --- /dev/null +++ b/test/appBinaries/admin.app/PrivacyInfo.xcprivacy @@ -0,0 +1,48 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + 0A2A.1 + 3B52.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryDiskSpace + NSPrivacyAccessedAPITypeReasons + + E174.1 + 85F4.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/test/appBinaries/admin.app/RCT-Folly_privacy.bundle/Info.plist b/test/appBinaries/admin.app/RCT-Folly_privacy.bundle/Info.plist new file mode 100644 index 0000000..8b4064e Binary files /dev/null and b/test/appBinaries/admin.app/RCT-Folly_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/admin.app/ReachabilitySwift.bundle/Info.plist b/test/appBinaries/admin.app/ReachabilitySwift.bundle/Info.plist new file mode 100644 index 0000000..5145da4 Binary files /dev/null and b/test/appBinaries/admin.app/ReachabilitySwift.bundle/Info.plist differ diff --git a/test/appBinaries/admin.app/ReachabilitySwift.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/admin.app/ReachabilitySwift.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..cfbe279 --- /dev/null +++ b/test/appBinaries/admin.app/ReachabilitySwift.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,8 @@ + + + + + NSPrivacyTracking + + + diff --git a/test/appBinaries/admin.app/React-Core_privacy.bundle/Info.plist b/test/appBinaries/admin.app/React-Core_privacy.bundle/Info.plist new file mode 100644 index 0000000..6281013 Binary files /dev/null and b/test/appBinaries/admin.app/React-Core_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/admin.app/React-Core_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/admin.app/React-Core_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..d9d7d19 --- /dev/null +++ b/test/appBinaries/admin.app/React-Core_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,29 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/test/appBinaries/admin.app/React-cxxreact_privacy.bundle/Info.plist b/test/appBinaries/admin.app/React-cxxreact_privacy.bundle/Info.plist new file mode 100644 index 0000000..a3fe2ce Binary files /dev/null and b/test/appBinaries/admin.app/React-cxxreact_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/admin.app/React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/admin.app/React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..6be0f26 --- /dev/null +++ b/test/appBinaries/admin.app/React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,21 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/test/appBinaries/admin.app/SDWebImage.bundle/Info.plist b/test/appBinaries/admin.app/SDWebImage.bundle/Info.plist new file mode 100644 index 0000000..1f41d4d Binary files /dev/null and b/test/appBinaries/admin.app/SDWebImage.bundle/Info.plist differ diff --git a/test/appBinaries/admin.app/SDWebImage.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/admin.app/SDWebImage.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..276f761 --- /dev/null +++ b/test/appBinaries/admin.app/SDWebImage.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,23 @@ + + + + + NSPrivacyTracking + + NSPrivacyCollectedDataTypes + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + + diff --git a/test/appBinaries/admin.app/SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib b/test/appBinaries/admin.app/SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib new file mode 100644 index 0000000..8417215 Binary files /dev/null and b/test/appBinaries/admin.app/SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib differ diff --git a/test/appBinaries/admin.app/SplashScreen.storyboardc/Info.plist b/test/appBinaries/admin.app/SplashScreen.storyboardc/Info.plist new file mode 100644 index 0000000..79f4412 Binary files /dev/null and b/test/appBinaries/admin.app/SplashScreen.storyboardc/Info.plist differ diff --git a/test/appBinaries/admin.app/SplashScreen.storyboardc/SplashScreenViewController.nib b/test/appBinaries/admin.app/SplashScreen.storyboardc/SplashScreenViewController.nib new file mode 100644 index 0000000..eb6f55c Binary files /dev/null and b/test/appBinaries/admin.app/SplashScreen.storyboardc/SplashScreenViewController.nib differ diff --git a/test/appBinaries/admin.app/SymbuyoteAdmin b/test/appBinaries/admin.app/SymbuyoteAdmin new file mode 100755 index 0000000..8706ddb Binary files /dev/null and b/test/appBinaries/admin.app/SymbuyoteAdmin differ diff --git a/test/appBinaries/admin.app/SymbuyoteAdmin.debug.dylib b/test/appBinaries/admin.app/SymbuyoteAdmin.debug.dylib new file mode 100755 index 0000000..6fa9d08 Binary files /dev/null and b/test/appBinaries/admin.app/SymbuyoteAdmin.debug.dylib differ diff --git a/test/appBinaries/admin.app/_CodeSignature/CodeResources b/test/appBinaries/admin.app/_CodeSignature/CodeResources new file mode 100644 index 0000000..0336d9b --- /dev/null +++ b/test/appBinaries/admin.app/_CodeSignature/CodeResources @@ -0,0 +1,535 @@ + + + + + files + + AppIcon60x60@2x.png + + 97LNT9kpa48T+CswHSue8trK1eE= + + AppIcon76x76@2x~ipad.png + + VzU6ZM8C95tff2IFjtvjPfEV8Vs= + + Assets.car + + LrIAJ0UWrloOF0ANfYZBMOddVeQ= + + EXConstants.bundle/Info.plist + + Hlxsc20/U0owoVLTeqzSm5ybNIs= + + EXConstants.bundle/app.config + + IFa3PxmiSkaJ0td8DhhIk/PexXY= + + EXUpdates.bundle/Info.plist + + wjdfAxEpgfQFinoWBfIM8p9jaw8= + + Expo.plist + + yXM53emO8rHxLh7yvjjxI7jUS4U= + + ExpoApplication_privacy.bundle/Info.plist + + 8BRDaa8J7FLCzhVYdsGF90Fhe6A= + + ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy + + mUc2YHiDtobIhFXi+Mvm12TXeb8= + + ExpoConstants_privacy.bundle/Info.plist + + gHWCze8PybGkM8T+sLc+3tpj/QE= + + ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy + + dHAsEQehwJCS8hMOpBoz7emiNj8= + + ExpoDevice_privacy.bundle/Info.plist + + 6hGpMQ+NbBTY+ghWXzsUw8XJGyM= + + ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy + + hWEgzzi+YPgmddeTqWfAi6jGQ0E= + + ExpoFileSystem_privacy.bundle/Info.plist + + WIOt6Nu0S3BZ/+6OsBQFrMyXaNE= + + ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy + + UieOpg4b1PxYR6jA3/cs9mU9rdo= + + ExpoNotifications_privacy.bundle/Info.plist + + BwASpOTXQeKbJUrAWQFpwRpHkM8= + + ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy + + dHAsEQehwJCS8hMOpBoz7emiNj8= + + ExpoSystemUI_privacy.bundle/Info.plist + + ZY9+IxqDzlo+4baYZWU5AcIgICQ= + + ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy + + dHAsEQehwJCS8hMOpBoz7emiNj8= + + Frameworks/hermes.framework/Info.plist + + 4Hno0Ddszl7pNxmsMdj4eZ8APpg= + + Frameworks/hermes.framework/_CodeSignature/CodeResources + + UltW0Jw9IEI+gE7DBGy5/VsUBrw= + + Frameworks/hermes.framework/hermes + + zNwvRCO4iW9WNlr9JGQIrylk2Ko= + + Info.plist + + 4ZwmTOgnIm01EgWvwwqDN/hpTVI= + + PkgInfo + + n57qDP4tZfLD1rCS43W0B4LQjzE= + + PrivacyInfo.xcprivacy + + QWVPQQrLs8XwFZWrDE5vARWvUdA= + + RCT-Folly_privacy.bundle/Info.plist + + QV6mi/fThThHpU2soqgmADF/NUI= + + ReachabilitySwift.bundle/Info.plist + + R1f4iy65ziHGDflHUDJ3rYb7QJw= + + ReachabilitySwift.bundle/PrivacyInfo.xcprivacy + + 0RESd+++ZxZWQhIEMSOOvP7phYs= + + React-Core_privacy.bundle/Info.plist + + bwZ/mVvwWYRpCtLUK8MTyiLp/JU= + + React-Core_privacy.bundle/PrivacyInfo.xcprivacy + + ZahcOiTSEcJJdvNh0xqgAKPqbMs= + + React-cxxreact_privacy.bundle/Info.plist + + DHapNtVVUNHS9BKJUN7HbkRj/0E= + + React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy + + dxJQFdQ77efnBkB0VBZmuIamJ4g= + + SDWebImage.bundle/Info.plist + + MiKmS7AM8ulTkag/cANN1izmsx4= + + SDWebImage.bundle/PrivacyInfo.xcprivacy + + PFHYbs0V3eUFDWQyYQcwEetuqEk= + + SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib + + +LtcMiEvVQs2QdoxGRtI33YPCYs= + + SplashScreen.storyboardc/Info.plist + + E68oTK3pecVBbvVw/Td2doSlDiA= + + SplashScreen.storyboardc/SplashScreenViewController.nib + + XO9GpHETPa/KEeOkIqhZoQ6OIvU= + + SymbuyoteAdmin.debug.dylib + + ZwTTt/x0U07XvLmnb3+tTdSeZn0= + + __preview.dylib + + NKNb0Q7QaNmfiMI7dnipVcSb6Bo= + + boost_privacy.bundle/Info.plist + + V94X3Cp8LSj+pZ/hfbsOD4huj5Q= + + glog_privacy.bundle/Info.plist + + MxuR75ZIsXAD5pxH3nEwX9uafJ0= + + + files2 + + AppIcon60x60@2x.png + + hash2 + + 1EdHEGg/ZaMS6Zip6Ie7YlVSaTP8FBbCsE+pAI+y0Yk= + + + AppIcon76x76@2x~ipad.png + + hash2 + + 0FSd2xHbBOAtgMQ4Et7BIh1mcFoPKKSNPELVi5SQJAc= + + + Assets.car + + hash2 + + VeXk52gO5+lQhdUDpJkX5HFitYSp/HTm9kpkxMmfwws= + + + EXConstants.bundle/Info.plist + + hash2 + + jZG3+Tzakbtg344R3nPmevDrI3G9hqlhuDM+DGKsmHY= + + + EXConstants.bundle/app.config + + hash2 + + KZQx0xB/v36dzA1NH6PtrZPUnlG5NMIASOIYzeC36j4= + + + EXUpdates.bundle/Info.plist + + hash2 + + TSLIu7uoFgEkmWl6rOkXOLHgeB1Z/nLtqptH/f2Kzds= + + + Expo.plist + + hash2 + + WwvRV3RJHdWPGFQnnyrsouAha0/2EaB+goHuQsVMZ2Q= + + + ExpoApplication_privacy.bundle/Info.plist + + hash2 + + OF6pzmZB+LuE1u+wzImbqZDIJmhoflDtg2sTmrOtGiY= + + + ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + tIdj/9KcutgVElrlbhBzJz5BiuCGED/H3/fvvsFnWqo= + + + ExpoConstants_privacy.bundle/Info.plist + + hash2 + + MGRLpoZ+01WpddRUuE8TLN2RgOiqhzIDZEWy3MA1kNQ= + + + ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + Ky2O23HVHFsfGs5M2yipS68i/d6bvy4r/BfRh/97X0c= + + + ExpoDevice_privacy.bundle/Info.plist + + hash2 + + VW+4r911lj+g2ALGOJp8aFap1Y0t3bccy5wunDzTLDs= + + + ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + 2JioNW3Ie3zSsXkh1opGNtQkBns6dcg7eTX9eXcZycs= + + + ExpoFileSystem_privacy.bundle/Info.plist + + hash2 + + ByWljZT3TE7/EQIJQP/napK+gMwwBFaLiROcsjSHmJk= + + + ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + M7DgdPJz9YimS6VjKQnGqM8fFtuOTNhMaXi9Ii39Zb0= + + + ExpoNotifications_privacy.bundle/Info.plist + + hash2 + + tKJ+YduFArUfPD3zQIGLIPtXagl8rbk4RDDBfsLvJC8= + + + ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + Ky2O23HVHFsfGs5M2yipS68i/d6bvy4r/BfRh/97X0c= + + + ExpoSystemUI_privacy.bundle/Info.plist + + hash2 + + tGD6qrPgcjmHblKSEqq1CRuX18qzPmRBwHGfZltFSCw= + + + ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + Ky2O23HVHFsfGs5M2yipS68i/d6bvy4r/BfRh/97X0c= + + + Frameworks/hermes.framework/Info.plist + + hash2 + + JXB+dif18YekowEWiL1F0bJhRmDJCNhC7Yuki1yxMK0= + + + Frameworks/hermes.framework/_CodeSignature/CodeResources + + hash2 + + 1oRx8Mn/IhJGRZOGyHTCY2w0MZ+C71dPBNeLWZ06EJk= + + + Frameworks/hermes.framework/hermes + + hash2 + + 0po9tSLjyYKKx+ArJ1vK4kNtKcwcCF1fCYfIP3UR8M8= + + + PrivacyInfo.xcprivacy + + hash2 + + 0iT0B29OMhTbiXYnweoynu+q6Im8gta4P/eeuquI8zU= + + + RCT-Folly_privacy.bundle/Info.plist + + hash2 + + 0dcC3Z35ltB1Rk2HWpjCzA4wPFt+2WaTjgv/z5AxE1E= + + + ReachabilitySwift.bundle/Info.plist + + hash2 + + a0Ywukh2Qq/wQxGNTeIC7/8oN2YZMvE9YYIecPYUN1M= + + + ReachabilitySwift.bundle/PrivacyInfo.xcprivacy + + hash2 + + pwgfFQbJDo5nMQDlwWHnZbi3piREbiC9S9bvrKgICLg= + + + React-Core_privacy.bundle/Info.plist + + hash2 + + omnNUjXWFudh+cE0TJqsI2YDpTvWTixl77Voxv40Jf4= + + + React-Core_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + fAiWnkWWIabs7AQ8zbkBJlHxhYEZRfdVF8Yj2uLhFic= + + + React-cxxreact_privacy.bundle/Info.plist + + hash2 + + tKBcBEwmtUE9GGaNVVGdsi6/KnlaX4bi1D54dKd5mm4= + + + React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + BYfRVcVqb08GR+vGtqC9AmYVzWEO6PIJqXhrealq0zU= + + + SDWebImage.bundle/Info.plist + + hash2 + + ssr4wetNnB+bGHW2na0M24sSv1inTqC0ReqiCMf6fWU= + + + SDWebImage.bundle/PrivacyInfo.xcprivacy + + hash2 + + A7LHCDOjMaKx79Ef8WjtAqjq39Xn0fvzDuzHUJpK6kc= + + + SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib + + hash2 + + X+tAJBYf6l0fu6OOgc8+aot/0jOHh5N+R9T2CA7fpzw= + + + SplashScreen.storyboardc/Info.plist + + hash2 + + dNvO7WzwpeXGmDR5MyjJeD7Ksd5ILUlU4lfKITK3Q68= + + + SplashScreen.storyboardc/SplashScreenViewController.nib + + hash2 + + nBo0wSHSJHlAjPDqrLNJFUjO0WZVeZuuO19/I4AxS6g= + + + SymbuyoteAdmin.debug.dylib + + hash2 + + bJ9FzLhQRgwj5TfBA8qj2AMq6UuOeEBnqpn4Mdj7YRc= + + + __preview.dylib + + hash2 + + JxYb3r7Pg5bMt+qPjY4ibIde7zNM5U7OL6HGGuldoTM= + + + boost_privacy.bundle/Info.plist + + hash2 + + ewhZPFvqBmGCXr9cyPcgBgi1XfwdibD9dwEvGqRXAFc= + + + glog_privacy.bundle/Info.plist + + hash2 + + ppv2/Di+oXBAtgOAUjnelHqDc6Xxh7Ki3j5KlqckbEY= + + + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/test/appBinaries/admin.app/__preview.dylib b/test/appBinaries/admin.app/__preview.dylib new file mode 100755 index 0000000..49d1dae Binary files /dev/null and b/test/appBinaries/admin.app/__preview.dylib differ diff --git a/test/appBinaries/admin.app/boost_privacy.bundle/Info.plist b/test/appBinaries/admin.app/boost_privacy.bundle/Info.plist new file mode 100644 index 0000000..e84af22 Binary files /dev/null and b/test/appBinaries/admin.app/boost_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/admin.app/glog_privacy.bundle/Info.plist b/test/appBinaries/admin.app/glog_privacy.bundle/Info.plist new file mode 100644 index 0000000..4e89bea Binary files /dev/null and b/test/appBinaries/admin.app/glog_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/AppAuthCore_Privacy.bundle/Info.plist b/test/appBinaries/user.app/AppAuthCore_Privacy.bundle/Info.plist new file mode 100644 index 0000000..5efbbc8 Binary files /dev/null and b/test/appBinaries/user.app/AppAuthCore_Privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/AppAuthCore_Privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/AppAuthCore_Privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..cc6746d --- /dev/null +++ b/test/appBinaries/user.app/AppAuthCore_Privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,16 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTrackingDomains + + NSPrivacyTracking + + + diff --git a/test/appBinaries/user.app/AppIcon60x60@2x.png b/test/appBinaries/user.app/AppIcon60x60@2x.png new file mode 100644 index 0000000..41ede9e Binary files /dev/null and b/test/appBinaries/user.app/AppIcon60x60@2x.png differ diff --git a/test/appBinaries/user.app/AppIcon76x76@2x~ipad.png b/test/appBinaries/user.app/AppIcon76x76@2x~ipad.png new file mode 100644 index 0000000..d99f9e1 Binary files /dev/null and b/test/appBinaries/user.app/AppIcon76x76@2x~ipad.png differ diff --git a/test/appBinaries/user.app/Assets.car b/test/appBinaries/user.app/Assets.car new file mode 100644 index 0000000..98c6e6f Binary files /dev/null and b/test/appBinaries/user.app/Assets.car differ diff --git a/test/appBinaries/user.app/EXConstants.bundle/Info.plist b/test/appBinaries/user.app/EXConstants.bundle/Info.plist new file mode 100644 index 0000000..c5d88cc Binary files /dev/null and b/test/appBinaries/user.app/EXConstants.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/EXConstants.bundle/app.config b/test/appBinaries/user.app/EXConstants.bundle/app.config new file mode 100644 index 0000000..3e8ca2a --- /dev/null +++ b/test/appBinaries/user.app/EXConstants.bundle/app.config @@ -0,0 +1 @@ +{"name":"Freshyo","slug":"freshyo","version":"1.2.0","orientation":"portrait","icon":"./assets/images/freshyo-logo.png","scheme":"freshyo","userInterfaceStyle":"automatic","newArchEnabled":true,"ios":{"buildNumber":"1.1.0","supportsTablet":true,"bundleIdentifier":"com.freshyotrial.app","infoPlist":{"LSApplicationQueriesSchemes":["ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay","ppemerchantsdkv1","ppemerchantsdkv2","ppemerchantsdkv3","paytmmp","gpay"],"ITSAppUsesNonExemptEncryption":false,"NSPhotoLibraryUsageDescription":"This app uses photo library to allow users to upload pictures as a part or product's review and feedback.","NSLocationWhenInUseUsageDescription":"This app uses your location to decide if your place is serviceable or not."}},"android":{"softwareKeyboardLayoutMode":"resize","adaptiveIcon":{"foregroundImage":"./assets/images/freshyo-logo.png","backgroundColor":"#fff0f6"},"edgeToEdgeEnabled":true,"package":"in.freshyo.app","googleServicesFile":"./google-services.json"},"web":{"bundler":"metro","output":"static","favicon":"./assets/images/favicon.png"},"plugins":["expo-router",["expo-splash-screen",{"image":"./assets/images/freshyo-logo.png","imageWidth":200,"resizeMode":"contain","backgroundColor":"#ffffff"}],"expo-secure-store","expo-notifications"],"experiments":{"typedRoutes":true},"extra":{"router":{},"eas":{"projectId":"7f3e7611-f7a8-45f9-8a99-c2b1f6454d48"}},"runtimeVersion":{"policy":"appVersion"},"updates":{"url":"https://u.expo.dev/7f3e7611-f7a8-45f9-8a99-c2b1f6454d48"},"owner":"mohammedshafiuddin54","sdkVersion":"53.0.0","platforms":["ios","android","web"],"androidStatusBar":{"backgroundColor":"#ffffff"}} \ No newline at end of file diff --git a/test/appBinaries/user.app/EXUpdates.bundle/Info.plist b/test/appBinaries/user.app/EXUpdates.bundle/Info.plist new file mode 100644 index 0000000..2f4117e Binary files /dev/null and b/test/appBinaries/user.app/EXUpdates.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/Expo.plist b/test/appBinaries/user.app/Expo.plist new file mode 100644 index 0000000..d4054e2 Binary files /dev/null and b/test/appBinaries/user.app/Expo.plist differ diff --git a/test/appBinaries/user.app/ExpoApplication_privacy.bundle/Info.plist b/test/appBinaries/user.app/ExpoApplication_privacy.bundle/Info.plist new file mode 100644 index 0000000..1464da4 Binary files /dev/null and b/test/appBinaries/user.app/ExpoApplication_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..53bb32a --- /dev/null +++ b/test/appBinaries/user.app/ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + + diff --git a/test/appBinaries/user.app/ExpoConstants_privacy.bundle/Info.plist b/test/appBinaries/user.app/ExpoConstants_privacy.bundle/Info.plist new file mode 100644 index 0000000..7c3cf6b Binary files /dev/null and b/test/appBinaries/user.app/ExpoConstants_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5f6aa38 --- /dev/null +++ b/test/appBinaries/user.app/ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/test/appBinaries/user.app/ExpoDevice_privacy.bundle/Info.plist b/test/appBinaries/user.app/ExpoDevice_privacy.bundle/Info.plist new file mode 100644 index 0000000..118e7ff Binary files /dev/null and b/test/appBinaries/user.app/ExpoDevice_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..7d912e0 --- /dev/null +++ b/test/appBinaries/user.app/ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + + diff --git a/test/appBinaries/user.app/ExpoFileSystem_privacy.bundle/Info.plist b/test/appBinaries/user.app/ExpoFileSystem_privacy.bundle/Info.plist new file mode 100644 index 0000000..d549132 Binary files /dev/null and b/test/appBinaries/user.app/ExpoFileSystem_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..2557cc1 --- /dev/null +++ b/test/appBinaries/user.app/ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,34 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + 0A2A.1 + 3B52.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryDiskSpace + NSPrivacyAccessedAPITypeReasons + + E174.1 + 85F4.1 + + + + + diff --git a/test/appBinaries/user.app/ExpoNotifications_privacy.bundle/Info.plist b/test/appBinaries/user.app/ExpoNotifications_privacy.bundle/Info.plist new file mode 100644 index 0000000..6a7a6a9 Binary files /dev/null and b/test/appBinaries/user.app/ExpoNotifications_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5f6aa38 --- /dev/null +++ b/test/appBinaries/user.app/ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/test/appBinaries/user.app/ExpoSystemUI_privacy.bundle/Info.plist b/test/appBinaries/user.app/ExpoSystemUI_privacy.bundle/Info.plist new file mode 100644 index 0000000..9386958 Binary files /dev/null and b/test/appBinaries/user.app/ExpoSystemUI_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5f6aa38 --- /dev/null +++ b/test/appBinaries/user.app/ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,24 @@ + + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/test/appBinaries/user.app/FBLPromises_Privacy.bundle/Info.plist b/test/appBinaries/user.app/FBLPromises_Privacy.bundle/Info.plist new file mode 100644 index 0000000..0b25ae7 Binary files /dev/null and b/test/appBinaries/user.app/FBLPromises_Privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/FBLPromises_Privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/FBLPromises_Privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5397adc --- /dev/null +++ b/test/appBinaries/user.app/FBLPromises_Privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyAccessedAPITypes + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + diff --git a/test/appBinaries/user.app/Frameworks/Razorpay.framework/Info.plist b/test/appBinaries/user.app/Frameworks/Razorpay.framework/Info.plist new file mode 100644 index 0000000..4b9b7ea Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/Razorpay.framework/Info.plist differ diff --git a/test/appBinaries/user.app/Frameworks/Razorpay.framework/Razorpay b/test/appBinaries/user.app/Frameworks/Razorpay.framework/Razorpay new file mode 100755 index 0000000..8edffe8 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/Razorpay.framework/Razorpay differ diff --git a/test/appBinaries/user.app/Frameworks/Razorpay.framework/_CodeSignature/CodeResources b/test/appBinaries/user.app/Frameworks/Razorpay.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..95e365c --- /dev/null +++ b/test/appBinaries/user.app/Frameworks/Razorpay.framework/_CodeSignature/CodeResources @@ -0,0 +1,101 @@ + + + + + files + + Info.plist + + m2+OcUVS+NCF/RaQ0NMeexAJIbU= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/test/appBinaries/user.app/Frameworks/RazorpayCore.framework/Info.plist b/test/appBinaries/user.app/Frameworks/RazorpayCore.framework/Info.plist new file mode 100644 index 0000000..309d8bc Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayCore.framework/Info.plist differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayCore.framework/RazorpayCore b/test/appBinaries/user.app/Frameworks/RazorpayCore.framework/RazorpayCore new file mode 100755 index 0000000..93b8297 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayCore.framework/RazorpayCore differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayCore.framework/_CodeSignature/CodeResources b/test/appBinaries/user.app/Frameworks/RazorpayCore.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..291ab93 --- /dev/null +++ b/test/appBinaries/user.app/Frameworks/RazorpayCore.framework/_CodeSignature/CodeResources @@ -0,0 +1,101 @@ + + + + + files + + Info.plist + + IgSq/mUvfi0nncHC2TAKVG0zPwA= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Assets.car b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Assets.car new file mode 100644 index 0000000..589fe13 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Assets.car differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/Info.plist b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/Info.plist new file mode 100644 index 0000000..26c814b Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/Info.plist differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/objects-11.0+.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/objects-11.0+.nib new file mode 100644 index 0000000..80579c1 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/objects-11.0+.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/runtime.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/runtime.nib new file mode 100644 index 0000000..80579c1 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/runtime.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/objects-11.0+.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/objects-11.0+.nib new file mode 100644 index 0000000..e777691 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/objects-11.0+.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/runtime.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/runtime.nib new file mode 100644 index 0000000..e777691 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/runtime.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/objects-11.0+.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/objects-11.0+.nib new file mode 100644 index 0000000..f6c81d2 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/objects-11.0+.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/runtime.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/runtime.nib new file mode 100644 index 0000000..e18633c Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/runtime.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/objects-11.0+.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/objects-11.0+.nib new file mode 100644 index 0000000..9073a45 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/objects-11.0+.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/runtime.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/runtime.nib new file mode 100644 index 0000000..6e202ea Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/runtime.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/objects-11.0+.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/objects-11.0+.nib new file mode 100644 index 0000000..2dbc02b Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/objects-11.0+.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/runtime.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/runtime.nib new file mode 100644 index 0000000..2dbc02b Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/runtime.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/objects-11.0+.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/objects-11.0+.nib new file mode 100644 index 0000000..069c006 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/objects-11.0+.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/runtime.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/runtime.nib new file mode 100644 index 0000000..069c006 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/runtime.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/objects-11.0+.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/objects-11.0+.nib new file mode 100644 index 0000000..ca94985 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/objects-11.0+.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/runtime.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/runtime.nib new file mode 100644 index 0000000..ca94985 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/runtime.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/objects-11.0+.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/objects-11.0+.nib new file mode 100644 index 0000000..03a2611 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/objects-11.0+.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/runtime.nib b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/runtime.nib new file mode 100644 index 0000000..776b6de Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/runtime.nib differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/CommonAssets/Razorpay_Logo.png b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/CommonAssets/Razorpay_Logo.png new file mode 100644 index 0000000..3e66db5 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/CommonAssets/Razorpay_Logo.png differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/CommonAssets/check_mark.png b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/CommonAssets/check_mark.png new file mode 100644 index 0000000..e5e6780 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/CommonAssets/check_mark.png differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/CommonAssets/warning.png b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/CommonAssets/warning.png new file mode 100644 index 0000000..ef818d2 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/CommonAssets/warning.png differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/EncryptedOtpelf.js b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/EncryptedOtpelf.js new file mode 100644 index 0000000..60d6c47 --- /dev/null +++ b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/EncryptedOtpelf.js @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Hash.txt b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Hash.txt new file mode 100644 index 0000000..e82cb2f --- /dev/null +++ b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Hash.txt @@ -0,0 +1 @@ +12bd975b82f23eb997a3ee2df03e4e33 \ No newline at end of file diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Info.plist b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Info.plist new file mode 100644 index 0000000..15baaa2 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/Info.plist differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..b9eb8d0 --- /dev/null +++ b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/PrivacyInfo.xcprivacy @@ -0,0 +1,150 @@ + + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypePhysicalAddress + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeOtherDiagnosticData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeCrashData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeProductInteraction + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeProductPersonalization + NSPrivacyCollectedDataTypePurposeAppFunctionality + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeDeviceID + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + NSPrivacyCollectedDataTypePurposeProductPersonalization + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypePaymentInfo + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + NSPrivacyCollectedDataTypePurposeAnalytics + NSPrivacyCollectedDataTypePurposeProductPersonalization + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypePhoneNumber + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + NSPrivacyCollectedDataTypePurposeAppFunctionality + NSPrivacyCollectedDataTypePurposeProductPersonalization + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeName + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeProductPersonalization + NSPrivacyCollectedDataTypePurposeAppFunctionality + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + Email address + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeProductPersonalization + NSPrivacyCollectedDataTypePurposeAnalytics + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyTracking + + + diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/RazorpayStandard b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/RazorpayStandard new file mode 100755 index 0000000..2bd9c59 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/RazorpayStandard differ diff --git a/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/_CodeSignature/CodeResources b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..34fd4eb --- /dev/null +++ b/test/appBinaries/user.app/Frameworks/RazorpayStandard.framework/_CodeSignature/CodeResources @@ -0,0 +1,366 @@ + + + + + files + + Assets.car + + 9EtCg2Ey2Zi4Ua584kuKWTJN01U= + + Checkout.storyboardc/Info.plist + + DFcy10+V49NKtjJ4RLpByN10P1k= + + Checkout.storyboardc/MagicXNavController.nib/objects-11.0+.nib + + zRbA0UPDWTIRE/KMCArksV/vK2k= + + Checkout.storyboardc/MagicXNavController.nib/runtime.nib + + zRbA0UPDWTIRE/KMCArksV/vK2k= + + Checkout.storyboardc/OpinionatedAlertVC.nib/objects-11.0+.nib + + 0nbduMecK7uoslXovJgcjilOIB8= + + Checkout.storyboardc/OpinionatedAlertVC.nib/runtime.nib + + 0nbduMecK7uoslXovJgcjilOIB8= + + Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/objects-11.0+.nib + + c8N/593lOrAw9wwSo2JSseKACUI= + + Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/runtime.nib + + GAbF07uihY0DE3w15+txJ0RlSNw= + + Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/objects-11.0+.nib + + PcD+CIGNT4GNXBw18IEBAYmUl1A= + + Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/runtime.nib + + 1LYMZo3gzNiKkp3f7Nzh+lgBbPg= + + Checkout.storyboardc/RazorpayCheckoutVC.nib/objects-11.0+.nib + + ENBWg/fxi+P7OShg+NGXd0X+mWQ= + + Checkout.storyboardc/RazorpayCheckoutVC.nib/runtime.nib + + ENBWg/fxi+P7OShg+NGXd0X+mWQ= + + Checkout.storyboardc/RazorpayMagicxVC.nib/objects-11.0+.nib + + Ia0hGvI0wvIaseYa7wMvQf/q438= + + Checkout.storyboardc/RazorpayMagicxVC.nib/runtime.nib + + Ia0hGvI0wvIaseYa7wMvQf/q438= + + Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/objects-11.0+.nib + + 09suesko3lo0ihguFnxyvFMqd6g= + + Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/runtime.nib + + 09suesko3lo0ihguFnxyvFMqd6g= + + Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/objects-11.0+.nib + + GuaLaOgcxzpvPP6jj7CE6UW1x54= + + Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/runtime.nib + + Ucg3HkU3DNFIfnKf6gQlzd/zqTg= + + CommonAssets/Razorpay_Logo.png + + C/QPifs1kjcxzxgwUgDFDlLjpRw= + + CommonAssets/check_mark.png + + 6d4pPz33KoUobYRDPpGmnPiTVMs= + + CommonAssets/warning.png + + gxArEMTCcu4a+ueYNB3oMoIh48o= + + EncryptedOtpelf.js + + A893KbMpygzZy6/G1xrQkAudMxw= + + Hash.txt + + gN8QKnsfFYPlPa6NstmuiJETxJ8= + + Info.plist + + acRXxu68VWw8Pnzhk8Ky6zQaWHE= + + PrivacyInfo.xcprivacy + + 62HpNLqPh8tKsg+iNP/pSbF2S6M= + + + files2 + + Assets.car + + hash2 + + HcTTFmbApmRduIkc+LudaGbZclscDoJ6VJdjQDMk5z8= + + + Checkout.storyboardc/Info.plist + + hash2 + + XV+Km0uI0aCCx6b8FFBL8ctnAUqg/+iH2HKwpDJJDns= + + + Checkout.storyboardc/MagicXNavController.nib/objects-11.0+.nib + + hash2 + + /FTBuwa4eqDE4oW65Wzg7NRMxsEk6lrbA5gEQvxHMm8= + + + Checkout.storyboardc/MagicXNavController.nib/runtime.nib + + hash2 + + /FTBuwa4eqDE4oW65Wzg7NRMxsEk6lrbA5gEQvxHMm8= + + + Checkout.storyboardc/OpinionatedAlertVC.nib/objects-11.0+.nib + + hash2 + + TB5d1qjY2vLAC2ml/4EBTkBy3xnnLZQe6gxyjAuM7Hs= + + + Checkout.storyboardc/OpinionatedAlertVC.nib/runtime.nib + + hash2 + + TB5d1qjY2vLAC2ml/4EBTkBy3xnnLZQe6gxyjAuM7Hs= + + + Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/objects-11.0+.nib + + hash2 + + 9gbR1Bca1fy1VmXM6YTr9iMj/H9FiV5FH80kOSCS5cA= + + + Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/runtime.nib + + hash2 + + 0aP4/XYhE9pTrC1von5mej2B5hZzviQdM4PQj/nojlY= + + + Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/objects-11.0+.nib + + hash2 + + hg8U6PEGkuQ5LmSJ3QWnXPjAHQ9HR+iYMliJQBqIXsA= + + + Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/runtime.nib + + hash2 + + xzfMa2B7p6qD36vy7gfDE7AfItGacEFMLkGs19efnI0= + + + Checkout.storyboardc/RazorpayCheckoutVC.nib/objects-11.0+.nib + + hash2 + + 0D+N+GRb1ZrUQlq4dTQIQfubTWQC44SvjHUHVlVbgeg= + + + Checkout.storyboardc/RazorpayCheckoutVC.nib/runtime.nib + + hash2 + + 0D+N+GRb1ZrUQlq4dTQIQfubTWQC44SvjHUHVlVbgeg= + + + Checkout.storyboardc/RazorpayMagicxVC.nib/objects-11.0+.nib + + hash2 + + l6Hz4xHGp/8dMGEWk8KuCnewyrV7Y1XGhWysBUgItFY= + + + Checkout.storyboardc/RazorpayMagicxVC.nib/runtime.nib + + hash2 + + l6Hz4xHGp/8dMGEWk8KuCnewyrV7Y1XGhWysBUgItFY= + + + Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/objects-11.0+.nib + + hash2 + + bzY2zdca4b/GrxTr/LmNprdhD3SyIBsZG1W2z7TVW28= + + + Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/runtime.nib + + hash2 + + bzY2zdca4b/GrxTr/LmNprdhD3SyIBsZG1W2z7TVW28= + + + Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/objects-11.0+.nib + + hash2 + + I8p2+VocnQu/7nTAHxHwPLoZ9J+et+y957CgfHi+MQo= + + + Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/runtime.nib + + hash2 + + h05YMT+1oAA6um16sH5KVB2c6toLm935YPmV2d/ZDU8= + + + CommonAssets/Razorpay_Logo.png + + hash2 + + udRErjoaEwN536HIEl+2sH6KQ0Q2KzlKwLYCkQlBGKE= + + + CommonAssets/check_mark.png + + hash2 + + s+l4gXoMSGUj0xR2eSdXwQTHoyRU5F4+aTSVjO+I8wU= + + + CommonAssets/warning.png + + hash2 + + S7OOo4xdlAEiEgfkEuic4ap4JZlhvtYIwFSHWu034SA= + + + EncryptedOtpelf.js + + hash2 + + 85Tocsg1aPekBFPeMKMV2IruNGVkOyyV6xlbQkQOH3A= + + + Hash.txt + + hash2 + + B20CsAEe8H45a3Ivw23aBTWNU7qGh1JYKb/iAwwaIEQ= + + + PrivacyInfo.xcprivacy + + hash2 + + 0GK4q+J5XVD2O8agumlONknk2PSlkzr97y/P84XeCyg= + + + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/test/appBinaries/user.app/Frameworks/hermes.framework/Info.plist b/test/appBinaries/user.app/Frameworks/hermes.framework/Info.plist new file mode 100644 index 0000000..765e804 --- /dev/null +++ b/test/appBinaries/user.app/Frameworks/hermes.framework/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + hermes + CFBundleIconFile + + CFBundleIdentifier + dev.hermesengine.iphonesimulator + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.12.0 + CFBundleSignature + ???? + CFBundleVersion + 0.12.0 + CSResourcesFileMapped + + MinimumOSVersion + 15.1 + + diff --git a/test/appBinaries/user.app/Frameworks/hermes.framework/_CodeSignature/CodeResources b/test/appBinaries/user.app/Frameworks/hermes.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..da00154 --- /dev/null +++ b/test/appBinaries/user.app/Frameworks/hermes.framework/_CodeSignature/CodeResources @@ -0,0 +1,101 @@ + + + + + files + + Info.plist + + 4Hno0Ddszl7pNxmsMdj4eZ8APpg= + + + files2 + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/test/appBinaries/user.app/Frameworks/hermes.framework/hermes b/test/appBinaries/user.app/Frameworks/hermes.framework/hermes new file mode 100755 index 0000000..c932c85 Binary files /dev/null and b/test/appBinaries/user.app/Frameworks/hermes.framework/hermes differ diff --git a/test/appBinaries/user.app/Freshyo b/test/appBinaries/user.app/Freshyo new file mode 100755 index 0000000..0f1327b Binary files /dev/null and b/test/appBinaries/user.app/Freshyo differ diff --git a/test/appBinaries/user.app/Freshyo.debug.dylib b/test/appBinaries/user.app/Freshyo.debug.dylib new file mode 100755 index 0000000..b70801f Binary files /dev/null and b/test/appBinaries/user.app/Freshyo.debug.dylib differ diff --git a/test/appBinaries/user.app/GTMAppAuth_Privacy.bundle/Info.plist b/test/appBinaries/user.app/GTMAppAuth_Privacy.bundle/Info.plist new file mode 100644 index 0000000..a1122dc Binary files /dev/null and b/test/appBinaries/user.app/GTMAppAuth_Privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/GTMAppAuth_Privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/GTMAppAuth_Privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..d37d627 --- /dev/null +++ b/test/appBinaries/user.app/GTMAppAuth_Privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyCollectedDataTypes + + NSPrivacyAccessedAPITypes + + NSPrivacyTrackingDomains + + NSPrivacyTracking + + + diff --git a/test/appBinaries/user.app/GTMSessionFetcher_Core_Privacy.bundle/Info.plist b/test/appBinaries/user.app/GTMSessionFetcher_Core_Privacy.bundle/Info.plist new file mode 100644 index 0000000..b28a0f9 Binary files /dev/null and b/test/appBinaries/user.app/GTMSessionFetcher_Core_Privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/GTMSessionFetcher_Core_Privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/GTMSessionFetcher_Core_Privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..0a95d09 --- /dev/null +++ b/test/appBinaries/user.app/GTMSessionFetcher_Core_Privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,23 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/Info.plist b/test/appBinaries/user.app/GoogleSignIn.bundle/Info.plist new file mode 100644 index 0000000..38171da Binary files /dev/null and b/test/appBinaries/user.app/GoogleSignIn.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/GoogleSignIn.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..010fc33 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,122 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeName + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeEmailAddress + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypePhoneNumber + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeOtherDataTypes + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeCoarseLocation + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeUserID + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeDeviceID + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeOtherUsageData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAnalytics + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + + + + diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/Roboto-Bold.ttf b/test/appBinaries/user.app/GoogleSignIn.bundle/Roboto-Bold.ttf new file mode 100755 index 0000000..68822ca Binary files /dev/null and b/test/appBinaries/user.app/GoogleSignIn.bundle/Roboto-Bold.ttf differ diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/ar.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/ar.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..d122eb7 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/ar.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "تسجيل الدخول"; + +/* Long form sign-in button text */ +"Sign in with Google" = "تسجيل الدخول باستخدام Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "موافق"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "إلغاء"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "إعدادات"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "يتعذَّر تسجيل الدخول إلى الحساب"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "يطلب منك المشرف تعيين رمز مرور على هذا الجهاز للدخول إلى هذا الحساب. يُرجى تعيين رمز المرور وإعادة المحاولة."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "لا يتوافق هذا الجهاز مع سياسة الأمان التي أعدها مشرفك"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "هل تريد الربط بتطبيق Device Policy؟"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "يجب الربط مع تطبيق Device Policy قبل تسجيل الدخول لحماية بيانات مؤسستك."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "ربط"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/ca.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/ca.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..8a1c13e --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/ca.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Inicia la sessió"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Inicia la sessió amb Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "D’acord"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancel·la"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Configuració"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "No es pot iniciar la sessió al compte"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "L'administrador requereix que estableixis una contrasenya en aquest dispositiu per accedir al compte. Estableix una contrasenya i torna-ho a provar."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "El dispositiu no compleix la política de seguretat establerta pel teu administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vols connectar-te amb l'aplicació Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Per protegir les dades de la teva organització, t'has de connectar amb l'aplicació Device Policy abans d'iniciar la sessió."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Vull connectar-me"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/cs.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/cs.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..4443b22 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/cs.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Přihlásit se"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Přihlásit se účtem Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Zrušit"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Nastavení"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nelze se přihlásit k účtu"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administrátor vyžaduje, abyste v tomto zařízení nastavili heslo pro přístup k tomuto účtu. Nastavte prosím heslo a zkuste to znovu."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Zařízení nevyhovuje bezpečnostním zásadám nastaveným administrátorem."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Propojit s aplikací Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Aby bylo možné chránit data vaší organizace, před přihlášením je nutné aktivovat propojení s aplikací Device Policy."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Propojit"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/da.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/da.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..cc44a71 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/da.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Log ind"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Log ind med Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Annuller"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Indstillinger"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Der kunne ikke logges ind på kontoen"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Din administrator kræver, at du angiver en adgangskode på enheden for at få adgang til kontoen. Angiv en adgangskode, og prøv igen."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Enheden overholder ikke den sikkerhedspolitik, der er angivet af din administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vil du oprette forbindelse til appen Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Du skal oprette forbindelse til appen Device Policy, inden du logger ind, for at beskytte din organisations data."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Opret forbindelse"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/de.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/de.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..b4e0963 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/de.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Anmelden"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Über Google anmelden"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Abbrechen"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Einstellungen"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Anmelden im Konto nicht möglich"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Ihr Administrator hat festgelegt, dass auf diesem Gerät ein Sicherheitscode eingerichtet werden muss, um auf dieses Konto zuzugreifen. Bitte legen Sie einen Sicherheitscode fest und versuchen Sie es noch einmal."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Das Gerät ist nicht mit den von Ihrem Administrator festgelegten Sicherheitsrichtlinien konform."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Mit der Device Policy App verknüpfen?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Zum Schutz der Daten Ihrer Organisation müssen Sie Ihr Gerät zuerst mit der Device Policy App verknüpfen, bevor Sie sich anmelden."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Verknüpfen"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/el.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/el.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..05bd7cc --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/el.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Σύνδεση"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Συνδεθείτε με το Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "ΟΚ"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Άκυρο"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Ρυθμίσεις"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Δεν είναι δυνατή η σύνδεση στον λογαριασμό"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Ο διαχειριστής σας απαιτεί να ορίσετε έναν κωδικό πρόσβασης στη συσκευή, για να έχετε πρόσβαση σε αυτόν τον λογαριασμό. Ορίστε έναν κωδικό πρόσβασης και δοκιμάστε ξανά."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Η συσκευή δεν συμμορφώνεται με την πολιτική ασφαλείας που έχει ορίσει ο διαχειριστής σας."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Σύνδεση με την εφαρμογή Device Policy;"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Προκειμένου να προστατεύσετε τα δεδομένα του οργανισμού σας, θα πρέπει να συνδεθείτε με την εφαρμογή Device Policy προτού συνδεθείτε στον λογαριασμό σας."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Σύνδεση"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/en.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/en.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..460ad64 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/en.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Sign in"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Sign in with Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancel"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Settings"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Unable to sign in to account"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Your administrator requires you to set a passcode on this device to access this account. Please set a passcode and try again."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "The device is not compliant with the security policy set by your administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Connect with Device Policy App?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "In order to protect your organization's data, you must connect with the Device Policy app before logging in."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Connect"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/en_GB.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/en_GB.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..f4e37db --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/en_GB.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Sign in"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Sign in with Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancel"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Settings"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Unable to sign in to account"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Your administrator requires you to set a passcode on this device to access this account. Please set a passcode and try again."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "The device is not compliant with the security policy set by your administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Connect with Device Policy App?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "In order to protect your organisation's data, you must connect with the Device Policy app before logging in."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Connect"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/es.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/es.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..f756140 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/es.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Iniciar sesión"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Iniciar sesión con Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Aceptar"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Configuración"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "No se ha podido iniciar sesión en la cuenta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "El administrador requiere que configures una contraseña en este dispositivo para acceder a esta cuenta. Inténtalo de nuevo cuando lo hayas hecho."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "El dispositivo no cumple la política de privacidad que ha definido tu administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "¿Has conectado tu dispositivo con la aplicación Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger los datos de tu organización, debes conectar tu dispositivo con la aplicación Device Policy antes de iniciar sesión."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectar"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/es_MX.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/es_MX.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..4cfb56d --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/es_MX.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Acceder"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Acceder con Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Aceptar"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Configuración"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "No es posible acceder a la cuenta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Para acceder a esta cuenta, tu administrador requiere que establezcas una contraseña en el dispositivo. Configúrala y vuelve a intentarlo."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "El dispositivo no cumple con la política de seguridad que estableció el administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "¿Deseas conectarte con la app de Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger los datos de tu organización, debes conectarte con la app de Device Policy antes de acceder."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectar"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/fi.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/fi.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..c0006f7 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/fi.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Kirjaudu sisään"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Kirjaudu Google-tilin tunnuksilla"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Peruuta"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Asetukset"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Kirjautuminen tilille ei onnistu"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Järjestelmänvalvoja edellyttää tunnuskoodin määrittämistä, ennen kuin voit käyttää tiliä tällä laitteella. Määritä tunnuskoodi ja yritä uudelleen."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Laite ei noudata järjestelmänvalvojan määrittämää verkkotunnuskäytäntöä."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Muodostetaanko yhteys Device Policy ‑sovellukseen?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Suojaa organisaatiosi dataa muodostamalla yhteys Device Policy ‑sovellukseen ennen kirjautumista."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Muodosta yhteys"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/fr.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/fr.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..06a30c1 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/fr.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Se connecter"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Se connecter avec Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Annuler"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Paramètres"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Impossible de se connecter au compte"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Votre administrateur exige que vous définissiez un mot de passe sur cet appareil pour accéder à ce compte. Veuillez définir un mot de passe, puis réessayer."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "L'appareil ne respecte pas les règles de sécurité définies par votre administrateur."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Se connecter à l'application Device Policy ?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Afin de protéger les données de votre organisation, vous devez vous connecter à l'application Device Policy avant de vous connecter à votre compte."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Connexion"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/fr_CA.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/fr_CA.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..29ca57e --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/fr_CA.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Se connecter"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Se connecter à Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Annuler"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Paramètres"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Impossible de se connecter au compte"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Pour que votre administrateur puisse accéder à ce compte, vous devez définir un mot de passe sur cet appareil. Veuillez définir un mot de passe et réessayer."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "L'appareil n'est pas conforme à la politique de sécurité définie par votre administrateur."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Connexion avec l'application Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Pour protéger les données de votre organisation, vous devez vous connecter à l'application Device Policy avant de vous connecter."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Connexion"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/google.png b/test/appBinaries/user.app/GoogleSignIn.bundle/google.png new file mode 100644 index 0000000..a13d4dc Binary files /dev/null and b/test/appBinaries/user.app/GoogleSignIn.bundle/google.png differ diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/google@2x.png b/test/appBinaries/user.app/GoogleSignIn.bundle/google@2x.png new file mode 100644 index 0000000..88a86b1 Binary files /dev/null and b/test/appBinaries/user.app/GoogleSignIn.bundle/google@2x.png differ diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/google@3x.png b/test/appBinaries/user.app/GoogleSignIn.bundle/google@3x.png new file mode 100644 index 0000000..b4d4645 Binary files /dev/null and b/test/appBinaries/user.app/GoogleSignIn.bundle/google@3x.png differ diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..da294c8 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "היכנס"; + +/* Long form sign-in button text */ +"Sign in with Google" = "היכנס באמצעות Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "אישור"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "ביטול"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "הגדרות"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "לא ניתן להיכנס לחשבון"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "מנהל המערכת דורש ממך להגדיר קוד סיסמה במכשיר זה כדי לגשת לחשבון זה. יש להגדיר קוד סיסמה ולנסות שוב."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "המכשיר אינו פועל בהתאם למדיניות האבטחה שנקבעה על-ידי מנהל המערכת."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "האם להתחבר באמצעות האפליקציית Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "על מנת להגן על נתוני הארגון שלך, יש להתחבר באמצעות אפליקציית Device Policy לפני הכניסה לחשבון."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "התחברות"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..bafc3f1 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "साइन इन करें"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Google के साथ साइन इन करें"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "ठीक"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "अभी नहीं"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "सेटिंग"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "खाते में साइन इन नहीं किया जा सका"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "आपके एडमिन के लिए ज़रूरी है कि आप यह खाता एक्सेस करने के लिए इस डिवाइस पर एक पासकोड सेट करें. कृपया पासकोड सेट करें और दोबारा कोशिश करें."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "डिवाइस आपके एडमिन के ज़रिए सेट की गई सुरक्षा नीति का अनुपालन नहीं करता है."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "क्या Device Policy ऐप्लिकेशन से कनेक्ट करना चाहते हैं?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "अपने संगठन डेटा की सुरक्षा के लिए, आपको लॉग-इन करने से पहले Device Policy ऐप्लिकेशन से कनेक्ट करना होगा."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "कनेक्ट करें"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..6304c00 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Prijava"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Prijavite se putem Googlea"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "U redu"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Odbaci"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Postavke"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Prijava na račun nije moguća"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Vaš administrator zahtijeva da postavite šifru zaporke na ovom uređaju da biste pristupili računu. Postavite šifru zaporke i pokušajte ponovo."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Uređaj nije usklađen sa sigurnosnim pravilima koja je postavio vaš administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Želite li se povezati s aplikacijom Pravila za uređaje?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Da biste zaštitili podatke svoje organizacije, morate se povezati s aplikacijom Pravila za uređaje prije prijave."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Poveži"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..4940e4c --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Bejelentkezés"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Bejelentkezés Google-fiókkal"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Mégse"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Beállítások"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nem sikerült bejelentkezni a fiókba"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Adminisztrátora biztonsági kód beállítását kéri ezen az eszközön a fiókhoz való hozzáféréshez. Kérjük, állítson be biztonsági kódot, majd próbálja újra."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Az eszköz nem felel meg a rendszergazda által beállított biztonsági házirendnek."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Csatlakozik a Device Policy alkalmazáshoz?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "A szervezet adatainak védelme érdekében a bejelentkezés előtt csatlakoznia kell a Device Policy alkalmazáshoz."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Csatlakozás"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..2ed96ba --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Masuk"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Masuk dengan Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Oke"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Batal"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Setelan"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Tidak dapat login ke akun"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administrator mengharuskan Anda menyetel kode sandi di perangkat ini untuk mengakses akun ini. Setel kode sandi dan coba lagi."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Perangkat ini tidak sesuai dengan kebijakan keamanan yang disetel oleh administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Sambungkan dengan Aplikasi Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Untuk melindungi data organisasi, Anda harus tersambung dengan aplikasi Device Policy sebelum login."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Sambungkan"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..b7c233c --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Accedi"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Accedi con Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Annulla"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Impostazioni"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Impossibile accedere all'account"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "L'amministratore richiede l'impostazione di un passcode sul dispositivo per accedere a questo account. Imposta un passcode e riprova."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Il dispositivo non è conforme alle norme di sicurezza stabilite dall'amministratore."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vuoi collegarti all'app Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Per proteggere i dati della tua organizzazione, devi collegarti all'app Device Policy prima di accedere."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Collega"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..16c62cb --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "ログイン"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Googleでログイン"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "キャンセル"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "設定"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "アカウントにログインできません"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "このアカウントにアクセスするには、この端末でパスコードを設定する必要があります。パスコードを設定してから、もう一度お試しください。"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "この端末は、管理者が設定したセキュリティ ポリシーに準拠していません。"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Device Policy アプリと接続しますか?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "組織のデータを保護するために、ログインする前に Device Policy アプリと接続する必要があります。"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "接続"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..c0faf96 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "로그인"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Google 계정으로 로그인"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "확인"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "취소"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "설정"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "계정에 로그인할 수 없음"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "관리자의 설정에 따라 이 계정에 액세스하려면 사용 중인 기기에 비밀번호를 설정해야 합니다. 비밀번호를 설정한 후 다시 시도해 주세요."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "관리자가 설정한 보안 정책을 준수하지 않는 기기입니다."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Device Policy 앱과 연결하시겠습니까?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "조직의 데이터를 보호하려면 로그인하기 전에 Device Policy 앱과 연결해야 합니다."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "연결"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..2fcb23e --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Log masuk"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Log masuk dengan Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Batal"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Tetapan"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Tidak dapat log masuk ke akaun"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Pentadbir menghendaki anda menetapkan kod laluan pada peranti ini untuk mengakses akaun ini. Sila tetapkan kod laluan, kemudian cuba lagi."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Peranti tidak mematuhi dasar keselamatan yang ditetapkan oleh pentadbir anda."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Berhubung dengan Apl Dasar Peranti?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Untuk melindungi data organisasi anda, anda mesti berhubung dengan apl Dasar Peranti sebelum log masuk."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Hubungkan"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..4ffeb75 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Logg på"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Logg på med Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Avbryt"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Innstillinger"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Kan ikke logge på kontoen"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administratoren din krever at du angir en adgangskode på denne enheten for å få tilgang til kontoen. Angi en adgangskode, og prøv på nytt."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Enheten overholder ikke retningslinjene for sikkerhet som ble angitt av administratoren din."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vil du koble til med Device Policy-appen?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "For å beskytte dataene til organisasjonen din må du koble til med Device Policy-appen før du logger på."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Koble til"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..f9d0b80 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Inloggen"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Inloggen met Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Annuleren"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Instellingen"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Kan niet inloggen op account"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Uw beheerder vereist dat u een toegangscode instelt op dit apparaat om toegang te krijgen tot dit account. Stel een toegangscode in en probeer het opnieuw."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Het apparaat voldoet niet aan het beveiligingsbeleid dat is ingesteld door uw beheerder."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Verbinden met Device Policy-app?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Ter bescherming van de gegevens van uw organisatie moet u verbinding maken met de Device Policy-app voordat u inlogt."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Verbinden"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..2317335 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Zaloguj się"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Zaloguj się przez Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Anuluj"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Ustawienia"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nie można zalogować się na konto"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administrator wymaga ustawienia kodu dostępu do konta na tym urządzeniu. Ustaw kod dostępu i spróbuj ponownie."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Urządzenie nie jest zgodne z zasadami bezpieczeństwa ustanowionymi przez Twojego administratora."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Połączyć z aplikacją Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Aby chronić dane organizacji, przed zalogowaniem musisz się połączyć z aplikacją Device Policy."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Połącz"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..8dc34f6 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Fazer login"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Fazer login com o Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Configurações"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Não foi possível fazer login na conta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Seu administrador exige que você defina uma senha neste dispositivo para acessar esta conta. Defina uma senha e tente novamente."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "O dispositivo não está em conformidade com a política de segurança definida pelo administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Conectar-se ao app Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger os dados da sua organização, você precisa se conectar ao app Device Policy antes de fazer login."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectar"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..8dc34f6 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Fazer login"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Fazer login com o Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Configurações"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Não foi possível fazer login na conta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Seu administrador exige que você defina uma senha neste dispositivo para acessar esta conta. Defina uma senha e tente novamente."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "O dispositivo não está em conformidade com a política de segurança definida pelo administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Conectar-se ao app Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger os dados da sua organização, você precisa se conectar ao app Device Policy antes de fazer login."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectar"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..23875ea --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Iniciar sessão"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Iniciar sessão com o Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Cancelar"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Definições"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Não é possível iniciar sessão na conta"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "O administrador requer a definição de um código secreto neste dispositivo para aceder a esta conta. Defina um código secreto e tente novamente."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "O dispositivo não está em conformidade com a política de segurança definida pelo seu administrador."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Pretende ligar-se à aplicação Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Para proteger os dados da sua entidade, tem de se ligar à aplicação Device Policy antes de iniciar sessão."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Ligar"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..7f24cbd --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Conectați-vă"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Conectați-vă cu Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Anulați"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Setări"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nu vă puteți conecta la cont"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administratorul impune să setați o parolă pe acest dispozitiv ca să accesați contul. Setați o parolă și încercați din nou."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Dispozitivul nu respectă politica de securitate stabilită de administrator."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vă conectați cu aplicația Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Pentru a vă proteja datele organizației, trebuie să vă conectați cu aplicația Device Policy înainte de a vă conecta."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Conectați"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..4041696 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Войти"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Войти в аккаунт Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "ОК"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Отмена"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Настройки"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Не удалось войти в аккаунт"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "В соответствии с требованиями администратора для входа в аккаунт необходимо установить на устройстве код доступа. Сделайте это и повторите попытку."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Устройство не соответствует правилам безопасности, которые установлены администратором."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Подключить приложение Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "В целях защиты корпоративных данных перед входом в аккаунт необходимо подключить приложение Device Policy."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Подключить"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..c516318 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Prihlásiť sa"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Prihlásiť sa pomocou účtu Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Zrušiť"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Nastavenia"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Nedá sa prihlásiť do účtu"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Správca vyžaduje, aby ste v tomto zariadení nastavili vstupný kód na prístup do príslušného účtu. Nastavte vstupný kód a skúste to znova."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Zariadenie nespĺňa pravidlá zabezpečenia nastavené vaším správcom."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Prepojiť s aplikáciou Pravidlá pre zariadenie?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Na to, aby bolo možné chrániť dáta vašej organizácie, je nutné pred prihlásením aktivovať prepojenie s aplikáciou Pravidlá pre zariadenie."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Prepojiť"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..46ada2b --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Logga in"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Logga in med Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Ok"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Avbryt"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Inställningar"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Det gick inte att logga in på kontot"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Administratören kräver att du anger ett lösenord på den här enheten för att få åtkomst till kontot. Ange ett lösenord och försök igen."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Säkerhetspolicyn som administratören har angett efterlevs inte på enheten."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Vill du ansluta med appen Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Du måste ansluta med appen Device Policy innan du loggar in för att skydda organisationens data."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Anslut"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..125c39d --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "ลงชื่อเข้าใช้"; + +/* Long form sign-in button text */ +"Sign in with Google" = "ลงชื่อเข้าใช้ด้วย Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "ตกลง"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "ยกเลิก"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "การตั้งค่า"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "ลงชื่อเข้าใช้บัญชีไม่ได้"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "ผู้ดูแลระบบกำหนดให้คุณตั้งรหัสผ่านในอุปกรณ์นี้เพื่อเข้าถึงบัญชีนี้ โปรดตั้งรหัสผ่าน แล้วลองอีกครั้ง"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "อุปกรณ์ไม่ตรงตามนโยบายความปลอดภัยที่กำหนดโดยผู้ดูแลระบบของคุณ"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "เชื่อมต่อแอป Device Policy ไหม"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "เพื่อปกป้องข้อมูลขององค์กร คุณต้องเชื่อมต่อแอป Device Policy ก่อนลงชื่อเข้าสู่ระบบ"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "เชื่อมต่อ"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..fb22b60 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Oturum aç"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Google ile oturum aç"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "Tamam"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "İptal"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Ayarlar"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Hesapta oturum açılamıyor"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Yöneticiniz, bu hesaba erişmek için bu cihazda bir şifre kodu ayarlamanızı gerektiriyor. Lütfen şifre kodu ayarlayın ve tekrar deneyin."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Bu cihaz, yöneticinizin ayarladığı güvenlik politikasıyla uyumlu değil."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Cihaz Politika Uygulamasına bağlanılsın mı?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Kuruluşunuzun verilerini korumak için, giriş yapmadan önce Cihaz Politikası uygulamasına bağlanmalısınız."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Bağlan"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..8d5b841 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Увійти"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Увійти в обліковий запис Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Скасувати"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Налаштування"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Не вдається ввійти в обліковий запис"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Щоб увійти в обліковий запис, потрібно налаштувати код доступу на пристрої. Зробіть це й повторіть спробу."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Пристрій не відповідає правилу безпеки, яке налаштував адміністратор."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "З’єднатися з додатком Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Щоб захистити дані організації, потрібно з’єднатися з додатком Device Policy, перш ніж увійти."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "З’єднатися"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..11427e0 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "Đăng nhập"; + +/* Long form sign-in button text */ +"Sign in with Google" = "Đăng nhập bằng Google"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "OK"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "Hủy"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "Cài đặt"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "Không thể đăng nhập vào tài khoản"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "Quản trị viên của bạn yêu cầu bạn phải đặt mật mã trên thiết bị này để truy cập vào tài khoản này. Hãy đặt mật mã và thử lại."; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "Thiết bị này không tuân thủ chính sách bảo mật do quản trị viên của bạn thiết lập."; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "Kết nối với ứng dụng Device Policy?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "Để bảo vệ dữ liệu của tổ chức của mình, bạn phải kết nối với ứng dụng Device Policy trước khi đăng nhập."; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "Kết nối"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..5c57160 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "登录"; + +/* Long form sign-in button text */ +"Sign in with Google" = "使用 Google 帐号登录"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "确定"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "取消"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "设置"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "无法登录帐号"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "您的管理员要求您必须先在此设备上设置密码,然后才能访问此帐号。请设置密码并重试。"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "该设备不符合管理员设置的安全政策。"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "要关联 Device Policy 应用吗?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "要保护您组织的数据,您必须在登录前关联 Device Policy 应用。"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "关联"; diff --git a/test/appBinaries/user.app/GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings b/test/appBinaries/user.app/GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings new file mode 100644 index 0000000..a51c525 --- /dev/null +++ b/test/appBinaries/user.app/GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings @@ -0,0 +1,32 @@ +/* Sign-in button text */ +"Sign in" = "登入"; + +/* Long form sign-in button text */ +"Sign in with Google" = "登入 Google 帳戶"; + +/* The text for the button for user to acknowledge and dismiss a dialog. */ +"OK" = "確定"; + +/* The text for the button for user to dismiss a dialog without taking any action. */ +"Cancel" = "取消"; + +/* The name of the iOS native "Settings" app. */ +"SettingsAppName" = "設定"; + +/* The title for the error dialog for unable to sign in because of EMM policy. */ +"EmmErrorTitle" = "無法登入帳戶"; + +/* The text in the error dialog asking user to set up a passcode for the device due to EMM policy. */ +"EmmPasscodeRequired" = "管理員要求您必須為這個裝置設定通行碼,才能存取這個帳戶。請設定通行碼,然後再試一次。"; + +/* The text in the error dialog informing user that EMM policy prevented sign-in on the device. */ +"EmmGeneralError" = "這部裝置不符合您的管理員所設定的安全性政策規定。"; + +/* The title in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectTitle" = "要連結 Device Policy 應用程式嗎?"; + +/* The text in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectText" = "為了保護貴機構的資料,您必須在登入前連結 Device Policy 應用程式。"; + +/* The action button label in the error dialog informing user that connecting with Device Policy app is required. */ +"EmmConnectLabel" = "連結"; diff --git a/test/appBinaries/user.app/GoogleUtilities_Privacy.bundle/Info.plist b/test/appBinaries/user.app/GoogleUtilities_Privacy.bundle/Info.plist new file mode 100644 index 0000000..0c1b5bc Binary files /dev/null and b/test/appBinaries/user.app/GoogleUtilities_Privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/GoogleUtilities_Privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/GoogleUtilities_Privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..1c9e1a6 --- /dev/null +++ b/test/appBinaries/user.app/GoogleUtilities_Privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,34 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + + NSPrivacyCollectedDataTypes + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + C56D.1 + + + + + + diff --git a/test/appBinaries/user.app/Info.plist b/test/appBinaries/user.app/Info.plist new file mode 100644 index 0000000..db4efd4 Binary files /dev/null and b/test/appBinaries/user.app/Info.plist differ diff --git a/test/appBinaries/user.app/PkgInfo b/test/appBinaries/user.app/PkgInfo new file mode 100644 index 0000000..bd04210 --- /dev/null +++ b/test/appBinaries/user.app/PkgInfo @@ -0,0 +1 @@ +APPL???? \ No newline at end of file diff --git a/test/appBinaries/user.app/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..f184652 --- /dev/null +++ b/test/appBinaries/user.app/PrivacyInfo.xcprivacy @@ -0,0 +1,49 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + 0A2A.1 + 3B52.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + C56D.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryDiskSpace + NSPrivacyAccessedAPITypeReasons + + E174.1 + 85F4.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/test/appBinaries/user.app/RCT-Folly_privacy.bundle/Info.plist b/test/appBinaries/user.app/RCT-Folly_privacy.bundle/Info.plist new file mode 100644 index 0000000..8b4064e Binary files /dev/null and b/test/appBinaries/user.app/RCT-Folly_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/RNSVGFilters.bundle/Info.plist b/test/appBinaries/user.app/RNSVGFilters.bundle/Info.plist new file mode 100644 index 0000000..90569c8 Binary files /dev/null and b/test/appBinaries/user.app/RNSVGFilters.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/RNSVGFilters.bundle/RNSVGArithmeticFilter.iphoneos.metallib b/test/appBinaries/user.app/RNSVGFilters.bundle/RNSVGArithmeticFilter.iphoneos.metallib new file mode 100644 index 0000000..47668d1 Binary files /dev/null and b/test/appBinaries/user.app/RNSVGFilters.bundle/RNSVGArithmeticFilter.iphoneos.metallib differ diff --git a/test/appBinaries/user.app/RNSVGFilters.bundle/RNSVGCompositeXor.iphoneos.metallib b/test/appBinaries/user.app/RNSVGFilters.bundle/RNSVGCompositeXor.iphoneos.metallib new file mode 100644 index 0000000..0d0f406 Binary files /dev/null and b/test/appBinaries/user.app/RNSVGFilters.bundle/RNSVGCompositeXor.iphoneos.metallib differ diff --git a/test/appBinaries/user.app/ReachabilitySwift.bundle/Info.plist b/test/appBinaries/user.app/ReachabilitySwift.bundle/Info.plist new file mode 100644 index 0000000..5145da4 Binary files /dev/null and b/test/appBinaries/user.app/ReachabilitySwift.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/ReachabilitySwift.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/ReachabilitySwift.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..cfbe279 --- /dev/null +++ b/test/appBinaries/user.app/ReachabilitySwift.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,8 @@ + + + + + NSPrivacyTracking + + + diff --git a/test/appBinaries/user.app/React-Core_privacy.bundle/Info.plist b/test/appBinaries/user.app/React-Core_privacy.bundle/Info.plist new file mode 100644 index 0000000..6281013 Binary files /dev/null and b/test/appBinaries/user.app/React-Core_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/React-Core_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/React-Core_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..d9d7d19 --- /dev/null +++ b/test/appBinaries/user.app/React-Core_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,29 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/test/appBinaries/user.app/React-cxxreact_privacy.bundle/Info.plist b/test/appBinaries/user.app/React-cxxreact_privacy.bundle/Info.plist new file mode 100644 index 0000000..a3fe2ce Binary files /dev/null and b/test/appBinaries/user.app/React-cxxreact_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..6be0f26 --- /dev/null +++ b/test/appBinaries/user.app/React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,21 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/test/appBinaries/user.app/SDWebImage.bundle/Info.plist b/test/appBinaries/user.app/SDWebImage.bundle/Info.plist new file mode 100644 index 0000000..1f41d4d Binary files /dev/null and b/test/appBinaries/user.app/SDWebImage.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/SDWebImage.bundle/PrivacyInfo.xcprivacy b/test/appBinaries/user.app/SDWebImage.bundle/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..276f761 --- /dev/null +++ b/test/appBinaries/user.app/SDWebImage.bundle/PrivacyInfo.xcprivacy @@ -0,0 +1,23 @@ + + + + + NSPrivacyTracking + + NSPrivacyCollectedDataTypes + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + + diff --git a/test/appBinaries/user.app/SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib b/test/appBinaries/user.app/SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib new file mode 100644 index 0000000..8417215 Binary files /dev/null and b/test/appBinaries/user.app/SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib differ diff --git a/test/appBinaries/user.app/SplashScreen.storyboardc/Info.plist b/test/appBinaries/user.app/SplashScreen.storyboardc/Info.plist new file mode 100644 index 0000000..79f4412 Binary files /dev/null and b/test/appBinaries/user.app/SplashScreen.storyboardc/Info.plist differ diff --git a/test/appBinaries/user.app/SplashScreen.storyboardc/SplashScreenViewController.nib b/test/appBinaries/user.app/SplashScreen.storyboardc/SplashScreenViewController.nib new file mode 100644 index 0000000..eb6f55c Binary files /dev/null and b/test/appBinaries/user.app/SplashScreen.storyboardc/SplashScreenViewController.nib differ diff --git a/test/appBinaries/user.app/_CodeSignature/CodeResources b/test/appBinaries/user.app/_CodeSignature/CodeResources new file mode 100644 index 0000000..14f8021 --- /dev/null +++ b/test/appBinaries/user.app/_CodeSignature/CodeResources @@ -0,0 +1,1791 @@ + + + + + files + + AppAuthCore_Privacy.bundle/Info.plist + + MMDsBP6hdSYQ+aM0n7vZID0NVj8= + + AppAuthCore_Privacy.bundle/PrivacyInfo.xcprivacy + + MCDRptixYfA+qALBX9b4uxq3rwo= + + AppIcon60x60@2x.png + + EQAVkhSkPneAAzA/TC5okiIQCSY= + + AppIcon76x76@2x~ipad.png + + tERi/ybfFIrfA27Agwt+FaZ7lxI= + + Assets.car + + AEZBobR0IrgkOukQGSKh1p3ApLU= + + EXConstants.bundle/Info.plist + + Hlxsc20/U0owoVLTeqzSm5ybNIs= + + EXConstants.bundle/app.config + + gu2+gHdifrBUPqzAXQIYvdydX0g= + + EXUpdates.bundle/Info.plist + + wjdfAxEpgfQFinoWBfIM8p9jaw8= + + Expo.plist + + nD4OmzKel1DrphyqWIqjyzbx31E= + + ExpoApplication_privacy.bundle/Info.plist + + 8BRDaa8J7FLCzhVYdsGF90Fhe6A= + + ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy + + mUc2YHiDtobIhFXi+Mvm12TXeb8= + + ExpoConstants_privacy.bundle/Info.plist + + gHWCze8PybGkM8T+sLc+3tpj/QE= + + ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy + + dHAsEQehwJCS8hMOpBoz7emiNj8= + + ExpoDevice_privacy.bundle/Info.plist + + 6hGpMQ+NbBTY+ghWXzsUw8XJGyM= + + ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy + + hWEgzzi+YPgmddeTqWfAi6jGQ0E= + + ExpoFileSystem_privacy.bundle/Info.plist + + WIOt6Nu0S3BZ/+6OsBQFrMyXaNE= + + ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy + + UieOpg4b1PxYR6jA3/cs9mU9rdo= + + ExpoNotifications_privacy.bundle/Info.plist + + BwASpOTXQeKbJUrAWQFpwRpHkM8= + + ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy + + dHAsEQehwJCS8hMOpBoz7emiNj8= + + ExpoSystemUI_privacy.bundle/Info.plist + + ZY9+IxqDzlo+4baYZWU5AcIgICQ= + + ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy + + dHAsEQehwJCS8hMOpBoz7emiNj8= + + FBLPromises_Privacy.bundle/Info.plist + + ztyhBobmo4oPJ7w3hvsEnTQECDE= + + FBLPromises_Privacy.bundle/PrivacyInfo.xcprivacy + + ZajnvEs/MYRS3X4TPLAhBWi8mc4= + + Frameworks/Razorpay.framework/Info.plist + + m2+OcUVS+NCF/RaQ0NMeexAJIbU= + + Frameworks/Razorpay.framework/Razorpay + + wCcAD+BVHmZyLCiEBtRTiY2MxbQ= + + Frameworks/Razorpay.framework/_CodeSignature/CodeResources + + E3MDTYxmYfAlrvDpjZsMJ6zJcBI= + + Frameworks/RazorpayCore.framework/Info.plist + + IgSq/mUvfi0nncHC2TAKVG0zPwA= + + Frameworks/RazorpayCore.framework/RazorpayCore + + mL4UiHKydfuhBF+vIJxOKz8FC0Y= + + Frameworks/RazorpayCore.framework/_CodeSignature/CodeResources + + Mg2KLhPZgXh3p1KXRuTns7jtDXI= + + Frameworks/RazorpayStandard.framework/Assets.car + + 9EtCg2Ey2Zi4Ua584kuKWTJN01U= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/Info.plist + + DFcy10+V49NKtjJ4RLpByN10P1k= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/objects-11.0+.nib + + zRbA0UPDWTIRE/KMCArksV/vK2k= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/runtime.nib + + zRbA0UPDWTIRE/KMCArksV/vK2k= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/objects-11.0+.nib + + 0nbduMecK7uoslXovJgcjilOIB8= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/runtime.nib + + 0nbduMecK7uoslXovJgcjilOIB8= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/objects-11.0+.nib + + c8N/593lOrAw9wwSo2JSseKACUI= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/runtime.nib + + GAbF07uihY0DE3w15+txJ0RlSNw= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/objects-11.0+.nib + + PcD+CIGNT4GNXBw18IEBAYmUl1A= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/runtime.nib + + 1LYMZo3gzNiKkp3f7Nzh+lgBbPg= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/objects-11.0+.nib + + ENBWg/fxi+P7OShg+NGXd0X+mWQ= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/runtime.nib + + ENBWg/fxi+P7OShg+NGXd0X+mWQ= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/objects-11.0+.nib + + Ia0hGvI0wvIaseYa7wMvQf/q438= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/runtime.nib + + Ia0hGvI0wvIaseYa7wMvQf/q438= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/objects-11.0+.nib + + 09suesko3lo0ihguFnxyvFMqd6g= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/runtime.nib + + 09suesko3lo0ihguFnxyvFMqd6g= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/objects-11.0+.nib + + GuaLaOgcxzpvPP6jj7CE6UW1x54= + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/runtime.nib + + Ucg3HkU3DNFIfnKf6gQlzd/zqTg= + + Frameworks/RazorpayStandard.framework/CommonAssets/Razorpay_Logo.png + + C/QPifs1kjcxzxgwUgDFDlLjpRw= + + Frameworks/RazorpayStandard.framework/CommonAssets/check_mark.png + + 6d4pPz33KoUobYRDPpGmnPiTVMs= + + Frameworks/RazorpayStandard.framework/CommonAssets/warning.png + + gxArEMTCcu4a+ueYNB3oMoIh48o= + + Frameworks/RazorpayStandard.framework/EncryptedOtpelf.js + + A893KbMpygzZy6/G1xrQkAudMxw= + + Frameworks/RazorpayStandard.framework/Hash.txt + + gN8QKnsfFYPlPa6NstmuiJETxJ8= + + Frameworks/RazorpayStandard.framework/Info.plist + + acRXxu68VWw8Pnzhk8Ky6zQaWHE= + + Frameworks/RazorpayStandard.framework/PrivacyInfo.xcprivacy + + 62HpNLqPh8tKsg+iNP/pSbF2S6M= + + Frameworks/RazorpayStandard.framework/RazorpayStandard + + IdGPAM/47JeUvZn9deiVN/6Iv0s= + + Frameworks/RazorpayStandard.framework/_CodeSignature/CodeResources + + +XL7ApglNpkYeb23l63yQ4jQSSc= + + Frameworks/hermes.framework/Info.plist + + 4Hno0Ddszl7pNxmsMdj4eZ8APpg= + + Frameworks/hermes.framework/_CodeSignature/CodeResources + + UltW0Jw9IEI+gE7DBGy5/VsUBrw= + + Frameworks/hermes.framework/hermes + + zNwvRCO4iW9WNlr9JGQIrylk2Ko= + + Freshyo.debug.dylib + + 0wJL2nSLD2iEmJZBS3K8SZ2V60Y= + + GTMAppAuth_Privacy.bundle/Info.plist + + B9CynSkhRTwBcEXmzMf1Sn757Hg= + + GTMAppAuth_Privacy.bundle/PrivacyInfo.xcprivacy + + AL1dh5ctObXBjoBiabSJ86M3HQs= + + GTMSessionFetcher_Core_Privacy.bundle/Info.plist + + rJV8qyXvfTlettGz7pgbgb2SgqY= + + GTMSessionFetcher_Core_Privacy.bundle/PrivacyInfo.xcprivacy + + GqeAMkwbcNQeG0K4qQhQh2vHhHo= + + GoogleSignIn.bundle/Info.plist + + GTjO78FbEPbwvUpuwiVfbjuf7w8= + + GoogleSignIn.bundle/PrivacyInfo.xcprivacy + + Bpn4ciS1QfdDGVc7S27q+o0IUEM= + + GoogleSignIn.bundle/Roboto-Bold.ttf + + RzJ98PNefNfIZFh0iXp0SWl1RK4= + + GoogleSignIn.bundle/ar.lproj/GoogleSignIn.strings + + hash + + 1U4RM14vSknB5uPRHwbBf2P3L9k= + + optional + + + GoogleSignIn.bundle/ca.lproj/GoogleSignIn.strings + + hash + + GWFStbBzSsozR8ndnlnCGWrVgIE= + + optional + + + GoogleSignIn.bundle/cs.lproj/GoogleSignIn.strings + + hash + + rkKd2a1WbhspF12uj7jbNaxdcsw= + + optional + + + GoogleSignIn.bundle/da.lproj/GoogleSignIn.strings + + hash + + CH8u4ji0ph6g0lWmwFmjuWeHjcQ= + + optional + + + GoogleSignIn.bundle/de.lproj/GoogleSignIn.strings + + hash + + h9KGBhz6GBwN3U8va+ZhDVBbEsk= + + optional + + + GoogleSignIn.bundle/el.lproj/GoogleSignIn.strings + + hash + + Sa1DzFvme+rejqFjRGh0R8Wvi2U= + + optional + + + GoogleSignIn.bundle/en.lproj/GoogleSignIn.strings + + hash + + abhi3BU5/ZWaUMKlntWlHWqGpfk= + + optional + + + GoogleSignIn.bundle/en_GB.lproj/GoogleSignIn.strings + + hash + + iMO9o55MsPkZZzMfqxaQRohEIEs= + + optional + + + GoogleSignIn.bundle/es.lproj/GoogleSignIn.strings + + hash + + M6+vCrtORDxDSYRfCs0EQa/NF7E= + + optional + + + GoogleSignIn.bundle/es_MX.lproj/GoogleSignIn.strings + + hash + + rOsbQGNRZKkOBW4HhfQBTWwEQyI= + + optional + + + GoogleSignIn.bundle/fi.lproj/GoogleSignIn.strings + + hash + + gWfyNCqhd30Y2+42oIuL/HWmczg= + + optional + + + GoogleSignIn.bundle/fr.lproj/GoogleSignIn.strings + + hash + + uazilWliTrW6MuAL6umfC/8JA2w= + + optional + + + GoogleSignIn.bundle/fr_CA.lproj/GoogleSignIn.strings + + hash + + Esz3mlwnuaEJRGq9Kux4r37SBuQ= + + optional + + + GoogleSignIn.bundle/google.png + + aRs/zX73YrSGLLTP8EMEDJQGeTs= + + GoogleSignIn.bundle/google@2x.png + + xu0SOLMY2id0HRzRihn0qsuFhAc= + + GoogleSignIn.bundle/google@3x.png + + xbEbn7T4aiYsnIp0S2SVilad3d0= + + GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings + + hash + + ui2oaT67k0R8hevxOaYRPvkBncY= + + optional + + + GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings + + hash + + kZvr7XJerhHMM69PkXbnvBFp03o= + + optional + + + GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings + + hash + + f1AChdyqugygMHLDk8gT3Dci+JI= + + optional + + + GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings + + hash + + BSoNTBIf4kWxwJJhk3j4LqTytTQ= + + optional + + + GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings + + hash + + Frdz7EAjoTfEGLrt45QOxezjzXY= + + optional + + + GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings + + hash + + ip22TOlHApPdL0R4Op+px9lnPt4= + + optional + + + GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings + + hash + + sX0ftdSQz9WqdXlSCYZn0tktc/0= + + optional + + + GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings + + hash + + MXfc9JCBsSmgxmJ3xfMpVntvLfE= + + optional + + + GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings + + hash + + ZjmLydbxaQLSdIBGmX5LQQXMfhQ= + + optional + + + GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings + + hash + + 8kbG/vzCsprxXEBLWQPjsZYsmSM= + + optional + + + GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings + + hash + + /CN7CHAVyaosf4bXVc5GxzC2Zbc= + + optional + + + GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings + + hash + + IBrsi/T3mBKZccejeg+eKu+eLC8= + + optional + + + GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings + + hash + + a2Crth0x+hSdaEGM4YAiNqZxYKg= + + optional + + + GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings + + hash + + a2Crth0x+hSdaEGM4YAiNqZxYKg= + + optional + + + GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings + + hash + + d90ZsiztKcH6gT0M2GNhS9budLg= + + optional + + + GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings + + hash + + wH6Vf08sJ8KKd++qPXetaXtSSEg= + + optional + + + GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings + + hash + + dzPNIKMH551ZsL1tfx25Qj7g2fs= + + optional + + + GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings + + hash + + ltpfHSCCPpO3bQBP56jjt96+d90= + + optional + + + GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings + + hash + + 6zdaseAWNL3CgzM6rhievkeYLBY= + + optional + + + GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings + + hash + + jVVTwNkGABxQFM8h9aPRJ1fS2Pk= + + optional + + + GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings + + hash + + 4d5pvCFyTpDBY/o+3RsxJ8zqLdI= + + optional + + + GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings + + hash + + 7AbLARiohKfq0KKpDOoXJxq3L38= + + optional + + + GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings + + hash + + QTbqZVk6kNI316gFQkdgXuOnQpw= + + optional + + + GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings + + hash + + Sf0rT0s1gLnj2sAnAlTyCH4vbP0= + + optional + + + GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings + + hash + + lC5m5fk6gdtQtz8GphGC/3aPagU= + + optional + + + GoogleUtilities_Privacy.bundle/Info.plist + + HqEHDkN84aKrHgmPsfZz136rBCk= + + GoogleUtilities_Privacy.bundle/PrivacyInfo.xcprivacy + + 9Dge7JFNlx7Vk430tsjNsK3d0Ng= + + Info.plist + + 4FwzPzPDiNyfyKrk9QjFQZ4WLvM= + + PkgInfo + + n57qDP4tZfLD1rCS43W0B4LQjzE= + + PrivacyInfo.xcprivacy + + n3xideFfI0Ngl4cFAYwJums3KBo= + + RCT-Folly_privacy.bundle/Info.plist + + QV6mi/fThThHpU2soqgmADF/NUI= + + RNSVGFilters.bundle/Info.plist + + N/QZ+T1p+q4c422oQNZk4vh2p7k= + + RNSVGFilters.bundle/RNSVGArithmeticFilter.iphoneos.metallib + + +VLexPzHghS5+wGZ2o3Pb4hzkK4= + + RNSVGFilters.bundle/RNSVGCompositeXor.iphoneos.metallib + + uBh9rD7P0EEOLBtlduH9X3cREsM= + + ReachabilitySwift.bundle/Info.plist + + R1f4iy65ziHGDflHUDJ3rYb7QJw= + + ReachabilitySwift.bundle/PrivacyInfo.xcprivacy + + 0RESd+++ZxZWQhIEMSOOvP7phYs= + + React-Core_privacy.bundle/Info.plist + + bwZ/mVvwWYRpCtLUK8MTyiLp/JU= + + React-Core_privacy.bundle/PrivacyInfo.xcprivacy + + ZahcOiTSEcJJdvNh0xqgAKPqbMs= + + React-cxxreact_privacy.bundle/Info.plist + + DHapNtVVUNHS9BKJUN7HbkRj/0E= + + React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy + + dxJQFdQ77efnBkB0VBZmuIamJ4g= + + SDWebImage.bundle/Info.plist + + MiKmS7AM8ulTkag/cANN1izmsx4= + + SDWebImage.bundle/PrivacyInfo.xcprivacy + + PFHYbs0V3eUFDWQyYQcwEetuqEk= + + SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib + + +LtcMiEvVQs2QdoxGRtI33YPCYs= + + SplashScreen.storyboardc/Info.plist + + E68oTK3pecVBbvVw/Td2doSlDiA= + + SplashScreen.storyboardc/SplashScreenViewController.nib + + XO9GpHETPa/KEeOkIqhZoQ6OIvU= + + __preview.dylib + + RgwZ9QPuNGMOsLGsCQ8OENXgbgY= + + boost_privacy.bundle/Info.plist + + V94X3Cp8LSj+pZ/hfbsOD4huj5Q= + + glog_privacy.bundle/Info.plist + + MxuR75ZIsXAD5pxH3nEwX9uafJ0= + + + files2 + + AppAuthCore_Privacy.bundle/Info.plist + + hash2 + + XCH/1qDyZPjv/RjgenQU3TWe6MNYkehVq7O2FaqIweA= + + + AppAuthCore_Privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + Wt6WL6rqHt273QbEz4qHLOxVT2TFWgDgATYATTeOHO0= + + + AppIcon60x60@2x.png + + hash2 + + B4LhvxKM+Dl0yaKyJjJo0i4ihljLPSx7mJaiA1EVlNc= + + + AppIcon76x76@2x~ipad.png + + hash2 + + kuJvlgD9E3ttp1/o2kwRk48Elzw9ZLP7K00kBZ7Ljz0= + + + Assets.car + + hash2 + + I31WvyAqqDAj71Fb1vqIyYtBsNfYlqmP002v5kLMWp8= + + + EXConstants.bundle/Info.plist + + hash2 + + jZG3+Tzakbtg344R3nPmevDrI3G9hqlhuDM+DGKsmHY= + + + EXConstants.bundle/app.config + + hash2 + + y+ymJBSBSVsG9oYznl2AJAutqEJa7t8z7JbTxy+ugpk= + + + EXUpdates.bundle/Info.plist + + hash2 + + TSLIu7uoFgEkmWl6rOkXOLHgeB1Z/nLtqptH/f2Kzds= + + + Expo.plist + + hash2 + + kBYbyLwwA/TcEb1B6fZKAuAPVleaghLO3vFy4+u8Rn8= + + + ExpoApplication_privacy.bundle/Info.plist + + hash2 + + OF6pzmZB+LuE1u+wzImbqZDIJmhoflDtg2sTmrOtGiY= + + + ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + tIdj/9KcutgVElrlbhBzJz5BiuCGED/H3/fvvsFnWqo= + + + ExpoConstants_privacy.bundle/Info.plist + + hash2 + + MGRLpoZ+01WpddRUuE8TLN2RgOiqhzIDZEWy3MA1kNQ= + + + ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + Ky2O23HVHFsfGs5M2yipS68i/d6bvy4r/BfRh/97X0c= + + + ExpoDevice_privacy.bundle/Info.plist + + hash2 + + VW+4r911lj+g2ALGOJp8aFap1Y0t3bccy5wunDzTLDs= + + + ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + 2JioNW3Ie3zSsXkh1opGNtQkBns6dcg7eTX9eXcZycs= + + + ExpoFileSystem_privacy.bundle/Info.plist + + hash2 + + ByWljZT3TE7/EQIJQP/napK+gMwwBFaLiROcsjSHmJk= + + + ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + M7DgdPJz9YimS6VjKQnGqM8fFtuOTNhMaXi9Ii39Zb0= + + + ExpoNotifications_privacy.bundle/Info.plist + + hash2 + + tKJ+YduFArUfPD3zQIGLIPtXagl8rbk4RDDBfsLvJC8= + + + ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + Ky2O23HVHFsfGs5M2yipS68i/d6bvy4r/BfRh/97X0c= + + + ExpoSystemUI_privacy.bundle/Info.plist + + hash2 + + tGD6qrPgcjmHblKSEqq1CRuX18qzPmRBwHGfZltFSCw= + + + ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + Ky2O23HVHFsfGs5M2yipS68i/d6bvy4r/BfRh/97X0c= + + + FBLPromises_Privacy.bundle/Info.plist + + hash2 + + vjrjHLthqlPIFemDbmDUZpVTOJEFsAx/MHm8Tlo7deA= + + + FBLPromises_Privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + dLDNcvwjwe8wLyLuJ1P2GBfNxa8P96fy0GMrUk+4rOo= + + + Frameworks/Razorpay.framework/Info.plist + + hash2 + + wsFEo9G9DLEfTsFONS1IyzmIQnuwQMn2+IjPQ/sGaDU= + + + Frameworks/Razorpay.framework/Razorpay + + hash2 + + vCZkXi8fkCWuoAYOgBjpHMCgVTDB4eIyr6Fr9JCh8/E= + + + Frameworks/Razorpay.framework/_CodeSignature/CodeResources + + hash2 + + Indko2UICKEJAfyY8NjSLl5DJTBBhaHhs7bo2MegTMg= + + + Frameworks/RazorpayCore.framework/Info.plist + + hash2 + + tLxp/3dioDzPR4Pa54kDEwNxiqC6catKl1o+lXil6mM= + + + Frameworks/RazorpayCore.framework/RazorpayCore + + hash2 + + 1+k8h0FiRDrP4o7FjkjinUic2J21vc2Cc9lNZpMuxao= + + + Frameworks/RazorpayCore.framework/_CodeSignature/CodeResources + + hash2 + + FKBOlAIe/8zDrV0SEGCzMlyXFLYcFloNIHXf70gy6RY= + + + Frameworks/RazorpayStandard.framework/Assets.car + + hash2 + + HcTTFmbApmRduIkc+LudaGbZclscDoJ6VJdjQDMk5z8= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/Info.plist + + hash2 + + XV+Km0uI0aCCx6b8FFBL8ctnAUqg/+iH2HKwpDJJDns= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/objects-11.0+.nib + + hash2 + + /FTBuwa4eqDE4oW65Wzg7NRMxsEk6lrbA5gEQvxHMm8= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/MagicXNavController.nib/runtime.nib + + hash2 + + /FTBuwa4eqDE4oW65Wzg7NRMxsEk6lrbA5gEQvxHMm8= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/objects-11.0+.nib + + hash2 + + TB5d1qjY2vLAC2ml/4EBTkBy3xnnLZQe6gxyjAuM7Hs= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/OpinionatedAlertVC.nib/runtime.nib + + hash2 + + TB5d1qjY2vLAC2ml/4EBTkBy3xnnLZQe6gxyjAuM7Hs= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/objects-11.0+.nib + + hash2 + + 9gbR1Bca1fy1VmXM6YTr9iMj/H9FiV5FH80kOSCS5cA= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/QhR-ml-Zo4-view-36U-4g-R9b.nib/runtime.nib + + hash2 + + 0aP4/XYhE9pTrC1von5mej2B5hZzviQdM4PQj/nojlY= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/objects-11.0+.nib + + hash2 + + hg8U6PEGkuQ5LmSJ3QWnXPjAHQ9HR+iYMliJQBqIXsA= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RBq-mH-fUs-view-vI7-59-shd.nib/runtime.nib + + hash2 + + xzfMa2B7p6qD36vy7gfDE7AfItGacEFMLkGs19efnI0= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/objects-11.0+.nib + + hash2 + + 0D+N+GRb1ZrUQlq4dTQIQfubTWQC44SvjHUHVlVbgeg= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayCheckoutVC.nib/runtime.nib + + hash2 + + 0D+N+GRb1ZrUQlq4dTQIQfubTWQC44SvjHUHVlVbgeg= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/objects-11.0+.nib + + hash2 + + l6Hz4xHGp/8dMGEWk8KuCnewyrV7Y1XGhWysBUgItFY= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/RazorpayMagicxVC.nib/runtime.nib + + hash2 + + l6Hz4xHGp/8dMGEWk8KuCnewyrV7Y1XGhWysBUgItFY= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/objects-11.0+.nib + + hash2 + + bzY2zdca4b/GrxTr/LmNprdhD3SyIBsZG1W2z7TVW28= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/UINavigationController-ODs-ga-9IN.nib/runtime.nib + + hash2 + + bzY2zdca4b/GrxTr/LmNprdhD3SyIBsZG1W2z7TVW28= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/objects-11.0+.nib + + hash2 + + I8p2+VocnQu/7nTAHxHwPLoZ9J+et+y957CgfHi+MQo= + + + Frameworks/RazorpayStandard.framework/Checkout.storyboardc/ytB-xX-zk3-view-vP9-Lh-TPB.nib/runtime.nib + + hash2 + + h05YMT+1oAA6um16sH5KVB2c6toLm935YPmV2d/ZDU8= + + + Frameworks/RazorpayStandard.framework/CommonAssets/Razorpay_Logo.png + + hash2 + + udRErjoaEwN536HIEl+2sH6KQ0Q2KzlKwLYCkQlBGKE= + + + Frameworks/RazorpayStandard.framework/CommonAssets/check_mark.png + + hash2 + + s+l4gXoMSGUj0xR2eSdXwQTHoyRU5F4+aTSVjO+I8wU= + + + Frameworks/RazorpayStandard.framework/CommonAssets/warning.png + + hash2 + + S7OOo4xdlAEiEgfkEuic4ap4JZlhvtYIwFSHWu034SA= + + + Frameworks/RazorpayStandard.framework/EncryptedOtpelf.js + + hash2 + + 85Tocsg1aPekBFPeMKMV2IruNGVkOyyV6xlbQkQOH3A= + + + Frameworks/RazorpayStandard.framework/Hash.txt + + hash2 + + B20CsAEe8H45a3Ivw23aBTWNU7qGh1JYKb/iAwwaIEQ= + + + Frameworks/RazorpayStandard.framework/Info.plist + + hash2 + + FfZC9zqHYYEOUl+Q3MxcNvOApcNEda5ezP6/WETXyk4= + + + Frameworks/RazorpayStandard.framework/PrivacyInfo.xcprivacy + + hash2 + + 0GK4q+J5XVD2O8agumlONknk2PSlkzr97y/P84XeCyg= + + + Frameworks/RazorpayStandard.framework/RazorpayStandard + + hash2 + + nIwgs/PNh6GDUAxAzhbpvGvz4Oyd2ejvPx6TAW8Un48= + + + Frameworks/RazorpayStandard.framework/_CodeSignature/CodeResources + + hash2 + + zDX3ulxXCz6aKYfVoSfJ4B22CxdPnGgXw4mpZictVZI= + + + Frameworks/hermes.framework/Info.plist + + hash2 + + JXB+dif18YekowEWiL1F0bJhRmDJCNhC7Yuki1yxMK0= + + + Frameworks/hermes.framework/_CodeSignature/CodeResources + + hash2 + + 1oRx8Mn/IhJGRZOGyHTCY2w0MZ+C71dPBNeLWZ06EJk= + + + Frameworks/hermes.framework/hermes + + hash2 + + 0po9tSLjyYKKx+ArJ1vK4kNtKcwcCF1fCYfIP3UR8M8= + + + Freshyo.debug.dylib + + hash2 + + QWN2aMx84o0g9+dZRTrG4PX7kXPWGQxYGnJxcW2WV0s= + + + GTMAppAuth_Privacy.bundle/Info.plist + + hash2 + + +7QzFGMj4ALmBTsygMDQjde7n6FagDBE5zgiFiyzgV4= + + + GTMAppAuth_Privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + WpuPwM3bECAbtHzCgEs/AExyUUdmItJb/E61TtRuEIQ= + + + GTMSessionFetcher_Core_Privacy.bundle/Info.plist + + hash2 + + NVoq7ETtD09eHmWQth1U3bdRq/mzMUtGMzylcmAPOts= + + + GTMSessionFetcher_Core_Privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + PkqTy+hqzvfdfgY6KMhJmS9Vbn9SytxfN8HosOG1RoY= + + + GoogleSignIn.bundle/Info.plist + + hash2 + + wnHJcujy/UxzBYFM7RwGtQRTci1mpDfHY1BVx9/IaLc= + + + GoogleSignIn.bundle/PrivacyInfo.xcprivacy + + hash2 + + kwCXKFMJb31XDWxKS/cVKjbHmOicTw2B07TGtd+t39A= + + + GoogleSignIn.bundle/Roboto-Bold.ttf + + hash2 + + WU10pJ4we+fMnh7l8QI2hOaCDPEbzJaL7lkDkeGtWlo= + + + GoogleSignIn.bundle/ar.lproj/GoogleSignIn.strings + + hash2 + + ss+ejZ/IrQ+WELPlTvC4tJTwIbf6I6zvYJSyIFq+jHI= + + optional + + + GoogleSignIn.bundle/ca.lproj/GoogleSignIn.strings + + hash2 + + M+iP9QDcPbJGLirJM8EcKJKfrTUfV7Pm1irERhCtYao= + + optional + + + GoogleSignIn.bundle/cs.lproj/GoogleSignIn.strings + + hash2 + + UdoIYkwqed5HyBaDsp6KE0SkeIdWO+JW4ad6Z/a+NUQ= + + optional + + + GoogleSignIn.bundle/da.lproj/GoogleSignIn.strings + + hash2 + + 6CYblkbY6on3v3phpzrtzjD+UfaKqUfsvf6Mx+BNt9o= + + optional + + + GoogleSignIn.bundle/de.lproj/GoogleSignIn.strings + + hash2 + + Fs1BPfGrd+UJ33b4c6Wmh//PNgsfFQdD2TTFqzN3wig= + + optional + + + GoogleSignIn.bundle/el.lproj/GoogleSignIn.strings + + hash2 + + nMDBNJz2Zfx3MzDTGiYo9gCkPKqLXIgLA0pWZ/jw+rw= + + optional + + + GoogleSignIn.bundle/en.lproj/GoogleSignIn.strings + + hash2 + + xyajnDguPxp8H1js9HD4EtomN0n5MNqH98DDqg7GSMI= + + optional + + + GoogleSignIn.bundle/en_GB.lproj/GoogleSignIn.strings + + hash2 + + or14KgUbGgs8Q37Gox6b9/Z3iZWnKswyoOtKY5mtGsI= + + optional + + + GoogleSignIn.bundle/es.lproj/GoogleSignIn.strings + + hash2 + + UB5ExPO7nAWxMpfGAkD9Dhbnn4pj5vslGYII3LlCHKY= + + optional + + + GoogleSignIn.bundle/es_MX.lproj/GoogleSignIn.strings + + hash2 + + hNMnxxl7flSaHp6Ni7PhywLgKCxjI+X7Pd4KRzla9jQ= + + optional + + + GoogleSignIn.bundle/fi.lproj/GoogleSignIn.strings + + hash2 + + DpnzGonq2MwPxyrWq9zISr0m9pkmXu/2GoibNznadzs= + + optional + + + GoogleSignIn.bundle/fr.lproj/GoogleSignIn.strings + + hash2 + + tVE4d6zy15yPDq/3/N5KoWXzq7AWEbYGESYC/UQ3d7o= + + optional + + + GoogleSignIn.bundle/fr_CA.lproj/GoogleSignIn.strings + + hash2 + + 9xCSzz/bp+PgPQ2ZdIN4sRGUfKd6mRgw3dJMOZIrCG4= + + optional + + + GoogleSignIn.bundle/google.png + + hash2 + + KZYAxsP5lgvGgLduEjF901DWOgDsv13keDEb2UPphvY= + + + GoogleSignIn.bundle/google@2x.png + + hash2 + + YIMFDG4vd9yXjg4T1wcAtDC7Vreja1pcgKJzOsZgcqY= + + + GoogleSignIn.bundle/google@3x.png + + hash2 + + VqPZ1AQqGKWVpnftZGTeoQXx6Noy4Hw8XIQErzqqh4w= + + + GoogleSignIn.bundle/he.lproj/GoogleSignIn.strings + + hash2 + + KtB1FmX6YQB2EQfECgjfBJBnQA7X2NP7QuPuxFZ6YLA= + + optional + + + GoogleSignIn.bundle/hi.lproj/GoogleSignIn.strings + + hash2 + + 3UHXJzarX0qX0J3bFMSADuQLm+0jadZPDF/6uWpiRh4= + + optional + + + GoogleSignIn.bundle/hr.lproj/GoogleSignIn.strings + + hash2 + + JA+ymYzp46eWqXkG/G+WClYRwHhNxzsWyukU+u0KW/4= + + optional + + + GoogleSignIn.bundle/hu.lproj/GoogleSignIn.strings + + hash2 + + GoRF+Zxo+7BfNxT4D3DtCIpiNxtbmIXjErRRbwfYnk8= + + optional + + + GoogleSignIn.bundle/id.lproj/GoogleSignIn.strings + + hash2 + + PyRv43MvgTyToElSNlECqWWiJIriTlBPGVMTmFiLK/k= + + optional + + + GoogleSignIn.bundle/it.lproj/GoogleSignIn.strings + + hash2 + + TtxpfPqTYA6LaQTYcihANVBXvLLpxiQmqXzstkL2M8g= + + optional + + + GoogleSignIn.bundle/ja.lproj/GoogleSignIn.strings + + hash2 + + hk3OYj6xqZvup+cqHbkAhhDEA8l1hXBMH3gLIIk4ERQ= + + optional + + + GoogleSignIn.bundle/ko.lproj/GoogleSignIn.strings + + hash2 + + AhqCmUXH5He26Jp82dpoP1opwP/AwBLug5uvUO96wBM= + + optional + + + GoogleSignIn.bundle/ms.lproj/GoogleSignIn.strings + + hash2 + + y2wRSAv0XEuZrBwtz9tnpfgqeZkXomMNT7PpYTV7XJM= + + optional + + + GoogleSignIn.bundle/nb.lproj/GoogleSignIn.strings + + hash2 + + AqDORhPvDCPsPxYdWdXEk+neYmyBsEvpMYChGkLK6rA= + + optional + + + GoogleSignIn.bundle/nl.lproj/GoogleSignIn.strings + + hash2 + + SQUYZcAGQO3tTDWbHoIOEdHxkQVdu0gFkfk5fTerXg0= + + optional + + + GoogleSignIn.bundle/pl.lproj/GoogleSignIn.strings + + hash2 + + zB70RS/MmKy+7SKVC9fwoipXngJaj1DHj9u2AO045V0= + + optional + + + GoogleSignIn.bundle/pt.lproj/GoogleSignIn.strings + + hash2 + + h4m5LhoUwf1F8mYZJzxXPRsQnjz0AOVugKWHC6rrzO4= + + optional + + + GoogleSignIn.bundle/pt_BR.lproj/GoogleSignIn.strings + + hash2 + + h4m5LhoUwf1F8mYZJzxXPRsQnjz0AOVugKWHC6rrzO4= + + optional + + + GoogleSignIn.bundle/pt_PT.lproj/GoogleSignIn.strings + + hash2 + + VgBP67jGl9/ChEtJOy0f2pT31xiBxen0V91QtDRgDpk= + + optional + + + GoogleSignIn.bundle/ro.lproj/GoogleSignIn.strings + + hash2 + + r4dFHw1YRkncNtW9F0rb86p6SQ53QicvL33YbiJi490= + + optional + + + GoogleSignIn.bundle/ru.lproj/GoogleSignIn.strings + + hash2 + + HTeXAqlR7PmIQ9lXCSqMSv7j7v6GamABZD47d3Vdxdw= + + optional + + + GoogleSignIn.bundle/sk.lproj/GoogleSignIn.strings + + hash2 + + P/cihlo8LmENm4TLBV2TYyC4PWbK+iTI64GTaNQdXaw= + + optional + + + GoogleSignIn.bundle/sv.lproj/GoogleSignIn.strings + + hash2 + + EB6TqcbOigHnqGM3qiEvaIEEVBHW5FJwF5/vJhhhQx4= + + optional + + + GoogleSignIn.bundle/th.lproj/GoogleSignIn.strings + + hash2 + + 87AIPzi3JhCduSGnkEqY3kpQF7l4xbCahIDFRHo8T8c= + + optional + + + GoogleSignIn.bundle/tr.lproj/GoogleSignIn.strings + + hash2 + + DUnrVChJprfGiaclYvcgTKdFHOG+K+qtB0NSDZurgNI= + + optional + + + GoogleSignIn.bundle/uk.lproj/GoogleSignIn.strings + + hash2 + + Jhxu6B2f/rMv7vqp4r9JDKbb+lbniEMqlbSjM+LHru8= + + optional + + + GoogleSignIn.bundle/vi.lproj/GoogleSignIn.strings + + hash2 + + XdgQI6jed2yICWt5Lgc2Nmjlld6tS+jlIZu73Yg5j+A= + + optional + + + GoogleSignIn.bundle/zh_CN.lproj/GoogleSignIn.strings + + hash2 + + UnRDQSf3cJY9kq+HAKK4OMrkkbt2CGQtT/KlF/uB1nc= + + optional + + + GoogleSignIn.bundle/zh_TW.lproj/GoogleSignIn.strings + + hash2 + + 8K9LpcAznoYMsbk4Z5+PTNH5EEAbvqGHz7sjmrE7t+U= + + optional + + + GoogleUtilities_Privacy.bundle/Info.plist + + hash2 + + Etc9Ka9jHlKkiOdU4rQm4ncTX2FKxdGvUADnRlXMflQ= + + + GoogleUtilities_Privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + +Btc+PBDZicS7KnpeFdnJkzxkAJf5720l3cpbAaN5Tw= + + + PrivacyInfo.xcprivacy + + hash2 + + Qk5cgskUBuSahIgG5HlBCyGGMwSYrH3gLsC2b7WCNvU= + + + RCT-Folly_privacy.bundle/Info.plist + + hash2 + + 0dcC3Z35ltB1Rk2HWpjCzA4wPFt+2WaTjgv/z5AxE1E= + + + RNSVGFilters.bundle/Info.plist + + hash2 + + 9jpOxY3y8jSIucJzJ+fC3Idaug7W1Btg/C47UxQR4A4= + + + RNSVGFilters.bundle/RNSVGArithmeticFilter.iphoneos.metallib + + hash2 + + aRRl/fIr4pQqkGSCmYRAyw0/aGOTcpNrit0zlcC0Dtk= + + + RNSVGFilters.bundle/RNSVGCompositeXor.iphoneos.metallib + + hash2 + + IjeoZNeITsXaqYQpPXdb5hrqaJk+s2Qqy5e5V5lT//I= + + + ReachabilitySwift.bundle/Info.plist + + hash2 + + a0Ywukh2Qq/wQxGNTeIC7/8oN2YZMvE9YYIecPYUN1M= + + + ReachabilitySwift.bundle/PrivacyInfo.xcprivacy + + hash2 + + pwgfFQbJDo5nMQDlwWHnZbi3piREbiC9S9bvrKgICLg= + + + React-Core_privacy.bundle/Info.plist + + hash2 + + omnNUjXWFudh+cE0TJqsI2YDpTvWTixl77Voxv40Jf4= + + + React-Core_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + fAiWnkWWIabs7AQ8zbkBJlHxhYEZRfdVF8Yj2uLhFic= + + + React-cxxreact_privacy.bundle/Info.plist + + hash2 + + tKBcBEwmtUE9GGaNVVGdsi6/KnlaX4bi1D54dKd5mm4= + + + React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy + + hash2 + + BYfRVcVqb08GR+vGtqC9AmYVzWEO6PIJqXhrealq0zU= + + + SDWebImage.bundle/Info.plist + + hash2 + + ssr4wetNnB+bGHW2na0M24sSv1inTqC0ReqiCMf6fWU= + + + SDWebImage.bundle/PrivacyInfo.xcprivacy + + hash2 + + A7LHCDOjMaKx79Ef8WjtAqjq39Xn0fvzDuzHUJpK6kc= + + + SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib + + hash2 + + X+tAJBYf6l0fu6OOgc8+aot/0jOHh5N+R9T2CA7fpzw= + + + SplashScreen.storyboardc/Info.plist + + hash2 + + dNvO7WzwpeXGmDR5MyjJeD7Ksd5ILUlU4lfKITK3Q68= + + + SplashScreen.storyboardc/SplashScreenViewController.nib + + hash2 + + nBo0wSHSJHlAjPDqrLNJFUjO0WZVeZuuO19/I4AxS6g= + + + __preview.dylib + + hash2 + + UbBGRjm1oDTKLqt93m151cuAV0REsMWG8e/99ttskOw= + + + boost_privacy.bundle/Info.plist + + hash2 + + ewhZPFvqBmGCXr9cyPcgBgi1XfwdibD9dwEvGqRXAFc= + + + glog_privacy.bundle/Info.plist + + hash2 + + ppv2/Di+oXBAtgOAUjnelHqDc6Xxh7Ki3j5KlqckbEY= + + + + rules + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/test/appBinaries/user.app/__preview.dylib b/test/appBinaries/user.app/__preview.dylib new file mode 100755 index 0000000..a1510fd Binary files /dev/null and b/test/appBinaries/user.app/__preview.dylib differ diff --git a/test/appBinaries/user.app/boost_privacy.bundle/Info.plist b/test/appBinaries/user.app/boost_privacy.bundle/Info.plist new file mode 100644 index 0000000..e84af22 Binary files /dev/null and b/test/appBinaries/user.app/boost_privacy.bundle/Info.plist differ diff --git a/test/appBinaries/user.app/glog_privacy.bundle/Info.plist b/test/appBinaries/user.app/glog_privacy.bundle/Info.plist new file mode 100644 index 0000000..4e89bea Binary files /dev/null and b/test/appBinaries/user.app/glog_privacy.bundle/Info.plist differ diff --git a/test/bun.lock b/test/bun.lock new file mode 100644 index 0000000..27930c4 --- /dev/null +++ b/test/bun.lock @@ -0,0 +1,888 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "test", + "dependencies": { + "detox": "^20.47.0", + "jest": "^30.3.0", + }, + "devDependencies": { + "@types/bun": "latest", + "@types/detox": "^18.1.3", + "@types/jest": "^30.0.0", + "ts-jest": "^29.4.6", + }, + "peerDependencies": { + "typescript": "^5", + }, + }, + }, + "packages": { + "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], + + "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="], + + "@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="], + + "@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="], + + "@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="], + + "@babel/plugin-syntax-async-generators": ["@babel/plugin-syntax-async-generators@7.8.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="], + + "@babel/plugin-syntax-bigint": ["@babel/plugin-syntax-bigint@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg=="], + + "@babel/plugin-syntax-class-properties": ["@babel/plugin-syntax-class-properties@7.12.13", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA=="], + + "@babel/plugin-syntax-class-static-block": ["@babel/plugin-syntax-class-static-block@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw=="], + + "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw=="], + + "@babel/plugin-syntax-import-meta": ["@babel/plugin-syntax-import-meta@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="], + + "@babel/plugin-syntax-json-strings": ["@babel/plugin-syntax-json-strings@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="], + + "@babel/plugin-syntax-logical-assignment-operators": ["@babel/plugin-syntax-logical-assignment-operators@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="], + + "@babel/plugin-syntax-nullish-coalescing-operator": ["@babel/plugin-syntax-nullish-coalescing-operator@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="], + + "@babel/plugin-syntax-numeric-separator": ["@babel/plugin-syntax-numeric-separator@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug=="], + + "@babel/plugin-syntax-object-rest-spread": ["@babel/plugin-syntax-object-rest-spread@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA=="], + + "@babel/plugin-syntax-optional-catch-binding": ["@babel/plugin-syntax-optional-catch-binding@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q=="], + + "@babel/plugin-syntax-optional-chaining": ["@babel/plugin-syntax-optional-chaining@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="], + + "@babel/plugin-syntax-private-property-in-object": ["@babel/plugin-syntax-private-property-in-object@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg=="], + + "@babel/plugin-syntax-top-level-await": ["@babel/plugin-syntax-top-level-await@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A=="], + + "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], + + "@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], + + "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + + "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="], + + "@colors/colors": ["@colors/colors@1.6.0", "", {}, "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA=="], + + "@dabh/diagnostics": ["@dabh/diagnostics@2.0.8", "", { "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", "kuler": "^2.0.0" } }, "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q=="], + + "@emnapi/core": ["@emnapi/core@1.9.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" } }, "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg=="], + + "@flatten-js/interval-tree": ["@flatten-js/interval-tree@1.1.4", "", {}, "sha512-o4emRDDvGdkwX18BSVSXH8q27qAL7Z2WDHSN75C8xyRSE4A8UOkig0mWSGoT5M5KaTHZxoLmalFwOTQmbRusUg=="], + + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@istanbuljs/load-nyc-config": ["@istanbuljs/load-nyc-config@1.1.0", "", { "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } }, "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="], + + "@istanbuljs/schema": ["@istanbuljs/schema@0.1.3", "", {}, "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="], + + "@jest/console": ["@jest/console@30.3.0", "", { "dependencies": { "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "jest-message-util": "30.3.0", "jest-util": "30.3.0", "slash": "^3.0.0" } }, "sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww=="], + + "@jest/core": ["@jest/core@30.3.0", "", { "dependencies": { "@jest/console": "30.3.0", "@jest/pattern": "30.0.1", "@jest/reporters": "30.3.0", "@jest/test-result": "30.3.0", "@jest/transform": "30.3.0", "@jest/types": "30.3.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "ci-info": "^4.2.0", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", "jest-changed-files": "30.3.0", "jest-config": "30.3.0", "jest-haste-map": "30.3.0", "jest-message-util": "30.3.0", "jest-regex-util": "30.0.1", "jest-resolve": "30.3.0", "jest-resolve-dependencies": "30.3.0", "jest-runner": "30.3.0", "jest-runtime": "30.3.0", "jest-snapshot": "30.3.0", "jest-util": "30.3.0", "jest-validate": "30.3.0", "jest-watcher": "30.3.0", "pretty-format": "30.3.0", "slash": "^3.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw=="], + + "@jest/diff-sequences": ["@jest/diff-sequences@30.3.0", "", {}, "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA=="], + + "@jest/environment": ["@jest/environment@30.3.0", "", { "dependencies": { "@jest/fake-timers": "30.3.0", "@jest/types": "30.3.0", "@types/node": "*", "jest-mock": "30.3.0" } }, "sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw=="], + + "@jest/expect": ["@jest/expect@30.3.0", "", { "dependencies": { "expect": "30.3.0", "jest-snapshot": "30.3.0" } }, "sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg=="], + + "@jest/expect-utils": ["@jest/expect-utils@30.3.0", "", { "dependencies": { "@jest/get-type": "30.1.0" } }, "sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA=="], + + "@jest/fake-timers": ["@jest/fake-timers@30.3.0", "", { "dependencies": { "@jest/types": "30.3.0", "@sinonjs/fake-timers": "^15.0.0", "@types/node": "*", "jest-message-util": "30.3.0", "jest-mock": "30.3.0", "jest-util": "30.3.0" } }, "sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ=="], + + "@jest/get-type": ["@jest/get-type@30.1.0", "", {}, "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA=="], + + "@jest/globals": ["@jest/globals@30.3.0", "", { "dependencies": { "@jest/environment": "30.3.0", "@jest/expect": "30.3.0", "@jest/types": "30.3.0", "jest-mock": "30.3.0" } }, "sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA=="], + + "@jest/pattern": ["@jest/pattern@30.0.1", "", { "dependencies": { "@types/node": "*", "jest-regex-util": "30.0.1" } }, "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA=="], + + "@jest/reporters": ["@jest/reporters@30.3.0", "", { "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "30.3.0", "@jest/test-result": "30.3.0", "@jest/transform": "30.3.0", "@jest/types": "30.3.0", "@jridgewell/trace-mapping": "^0.3.25", "@types/node": "*", "chalk": "^4.1.2", "collect-v8-coverage": "^1.0.2", "exit-x": "^0.2.2", "glob": "^10.5.0", "graceful-fs": "^4.2.11", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^5.0.0", "istanbul-reports": "^3.1.3", "jest-message-util": "30.3.0", "jest-util": "30.3.0", "jest-worker": "30.3.0", "slash": "^3.0.0", "string-length": "^4.0.2", "v8-to-istanbul": "^9.0.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw=="], + + "@jest/schemas": ["@jest/schemas@30.0.5", "", { "dependencies": { "@sinclair/typebox": "^0.34.0" } }, "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA=="], + + "@jest/snapshot-utils": ["@jest/snapshot-utils@30.3.0", "", { "dependencies": { "@jest/types": "30.3.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "natural-compare": "^1.4.0" } }, "sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g=="], + + "@jest/source-map": ["@jest/source-map@30.0.1", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "callsites": "^3.1.0", "graceful-fs": "^4.2.11" } }, "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg=="], + + "@jest/test-result": ["@jest/test-result@30.3.0", "", { "dependencies": { "@jest/console": "30.3.0", "@jest/types": "30.3.0", "@types/istanbul-lib-coverage": "^2.0.6", "collect-v8-coverage": "^1.0.2" } }, "sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ=="], + + "@jest/test-sequencer": ["@jest/test-sequencer@30.3.0", "", { "dependencies": { "@jest/test-result": "30.3.0", "graceful-fs": "^4.2.11", "jest-haste-map": "30.3.0", "slash": "^3.0.0" } }, "sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA=="], + + "@jest/transform": ["@jest/transform@30.3.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@jest/types": "30.3.0", "@jridgewell/trace-mapping": "^0.3.25", "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", "jest-haste-map": "30.3.0", "jest-regex-util": "30.0.1", "jest-util": "30.3.0", "pirates": "^4.0.7", "slash": "^3.0.0", "write-file-atomic": "^5.0.1" } }, "sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A=="], + + "@jest/types": ["@jest/types@30.3.0", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@pkgr/core": ["@pkgr/core@0.2.9", "", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="], + + "@sinclair/typebox": ["@sinclair/typebox@0.34.48", "", {}, "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA=="], + + "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "@sinonjs/fake-timers": ["@sinonjs/fake-timers@15.1.1", "", { "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw=="], + + "@so-ric/colorspace": ["@so-ric/colorspace@1.1.6", "", { "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" } }, "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], + + "@types/bun": ["@types/bun@1.3.10", "", { "dependencies": { "bun-types": "1.3.10" } }, "sha512-0+rlrUrOrTSskibryHbvQkDOWRJwJZqZlxrUs1u4oOoTln8+WIXBPmAuCF35SWB2z4Zl3E84Nl/D0P7803nigQ=="], + + "@types/detox": ["@types/detox@18.1.3", "", { "dependencies": { "detox": "*" } }, "sha512-4AjvhBQBzwUr5gn4SXQihobEM1oKrNkkj8e3zFOTNAe8r2BNdUtH2rFfdR3VxDm0z+1ga7pN7Q/P/S5jrxRU3A=="], + + "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], + + "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], + + "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], + + "@types/jest": ["@types/jest@30.0.0", "", { "dependencies": { "expect": "^30.0.0", "pretty-format": "^30.0.0" } }, "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA=="], + + "@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="], + + "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], + + "@types/triple-beam": ["@types/triple-beam@1.3.5", "", {}, "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw=="], + + "@types/yargs": ["@types/yargs@17.0.35", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg=="], + + "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.11.1", "", { "os": "android", "cpu": "arm" }, "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw=="], + + "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.11.1", "", { "os": "android", "cpu": "arm64" }, "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g=="], + + "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.11.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g=="], + + "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.11.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ=="], + + "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.11.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw=="], + + "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw=="], + + "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw=="], + + "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ=="], + + "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w=="], + + "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.11.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA=="], + + "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ=="], + + "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew=="], + + "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.11.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg=="], + + "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w=="], + + "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA=="], + + "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.11.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ=="], + + "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.11.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw=="], + + "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.11.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ=="], + + "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.11.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g=="], + + "@wix-pilot/core": ["@wix-pilot/core@3.4.2", "", { "dependencies": { "chalk": "^4.1.0", "pngjs": "^7.0.0", "winston": "^3.17.0" }, "peerDependencies": { "expect": "*" }, "optionalPeers": ["expect"] }, "sha512-O8V2NLfPEKI2IviJXG4g/vNbMfsBZNBhzAKFUOOaOR9TTDUJYlZUttqjhjP/fPnaDky0/hrfGES15sO0N7zEkw=="], + + "@wix-pilot/detox": ["@wix-pilot/detox@1.0.13", "", { "peerDependencies": { "@wix-pilot/core": "^3.4.1", "detox": ">=20.33.0", "expect": "29.x.x || 28.x.x || ^27.2.5" } }, "sha512-/34lM25AfmHNMLOeEIhfKVnx2YZyn5VHC/R4Bs1uXQ2B+Yg0JbxAfvfXA3xqxBsdYqrYImILPO3Ih0c5UzoNxw=="], + + "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + + "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + + "babel-jest": ["babel-jest@30.3.0", "", { "dependencies": { "@jest/transform": "30.3.0", "@types/babel__core": "^7.20.5", "babel-plugin-istanbul": "^7.0.1", "babel-preset-jest": "30.3.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.11.0 || ^8.0.0-0" } }, "sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ=="], + + "babel-plugin-istanbul": ["babel-plugin-istanbul@7.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" } }, "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA=="], + + "babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@30.3.0", "", { "dependencies": { "@types/babel__core": "^7.20.5" } }, "sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg=="], + + "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.2.0", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg=="], + + "babel-preset-jest": ["babel-preset-jest@30.3.0", "", { "dependencies": { "babel-plugin-jest-hoist": "30.3.0", "babel-preset-current-node-syntax": "^1.2.0" }, "peerDependencies": { "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, "sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.8", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ=="], + + "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="], + + "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "browser-process-hrtime": ["browser-process-hrtime@1.0.0", "", {}, "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="], + + "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], + + "bs-logger": ["bs-logger@0.2.6", "", { "dependencies": { "fast-json-stable-stringify": "2.x" } }, "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog=="], + + "bser": ["bser@2.1.1", "", { "dependencies": { "node-int64": "^0.4.0" } }, "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="], + + "bunyamin": ["bunyamin@1.6.3", "", { "dependencies": { "@flatten-js/interval-tree": "^1.1.2", "multi-sort-stream": "^1.0.4", "stream-json": "^1.7.5", "trace-event-lib": "^1.3.1" }, "peerDependencies": { "@types/bunyan": "^1.8.8", "bunyan": "^1.8.15 || ^2.0.0" }, "optionalPeers": ["@types/bunyan", "bunyan"] }, "sha512-m1hAijFhu8pFiidsVc0XEDic46uxPK+mKNLqkb5mluNx0nTolNzx/DjwMqHChQWCgfOLMjKYJJ2uPTQLE6t4Ng=="], + + "bunyan": ["bunyan@1.8.15", "", { "optionalDependencies": { "dtrace-provider": "~0.8", "moment": "^2.19.3", "mv": "~2", "safe-json-stringify": "~1" }, "bin": { "bunyan": "bin/bunyan" } }, "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig=="], + + "bunyan-debug-stream": ["bunyan-debug-stream@3.1.1", "", { "dependencies": { "chalk": "^4.1.2" }, "peerDependencies": { "bunyan": "*" }, "optionalPeers": ["bunyan"] }, "sha512-LfMcz4yKM6s9BP5dfT63Prb5B2hAjReLAfQzLbNQF7qBHtn3P1v+/yn0SZ6UAr4PC3VZRX/QzK7HYkkY0ytokQ=="], + + "caf": ["caf@15.0.1", "", {}, "sha512-Xp/IK6vMwujxWZXra7djdYzPdPnEQKa7Mudu2wZgDQ3TJry1I0TgtjEgwZHpoBcMp68j4fb0/FZ1SJyMEgJrXQ=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001779", "", {}, "sha512-U5og2PN7V4DMgF50YPNtnZJGWVLFjjsN3zb6uMT5VGYIewieDj1upwfuVNXf4Kor+89c3iCRJnSzMD5LmTvsfA=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "char-regex": ["char-regex@1.0.2", "", {}, "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="], + + "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="], + + "cjs-module-lexer": ["cjs-module-lexer@2.2.0", "", {}, "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "co": ["co@4.6.0", "", {}, "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ=="], + + "collect-v8-coverage": ["collect-v8-coverage@1.0.3", "", {}, "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw=="], + + "color": ["color@5.0.3", "", { "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" } }, "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "color-string": ["color-string@2.1.4", "", { "dependencies": { "color-name": "^2.0.0" } }, "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decamelize": ["decamelize@4.0.0", "", {}, "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ=="], + + "dedent": ["dedent@1.7.2", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "detect-newline": ["detect-newline@3.1.0", "", {}, "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA=="], + + "detox": ["detox@20.47.0", "", { "dependencies": { "@wix-pilot/core": "^3.4.2", "@wix-pilot/detox": "^1.0.13", "ajv": "^8.6.3", "bunyan": "^1.8.12", "bunyan-debug-stream": "^3.1.0", "caf": "^15.0.1", "chalk": "^4.0.0", "execa": "^5.1.1", "find-up": "^5.0.0", "fs-extra": "^11.0.0", "funpermaproxy": "^1.1.0", "glob": "^8.0.3", "ini": "^1.3.4", "jest-environment-emit": "^1.2.0", "json-cycle": "^1.3.0", "lodash": "^4.17.11", "multi-sort-stream": "^1.0.3", "multipipe": "^4.0.0", "node-ipc": "9.2.1", "promisify-child-process": "^4.1.2", "proper-lockfile": "^3.0.2", "resolve-from": "^5.0.0", "sanitize-filename": "^1.6.1", "semver": "^7.0.0", "serialize-error": "^8.0.1", "shell-quote": "^1.7.2", "signal-exit": "^3.0.3", "stream-json": "^1.7.4", "strip-ansi": "^6.0.1", "telnet-client": "1.2.8", "tmp": "^0.2.1", "trace-event-lib": "^1.3.1", "which": "^1.3.1", "ws": "^7.0.0", "yargs": "^17.0.0", "yargs-parser": "^21.0.0", "yargs-unparser": "^2.0.0" }, "peerDependencies": { "jest": "30.x.x || 29.x.x || 28.x.x || ^27.2.5" }, "optionalPeers": ["jest"], "bin": { "detox": "local-cli/cli.js" } }, "sha512-Jpk296Ct006MnemKQP25X1q4fQ3G6rwSX+f0BqC5Py7qKdJ9cRh4H39D1GIIV56UJ/nJEI5IAgg7jrSPjCT9sA=="], + + "dtrace-provider": ["dtrace-provider@0.8.8", "", { "dependencies": { "nan": "^2.14.0" } }, "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg=="], + + "duplexer2": ["duplexer2@0.1.4", "", { "dependencies": { "readable-stream": "^2.0.2" } }, "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "easy-stack": ["easy-stack@1.0.1", "", {}, "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.313", "", {}, "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA=="], + + "emittery": ["emittery@0.13.1", "", {}, "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "enabled": ["enabled@2.0.0", "", {}, "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="], + + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "event-pubsub": ["event-pubsub@4.3.0", "", {}, "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ=="], + + "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + + "exeunt": ["exeunt@1.1.0", "", {}, "sha512-dd++Yn/0Fp+gtJ04YHov7MeAii+LFivJc6KqnJNfplzLVUkUDrfKoQDTLlCgzcW15vY5hKlHasWeIsQJ8agHsw=="], + + "exit-x": ["exit-x@0.2.2", "", {}, "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ=="], + + "expect": ["expect@30.3.0", "", { "dependencies": { "@jest/expect-utils": "30.3.0", "@jest/get-type": "30.1.0", "jest-matcher-utils": "30.3.0", "jest-message-util": "30.3.0", "jest-mock": "30.3.0", "jest-util": "30.3.0" } }, "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], + + "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], + + "fecha": ["fecha@4.2.3", "", {}, "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat": ["flat@5.0.2", "", { "bin": { "flat": "cli.js" } }, "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="], + + "fn.name": ["fn.name@1.1.0", "", {}, "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="], + + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "fs-extra": ["fs-extra@11.3.4", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "funpermaproxy": ["funpermaproxy@1.1.0", "", {}, "sha512-2Sp1hWuO8m5fqeFDusyhKqYPT+7rGLw34N3qonDcdRP8+n7M7Gl/yKp/q7oCxnnJ6pWCectOmLFJpsMU/++KrQ=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-package-type": ["get-package-type@0.1.0", "", {}, "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="], + + "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "handlebars": ["handlebars@4.7.8", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], + + "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], + + "import-local": ["import-local@3.2.0", "", { "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" } }, "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-generator-fn": ["is-generator-fn@2.1.0", "", {}, "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="], + + "is-plain-obj": ["is-plain-obj@2.1.0", "", {}, "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="], + + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], + + "istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], + + "istanbul-lib-report": ["istanbul-lib-report@3.0.1", "", { "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw=="], + + "istanbul-lib-source-maps": ["istanbul-lib-source-maps@5.0.6", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0" } }, "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A=="], + + "istanbul-reports": ["istanbul-reports@3.2.0", "", { "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA=="], + + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "jest": ["jest@30.3.0", "", { "dependencies": { "@jest/core": "30.3.0", "@jest/types": "30.3.0", "import-local": "^3.2.0", "jest-cli": "30.3.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": "./bin/jest.js" }, "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg=="], + + "jest-changed-files": ["jest-changed-files@30.3.0", "", { "dependencies": { "execa": "^5.1.1", "jest-util": "30.3.0", "p-limit": "^3.1.0" } }, "sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA=="], + + "jest-circus": ["jest-circus@30.3.0", "", { "dependencies": { "@jest/environment": "30.3.0", "@jest/expect": "30.3.0", "@jest/test-result": "30.3.0", "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "co": "^4.6.0", "dedent": "^1.6.0", "is-generator-fn": "^2.1.0", "jest-each": "30.3.0", "jest-matcher-utils": "30.3.0", "jest-message-util": "30.3.0", "jest-runtime": "30.3.0", "jest-snapshot": "30.3.0", "jest-util": "30.3.0", "p-limit": "^3.1.0", "pretty-format": "30.3.0", "pure-rand": "^7.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA=="], + + "jest-cli": ["jest-cli@30.3.0", "", { "dependencies": { "@jest/core": "30.3.0", "@jest/test-result": "30.3.0", "@jest/types": "30.3.0", "chalk": "^4.1.2", "exit-x": "^0.2.2", "import-local": "^3.2.0", "jest-config": "30.3.0", "jest-util": "30.3.0", "jest-validate": "30.3.0", "yargs": "^17.7.2" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "./bin/jest.js" } }, "sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw=="], + + "jest-config": ["jest-config@30.3.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@jest/get-type": "30.1.0", "@jest/pattern": "30.0.1", "@jest/test-sequencer": "30.3.0", "@jest/types": "30.3.0", "babel-jest": "30.3.0", "chalk": "^4.1.2", "ci-info": "^4.2.0", "deepmerge": "^4.3.1", "glob": "^10.5.0", "graceful-fs": "^4.2.11", "jest-circus": "30.3.0", "jest-docblock": "30.2.0", "jest-environment-node": "30.3.0", "jest-regex-util": "30.0.1", "jest-resolve": "30.3.0", "jest-runner": "30.3.0", "jest-util": "30.3.0", "jest-validate": "30.3.0", "parse-json": "^5.2.0", "pretty-format": "30.3.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "peerDependencies": { "@types/node": "*", "esbuild-register": ">=3.4.0", "ts-node": ">=9.0.0" }, "optionalPeers": ["@types/node", "esbuild-register", "ts-node"] }, "sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w=="], + + "jest-diff": ["jest-diff@30.3.0", "", { "dependencies": { "@jest/diff-sequences": "30.3.0", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "pretty-format": "30.3.0" } }, "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ=="], + + "jest-docblock": ["jest-docblock@30.2.0", "", { "dependencies": { "detect-newline": "^3.1.0" } }, "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA=="], + + "jest-each": ["jest-each@30.3.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "@jest/types": "30.3.0", "chalk": "^4.1.2", "jest-util": "30.3.0", "pretty-format": "30.3.0" } }, "sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA=="], + + "jest-environment-emit": ["jest-environment-emit@1.2.0", "", { "dependencies": { "bunyamin": "^1.5.2", "bunyan": "^2.0.5", "bunyan-debug-stream": "^3.1.0", "funpermaproxy": "^1.1.0", "lodash.merge": "^4.6.2", "node-ipc": "9.2.1", "strip-ansi": "^6.0.0", "tslib": "^2.5.3" }, "peerDependencies": { "@jest/environment": ">=27.2.5", "@jest/types": ">=27.2.5", "jest": ">=27.2.5", "jest-environment-jsdom": ">=27.2.5", "jest-environment-node": ">=27.2.5" }, "optionalPeers": ["@jest/environment", "@jest/types", "jest", "jest-environment-jsdom", "jest-environment-node"] }, "sha512-dSFBrRuIiWbHK2LSUA6CutXpMcNGjjuhvxFLF+TVz5tYFAAH0eesrZgrQ3UtOptajDYNt/fIGRqtlHqGq/bLbA=="], + + "jest-environment-node": ["jest-environment-node@30.3.0", "", { "dependencies": { "@jest/environment": "30.3.0", "@jest/fake-timers": "30.3.0", "@jest/types": "30.3.0", "@types/node": "*", "jest-mock": "30.3.0", "jest-util": "30.3.0", "jest-validate": "30.3.0" } }, "sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ=="], + + "jest-haste-map": ["jest-haste-map@30.3.0", "", { "dependencies": { "@jest/types": "30.3.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", "jest-util": "30.3.0", "jest-worker": "30.3.0", "picomatch": "^4.0.3", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.3" } }, "sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA=="], + + "jest-leak-detector": ["jest-leak-detector@30.3.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "pretty-format": "30.3.0" } }, "sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ=="], + + "jest-matcher-utils": ["jest-matcher-utils@30.3.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "jest-diff": "30.3.0", "pretty-format": "30.3.0" } }, "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA=="], + + "jest-message-util": ["jest-message-util@30.3.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.3.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "picomatch": "^4.0.3", "pretty-format": "30.3.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw=="], + + "jest-mock": ["jest-mock@30.3.0", "", { "dependencies": { "@jest/types": "30.3.0", "@types/node": "*", "jest-util": "30.3.0" } }, "sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog=="], + + "jest-pnp-resolver": ["jest-pnp-resolver@1.2.3", "", { "peerDependencies": { "jest-resolve": "*" }, "optionalPeers": ["jest-resolve"] }, "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w=="], + + "jest-regex-util": ["jest-regex-util@30.0.1", "", {}, "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA=="], + + "jest-resolve": ["jest-resolve@30.3.0", "", { "dependencies": { "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "jest-haste-map": "30.3.0", "jest-pnp-resolver": "^1.2.3", "jest-util": "30.3.0", "jest-validate": "30.3.0", "slash": "^3.0.0", "unrs-resolver": "^1.7.11" } }, "sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g=="], + + "jest-resolve-dependencies": ["jest-resolve-dependencies@30.3.0", "", { "dependencies": { "jest-regex-util": "30.0.1", "jest-snapshot": "30.3.0" } }, "sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw=="], + + "jest-runner": ["jest-runner@30.3.0", "", { "dependencies": { "@jest/console": "30.3.0", "@jest/environment": "30.3.0", "@jest/test-result": "30.3.0", "@jest/transform": "30.3.0", "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "emittery": "^0.13.1", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", "jest-docblock": "30.2.0", "jest-environment-node": "30.3.0", "jest-haste-map": "30.3.0", "jest-leak-detector": "30.3.0", "jest-message-util": "30.3.0", "jest-resolve": "30.3.0", "jest-runtime": "30.3.0", "jest-util": "30.3.0", "jest-watcher": "30.3.0", "jest-worker": "30.3.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" } }, "sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw=="], + + "jest-runtime": ["jest-runtime@30.3.0", "", { "dependencies": { "@jest/environment": "30.3.0", "@jest/fake-timers": "30.3.0", "@jest/globals": "30.3.0", "@jest/source-map": "30.0.1", "@jest/test-result": "30.3.0", "@jest/transform": "30.3.0", "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "cjs-module-lexer": "^2.1.0", "collect-v8-coverage": "^1.0.2", "glob": "^10.5.0", "graceful-fs": "^4.2.11", "jest-haste-map": "30.3.0", "jest-message-util": "30.3.0", "jest-mock": "30.3.0", "jest-regex-util": "30.0.1", "jest-resolve": "30.3.0", "jest-snapshot": "30.3.0", "jest-util": "30.3.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng=="], + + "jest-snapshot": ["jest-snapshot@30.3.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", "@jest/expect-utils": "30.3.0", "@jest/get-type": "30.1.0", "@jest/snapshot-utils": "30.3.0", "@jest/transform": "30.3.0", "@jest/types": "30.3.0", "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", "expect": "30.3.0", "graceful-fs": "^4.2.11", "jest-diff": "30.3.0", "jest-matcher-utils": "30.3.0", "jest-message-util": "30.3.0", "jest-util": "30.3.0", "pretty-format": "30.3.0", "semver": "^7.7.2", "synckit": "^0.11.8" } }, "sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ=="], + + "jest-util": ["jest-util@30.3.0", "", { "dependencies": { "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", "picomatch": "^4.0.3" } }, "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg=="], + + "jest-validate": ["jest-validate@30.3.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "@jest/types": "30.3.0", "camelcase": "^6.3.0", "chalk": "^4.1.2", "leven": "^3.1.0", "pretty-format": "30.3.0" } }, "sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q=="], + + "jest-watcher": ["jest-watcher@30.3.0", "", { "dependencies": { "@jest/test-result": "30.3.0", "@jest/types": "30.3.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "emittery": "^0.13.1", "jest-util": "30.3.0", "string-length": "^4.0.2" } }, "sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w=="], + + "jest-worker": ["jest-worker@30.3.0", "", { "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", "jest-util": "30.3.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" } }, "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ=="], + + "js-message": ["js-message@1.0.7", "", {}, "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA=="], + + "js-queue": ["js-queue@2.0.2", "", { "dependencies": { "easy-stack": "^1.0.1" } }, "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-cycle": ["json-cycle@1.5.0", "", {}, "sha512-GOehvd5PO2FeZ5T4c+RxobeT5a1PiGpF4u9/3+UvrMU4bhnVqzJY7hm39wg8PDCqkU91fWGH8qjWR4bn+wgq9w=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + + "kuler": ["kuler@2.0.0", "", {}, "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="], + + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], + + "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "logform": ["logform@2.7.0", "", { "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", "fecha": "^4.2.0", "ms": "^2.1.1", "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" } }, "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ=="], + + "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="], + + "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], + + "makeerror": ["makeerror@1.0.12", "", { "dependencies": { "tmpl": "1.0.5" } }, "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + + "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], + + "moment": ["moment@2.30.1", "", {}, "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "multi-sort-stream": ["multi-sort-stream@1.0.4", "", {}, "sha512-hAZ8JOEQFbgdLe8HWZbb7gdZg0/yAIHF00Qfo3kd0rXFv96nXe+/bPTrKHZ2QMHugGX4FiAyET1Lt+jiB+7Qlg=="], + + "multipipe": ["multipipe@4.0.0", "", { "dependencies": { "duplexer2": "^0.1.2", "object-assign": "^4.1.0" } }, "sha512-jzcEAzFXoWwWwUbvHCNPwBlTz3WCWe/jPcXSmTfbo/VjRwRTfvLZ/bdvtiTdqCe8d4otCSsPCbhGYcX+eggpKQ=="], + + "mv": ["mv@2.1.1", "", { "dependencies": { "mkdirp": "~0.5.1", "ncp": "~2.0.0", "rimraf": "~2.4.0" } }, "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg=="], + + "nan": ["nan@2.25.0", "", {}, "sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g=="], + + "napi-postinstall": ["napi-postinstall@0.3.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "ncp": ["ncp@2.0.0", "", { "bin": { "ncp": "./bin/ncp" } }, "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA=="], + + "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], + + "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], + + "node-ipc": ["node-ipc@9.2.1", "", { "dependencies": { "event-pubsub": "4.3.0", "js-message": "1.0.7", "js-queue": "2.0.2" } }, "sha512-mJzaM6O3xHf9VT8BULvJSbdVbmHUKRNOH7zDDkCrA1/T+CVjq2WVIDfLt0azZRXpgArJtl3rtmEozrbXPZ9GaQ=="], + + "node-releases": ["node-releases@2.0.36", "", {}, "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "one-time": ["one-time@1.0.0", "", { "dependencies": { "fn.name": "1.x.x" } }, "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g=="], + + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + + "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], + + "pngjs": ["pngjs@7.0.0", "", {}, "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow=="], + + "pretty-format": ["pretty-format@30.3.0", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "promisify-child-process": ["promisify-child-process@4.1.2", "", {}, "sha512-APnkIgmaHNJpkAn7k+CrJSi9WMuff5ctYFbD0CO2XIPkM8yO7d/ShouU2clywbpHV/DUsyc4bpJCsNgddNtx4g=="], + + "proper-lockfile": ["proper-lockfile@3.2.0", "", { "dependencies": { "graceful-fs": "^4.1.11", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "sha512-iMghHHXv2bsxl6NchhEaFck8tvX3F9cknEEh1SUpguUOBjN7PAAW9BLzmbc1g/mCD1gY3EE2EABBHPJfFdHFmA=="], + + "pure-rand": ["pure-rand@7.0.1", "", {}, "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ=="], + + "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "resolve-cwd": ["resolve-cwd@3.0.0", "", { "dependencies": { "resolve-from": "^5.0.0" } }, "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="], + + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + + "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + + "rimraf": ["rimraf@2.4.5", "", { "dependencies": { "glob": "^6.0.1" }, "bin": { "rimraf": "./bin.js" } }, "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ=="], + + "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "safe-json-stringify": ["safe-json-stringify@1.2.0", "", {}, "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg=="], + + "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], + + "sanitize-filename": ["sanitize-filename@1.6.3", "", { "dependencies": { "truncate-utf8-bytes": "^1.0.0" } }, "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg=="], + + "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "serialize-error": ["serialize-error@8.1.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "source-map-support": ["source-map-support@0.5.13", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "stack-trace": ["stack-trace@0.0.10", "", {}, "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg=="], + + "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], + + "stream-chain": ["stream-chain@2.2.5", "", {}, "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA=="], + + "stream-json": ["stream-json@1.9.1", "", { "dependencies": { "stream-chain": "^2.2.5" } }, "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw=="], + + "string-length": ["string-length@4.0.2", "", { "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], + + "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "synckit": ["synckit@0.11.12", "", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ=="], + + "telnet-client": ["telnet-client@1.2.8", "", { "dependencies": { "bluebird": "^3.5.4" } }, "sha512-W+w4k3QAmULVNhBVT2Fei369kGZCh/TH25M7caJAXW+hLxwoQRuw0di3cX4l0S9fgH3Mvq7u+IFMoBDpEw/eIg=="], + + "test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + + "text-hex": ["text-hex@1.0.0", "", {}, "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="], + + "tmp": ["tmp@0.2.5", "", {}, "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow=="], + + "tmpl": ["tmpl@1.0.5", "", {}, "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="], + + "trace-event-lib": ["trace-event-lib@1.4.1", "", { "dependencies": { "browser-process-hrtime": "^1.0.0" } }, "sha512-TOgFolKG8JFY+9d5EohGWMvwvteRafcyfPWWNIqcuD1W/FUvxWcy2MSCZ/beYHM63oYPHYHCd3tkbgCctHVP7w=="], + + "triple-beam": ["triple-beam@1.4.1", "", {}, "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg=="], + + "truncate-utf8-bytes": ["truncate-utf8-bytes@1.0.2", "", { "dependencies": { "utf8-byte-length": "^1.0.1" } }, "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ=="], + + "ts-jest": ["ts-jest@29.4.6", "", { "dependencies": { "bs-logger": "^0.2.6", "fast-json-stable-stringify": "^2.1.0", "handlebars": "^4.7.8", "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", "semver": "^7.7.3", "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", "@jest/transform": "^29.0.0 || ^30.0.0", "@jest/types": "^29.0.0 || ^30.0.0", "babel-jest": "^29.0.0 || ^30.0.0", "jest": "^29.0.0 || ^30.0.0", "jest-util": "^29.0.0 || ^30.0.0", "typescript": ">=4.3 <6" }, "optionalPeers": ["@babel/core", "@jest/transform", "@jest/types", "babel-jest", "jest-util"], "bin": { "ts-jest": "cli.js" } }, "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], + + "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], + + "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "unrs-resolver": ["unrs-resolver@1.11.1", "", { "dependencies": { "napi-postinstall": "^0.3.0" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.11.1", "@unrs/resolver-binding-android-arm64": "1.11.1", "@unrs/resolver-binding-darwin-arm64": "1.11.1", "@unrs/resolver-binding-darwin-x64": "1.11.1", "@unrs/resolver-binding-freebsd-x64": "1.11.1", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-musl": "1.11.1", "@unrs/resolver-binding-wasm32-wasi": "1.11.1", "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg=="], + + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + + "utf8-byte-length": ["utf8-byte-length@1.0.5", "", {}, "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "v8-to-istanbul": ["v8-to-istanbul@9.3.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" } }, "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA=="], + + "walker": ["walker@1.0.8", "", { "dependencies": { "makeerror": "1.0.12" } }, "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ=="], + + "which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], + + "winston": ["winston@3.19.0", "", { "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", "async": "^3.2.3", "is-stream": "^2.0.0", "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.9.0" } }, "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA=="], + + "winston-transport": ["winston-transport@4.9.0", "", { "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" } }, "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A=="], + + "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "write-file-atomic": ["write-file-atomic@5.0.1", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw=="], + + "ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yargs-unparser": ["yargs-unparser@2.0.0", "", { "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", "flat": "^5.0.2", "is-plain-obj": "^2.1.0" } }, "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@isaacs/cliui/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "@istanbuljs/load-nyc-config/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + + "@istanbuljs/load-nyc-config/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "@jest/reporters/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], + + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "color/color-convert": ["color-convert@3.1.3", "", { "dependencies": { "color-name": "^2.0.0" } }, "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg=="], + + "color-string/color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="], + + "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "duplexer2/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "jest-config/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "jest-environment-emit/bunyan": ["bunyan@2.0.5", "", { "dependencies": { "exeunt": "1.1.0" }, "optionalDependencies": { "dtrace-provider": "~0.8", "moment": "^2.19.3", "mv": "~2", "safe-json-stringify": "~1" }, "bin": { "bunyan": "bin/bunyan" } }, "sha512-Jvl74TdxCN6rSP9W1I6+UOUtwslTDqsSFkDqZlFb/ilaSvQ+bZAnXT/GT97IZ5L+Vph0joPZPhxUyn6FLNmFAA=="], + + "jest-runtime/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "pkg-dir/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "rimraf/glob": ["glob@6.0.4", "", { "dependencies": { "inflight": "^1.0.4", "inherits": "2", "minimatch": "2 || 3", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A=="], + + "serialize-error/type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], + + "string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "test-exclude/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "test-exclude/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "write-file-atomic/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "@istanbuljs/load-nyc-config/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "@jest/reporters/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "color/color-convert/color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="], + + "duplexer2/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "jest-config/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "jest-runtime/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + + "test-exclude/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + } +} diff --git a/test/detox.config.ts b/test/detox.config.ts new file mode 100644 index 0000000..27fcb7a --- /dev/null +++ b/test/detox.config.ts @@ -0,0 +1,42 @@ +import { type DetoxConfig } from "detox/detox"; + + +const config:DetoxConfig = { + testRunner: { + args: { + $0: 'jest', + config: 'jest.config.ts' + } + }, + apps: { + "user.ios": { + type: "ios.app", + binaryPath: "appBinaries/User.app", + bundleId: "com.freshyotrial.app" + }, + "admin.ios": { + type: "ios.app", + binaryPath: "appBinaries/admin.app", + bundleId: "in.freshyo.adminui" + } + }, + devices: { + simulator: { + type: "ios.simulator", + device: { + type: "iPhone 16" + } + } + }, + + configurations: { + "ios.user": { + device: 'simulator', + app: 'user.ios', + }, + "ios.admin": { + device: 'simulator', + app: 'admin.ios' + } + } +} diff --git a/test/index.js b/test/index.js deleted file mode 100644 index fc6077b..0000000 --- a/test/index.js +++ /dev/null @@ -1,168 +0,0 @@ -import { remote } from 'webdriverio' - - -const driver = await remote({ - hostname: 'localhost', - port: 4723, - path: "/", - capabilities: { - platformName: "Android", - "appium:automationName": "UiAutomator2", - "appium:deviceName": "Android Emulator", - "appium:app": "/Users/mohammedshafiuddin/WebDev/freshyo/apps/admin-ui/android/app/build/outputs/apk/debug/app-debug.apk" - } -}) - -// Conditional login - only if login screen is present -try { - const loginInput = await driver.$('~login-name-input'); - await loginInput.waitForDisplayed({ timeout: 5000 }); - - // Login screen exists - perform login - console.log('Login screen found, performing login...'); - - // Enter username - await loginInput.click(); - await loginInput.setValue('admin1'); - - // Enter password - const passwordInput = await driver.$('~login-password-input'); - await passwordInput.click(); - await passwordInput.setValue('admin12345'); - - // Click login button - const loginButton = await driver.$('~login-button'); - await loginButton.click(); - - // Wait for dashboard to load - console.log('Waiting for dashboard...'); - await driver.$('~delivery-slots-menu-item').waitForDisplayed({ timeout: 10000 }); - console.log('Dashboard loaded!'); -} catch (e) { - // Login screen not found - already logged in or different screen - console.log('Login screen not found, continuing...'); -} - -// Navigate to Delivery Slots -console.log('Navigating to Delivery Slots...'); -const deliverySlotsMenu = await driver.$('~delivery-slots-menu-item'); -await deliverySlotsMenu.waitForDisplayed({ timeout: 5000 }); -await deliverySlotsMenu.click(); - -// Wait for slots page and click FAB -console.log('Waiting for slots page...'); -const addSlotFab = await driver.$('~add-slot-fab'); -await addSlotFab.waitForDisplayed({ timeout: 20000 }); -await addSlotFab.click(); - -// Wait for slot form -console.log('Waiting for slot form...'); -await driver.$('~delivery-time-picker').waitForDisplayed({ timeout: 5000 }); - -// Calculate target times -const now = new Date(); -const targetDeliveryTime = new Date(now.getTime() + 2 * 60 * 60 * 1000); // 2 hours from now -const targetFreezeTime = new Date(now.getTime() + 1 * 60 * 60 * 1000 + 45 * 60 * 1000); // 1hr 45min from now - -const deliveryHour = targetDeliveryTime.getHours(); -const deliveryMinute = targetDeliveryTime.getMinutes(); -const freezeHour = targetFreezeTime.getHours(); -const freezeMinute = targetFreezeTime.getMinutes(); - -console.log(`Target delivery time: ${deliveryHour}:${deliveryMinute.toString().padStart(2, '0')}`); -console.log(`Target freeze time: ${freezeHour}:${freezeMinute.toString().padStart(2, '0')}`); - -// Set delivery time -console.log('Setting delivery time...'); -const deliveryTimePicker = await driver.$('~delivery-time-picker'); -await deliveryTimePicker.click(); - -// Wait for time picker dialog -await driver.pause(1000); - -try { - // Find hour field and set it - const hourField = await driver.$('android=new UiSelector().resourceId("android:id/hour")'); - await hourField.clearValue(); - await hourField.setValue(deliveryHour.toString()); - - // Find minute field and set it - const minuteField = await driver.$('android=new UiSelector().resourceId("android:id/minute")'); - await minuteField.clearValue(); - await minuteField.setValue(deliveryMinute.toString().padStart(2, '0')); - - // Click OK button - const okButton = await driver.$('android=new UiSelector().resourceId("android:id/button1")'); - await okButton.click(); - console.log('Delivery time set successfully'); -} catch (e) { - console.log('Could not interact with time picker, using back button...'); - await driver.back(); -} - -// Set freeze time -console.log('Setting freeze time...'); -const freezeTimePicker = await driver.$('~freeze-time-picker'); -await freezeTimePicker.click(); - -// Wait for time picker dialog -await driver.pause(1000); - -try { - // Find hour field and set it - const freezeHourField = await driver.$('android=new UiSelector().resourceId("android:id/hour")'); - await freezeHourField.clearValue(); - await freezeHourField.setValue(freezeHour.toString()); - - // Find minute field and set it - const freezeMinuteField = await driver.$('android=new UiSelector().resourceId("android:id/minute")'); - await freezeMinuteField.clearValue(); - await freezeMinuteField.setValue(freezeMinute.toString().padStart(2, '0')); - - // Click OK button - const freezeOkButton = await driver.$('android=new UiSelector().resourceId("android:id/button1")'); - await freezeOkButton.click(); - console.log('Freeze time set successfully'); -} catch (e) { - console.log('Could not interact with time picker, using back button...'); - await driver.back(); -} - -// Select product group "All mutton items" -console.log('Selecting product group...'); -const productGroupsDropdown = await driver.$('~product-groups-dropdown'); -await productGroupsDropdown.click(); - -// Wait for dropdown and select "All mutton items" -await driver.pause(2000); - -// Try to find and tap "All mutton items" option -try { - const muttonOption = await driver.$('android=new UiSelector().textContains("All mutton items")'); - await muttonOption.waitForDisplayed({ timeout: 5000 }); - await muttonOption.click(); - console.log('Selected "All mutton items" group'); -} catch (e) { - console.log('Could not find "All mutton items" option, continuing...'); -} - -// Tap Done to close dropdown -const doneButton = await driver.$('~product-groups-dropdown-done'); -if (await doneButton.isDisplayed()) { - await doneButton.click(); -} - -// Create slot -console.log('Creating slot...'); -const createSlotButton = await driver.$('~create-slot-button'); -await createSlotButton.waitForDisplayed({ timeout: 5000 }); -await createSlotButton.click(); - -// Wait for slot creation -console.log('Waiting for slot creation...'); -await driver.pause(5000); - -console.log('Slot creation test completed!'); - -// Keep the session open for verification or close it -// await driver.deleteSession(); diff --git a/test/index.ts b/test/index.ts new file mode 100644 index 0000000..f67b2c6 --- /dev/null +++ b/test/index.ts @@ -0,0 +1 @@ +console.log("Hello via Bun!"); \ No newline at end of file diff --git a/test/jest.config.cjs b/test/jest.config.cjs new file mode 100644 index 0000000..9a54a80 --- /dev/null +++ b/test/jest.config.cjs @@ -0,0 +1,12 @@ +module.exports = { + preset: "ts-jest", + testEnvironment: "detox/runners/jest/testEnvironment", + testTimeout: 120000, + transform: { + "^.+\\.tsx?$": ["ts-jest", { + tsconfig: { + verbatimModuleSyntax: false + } + }] + } +} diff --git a/test/package-lock.json b/test/package-lock.json deleted file mode 100644 index 1d1e8aa..0000000 --- a/test/package-lock.json +++ /dev/null @@ -1,2859 +0,0 @@ -{ - "name": "test", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "test", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "webdriverio": "^9.24.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@promptbook/utils": { - "version": "0.69.5", - "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.69.5.tgz", - "integrity": "sha512-xm5Ti/Hp3o4xHrsK9Yy3MS6KbDxYbq485hDsFvxqaNA7equHLPdo8H8faTitTeb14QCDfLW4iwCxdVYu5sn6YQ==", - "funding": [ - { - "type": "individual", - "url": "https://buymeacoffee.com/hejny" - }, - { - "type": "github", - "url": "https://github.com/webgptorg/promptbook/blob/main/README.md#%EF%B8%8F-contributing" - } - ], - "license": "CC-BY-4.0", - "dependencies": { - "spacetrim": "0.11.59" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.0.tgz", - "integrity": "sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.4.3", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.5.0", - "semver": "^7.7.4", - "tar-fs": "^3.1.1", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.37", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", - "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", - "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", - "license": "MIT" - }, - "node_modules/@types/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", - "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@wdio/config": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.24.0.tgz", - "integrity": "sha512-rcHu0eG16rSEmHL0sEKDcr/vYFmGhQ5GOlmlx54r+1sgh6sf136q+kth4169s16XqviWGW3LjZbUfpTK29pGtw==", - "license": "MIT", - "dependencies": { - "@wdio/logger": "9.18.0", - "@wdio/types": "9.24.0", - "@wdio/utils": "9.24.0", - "deepmerge-ts": "^7.0.3", - "glob": "^10.2.2", - "import-meta-resolve": "^4.0.0", - "jiti": "^2.6.1" - }, - "engines": { - "node": ">=18.20.0" - } - }, - "node_modules/@wdio/logger": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.18.0.tgz", - "integrity": "sha512-HdzDrRs+ywAqbXGKqe1i/bLtCv47plz4TvsHFH3j729OooT5VH38ctFn5aLXgECmiAKDkmH/A6kOq2Zh5DIxww==", - "license": "MIT", - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "safe-regex2": "^5.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18.20.0" - } - }, - "node_modules/@wdio/protocols": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-9.24.0.tgz", - "integrity": "sha512-ozQKYddBLT4TRvU9J+fGrhVUtx3iDAe+KNCJcTDMFMxNSdDMR2xFQdNp8HLHypspk58oXTYCvz6ZYjySthhqsw==", - "license": "MIT" - }, - "node_modules/@wdio/repl": { - "version": "9.16.2", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-9.16.2.tgz", - "integrity": "sha512-FLTF0VL6+o5BSTCO7yLSXocm3kUnu31zYwzdsz4n9s5YWt83sCtzGZlZpt7TaTzb3jVUfxuHNQDTb8UMkCu0lQ==", - "license": "MIT", - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": ">=18.20.0" - } - }, - "node_modules/@wdio/types": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-9.24.0.tgz", - "integrity": "sha512-PYYunNl8Uq1r8YMJAK6ReRy/V/XIrCSyj5cpCtR5EqCL6heETOORFj7gt4uPnzidfgbtMBcCru0LgjjlMiH1UQ==", - "license": "MIT", - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": ">=18.20.0" - } - }, - "node_modules/@wdio/utils": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.24.0.tgz", - "integrity": "sha512-6WhtzC5SNCGRBTkaObX6A07Ofnnyyf+TQH/d/fuhZRqvBknrP4AMMZF+PFxGl1fwdySWdBn+gV2QLE+52Byowg==", - "license": "MIT", - "dependencies": { - "@puppeteer/browsers": "^2.2.0", - "@wdio/logger": "9.18.0", - "@wdio/types": "9.24.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^7.0.3", - "edgedriver": "^6.1.2", - "geckodriver": "^6.1.0", - "get-port": "^7.0.0", - "import-meta-resolve": "^4.0.0", - "locate-app": "^2.2.24", - "mitt": "^3.0.1", - "safaridriver": "^1.0.0", - "split2": "^4.2.0", - "wait-port": "^1.1.0" - }, - "engines": { - "node": ">=18.20.0" - } - }, - "node_modules/@zip.js/zip.js": { - "version": "2.8.23", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.8.23.tgz", - "integrity": "sha512-RB+RLnxPJFPrGvQ9rgO+4JOcsob6lD32OcF0QE0yg24oeW9q8KnTTNlugcDaIveEcCbclobJcZP+fLQ++sH0bw==", - "license": "BSD-3-Clause", - "engines": { - "bun": ">=0.7.0", - "deno": ">=1.0.0", - "node": ">=18.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/b4a": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", - "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", - "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", - "license": "Apache-2.0", - "peerDependencies": { - "bare-abort-controller": "*" - }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - } - } - }, - "node_modules/bare-fs": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.5.tgz", - "integrity": "sha512-XvwYM6VZqKoqDll8BmSww5luA5eflDzY0uEFfBJtFKe4PAAtxBjU3YIxzIBzhyaEQBy1VXEQBto4cpN5RZJw+w==", - "license": "Apache-2.0", - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4", - "bare-url": "^2.2.2", - "fast-fifo": "^1.3.2" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.7.1.tgz", - "integrity": "sha512-ebvMaS5BgZKmJlvuWh14dg9rbUI84QeV3WlWn6Ph6lFI8jJoh7ADtVTyD2c93euwbe+zgi0DVrl4YmqXeM9aIA==", - "license": "Apache-2.0", - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "license": "Apache-2.0", - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.8.0.tgz", - "integrity": "sha512-reUN0M2sHRqCdG4lUK3Fw8w98eeUIZHL5c3H7Mbhk2yVBL+oofgaIp0ieLfD5QXwPCypBpmEEKU2WZKzbAk8GA==", - "license": "Apache-2.0", - "dependencies": { - "streamx": "^2.21.0", - "teex": "^1.0.1" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/bare-url": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", - "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", - "license": "Apache-2.0", - "dependencies": { - "bare-path": "^3.0.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/basic-ftp": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.0.tgz", - "integrity": "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cheerio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", - "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "encoding-sniffer": "^0.2.1", - "htmlparser2": "^10.1.0", - "parse5": "^7.3.0", - "parse5-htmlparser2-tree-adapter": "^7.1.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^7.19.0", - "whatwg-mimetype": "^4.0.0" - }, - "engines": { - "node": ">=20.18.1" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-shorthand-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.2.tgz", - "integrity": "sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==", - "license": "MIT" - }, - "node_modules/css-value": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", - "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==" - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.1.tgz", - "integrity": "sha512-G7Cqgaelq68XHJNGlZ7lrNQyhZGsFqpwtGFexqUv4IQdjKoSYF7ipZ9UuTJZUSQXFj/XaoBLuEVIVqr8EJngEQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deepmerge-ts": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", - "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/edge-paths": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz", - "integrity": "sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==", - "license": "MIT", - "dependencies": { - "@types/which": "^2.0.1", - "which": "^2.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/shirshak55" - } - }, - "node_modules/edge-paths/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/edge-paths/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/edgedriver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-6.3.0.tgz", - "integrity": "sha512-ggEQL+oEyIcM4nP2QC3AtCQ04o4kDNefRM3hja0odvlPSnsaxiruMxEZ93v3gDCKWYW6BXUr51PPradb+3nffw==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@wdio/logger": "^9.18.0", - "@zip.js/zip.js": "^2.8.11", - "decamelize": "^6.0.1", - "edge-paths": "^3.0.5", - "fast-xml-parser": "^5.3.3", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "which": "^6.0.0" - }, - "bin": { - "edgedriver": "bin/edgedriver.js" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/encoding-sniffer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" - }, - "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", - "license": "Apache-2.0", - "dependencies": { - "bare-events": "^2.7.0" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", - "license": "MIT" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "node_modules/fast-xml-builder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz", - "integrity": "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/fast-xml-parser": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.2.tgz", - "integrity": "sha512-pw/6pIl4k0CSpElPEJhDppLzaixDEuWui2CUQQBH/ECDf7+y6YwA4Gf7Tyb0Rfe4DIMuZipYj4AEL0nACKglvQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "fast-xml-builder": "^1.0.0", - "strnum": "^2.1.2" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/geckodriver": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-6.1.0.tgz", - "integrity": "sha512-ZRXLa4ZaYTTgUO4Eefw+RsQCleugU2QLb1ME7qTYxxuRj51yAhfnXaItXNs5/vUzfIaDHuZ+YnSF005hfp07nQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@wdio/logger": "^9.18.0", - "@zip.js/zip.js": "^2.8.11", - "decamelize": "^6.0.1", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "modern-tar": "^0.7.2" - }, - "bin": { - "geckodriver": "bin/geckodriver.js" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-port": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", - "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-uri": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", - "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", - "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/htmlfy": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/htmlfy/-/htmlfy-0.8.1.tgz", - "integrity": "sha512-xWROBw9+MEGwxpotll0h672KCaLrKKiCYzsyN8ZgL9cQbVumFnyvsk2JqiB9ELAV1GLj1GG/jxZUjV9OZZi/yQ==", - "license": "MIT" - }, - "node_modules/htmlparser2": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", - "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "entities": "^7.0.1" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" - }, - "node_modules/import-meta-resolve": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", - "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", - "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=20" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "license": "(MIT OR GPL-3.0-or-later)", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/locate-app": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.5.0.tgz", - "integrity": "sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==", - "funding": [ - { - "type": "individual", - "url": "https://buymeacoffee.com/hejny" - }, - { - "type": "github", - "url": "https://github.com/hejny/locate-app/blob/main/README.md#%EF%B8%8F-contributing" - } - ], - "license": "Apache-2.0", - "dependencies": { - "@promptbook/utils": "0.69.5", - "type-fest": "4.26.0", - "userhome": "1.0.1" - } - }, - "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, - "node_modules/lodash.zip": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", - "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", - "license": "MIT" - }, - "node_modules/loglevel": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", - "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/loglevel-plugin-prefix": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", - "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, - "node_modules/modern-tar": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.7.5.tgz", - "integrity": "sha512-YTefgdpKKFgoTDbEUqXqgUJct2OG6/4hs4XWLsxcHkDLj/x/V8WmKIRppPnXP5feQ7d1vuYWSp3qKkxfwaFaxA==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "license": "MIT", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "license": "MIT", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-parser-stream": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", - "license": "MIT", - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/query-selector-shadow-dom": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", - "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", - "license": "MIT" - }, - "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz", - "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^2.0.1" - } - }, - "node_modules/ret": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", - "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/rgb2hex": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", - "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==", - "license": "MIT" - }, - "node_modules/safaridriver": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-1.0.1.tgz", - "integrity": "sha512-jkg4434cYgtrIF2AeY/X0Wmd2W73cK5qIEFE3hDrrQenJH/2SDJIXGvPAigfvQTcE9+H31zkiNHbUqcihEiMRA==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-regex2": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.0.0.tgz", - "integrity": "sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "dependencies": { - "ret": "~0.5.0" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-error": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-12.0.0.tgz", - "integrity": "sha512-ZYkZLAvKTKQXWuh5XpBw7CdbSzagarX39WyZ2H07CDLC5/KfsRGlIXV8d4+tfqX1M7916mRqR1QfNHSij+c9Pw==", - "license": "MIT", - "dependencies": { - "type-fest": "^4.31.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "license": "MIT", - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spacetrim": { - "version": "0.11.59", - "resolved": "https://registry.npmjs.org/spacetrim/-/spacetrim-0.11.59.tgz", - "integrity": "sha512-lLYsktklSRKprreOm7NXReW8YiX2VBjbgmXYEziOoGf/qsJqAEACaDvoTtUOycwjpaSh+bT8eu0KrJn7UNxiCg==", - "funding": [ - { - "type": "individual", - "url": "https://buymeacoffee.com/hejny" - }, - { - "type": "github", - "url": "https://github.com/hejny/spacetrim/blob/main/README.md#%EF%B8%8F-contributing" - } - ], - "license": "Apache-2.0" - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/streamx": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", - "license": "MIT", - "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strnum": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", - "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar-fs": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz", - "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/tar-stream": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", - "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "bare-fs": "^4.5.5", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/teex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", - "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", - "license": "MIT", - "dependencies": { - "streamx": "^2.12.5" - } - }, - "node_modules/text-decoder": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", - "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-fest": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.0.tgz", - "integrity": "sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/undici": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", - "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/urlpattern-polyfill": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", - "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", - "license": "MIT" - }, - "node_modules/userhome": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/userhome/-/userhome-1.0.1.tgz", - "integrity": "sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/wait-port": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-1.1.0.tgz", - "integrity": "sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "commander": "^9.3.0", - "debug": "^4.3.4" - }, - "bin": { - "wait-port": "bin/wait-port.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/wait-port/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wait-port/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/webdriver": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-9.24.0.tgz", - "integrity": "sha512-2R31Ey83NzMsafkl4hdFq6GlIBvOODQMkueLjeRqYAITu3QCYiq9oqBdnWA6CdePuV4dbKlYsKRX0mwMiPclDA==", - "license": "MIT", - "dependencies": { - "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "9.24.0", - "@wdio/logger": "9.18.0", - "@wdio/protocols": "9.24.0", - "@wdio/types": "9.24.0", - "@wdio/utils": "9.24.0", - "deepmerge-ts": "^7.0.3", - "https-proxy-agent": "^7.0.6", - "undici": "^6.21.3", - "ws": "^8.8.0" - }, - "engines": { - "node": ">=18.20.0" - } - }, - "node_modules/webdriver/node_modules/undici": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", - "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, - "node_modules/webdriverio": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-9.24.0.tgz", - "integrity": "sha512-LTJt6Z/iDM0ne/4ytd3BykoPv9CuJ+CAILOzlwFeMGn4Mj02i4Bk2Rg9o/jeJ89f52hnv4OPmNjD0e8nzWAy5g==", - "license": "MIT", - "dependencies": { - "@types/node": "^20.11.30", - "@types/sinonjs__fake-timers": "^8.1.5", - "@wdio/config": "9.24.0", - "@wdio/logger": "9.18.0", - "@wdio/protocols": "9.24.0", - "@wdio/repl": "9.16.2", - "@wdio/types": "9.24.0", - "@wdio/utils": "9.24.0", - "archiver": "^7.0.1", - "aria-query": "^5.3.0", - "cheerio": "^1.0.0-rc.12", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "grapheme-splitter": "^1.0.4", - "htmlfy": "^0.8.1", - "is-plain-obj": "^4.1.0", - "jszip": "^3.10.1", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "query-selector-shadow-dom": "^1.0.1", - "resq": "^1.11.0", - "rgb2hex": "0.2.5", - "serialize-error": "^12.0.0", - "urlpattern-polyfill": "^10.0.0", - "webdriver": "9.24.0" - }, - "engines": { - "node": ">=18.20.0" - }, - "peerDependencies": { - "puppeteer-core": ">=22.x || <=24.x" - }, - "peerDependenciesMeta": { - "puppeteer-core": { - "optional": true - } - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/which": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", - "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", - "license": "ISC", - "dependencies": { - "isexe": "^4.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yauzl/node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - } - } -} diff --git a/test/package.json b/test/package.json index 55e580b..288b5e8 100644 --- a/test/package.json +++ b/test/package.json @@ -1,15 +1,19 @@ { "name": "test", - "version": "1.0.0", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "module": "index.ts", + "type": "module", + "private": true, + "devDependencies": { + "@types/bun": "latest", + "@types/detox": "^18.1.3", + "@types/jest": "^30.0.0", + "ts-jest": "^29.4.6" + }, + "peerDependencies": { + "typescript": "^5" }, - "keywords": [], - "author": "", - "license": "ISC", - "description": "", "dependencies": { - "webdriverio": "^9.24.0" + "detox": "^20.47.0", + "jest": "^30.3.0" } } diff --git a/test/src/slotCreate.test.ts b/test/src/slotCreate.test.ts new file mode 100644 index 0000000..01e899e --- /dev/null +++ b/test/src/slotCreate.test.ts @@ -0,0 +1,14 @@ +import { launchFirst, openStaffApp } from "./switchers" + + +describe("Create a slot", () => { + beforeAll(async () => { + // await launchFirst(); + await openStaffApp(); + }) + + it("creates a slot", async () => { + await openStaffApp(); + + }) +}) diff --git a/test/src/switchers.ts b/test/src/switchers.ts new file mode 100644 index 0000000..4eecd8b --- /dev/null +++ b/test/src/switchers.ts @@ -0,0 +1,32 @@ +import { device } from "detox" + +type LaunchAppOptions = { + bundleId?: string + newInstance?: boolean +} + + +export async function openUserApp() { + await device.launchApp({ + bundleId: "com.freshyotrial.app", + newInstance: false + } as LaunchAppOptions) +} + +export async function openStaffApp() { + await device.launchApp({ + bundleId: "in.freshyo.adminui", + newInstance: false + } as LaunchAppOptions) +} + +export async function launchFirst() { + await device.launchApp({ + bundleId: "com.freshyotrial.app", + newInstance: true + } as LaunchAppOptions) + await device.launchApp({ + bundleId: "in.freshyo.app", + newInstance: true + } as LaunchAppOptions) +} diff --git a/test/tsconfig.json b/test/tsconfig.json new file mode 100644 index 0000000..9c62f74 --- /dev/null +++ b/test/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + // Environment setup & latest features + "lib": ["ESNext"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +}