Compare commits
No commits in common. "main" and "products_slots_mod" have entirely different histories.
main
...
products_s
198 changed files with 598 additions and 6283 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -7,7 +7,6 @@ yarn-debug.log*
|
|||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
.pnpm-debug.log*
|
||||
*.apk
|
||||
|
||||
**/.wrangler/*
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
|
|
|
|||
|
|
@ -23,13 +23,15 @@
|
|||
"license": "ISC",
|
||||
"description": "",
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "^3.888.0",
|
||||
"@aws-sdk/s3-request-presigner": "^3.888.0",
|
||||
"@hono/node-server": "^1.19.11",
|
||||
"@hono/trpc-server": "^0.4.2",
|
||||
"@trpc/server": "^11.6.0",
|
||||
"@turf/boolean-point-in-polygon": "^7.2.0",
|
||||
"@turf/helpers": "^7.2.0",
|
||||
"@turf/turf": "^7.2.0",
|
||||
"@types/bcryptjs": "^2.4.6",
|
||||
"aws4fetch": "^1.0.20",
|
||||
"axios": "^1.11.0",
|
||||
"bcryptjs": "^3.0.2",
|
||||
"dayjs": "^1.11.18",
|
||||
"dotenv": "^17.2.1",
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import { Buffer } from 'buffer'
|
||||
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'
|
||||
|
|
@ -179,19 +180,18 @@ export async function clearUrlCache(urls: string[]): Promise<{ success: boolean;
|
|||
}
|
||||
|
||||
try {
|
||||
const resp = await fetch(
|
||||
const response = await axios.post(
|
||||
`https://api.cloudflare.com/client/v4/zones/${cloudflareZoneId}/purge_cache`,
|
||||
{ files: urls },
|
||||
{
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Authorization': `Bearer ${cloudflareApiToken}`,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({ files: urls }),
|
||||
}
|
||||
)
|
||||
|
||||
const result = await resp.json() as { success: boolean; errors?: { message: string }[] }
|
||||
const result = response.data as { success: boolean; errors?: { message: string }[] }
|
||||
|
||||
if (!result.success) {
|
||||
const errorMessages = result.errors?.map(e => e.message) || ['Unknown error']
|
||||
|
|
@ -218,19 +218,18 @@ export async function clearAllCache(): Promise<{ success: boolean; errors?: stri
|
|||
}
|
||||
|
||||
try {
|
||||
const resp = await fetch(
|
||||
const response = await axios.post(
|
||||
`https://api.cloudflare.com/client/v4/zones/${cloudflareZoneId}/purge_cache`,
|
||||
{ purge_everything: true },
|
||||
{
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Authorization': `Bearer ${cloudflareApiToken}`,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({ purge_everything: true }),
|
||||
}
|
||||
)
|
||||
|
||||
const result = await resp.json() as { success: boolean; errors?: { message: string }[] }
|
||||
const result = response.data as { success: boolean; errors?: { message: string }[] }
|
||||
|
||||
if (!result.success) {
|
||||
const errorMessages = result.errors?.map(e => e.message) || ['Unknown error']
|
||||
|
|
|
|||
|
|
@ -1,20 +1,20 @@
|
|||
import axios from 'axios';
|
||||
|
||||
export async function extractCoordsFromRedirectUrl(url: string): Promise<{ latitude: string; longitude: string } | null> {
|
||||
try {
|
||||
const response = await fetch(url, { redirect: 'manual' })
|
||||
if (response.status === 301 || response.status === 302) {
|
||||
const redirectUrl = response.headers.get('location')
|
||||
if (redirectUrl) {
|
||||
const coordsMatch = redirectUrl.match(/!3d([-\d.]+)!4d([-\d.]+)/)
|
||||
if (coordsMatch) {
|
||||
return {
|
||||
latitude: coordsMatch[1],
|
||||
longitude: coordsMatch[2],
|
||||
}
|
||||
}
|
||||
await axios.get(url, { maxRedirects: 0 });
|
||||
return null;
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 302 || error.response?.status === 301) {
|
||||
const redirectUrl = error.response.headers.location;
|
||||
const coordsMatch = redirectUrl.match(/!3d([-\d.]+)!4d([-\d.]+)/);
|
||||
if (coordsMatch) {
|
||||
return {
|
||||
latitude: coordsMatch[1],
|
||||
longitude: coordsMatch[2],
|
||||
};
|
||||
}
|
||||
}
|
||||
return null
|
||||
} catch {
|
||||
return null
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
// import { Queue, Worker } from 'bullmq';
|
||||
import { Expo } from 'expo-server-sdk';
|
||||
// import { db } from '@/src/db/db_index'
|
||||
import { scaffoldAssetUrl } from '@/src/lib/s3-client'
|
||||
import { queueDataPusher } from '@/src/lib/queue-data-pusher'
|
||||
|
|
@ -50,8 +51,7 @@ export async function sendAdminNotification(data: {
|
|||
imageUrl: string | null;
|
||||
}) {
|
||||
const { token, title, body, imageUrl } = data;
|
||||
const { Expo } = await import('expo-server-sdk')
|
||||
|
||||
|
||||
// Validate Expo push token
|
||||
if (!Expo.isExpoPushToken(token)) {
|
||||
console.error(`Invalid Expo push token: ${token}`);
|
||||
|
|
|
|||
|
|
@ -87,12 +87,7 @@ const formatCancellationMessage = (orderData: any, cancellationData: Cancellatio
|
|||
📞 <b>Phone:</b> ${orderData.address?.phone || 'N/A'}
|
||||
|
||||
📦 <b>Items:</b>
|
||||
${orderData.orderItems?.map((item: any) => {
|
||||
const productQuantity = item.product?.productQuantity ?? 1
|
||||
const unitNotation = item.product?.unit?.shortNotation || ''
|
||||
const quantityWithUnit = unitNotation ? `${productQuantity}${unitNotation}` : `${productQuantity}`
|
||||
return ` • ${item.product?.name || 'Unknown'} ${quantityWithUnit} x${item.quantity}`
|
||||
}).join('\n') || ' N/A'}
|
||||
${orderData.orderItems?.map((item: any) => ` • ${item.product?.name || 'Unknown'} x${item.quantity}`).join('\n') || ' N/A'}
|
||||
|
||||
💰 <b>Total:</b> ₹${orderData.totalAmount}
|
||||
💳 <b>Refund:</b> ${orderData.refundStatus === 'na' ? 'N/A (COD)' : orderData.refundStatus || 'Pending'}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,11 @@
|
|||
import axios from 'axios';
|
||||
import { getIsDevMode, getTelegramBotToken, getTelegramChatIds } from '@/src/lib/env-exporter'
|
||||
|
||||
/**
|
||||
* Send a message to Telegram bot
|
||||
* @param message The message text to send
|
||||
* @returns Promise<boolean | null> indicating success, failure, or null if dev mode
|
||||
*/
|
||||
export const sendTelegramMessage = async (message: string): Promise<boolean | null> => {
|
||||
if (getIsDevMode()) {
|
||||
return null;
|
||||
|
|
@ -15,32 +21,33 @@ export const sendTelegramMessage = async (message: string): Promise<boolean | nu
|
|||
const results = await Promise.all(
|
||||
chatIds.map(async (chatId) => {
|
||||
try {
|
||||
const response = await fetch(`${telegramApiUrl}/sendMessage`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ chat_id: chatId, text: message, parse_mode: 'HTML' }),
|
||||
})
|
||||
const data = await response.json() as { ok: boolean }
|
||||
const response = await axios.post(`${telegramApiUrl}/sendMessage`, {
|
||||
chat_id: chatId,
|
||||
text: message,
|
||||
parse_mode: 'HTML',
|
||||
});
|
||||
|
||||
if (data.ok) {
|
||||
console.log(`Telegram message sent successfully to ${chatId}`)
|
||||
return true
|
||||
if (response.data && response.data.ok) {
|
||||
console.log(`Telegram message sent successfully to ${chatId}`);
|
||||
return true;
|
||||
} else {
|
||||
console.error(`Telegram API error for ${chatId}:`, data)
|
||||
return false
|
||||
console.error(`Telegram API error for ${chatId}:`, response.data);
|
||||
return false;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Failed to send Telegram message to ${chatId}:`, error)
|
||||
return false
|
||||
console.error(`Failed to send Telegram message to ${chatId}:`, error);
|
||||
return false;
|
||||
}
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
console.log('sent telegram message successfully')
|
||||
|
||||
|
||||
return results.some((result) => result)
|
||||
// Return true if at least one message was sent successfully
|
||||
return results.some((result) => result);
|
||||
} catch (error) {
|
||||
console.error('Failed to send Telegram message:', error)
|
||||
return false
|
||||
console.error('Failed to send Telegram message:', error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -6,8 +6,7 @@ import {
|
|||
getCacheVersion,
|
||||
} from '@/src/dbService'
|
||||
import type { StoresSummaryResponse } from '@packages/shared'
|
||||
import { polygon as turfPolygon, point as turfPoint } from '@turf/helpers';
|
||||
import { booleanPointInPolygon } from '@turf/boolean-point-in-polygon';
|
||||
import * as turf from '@turf/turf';
|
||||
import { z } from 'zod';
|
||||
import { mbnrGeoJson } from '@/src/lib/mbnr-geojson'
|
||||
import { generateUploadUrl } from '@/src/lib/s3-client'
|
||||
|
|
@ -16,7 +15,7 @@ import { getAllConstValues } from '@/src/lib/const-store'
|
|||
import { CONST_KEYS } from '@/src/lib/const-keys'
|
||||
import { getAssetsDomain, getApiCacheKey } from '@/src/lib/env-exporter'
|
||||
|
||||
const polygon = turfPolygon(mbnrGeoJson.features[0].geometry.coordinates);
|
||||
const polygon = turf.polygon(mbnrGeoJson.features[0].geometry.coordinates);
|
||||
|
||||
export async function scaffoldEssentialConsts() {
|
||||
const consts = await getAllConstValues();
|
||||
|
|
@ -77,8 +76,8 @@ export const commonApiRouter = router({
|
|||
.query(({ input }) => {
|
||||
try {
|
||||
const { lat, lng } = input;
|
||||
const point = turfPoint([lng, lat]); // GeoJSON: [longitude, latitude]
|
||||
const isInside = booleanPointInPolygon(point, polygon);
|
||||
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');
|
||||
|
|
|
|||
|
|
@ -15,8 +15,6 @@ import {
|
|||
|
||||
export { CacheCreator }
|
||||
|
||||
let app: ReturnType<typeof createApp> | null = null
|
||||
|
||||
export default {
|
||||
async fetch(
|
||||
request: Request,
|
||||
|
|
@ -35,10 +33,9 @@ export default {
|
|||
},
|
||||
ctx: ExecutionContext
|
||||
) {
|
||||
console.log(env)
|
||||
ensureWorkerInit(env)
|
||||
if (!app) {
|
||||
app = createApp()
|
||||
}
|
||||
const app = createApp()
|
||||
return app.fetch(request, env, ctx)
|
||||
},
|
||||
async queue(
|
||||
|
|
|
|||
|
|
@ -1,58 +0,0 @@
|
|||
# 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.
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
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.')
|
||||
}
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
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,
|
||||
}
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
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
|
||||
}
|
||||
|
|
@ -1,92 +0,0 @@
|
|||
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'],
|
||||
}
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
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 }
|
||||
}
|
||||
|
|
@ -1,142 +0,0 @@
|
|||
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)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
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>)
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
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]
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
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()
|
||||
}
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
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.
|
Before Width: | Height: | Size: 9 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 15 KiB |
Binary file not shown.
Binary file not shown.
|
|
@ -1 +0,0 @@
|
|||
{"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.
Binary file not shown.
|
|
@ -1,24 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
|
|
@ -1,24 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
|
|
@ -1,24 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
|
|
@ -1,34 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
|
|
@ -1,24 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
|
|
@ -1,24 +0,0 @@
|
|||
<?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>
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
<?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>
|
||||
|
|
@ -1,101 +0,0 @@
|
|||
<?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.
Binary file not shown.
|
|
@ -1 +0,0 @@
|
|||
APPL????
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -1,8 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
|
|
@ -1,29 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
|
|
@ -1,21 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
|
|
@ -1,23 +0,0 @@
|
|||
<?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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,535 +0,0 @@
|
|||
<?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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,16 +0,0 @@
|
|||
<?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.
|
Before Width: | Height: | Size: 16 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 24 KiB |
Binary file not shown.
Binary file not shown.
|
|
@ -1 +0,0 @@
|
|||
{"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.
Binary file not shown.
|
|
@ -1,24 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
|
|
@ -1,24 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
|
|
@ -1,24 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
|
|
@ -1,34 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
|
|
@ -1,24 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
|
|
@ -1,24 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
|
|
@ -1,14 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -1,101 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -1,101 +0,0 @@
|
|||
<?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>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue