This commit is contained in:
shafi54 2026-03-23 10:57:28 +05:30
parent ea848992c9
commit 6ff1fd63e5
190 changed files with 5854 additions and 3 deletions

1
.gitignore vendored
View file

@ -7,6 +7,7 @@ yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
*.apk
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

File diff suppressed because one or more lines are too long

58
apps/migrator/README.md Normal file
View file

@ -0,0 +1,58 @@
# 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:
```bash
bun --cwd apps/migrator run migrate --from postgres --to sqlite --source "<PG_URL>" --target "<SQLITE_PATH>"
```
```bash
bun --cwd apps/migrator run migrate --from sqlite --to postgres --source "<SQLITE_PATH>" --target "<PG_URL>"
```
### Flags
- `--from`: `postgres` or `sqlite`
- `--to`: `postgres` or `sqlite`
- `--source`: Postgres connection string or SQLite file path
- `--target`: Postgres connection string or SQLite file path
- `--batch`: optional batch size (default: `500`)
## Examples
```bash
bun --cwd apps/migrator run migrate \
--from postgres \
--to sqlite \
--source "postgres://user:pass@host:5432/db" \
--target "./sqlite.db"
```
```bash
bun --cwd apps/migrator run migrate \
--from sqlite \
--to postgres \
--source "./sqlite.db" \
--target "postgres://user:pass@host:5432/db" \
--batch 1000
```
## Notes
- IDs are copied as-is to preserve relationships.
- For Postgres targets, sequences may need manual reset after import.

View file

@ -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"
}
}

View file

@ -0,0 +1,13 @@
import { runPostgresToSqlite } from './postgres_to_sqlite'
import { runSqliteToPostgres } from './sqlite_to_postgres'
import { parseArgs } from './lib/args'
const args = parseArgs(Bun.argv.slice(2))
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.')
}

View file

@ -0,0 +1,50 @@
export type MigrationArgs = {
from: 'postgres' | 'sqlite'
to: 'postgres' | 'sqlite'
source: string
target: string
batchSize: number
}
const getFlagValue = (args: string[], flag: string): string | undefined => {
const index = args.indexOf(flag)
if (index === -1) return undefined
return args[index + 1]
}
export const parseArgs = (args: string[]): MigrationArgs => {
const from = getFlagValue(args, '--from')
const to = getFlagValue(args, '--to')
const source = getFlagValue(args, '--source')
const target = getFlagValue(args, '--target')
const batch = getFlagValue(args, '--batch')
if (!from || (from !== 'postgres' && from !== 'sqlite')) {
throw new Error('Missing or invalid --from (postgres|sqlite)')
}
if (!to || (to !== 'postgres' && to !== 'sqlite')) {
throw new Error('Missing or invalid --to (postgres|sqlite)')
}
if (!source) {
throw new Error('Missing --source')
}
if (!target) {
throw new Error('Missing --target')
}
const batchSize = batch ? Number(batch) : 500
if (Number.isNaN(batchSize) || batchSize <= 0) {
throw new Error('Invalid --batch, must be a positive number')
}
return {
from,
to,
source,
target,
batchSize,
}
}

View file

@ -0,0 +1,35 @@
export const parseJsonValue = <T>(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
}

View file

