Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/hubspot

src/wrappers.ts

125 lines · 4.2 KB · TypeScript
import { requireAuthMode } from './auth.ts'
import {
	createObject,
	getObject,
	listObjects,
	searchObjects,
	updateObject,
	type CreateObjectInput,
	type GetObjectInput,
	type ListObjectsInput,
	type SearchObjectsInput,
	type UpdateObjectInput,
} from './objects.ts'
import type { StandardObjectType } from './models.ts'
import type { HubSpotAuthInput, HubSpotFilterGroup, JsonRecord } from './types.ts'
import {
	optionalBoolean,
	optionalString,
	optionalStringArray,
	requireRecord,
} from './types.ts'

export type StandardListInput = Omit<ListObjectsInput, 'objectType'>
export type StandardGetInput = Omit<GetObjectInput, 'objectType'>
export type StandardSearchInput = Omit<SearchObjectsInput, 'objectType'>
export type StandardCreateInput = Omit<CreateObjectInput, 'objectType'>
export type StandardUpdateInput = Omit<UpdateObjectInput, 'objectType'>

export function listStandard(objectType: StandardObjectType, input: StandardListInput = {}) {
	return listObjects({ ...input, objectType })
}

export function getStandard(objectType: StandardObjectType, input: StandardGetInput) {
	return getObject({ ...input, objectType })
}

export function searchStandard(objectType: StandardObjectType, input: StandardSearchInput = {}) {
	return searchObjects({ ...input, objectType })
}

export function createStandard(objectType: StandardObjectType, input: StandardCreateInput) {
	return createObject({ ...input, objectType })
}

export function updateStandard(objectType: StandardObjectType, input: StandardUpdateInput) {
	return updateObject({ ...input, objectType })
}

export function parseAuth(input: JsonRecord): HubSpotAuthInput {
	return {
		integrationName: optionalString(input.integrationName, 'integrationName'),
		integration: optionalString(input.integration, 'integration'),
		account: optionalString(input.account, 'account'),
		secretName: optionalString(input.secretName, 'secretName'),
		auth: requireAuthMode(input.auth),
	}
}

export function parseListInput(params: Record<string, unknown>, label: string): StandardListInput {
	const input = requireRecord(params, label)
	return {
		...parseAuth(input),
		limit: input.limit as number | undefined,
		after: optionalString(input.after, 'after'),
		properties: optionalStringArray(input.properties, 'properties'),
		archived: optionalBoolean(input.archived, 'archived'),
		associations: optionalStringArray(input.associations, 'associations'),
	}
}

export function parseGetInput(params: Record<string, unknown>, label: string): StandardGetInput {
	const input = requireRecord(params, label)
	return {
		...parseAuth(input),
		id: optionalString(input.id, 'id') ?? '',
		idProperty: optionalString(input.idProperty, 'idProperty'),
		properties: optionalStringArray(input.properties, 'properties'),
		archived: optionalBoolean(input.archived, 'archived'),
		associations: optionalStringArray(input.associations, 'associations'),
	}
}

export function parseSearchInput(
	params: Record<string, unknown>,
	label: string,
): StandardSearchInput {
	const input = requireRecord(params, label)
	return {
		...parseAuth(input),
		query: optionalString(input.query, 'query'),
		filterGroups: input.filterGroups as Array<HubSpotFilterGroup> | undefined,
		sorts: optionalStringArray(input.sorts, 'sorts'),
		properties: optionalStringArray(input.properties, 'properties'),
		limit: input.limit as number | undefined,
		after: optionalString(input.after, 'after'),
	}
}

export function parseCreateInput(
	params: Record<string, unknown>,
	label: string,
): StandardCreateInput {
	const input = requireRecord(params, label)
	return {
		...parseAuth(input),
		properties: requireRecord(input.properties, 'properties'),
		confirm: optionalBoolean(input.confirm, 'confirm'),
		dryRun: optionalBoolean(input.dryRun, 'dryRun'),
	}
}

export function parseUpdateInput(
	params: Record<string, unknown>,
	label: string,
): StandardUpdateInput {
	const input = requireRecord(params, label)
	return {
		...parseAuth(input),
		id: optionalString(input.id, 'id') ?? '',
		idProperty: optionalString(input.idProperty, 'idProperty'),
		properties: requireRecord(input.properties, 'properties'),
		confirm: optionalBoolean(input.confirm, 'confirm'),
		dryRun: optionalBoolean(input.dryRun, 'dryRun'),
	}
}