import {z} from 'zod' export type GetApiV4OrganizationsFeaturesOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const organizationFeatures = z.object({id: z.string().nullable().optional(), legacyOrganizationId: z.string().nullable().optional(), enableEligibilityForms: z.boolean().optional(), enableAdditionalForms: z.boolean().optional(), enableReferenceForms: z.boolean().optional(), enableNewInternalForms: z.boolean().optional(), allowReviews: z.boolean().optional(), enableFormTables: z.boolean().optional(), enableLargeSelect: z.boolean().optional(), numFormFields: z.number().int().optional(), requireAddress: z.boolean().optional(), enableAddressValidation: z.boolean().optional(), enableShortAnswerExtendedValidation: z.boolean().optional(), enableFormLogic: z.boolean().optional(), enableCharityCheck: z.boolean().optional(), enableCollaborativeDrafts: z.boolean().optional(), enableDocusignIntegration: z.boolean().optional(), enableGoogleAnalytics: z.boolean().optional(), enableInternationalPhone: z.boolean().optional(), enableIDVFraudPrevention: z.boolean().optional(), enableKBAFraudPrevention: z.boolean().optional(), enableTransunionKBA: z.boolean().optional(), enableLimitMultipleSubmissions: z.boolean().optional(), enableLocalizeJs: z.boolean().optional(), enableManualSubmissions: z.boolean().optional(), enableMessaging: z.boolean().optional(), enableMessageDrafts: z.boolean().optional(), enableNewPublicGallery: z.boolean().optional(), enableReminders: z.boolean().optional(), enableResponsivePublicForms: z.boolean().optional(), enableNewPaymentOptions: z.boolean().optional(), enableStripeSubscription: z.boolean().optional(), enableTerms: z.boolean().optional(), enableValidatedPublicVoting: z.boolean().optional(), enableVideoTranscoding: z.boolean().optional(), enableDataPlatform: z.boolean().optional(), enableCalendar: z.boolean().optional(), enableSalesforceIntegration: z.boolean().optional(), enableRequestForms: z.boolean().optional(), enableRatings: z.boolean().optional(), enableMultiFileDocsPreview: z.boolean().optional(), enablePriceOptions: z.boolean().optional(), enablePaymentAddons: z.boolean().optional(), applySubFeesToSubscription: z.boolean().optional(), enableNewAssignments: z.boolean().optional(), enableLevelThreeViewScores: z.boolean().optional(), enableDiscover: z.boolean().optional(), enableNewSubmissionDetails: z.boolean().optional(), enableNewAdditionalForms: z.boolean().optional(), enableNewSubmissionActions: z.boolean().optional(), enableSubmitterNotes: z.boolean().optional(), allowRequestEdit: z.boolean().optional(), enableNewInitialForms: z.boolean().optional(), enableSelfServiceSubmissionLimits: z.boolean().optional(), shouldTrackSubmissionsMonthly: z.boolean().optional(), enableForeignCurrency: z.boolean().optional(), stripeEnabled: z.boolean().optional(), enableDocumentImport: z.boolean().optional(), enableAIAssistant: z.boolean().optional(), disableUSFormFields: z.boolean().optional(), isHIPAA: z.boolean().optional(), enableCandidPremierApi: z.boolean().optional(), enableBudgetTracking: z.boolean().optional(), enableFundsDistribution: z.boolean().optional(), enableUsBankPaymentBlocks: z.boolean().optional(), enableFinancialOversight: z.boolean().optional(), enableFinancialOversightPremium: z.boolean().optional(), enableReimbursements: z.boolean().optional(), enableAutoLabels: z.boolean().optional(), enableReviews: z.boolean().optional(), enableSingleRoundReview: z.boolean().optional(), enableMultiRoundReview: z.boolean().optional(), enableRandomAssignment: z.boolean().optional(), enableGroupAssignment: z.boolean().optional(), enableAutomatedReview: z.boolean().optional(), enableFeedbackSharing: z.boolean().optional(), enableReportsLink: z.boolean().optional(), enableAdvancedReporting: z.boolean().optional(), enableAggregateStatistics: z.boolean().optional(), enablePdfExport: z.boolean().optional(), enableVisitorReport: z.boolean().optional(), enableDashboard: z.boolean().optional(), enableApi: z.boolean().optional(), allowApi: z.boolean().optional(), enableReadWriteApi: z.boolean().optional(), enableZapierIntegration: z.boolean().optional(), enableGoogleSignIn: z.boolean().optional(), enableFacebookSignIn: z.boolean().optional(), enableSocialMediaButtons: z.boolean().optional(), disableSubmissionEmails: z.boolean().optional(), disableCreateAccountEmails: z.boolean().optional(), enableUsBankCheckPayment: z.boolean().optional(), enableUsBankAchPayment: z.boolean().optional(), enableUsBankPrepaidCardPayment: z.boolean().optional(), isAzure: z.boolean().optional(), enableCustomRoles: z.boolean().optional(), customRoleLimit: z.number().int().optional(), enableCustomizedLabelColor: z.boolean().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 }; /** * Get organization's features * * GET /v4/organizations/features */ export const getApiV4OrganizationsFeatures = async (options?: GetApiV4OrganizationsFeaturesOptions) => { const {baseUrl = "https://submittable-api.submittable.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/v4/organizations/features${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(organizationFeatures, await res.json()) };