@ -0,0 +1,92 @@
import type { TableName } from './table-order'
export const jsonColumns: Partial<Record<TableName, string[]>> = {
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<Record<TableName, string[]>> = {
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<Record<TableName, string[]>> = {
deliverySlotInfo: ['deliverySequence'],
paymentInfoTable: ['payload'],
payments: ['payload'],
keyValStore: ['value'],
}
export const timestampColumns: Partial<Record<TableName, string[]>> = {
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<Record<TableName, string[]>> = {
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'],
}

View file

@ -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 }
}

View file

@ -0,0 +1,142 @@
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, toEpochSeconds, 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<number> => {
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<boolean> => {
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, toDialect: Dialect) => {
if (value === null || value === undefined) return value
if (toDialect === 'sqlite') {
return toEpochSeconds(value as Date | number)
}
return toDate(value as number | Date)
}
const normalizeBoolean = (value: unknown, toDialect: Dialect) => {
if (toDialect === 'postgres') {
return toBoolean(value)
}
return value
}
const transformRow = (row: Record<string, unknown>, tableName: TableName, toDialect: Dialect) => {
const jsonCols = jsonColumns[tableName] || []
const timeCols = timestampColumns[tableName] || []
const boolCols = booleanColumns[tableName] || []
const output: Record<string, unknown> = { ...row }
jsonCols.forEach((column) => {
output[column] = normalizeJson(output[column], tableName, column, toDialect)
})
timeCols.forEach((column) => {
output[column] = normalizeTimestamps(output[column], toDialect)
})
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<string, unknown>) =>
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)
}
}

View file

@ -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<TableName, any>
const buildMap = (schema: Record<string, unknown>): 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<string, unknown>)
export const sqliteTables = buildMap(sqliteSchema as Record<string, unknown>)

View file

@ -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]

View file

@ -0,0 +1,21 @@
import type { MigrationArgs } from '../lib/args'
import { createPostgresDb, createSqliteDb } from '../lib/db'
import { runMigration } from '../lib/migrate'
export const runPostgresToSqlite = async (args: MigrationArgs) => {
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()
}
}

View file

