import {z} from 'zod' export type CreateApiScriptsSaveArgs = {'X-Phantombuster-Org'?: string | undefined, body: {id?: string | undefined, name?: string | undefined, branch?: (string | null) | undefined, code?: (string | null) | undefined, markdown?: (string | null) | undefined, manifest?: ({slug: string, description: string, kind: 'lib', documentation: {summary: string, exports: Array<{name: string, kind: 'function' | 'class' | 'interface' | 'typeAlias' | 'enum' | 'const' | 'namespace', signature: string}>}, unlisted?: boolean | undefined, isDeprecated?: boolean | undefined, isBaasCompatible?: boolean | undefined, personalUseOnly?: boolean | undefined, featuredRank?: number | undefined, usageRank?: number | undefined, categories?: Array | undefined, tags?: ({categories?: Array | undefined, extractions?: Array | undefined, actions?: Array | undefined, goals?: Array | undefined}) | undefined, defaultArgument?: {[key: string]: unknown} | undefined, outputDescription?: {[key: string]: unknown} | undefined, defaultArgumentAllowed?: boolean | undefined, argumentForm?: ({enabled?: boolean | undefined, steps?: (Array<{slug: string, title: string, headerTitle?: string | undefined, fields: {[key: string]: {label?: string | undefined, labelLink?: string | undefined, labelInfo?: string | undefined, placeholder?: string | undefined, helper?: string | undefined, helpers?: (Array | string) | undefined, optionLabels?: Array | undefined, optionIcons?: Array | undefined, format?: ('radioTiles' | 'combobox' | 'radio') | undefined, dataAttrFieldInfo?: string | undefined, isMultiLine?: boolean | undefined, rows?: number | undefined, isPassword?: boolean | undefined, deprecated?: boolean | undefined, collapsibleSection?: string | undefined, isLabelHidden?: boolean | undefined}}, helper?: string | undefined, helpers?: (Array | string) | undefined}>) | undefined}) | undefined, argumentSchema?: ({type?: 'object' | undefined, properties?: ({[key: string]: {type?: ('string' | 'boolean' | 'number' | 'object' | 'array' | 'integer') | undefined, required?: boolean | undefined, minLength?: number | undefined, maxLength?: number | undefined, minimum?: number | undefined, maximum?: number | undefined, enum?: Array | undefined, sensitive?: boolean | undefined} | {[key: string]: unknown}}) | undefined}) | undefined, argumentTypes?: ({[key: string]: {types?: (Array>) | undefined, pipe?: boolean | undefined, targetsColumn?: ({pipe?: string | undefined, types?: Array | undefined}) | undefined}}) | undefined, outputTypes?: ({[key: string]: {types?: Array | undefined, filenameBeginsWith?: Array | undefined}}) | undefined, updated?: boolean | undefined, update?: boolean | undefined, defaultSettings?: ({executionTimeLimit?: (number | null) | undefined, fileMgmt?: ('folders' | 'mix' | 'delete') | undefined, fileMgmtMaxFolders?: (number | null) | undefined, maxParallelism?: (number | null) | undefined, maxRetryNumber?: (number | null) | undefined, launchType?: ('manually' | 'repeatedly') | undefined, repeatedLaunchPreset?: ('Once every other day' | 'Once per day' | 'Once per day, at the start of the day' | 'Twice per day' | 'Thrice per day' | '4 times per day' | '6 times per day' | '8 times per day' | 'Once every other hour' | 'Once per hour' | 'Twice per hour' | 'Thrice per hour' | '4 times per hour' | 'Once every other working hour' | 'Once per working hour' | 'Twice per working hour' | 'Thrice per working hour' | '4 times per working hour' | 'Once every other working hour, excluding weekends' | 'Once per working hour, excluding weekends' | 'Twice per working hour, excluding weekends' | 'Thrice per working hour, excluding weekends' | '4 times per working hour, excluding weekends') | undefined, notificationPreset?: ('none' | 'error' | 'success') | undefined, ignoreNotificationPresetForOrgSlugs?: (Array | null) | undefined, notifications?: ({mailAutomaticExitSuccess?: boolean | undefined, mailAutomaticExitError?: boolean | undefined, mailAutomaticLaunchError?: boolean | undefined, mailAutomaticTimeError?: boolean | undefined, mailManualExitSuccess?: boolean | undefined, mailManualExitError?: boolean | undefined, mailManualLaunchError?: boolean | undefined, mailManualTimeError?: boolean | undefined, slackWebHook?: string | undefined, slackAutomaticExitSuccess?: boolean | undefined, slackAutomaticExitError?: boolean | undefined, slackAutomaticLaunchError?: boolean | undefined, slackAutomaticTimeError?: boolean | undefined, slackManualExitSuccess?: boolean | undefined, slackManualExitError?: boolean | undefined, slackManualLaunchError?: boolean | undefined, slackManualTimeError?: boolean | undefined, webhook?: string | undefined} | null) | undefined, proxyLease?: ({groupSlug?: (string | null) | undefined, refreshRate: number}) | undefined, proxyType?: ('none' | 'http' | 'pool' | 'squid lease') | undefined}) | undefined, inputIcon?: string | undefined, outputIcon?: string | undefined, status?: ({type?: string | undefined, description?: string | undefined}) | undefined, askUserToNameAgent?: boolean | undefined, reservedAgentSlots?: number | undefined, hideSetupLaunchSettings?: boolean | undefined, hideFolderManagement?: boolean | undefined, onlyListedForUsersEnrolledInBeta?: boolean | undefined, diffusionGroups?: Array<{arguments: Array, title: string}> | undefined, embeddedYouTubeVideo?: ({videoId: string, videoHeader?: string | undefined}) | undefined, tutorialArticleUrl?: string | undefined, plugins?: (Array<{name: 'rateLimitsRecommendations', recommendations: {[key: string]: Array<{type: 'max', intervalUnit: 'day' | 'week' | 'month', alertContent?: ({headerText: string, subheaderText?: string | undefined, linkTextOne: string, linkTextOther: string}) | undefined, values: Array<{key: string, value: number} | {[key: string]: unknown}>} | {[key: string]: unknown}>}} | {[key: string]: unknown} | {name: 'chainedResultsManagement', options: {chainedResultsFieldName: string, columnTypesToDisplay: Array<{hrefFromType: string, labelFromType: string} | string>, exclusionList?: {fieldName: string} | undefined}} | {[key: string]: unknown} | {name: 'attachments', options: {associatedFieldName: string, validationType: 'linkedinMessage'}} | {[key: string]: unknown} | {name: 'setupMappedFieldsColumnLayoutDisplay', options: {leftColumnTitle: string, rightColumnTitle: string, sectionFieldNameList: Array, label?: string | undefined, helper?: string | undefined, displayPreviewQueries?: boolean | undefined}} | {[key: string]: unknown} | {name: 'taggedTemplateInterpolation', associatedFieldName: string, sortedAvailableTags: Array, conditionalTags: Array} | {leadProperties: Array}>} | {[key: string]: unknown} | {name: 'leadDatabaseContribution', lastVersionAt: number} | {[key: string]: unknown} | {name: 'acceptsLeadListAsInput', hideMyPhantomsMode?: boolean | undefined, hideCsvUrlMode?: boolean | undefined, skipFirstStepIfPrefilled?: boolean | undefined} | {[key: string]: unknown} | {name: 'dividedInputType', associatedFieldName: string, optionIcons: Array} | {[key: string]: unknown} | {name: 'acceptsCRMListAsInput', helperText?: string | undefined, hideMyPhantomsMode?: boolean | undefined, hideCsvUrlMode?: boolean | undefined} | {[key: string]: unknown} | {name: 'crmOutputMappingPlugin', options: {activationArgumentName?: string | undefined, optionalFieldsArgumentName?: string | undefined, optionalFields: Array<{fieldLabel: string, resultFieldName: string, defaultCrmFieldId?: string | undefined}>, requiredFields: Array<{argumentName: string, fieldLabel: string, resultFieldName: string, defaultCrmFieldId?: string | undefined}>}} | {[key: string]: unknown} | {name: 'crmInputMappingPlugin', options: {fieldName: string, activationArgumentName?: string | undefined, requiredFields: Array<{fieldLabel: string, leadDatabaseFieldName: string, defaultCrmFieldId?: string | undefined}>}} | {[key: string]: unknown} | {name: 'useMultiIdentities', multiIdentityFieldName: string} | {[key: string]: unknown} | {[key: string]: unknown}>) | undefined, noLogTimeout?: number | undefined, argumentsToSendToAnalytics?: Array | undefined, recommenderMetadata?: ({workers?: Array | undefined, standalone?: boolean | undefined, description?: string | undefined}) | undefined, visibleInChat?: Array<'tealde'> | undefined} | null) | undefined}}; export type CreateApiScriptsSaveOptions = {baseUrl?: string | undefined, apiKeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const createApiScriptsSaveResponse = z.object({id: z.string(), name: z.string()}); 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 }; /** * Updates or creates a new script. If an id is provided, the corresponding script will be updated. Otherwise, a new script will be created. * * POST /scripts/save */ export const createApiScriptsSave = async (args: CreateApiScriptsSaveArgs, options?: CreateApiScriptsSaveOptions) => { const {baseUrl = "https://api.phantombuster.com/api/v2", fetch: fetchFn = fetch, apiKeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args['X-Phantombuster-Org'] != null) headers.set("X-Phantombuster-Org", String(args['X-Phantombuster-Org'])) if (apiKeyAuth !== undefined) headers.set("X-Phantombuster-Key", apiKeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/scripts/save${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", 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(createApiScriptsSaveResponse, await res.json()) };