import {z} from 'zod' export type ProjectSettingOperation = {op: 'add' | 'replace' | 'remove' | 'test', path: '/name' | '/targetLanguageIds' | '/cname' | '/visibility' | '/languageAccessPolicy' | '/glossaryAccess' | '/glossaryAccessOption' | '/description' | '/translateDuplicates' | '/isMtAllowed' | '/taskBasedAccessControl' | '/autoSubstitution' | '/skipUntranslatedStrings' | '/exportApprovedOnly' | '/autoTranslateDialects' | '/publicDownloads' | '/hiddenStringsProofreadersAccess' | '/useGlobalTm' | '/showTmSuggestionsDialects' | '/tmApprovedSuggestionsOnly' | '/inContext' | '/inContextProcessHiddenStrings' | '/inContextPseudoLanguageId' | '/qaCheckIsActive' | '/qaCheckCategories' | '/qaCheckCategories/{category}' | '/qaChecksIgnorableCategories' | '/qaChecksIgnorableCategories/{category}' | '/normalizePlaceholder' | '/languageMapping' | '/languageMapping/{languageId}' | '/languageMapping/{languageId}/{mappingKey}' | '/notificationSettings/translatorNewStrings' | '/notificationSettings/managerNewStrings' | '/notificationSettings/managerLanguageCompleted' | '/pseudoLanguageId' | '/defaultTmId' | '/defaultGlossaryId' | '/assignedStyleGuides' | '/assignedGlossaries' | '/assignedTms' | '/assignedTms/{tmId}' | '/tmPenalties/{penaltyKey}' | '/tmPreTranslate' | '/mtPreTranslate' | '/aiPreTranslate' | '/preTranslationAiPromptId' | '/editorSuggestionAiPromptId' | '/qaCheckActionAiPromptId' | '/contextReviewAiPromptId' | '/savingsReportSettingsTemplateId'}; export type ProjectInfoPatch = Array; export type PatchApiProjectsProjectIdArgs = {projectId: number, body: ProjectInfoPatch}; export type PatchApiProjectsProjectIdOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const language = z.object({id: z.string().optional(), name: z.string().optional(), editorCode: z.string().optional(), twoLettersCode: z.string().optional(), threeLettersCode: z.string().optional(), locale: z.string().optional(), androidCode: z.string().optional(), bcp47Code: z.string().optional(), osxCode: z.string().optional(), osxLocale: z.string().optional(), pluralCategoryNames: z.array(z.string()).optional(), pluralRules: z.string().optional(), pluralExamples: z.array(z.string()).optional(), textDirection: z.enum(["ltr", "rtl"]).optional(), dialectOf: z.string().nullable().optional()}); export const qaCheckCategories = z.object({empty: z.boolean().optional(), size: z.boolean().optional(), tags: z.boolean().optional(), spaces: z.boolean().optional(), variables: z.boolean().optional(), punctuation: z.boolean().optional(), symbolRegister: z.boolean().optional(), specialSymbols: z.boolean().optional(), wrongTranslation: z.boolean().optional(), spellcheck: z.boolean().optional(), icu: z.boolean().optional(), terms: z.boolean().optional(), duplicate: z.boolean().optional(), ftl: z.boolean().optional(), android: z.boolean().optional(), numbers: z.boolean().optional(), ai: z.boolean().optional(), outdated: z.boolean().optional(), mdx: z.boolean().optional(), unifiedPlaceholders: z.boolean().optional()}); export const qaChecksIgnorableCategories = z.object({empty: z.boolean().optional(), size: z.boolean().optional(), tags: z.boolean().optional(), spaces: z.boolean().optional(), variables: z.boolean().optional(), punctuation: z.boolean().optional(), symbolRegister: z.boolean().optional(), specialSymbols: z.boolean().optional(), wrongTranslation: z.boolean().optional(), spellcheck: z.boolean().optional(), icu: z.boolean().optional(), terms: z.boolean().optional(), duplicate: z.boolean().optional(), ftl: z.boolean().optional(), android: z.boolean().optional(), numbers: z.boolean().optional(), ai: z.boolean().optional(), outdated: z.boolean().optional(), mdx: z.boolean().optional(), unifiedPlaceholders: z.boolean().optional()}); export const languageMappingUk = z.object({name: z.string().optional(), two_letters_code: z.string().optional(), three_letters_code: z.string().optional(), locale: z.string().optional(), locale_with_underscore: z.string().optional(), android_code: z.string().optional(), osx_code: z.string().optional(), osx_locale: z.string().optional()}); export const assignedTm = z.object({priority: z.number().int().optional()}); export const tmPreTranslateProjectSettings = z.object({enabled: z.boolean().optional(), autoApproveOption: z.enum(["all", "perfectMatchOnly", "exceptAutoSubstituted", "perfectMatchApprovedOnly", "none"]).optional(), minimumMatchRatio: z.enum(["perfect", "100"]).optional()}); export const engineMtPreTranslateProjectSettings = z.object({mtId: z.number().int().optional(), languageIds: z.array(z.string()).optional()}); export const mtPreTranslateProjectSettings = z.object({enabled: z.boolean().optional(), mts: z.array(engineMtPreTranslateProjectSettings).optional()}); export const promptAiPreTranslateProjectSettings = z.object({aiPromptId: z.number().int().optional(), languageIds: z.array(z.string()).optional()}); export const aiPreTranslateProjectSettings = z.object({enabled: z.boolean().optional(), aiPrompts: z.array(promptAiPreTranslateProjectSettings).optional()}); export const languageUk = z.object({id: z.string().optional(), name: z.string().optional(), editorCode: z.string().optional(), twoLettersCode: z.string().optional(), threeLettersCode: z.string().optional(), locale: z.string().optional(), androidCode: z.string().optional(), osxCode: z.string().optional(), osxLocale: z.string().optional(), pluralCategoryNames: z.array(z.string()).optional(), pluralRules: z.string().optional(), pluralExamples: z.array(z.string()).optional(), textDirection: z.string().optional(), dialectOf: z.string().nullable().optional()}); export const crowdinStringBasedProjectSettingsResponse = z.object({id: z.number().int().optional(), type: z.number().int().optional(), userId: z.number().int().optional(), sourceLanguageId: z.string().optional(), targetLanguageIds: z.array(z.string()).optional(), languageAccessPolicy: z.string().optional(), name: z.string().optional(), cname: z.string().nullable().optional(), identifier: z.string().optional(), description: z.string().optional(), visibility: z.string().optional(), logo: z.string().optional(), publicDownloads: z.boolean().nullable().optional(), createdAt: z.string().nullable().optional(), updatedAt: z.string().nullable().optional(), lastActivity: z.string().nullable().optional(), sourceLanguage: language.optional(), targetLanguages: z.array(language).optional(), webUrl: z.string().optional(), savingsReportSettingsTemplateId: z.number().int().optional(), translateDuplicates: z.number().int().optional(), tagsDetection: z.number().int().optional(), glossaryAccess: z.boolean().optional(), glossaryAccessOption: z.enum(["readOnly", "fullAccess", "manageDrafts"]).optional(), isMtAllowed: z.boolean().optional(), taskBasedAccessControl: z.boolean().optional(), hiddenStringsProofreadersAccess: z.boolean().optional(), autoSubstitution: z.boolean().optional(), exportTranslatedOnly: z.boolean().optional(), skipUntranslatedStrings: z.boolean().optional(), exportApprovedOnly: z.boolean().optional(), autoTranslateDialects: z.boolean().optional(), useGlobalTm: z.boolean().optional(), showTmSuggestionsDialects: z.boolean().optional(), tmApprovedSuggestionsOnly: z.boolean().optional(), isSuspended: z.boolean().optional(), qaCheckIsActive: z.boolean().optional(), qaCheckCategories: qaCheckCategories.optional(), qaChecksIgnorableCategories: qaChecksIgnorableCategories.optional(), languageMapping: z.object({uk: languageMappingUk.optional()}).optional(), notificationSettings: z.object({translatorNewStrings: z.boolean().optional(), managerNewStrings: z.boolean().optional(), managerLanguageCompleted: z.boolean().optional()}).optional(), defaultTmId: z.number().int().optional(), defaultGlossaryId: z.number().int().optional(), assignedTms: z.object({"1": assignedTm.optional()}).optional(), assignedGlossaries: z.array(z.number().int()).optional(), assignedStyleGuides: z.array(z.number().int()).optional(), tmPenalties: z.object({autoSubstitution: z.number().int().optional(), tmPriority: z.object({priority: z.number().int().optional(), penalty: z.number().int().optional()}).optional(), multipleTranslations: z.number().int().optional(), timeSinceLastUsage: z.object({months: z.number().int().optional(), penalty: z.number().int().optional()}).optional(), timeSinceLastModified: z.object({months: z.number().int().optional(), penalty: z.number().int().optional()}).optional()}).optional(), normalizePlaceholder: z.boolean().optional(), tmPreTranslate: tmPreTranslateProjectSettings.optional(), mtPreTranslate: mtPreTranslateProjectSettings.optional(), aiPreTranslate: aiPreTranslateProjectSettings.optional(), preTranslationAiPromptId: z.number().int().nullable().optional(), editorSuggestionAiPromptId: z.number().int().nullable().optional(), qaCheckActionAiPromptId: z.number().int().nullable().optional(), contextReviewAiPromptId: z.number().int().nullable().optional(), inContext: z.boolean().optional(), inContextProcessHiddenStrings: z.boolean().optional(), inContextPseudoLanguageId: z.string().nullable().optional(), inContextPseudoLanguage: languageUk.nullable().optional()}); export const crowdinStringBasedProjectResource = z.object({data: crowdinStringBasedProjectSettingsResponse}); 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 }; /** * Edit Project * * PATCH /projects/{projectId} */ export const patchApiProjectsProjectId = async (args: PatchApiProjectsProjectIdArgs, options?: PatchApiProjectsProjectIdOptions) => { const {baseUrl = "https://api.crowdin.com/api/v2", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/projects/${encodeURIComponent(String(args.projectId))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "PATCH", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(crowdinStringBasedProjectResource, await res.json()) };