import { parseAuth } from './auth.ts' import { accounts } from './accounts.ts' import { getMe } from './me.ts' import { inferOperationFromPath, normalizeIntercomPath, oauthConnectUrl, permissionForOperation, } from './setup.ts' import type { IntercomAuthInput } from './types.ts' import { requireRecord } from './types.ts' export type SmokeTestInput = IntercomAuthInput & { /** When true, skip the live `/me` query even if credentials exist. */ setupOnly?: boolean } /** * Verify Intercom auth without returning email or workspace name. Without * credentials this still returns setup URLs so the package is forkable before * anyone connects. * @example * import smokeTest from 'kody:@kody/intercom/smoke-test' * const result = await smokeTest() */ export async function smokeTest(params: SmokeTestInput = {}) { const connectUrl = oauthConnectUrl('intercom') const selfCheck = { ok: true as const, contactPath: normalizeIntercomPath('/contacts') === '/contacts', searchIsRead: inferOperationFromPath('POST', '/contacts/search') === 'contacts.read', conversationWrite: inferOperationFromPath('POST', '/conversations/1/reply') === 'conversations.write', articleWrite: inferOperationFromPath('POST', '/articles') === 'articles.write', articleRead: inferOperationFromPath('GET', '/articles') === 'articles.read', meRead: inferOperationFromPath('GET', '/me') === 'me.read', contactWritePermission: permissionForOperation('contacts.write') === 'Read and write users', connectUrlUsesIntercomHost: connectUrl.includes('app.intercom.com'), connectUrlUsesEagleToken: connectUrl.includes('auth%2Feagle%2Ftoken'), } const info = await accounts(params) const canLive = Boolean(info.preferredAuth) && params.setupOnly !== true if (!canLive) { return { ok: true, live: false, selfCheck, authMode: info.preferredAuth, integrationName: info.integrationName, secretName: info.secretName, oauthConnected: info.oauthConnected, accessTokenSaved: info.accessTokenSaved, hasAdminId: false, setup: { connectUrl: info.connectUrl, accessTokenUrl: info.accessTokenUrl, callbackUrl: info.callbackUrl, requiredHosts: info.requiredHosts, }, } } const me = await getMe(params) return { ok: true, live: true, selfCheck, authMode: info.preferredAuth, integrationName: info.integrationName, secretName: info.secretName, oauthConnected: info.oauthConnected, accessTokenSaved: info.accessTokenSaved, hasAdminId: Boolean(me.id), region: me.app.region, setup: { connectUrl: info.connectUrl, accessTokenUrl: info.accessTokenUrl, callbackUrl: info.callbackUrl, requiredHosts: info.requiredHosts, }, } } /** * Verify Intercom auth without returning email or workspace name. * @example * import smokeTest from 'kody:@kody/intercom/smoke-test' * const result = await smokeTest({ setupOnly: true }) */ export default async function smokeTestEntrypoint( params: SmokeTestInput & Record = {}, ) { const input = requireRecord(params, 'smoke-test') return smokeTest({ ...parseAuth(input), setupOnly: input.setupOnly === true, }) }