@ -0,0 +1,21 @@
import type { MigrationArgs } from '../lib/args'
import { createPostgresDb, createSqliteDb } from '../lib/db'
import { runMigration } from '../lib/migrate'
export const runSqliteToPostgres = async (args: MigrationArgs) => {
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()
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

View file

@ -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"}}

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyCollectedDataTypes</key>
<array>
</array>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyCollectedDataTypes</key>
<array>
</array>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyCollectedDataTypes</key>
<array>
</array>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>35F9.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyCollectedDataTypes</key>
<array>
</array>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>0A2A.1</string>
<string>3B52.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryDiskSpace</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>E174.1</string>
<string>85F4.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyCollectedDataTypes</key>
<array>
</array>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyCollectedDataTypes</key>
<array>
</array>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>hermes</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>dev.hermesengine.iphonesimulator</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string></string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>0.12.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>0.12.0</string>
<key>CSResourcesFileMapped</key>
<true/>
<key>MinimumOSVersion</key>
<string>15.1</string>
</dict>
</plist>

View file

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Info.plist</key>
<data>
4Hno0Ddszl7pNxmsMdj4eZ8APpg=
</data>
</dict>
<key>files2</key>
<dict/>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

Binary file not shown.

View file

@ -0,0 +1 @@
APPL????

View file

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
<string>0A2A.1</string>
<string>3B52.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>35F9.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryDiskSpace</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>E174.1</string>
<string>85F4.1</string>
</array>
</dict>
</array>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyTracking</key>
<false/>
</dict>
</plist>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
</dict>
</plist>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyTracking</key>
<false/>
</dict>
</plist>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyTracking</key>
<false/>
</dict>
</plist>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
</plist>

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,535 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>AppIcon60x60@2x.png</key>
<data>
97LNT9kpa48T+CswHSue8trK1eE=
</data>
<key>AppIcon76x76@2x~ipad.png</key>
<data>
VzU6ZM8C95tff2IFjtvjPfEV8Vs=
</data>
<key>Assets.car</key>
<data>
LrIAJ0UWrloOF0ANfYZBMOddVeQ=
</data>
<key>EXConstants.bundle/Info.plist</key>
<data>
Hlxsc20/U0owoVLTeqzSm5ybNIs=
</data>
<key>EXConstants.bundle/app.config</key>
<data>
IFa3PxmiSkaJ0td8DhhIk/PexXY=
</data>
<key>EXUpdates.bundle/Info.plist</key>
<data>
wjdfAxEpgfQFinoWBfIM8p9jaw8=
</data>
<key>Expo.plist</key>
<data>
yXM53emO8rHxLh7yvjjxI7jUS4U=
</data>
<key>ExpoApplication_privacy.bundle/Info.plist</key>
<data>
8BRDaa8J7FLCzhVYdsGF90Fhe6A=
</data>
<key>ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy</key>
<data>
mUc2YHiDtobIhFXi+Mvm12TXeb8=
</data>
<key>ExpoConstants_privacy.bundle/Info.plist</key>
<data>
gHWCze8PybGkM8T+sLc+3tpj/QE=
</data>
<key>ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy</key>
<data>
dHAsEQehwJCS8hMOpBoz7emiNj8=
</data>
<key>ExpoDevice_privacy.bundle/Info.plist</key>
<data>
6hGpMQ+NbBTY+ghWXzsUw8XJGyM=
</data>
<key>ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy</key>
<data>
hWEgzzi+YPgmddeTqWfAi6jGQ0E=
</data>
<key>ExpoFileSystem_privacy.bundle/Info.plist</key>
<data>
WIOt6Nu0S3BZ/+6OsBQFrMyXaNE=
</data>
<key>ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy</key>
<data>
UieOpg4b1PxYR6jA3/cs9mU9rdo=
</data>
<key>ExpoNotifications_privacy.bundle/Info.plist</key>
<data>
BwASpOTXQeKbJUrAWQFpwRpHkM8=
</data>
<key>ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy</key>
<data>
dHAsEQehwJCS8hMOpBoz7emiNj8=
</data>
<key>ExpoSystemUI_privacy.bundle/Info.plist</key>
<data>
ZY9+IxqDzlo+4baYZWU5AcIgICQ=
</data>
<key>ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy</key>
<data>
dHAsEQehwJCS8hMOpBoz7emiNj8=
</data>
<key>Frameworks/hermes.framework/Info.plist</key>
<data>
4Hno0Ddszl7pNxmsMdj4eZ8APpg=
</data>
<key>Frameworks/hermes.framework/_CodeSignature/CodeResources</key>
<data>
UltW0Jw9IEI+gE7DBGy5/VsUBrw=
</data>
<key>Frameworks/hermes.framework/hermes</key>
<data>
zNwvRCO4iW9WNlr9JGQIrylk2Ko=
</data>
<key>Info.plist</key>
<data>
4ZwmTOgnIm01EgWvwwqDN/hpTVI=
</data>
<key>PkgInfo</key>
<data>
n57qDP4tZfLD1rCS43W0B4LQjzE=
</data>
<key>PrivacyInfo.xcprivacy</key>
<data>
QWVPQQrLs8XwFZWrDE5vARWvUdA=
</data>
<key>RCT-Folly_privacy.bundle/Info.plist</key>
<data>
QV6mi/fThThHpU2soqgmADF/NUI=
</data>
<key>ReachabilitySwift.bundle/Info.plist</key>
<data>
R1f4iy65ziHGDflHUDJ3rYb7QJw=
</data>
<key>ReachabilitySwift.bundle/PrivacyInfo.xcprivacy</key>
<data>
0RESd+++ZxZWQhIEMSOOvP7phYs=
</data>
<key>React-Core_privacy.bundle/Info.plist</key>
<data>
bwZ/mVvwWYRpCtLUK8MTyiLp/JU=
</data>
<key>React-Core_privacy.bundle/PrivacyInfo.xcprivacy</key>
<data>
ZahcOiTSEcJJdvNh0xqgAKPqbMs=
</data>
<key>React-cxxreact_privacy.bundle/Info.plist</key>
<data>
DHapNtVVUNHS9BKJUN7HbkRj/0E=
</data>
<key>React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy</key>
<data>
dxJQFdQ77efnBkB0VBZmuIamJ4g=
</data>
<key>SDWebImage.bundle/Info.plist</key>
<data>
MiKmS7AM8ulTkag/cANN1izmsx4=
</data>
<key>SDWebImage.bundle/PrivacyInfo.xcprivacy</key>
<data>
PFHYbs0V3eUFDWQyYQcwEetuqEk=
</data>
<key>SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib</key>
<data>
+LtcMiEvVQs2QdoxGRtI33YPCYs=
</data>
<key>SplashScreen.storyboardc/Info.plist</key>
<data>
E68oTK3pecVBbvVw/Td2doSlDiA=
</data>
<key>SplashScreen.storyboardc/SplashScreenViewController.nib</key>
<data>
XO9GpHETPa/KEeOkIqhZoQ6OIvU=
</data>
<key>SymbuyoteAdmin.debug.dylib</key>
<data>
ZwTTt/x0U07XvLmnb3+tTdSeZn0=
</data>
<key>__preview.dylib</key>
<data>
NKNb0Q7QaNmfiMI7dnipVcSb6Bo=
</data>
<key>boost_privacy.bundle/Info.plist</key>
<data>
V94X3Cp8LSj+pZ/hfbsOD4huj5Q=
</data>
<key>glog_privacy.bundle/Info.plist</key>
<data>
MxuR75ZIsXAD5pxH3nEwX9uafJ0=
</data>
</dict>
<key>files2</key>
<dict>
<key>AppIcon60x60@2x.png</key>
<dict>
<key>hash2</key>
<data>
1EdHEGg/ZaMS6Zip6Ie7YlVSaTP8FBbCsE+pAI+y0Yk=
</data>
</dict>
<key>AppIcon76x76@2x~ipad.png</key>
<dict>
<key>hash2</key>
<data>
0FSd2xHbBOAtgMQ4Et7BIh1mcFoPKKSNPELVi5SQJAc=
</data>
</dict>
<key>Assets.car</key>
<dict>
<key>hash2</key>
<data>
VeXk52gO5+lQhdUDpJkX5HFitYSp/HTm9kpkxMmfwws=
</data>
</dict>
<key>EXConstants.bundle/Info.plist</key>
<dict>
<key>hash2</key>
<data>
jZG3+Tzakbtg344R3nPmevDrI3G9hqlhuDM+DGKsmHY=
</data>
</dict>
<key>EXConstants.bundle/app.config</key>
<dict>
<key>hash2</key>
<data>
KZQx0xB/v36dzA1NH6PtrZPUnlG5NMIASOIYzeC36j4=
</data>
</dict>
<key>EXUpdates.bundle/Info.plist</key>
<dict>
<key>hash2</key>
<data>
TSLIu7uoFgEkmWl6rOkXOLHgeB1Z/nLtqptH/f2Kzds=
</data>
</dict>
<key>Expo.plist</key>
<dict>
<key>hash2</key>
<data>
WwvRV3RJHdWPGFQnnyrsouAha0/2EaB+goHuQsVMZ2Q=
</data>
</dict>
<key>ExpoApplication_privacy.bundle/Info.plist</key>
<dict>
<key>hash2</key>
<data>
OF6pzmZB+LuE1u+wzImbqZDIJmhoflDtg2sTmrOtGiY=
</data>
</dict>
<key>ExpoApplication_privacy.bundle/PrivacyInfo.xcprivacy</key>
<dict>
<key>hash2</key>
<data>
tIdj/9KcutgVElrlbhBzJz5BiuCGED/H3/fvvsFnWqo=
</data>
</dict>
<key>ExpoConstants_privacy.bundle/Info.plist</key>
<dict>
<key>hash2</key>
<data>
MGRLpoZ+01WpddRUuE8TLN2RgOiqhzIDZEWy3MA1kNQ=
</data>
</dict>
<key>ExpoConstants_privacy.bundle/PrivacyInfo.xcprivacy</key>
<dict>
<key>hash2</key>
<data>
Ky2O23HVHFsfGs5M2yipS68i/d6bvy4r/BfRh/97X0c=
</data>
</dict>
<key>ExpoDevice_privacy.bundle/Info.plist</key>
<dict>
<key>hash2</key>
<data>
VW+4r911lj+g2ALGOJp8aFap1Y0t3bccy5wunDzTLDs=
</data>
</dict>
<key>ExpoDevice_privacy.bundle/PrivacyInfo.xcprivacy</key>
<dict>
<key>hash2</key>
<data>
2JioNW3Ie3zSsXkh1opGNtQkBns6dcg7eTX9eXcZycs=
</data>
</dict>
<key>ExpoFileSystem_privacy.bundle/Info.plist</key>
<dict>
<key>hash2</key>
<data>
ByWljZT3TE7/EQIJQP/napK+gMwwBFaLiROcsjSHmJk=
</data>
</dict>
<key>ExpoFileSystem_privacy.bundle/PrivacyInfo.xcprivacy</key>
<dict>
<key>hash2</key>
<data>
M7DgdPJz9YimS6VjKQnGqM8fFtuOTNhMaXi9Ii39Zb0=
</data>
</dict>
<key>ExpoNotifications_privacy.bundle/Info.plist</key>
<dict>
<key>hash2</key>
<data>
tKJ+YduFArUfPD3zQIGLIPtXagl8rbk4RDDBfsLvJC8=
</data>
</dict>
<key>ExpoNotifications_privacy.bundle/PrivacyInfo.xcprivacy</key>
<dict>
<key>hash2</key>
<data>
Ky2O23HVHFsfGs5M2yipS68i/d6bvy4r/BfRh/97X0c=
</data>
</dict>
<key>ExpoSystemUI_privacy.bundle/Info.plist</key>
<dict>
<key>hash2</key>
<data>
tGD6qrPgcjmHblKSEqq1CRuX18qzPmRBwHGfZltFSCw=
</data>
</dict>
<key>ExpoSystemUI_privacy.bundle/PrivacyInfo.xcprivacy</key>
<dict>
<key>hash2</key>
<data>
Ky2O23HVHFsfGs5M2yipS68i/d6bvy4r/BfRh/97X0c=
</data>
</dict>
<key>Frameworks/hermes.framework/Info.plist</key>
<dict>
<key>hash2</key>
<data>
JXB+dif18YekowEWiL1F0bJhRmDJCNhC7Yuki1yxMK0=
</data>
</dict>
<key>Frameworks/hermes.framework/_CodeSignature/CodeResources</key>
<dict>
<key>hash2</key>
<data>
1oRx8Mn/IhJGRZOGyHTCY2w0MZ+C71dPBNeLWZ06EJk=
</data>
</dict>
<key>Frameworks/hermes.framework/hermes</key>
<dict>
<key>hash2</key>
<data>
0po9tSLjyYKKx+ArJ1vK4kNtKcwcCF1fCYfIP3UR8M8=
</data>
</dict>
<key>PrivacyInfo.xcprivacy</key>
<dict>
<key>hash2</key>
<data>
0iT0B29OMhTbiXYnweoynu+q6Im8gta4P/eeuquI8zU=
</data>
</dict>
<key>RCT-Folly_privacy.bundle/Info.plist</key>
<dict>
<key>hash2</key>
<data>
0dcC3Z35ltB1Rk2HWpjCzA4wPFt+2WaTjgv/z5AxE1E=
</data>
</dict>
<key>ReachabilitySwift.bundle/Info.plist</key>
<dict>
<key>hash2</key>
<data>
a0Ywukh2Qq/wQxGNTeIC7/8oN2YZMvE9YYIecPYUN1M=
</data>
</dict>
<key>ReachabilitySwift.bundle/PrivacyInfo.xcprivacy</key>
<dict>
<key>hash2</key>
<data>
pwgfFQbJDo5nMQDlwWHnZbi3piREbiC9S9bvrKgICLg=
</data>
</dict>
<key>React-Core_privacy.bundle/Info.plist</key>
<dict>
<key>hash2</key>
<data>
omnNUjXWFudh+cE0TJqsI2YDpTvWTixl77Voxv40Jf4=
</data>
</dict>
<key>React-Core_privacy.bundle/PrivacyInfo.xcprivacy</key>
<dict>
<key>hash2</key>
<data>
fAiWnkWWIabs7AQ8zbkBJlHxhYEZRfdVF8Yj2uLhFic=
</data>
</dict>
<key>React-cxxreact_privacy.bundle/Info.plist</key>
<dict>
<key>hash2</key>
<data>
tKBcBEwmtUE9GGaNVVGdsi6/KnlaX4bi1D54dKd5mm4=
</data>
</dict>
<key>React-cxxreact_privacy.bundle/PrivacyInfo.xcprivacy</key>
<dict>
<key>hash2</key>
<data>
BYfRVcVqb08GR+vGtqC9AmYVzWEO6PIJqXhrealq0zU=
</data>
</dict>
<key>SDWebImage.bundle/Info.plist</key>
<dict>
<key>hash2</key>
<data>
ssr4wetNnB+bGHW2na0M24sSv1inTqC0ReqiCMf6fWU=
</data>
</dict>
<key>SDWebImage.bundle/PrivacyInfo.xcprivacy</key>
<dict>
<key>hash2</key>
<data>
A7LHCDOjMaKx79Ef8WjtAqjq39Xn0fvzDuzHUJpK6kc=
</data>
</dict>
<key>SplashScreen.storyboardc/EXPO-VIEWCONTROLLER-1-view-EXPO-ContainerView.nib</key>
<dict>
<key>hash2</key>
<data>
X+tAJBYf6l0fu6OOgc8+aot/0jOHh5N+R9T2CA7fpzw=
</data>
</dict>
<key>SplashScreen.storyboardc/Info.plist</key>
<dict>
<key>hash2</key>
<data>
dNvO7WzwpeXGmDR5MyjJeD7Ksd5ILUlU4lfKITK3Q68=
</data>
</dict>
<key>SplashScreen.storyboardc/SplashScreenViewController.nib</key>
<dict>
<key>hash2</key>
<data>
nBo0wSHSJHlAjPDqrLNJFUjO0WZVeZuuO19/I4AxS6g=
</data>
</dict>
<key>SymbuyoteAdmin.debug.dylib</key>
<dict>
<key>hash2</key>
<data>
bJ9FzLhQRgwj5TfBA8qj2AMq6UuOeEBnqpn4Mdj7YRc=
</data>
</dict>
<key>__preview.dylib</key>
<dict>
<key>hash2</key>
<data>
JxYb3r7Pg5bMt+qPjY4ibIde7zNM5U7OL6HGGuldoTM=
</data>
</dict>
<key>boost_privacy.bundle/Info.plist</key>
<dict>
<key>hash2</key>
<data>
ewhZPFvqBmGCXr9cyPcgBgi1XfwdibD9dwEvGqRXAFc=
</data>
</dict>
<key>glog_privacy.bundle/Info.plist</key>
<dict>
<key>hash2</key>
<data>
ppv2/Di+oXBAtgOAUjnelHqDc6Xxh7Ki3j5KlqckbEY=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

Binary file not shown.

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array>
</array>
<key>NSPrivacyCollectedDataTypes</key>
<array>
</array>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyTracking</key>
<false/>
</dict>
</plist>

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

View file

@ -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"}}

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyCollectedDataTypes</key>
<array>
</array>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyCollectedDataTypes</key>
<array>
</array>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyCollectedDataTypes</key>
<array>
</array>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>35F9.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyCollectedDataTypes</key>
<array>
</array>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>0A2A.1</string>
<string>3B52.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryDiskSpace</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>E174.1</string>
<string>85F4.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyCollectedDataTypes</key>
<array>
</array>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyCollectedDataTypes</key>
<array>
</array>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
</dict>
</plist>

View file

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Info.plist</key>
<data>
m2+OcUVS+NCF/RaQ0NMeexAJIbU=
</data>
</dict>
<key>files2</key>
<dict/>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Info.plist</key>
<data>
IgSq/mUvfi0nncHC2TAKVG0zPwA=
</data>
</dict>
<key>files2</key>
<dict/>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

Some files were not shown because too many files have changed in this diff Show more