import {z} from 'zod' export type CreateApiApiV2ImportArgs = {'X-SimpleLocalize-Token': string, uploadFormat: 'android' | 'android-strings' | 'android-xml' | 'csv-translations' | 'tsv' | 'excel' | 'java-properties' | 'localizable-xcstrings' | 'localizable-strings' | 'localizable-strings-dict' | 'po-pot' | 'php-array' | 'string-resources' | 'simplelocalize-json' | 'single-language-json' | 'multi-language-json' | 'javascript' | 'module-exports' | 'yaml' | 'qt-linguist' | 'resx', importOptions?: (Array<'PUBLISH_AFTER_IMPORT' | 'REPLACE_TRANSLATION_IF_FOUND' | 'TRIM_LEADING_TRAILING_SPACES' | 'UNESCAPE_NEW_LINES' | 'UNESCAPE_SINGLE_QUOTES' | 'SHEETS_AS_NAMESPACES' | 'MULTI_LANGUAGE' | 'LANGUAGES_NESTED'>) | undefined, languageKey?: string | undefined, customerId?: string | undefined, namespace?: string | undefined, tags?: Array | undefined, body: BodyInit}; export type CreateApiApiV2ImportOptions = {baseUrl?: string | undefined, ProjectAPIKey?: string | undefined, fetch?: typeof fetch | undefined}; export const language = z.object({key: z.string().optional(), name: z.string().optional(), isDefault: z.boolean().optional(), order: z.number().int().optional(), flag: z.string().optional(), access: z.enum(["WRITE_READ", "READ", "HIDDEN"]).optional(), translationProvider: z.enum(["GOOGLE_TRANSLATE", "DEEPL", "OPEN_AI", "OPEN_ROUTER", "CUSTOM_AI", "ANTHROPIC", "GEMINI", "SIMPLELOCALIZE_AI", "EXTERNAL_API", "SYSTRAN", "PSEUDO_TRANSLATE", "TRANSLATION_MEMORY", "DISABLED"]).optional(), providerLanguage: z.string().optional(), sourceLanguage: z.string().optional(), deeplFormality: z.string().optional(), isLocked: z.boolean().optional(), attributes: z.record(z.string(), z.unknown()).optional(), context: z.string().optional(), fallbackLanguage: z.string().optional()}); export const importFileResponseV2 = z.object({numberOfKeysFound: z.number().int().optional(), numberOfUniqueKeysFound: z.number().int().optional(), foundLanguages: z.array(language).optional()}); export const createApiApiV2ImportResponse = z.object({msg: z.string().optional(), status: z.number().int().optional(), data: importFileResponseV2.optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Import translations from file * * POST /api/v2/import */ export const createApiApiV2Import = async (args: CreateApiApiV2ImportArgs, options?: CreateApiApiV2ImportOptions) => { const {baseUrl = "https://api.simplelocalize.io", fetch: fetchFn = fetch, ProjectAPIKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args['X-SimpleLocalize-Token'] != null) headers.set("X-SimpleLocalize-Token", String(args['X-SimpleLocalize-Token'])) if (args.uploadFormat != null) query.append("uploadFormat", String(args.uploadFormat)) for (const item of args.importOptions ?? []) query.append("importOptions", String(item)) if (args.languageKey != null) query.append("languageKey", String(args.languageKey)) if (args.customerId != null) query.append("customerId", String(args.customerId)) if (args.namespace != null) query.append("namespace", String(args.namespace)) for (const item of args.tags ?? []) query.append("tags", String(item)) if (ProjectAPIKey !== undefined) headers.set("X-SimpleLocalize-Token", ProjectAPIKey) const url = `${baseUrl.replace(/\/+$/, '')}/api/v2/import${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: args.body}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(createApiApiV2ImportResponse, await res.json()) };