import { accounts } from './accounts.ts'
import { getUser } from './get-user.ts'
import { inferOperationFromPath, oauthConnectUrl, scopeForOperation } from './setup.ts'
import { calendlyResourceUri, normalizeCalendlyPath, uuidFromUri } from './client.ts'
import type { CalendlyAuthInput } from './types.ts'
import { optionalString, requireRecord } from './types.ts'
import { requireAuthMode } from './auth.ts'
export type SmokeTestInput = CalendlyAuthInput & {
/** When true, skip the live user read even if credentials exist. */
setupOnly?: boolean
/** Alias of `setupOnly`. */
dryRun?: boolean
}
/**
* Verify Calendly auth without returning account email. Without credentials this
* still returns setup URLs so the package is forkable before anyone connects.
* @example
* import smokeTest from 'kody:@kody/calendly/smoke-test'
* const result = await smokeTest()
*/
export async function smokeTest(params: SmokeTestInput = {}) {
const connectUrl = oauthConnectUrl('calendly')
const selfCheck = {
ok: true as const,
pathNormalizesRoot: normalizeCalendlyPath('users/me') === '/users/me',
uuidFromUri: uuidFromUri('https://api.calendly.com/event_types/abc') === 'abc',
eventTypeUri: calendlyResourceUri('event_types', 'abc') === 'https://api.calendly.com/event_types/abc',
eventWriteScope: scopeForOperation('scheduledEvents.write') === 'scheduled_events:write',
inviteeWriteFromPath:
inferOperationFromPath('POST', '/invitees') === 'scheduledEvents.write',
connectUrlUsesAuthHost: connectUrl.includes('auth.calendly.com'),
connectUrlHasUsersScope: connectUrl.includes('users%3Aread'),
}
const info = await accounts(params)
const skipLive = params.setupOnly === true || params.dryRun === true
const canLive = Boolean(info.preferredAuth) && !skipLive
if (!canLive) {
return {
ok: true,
live: false,
dryRun: skipLive || undefined,
selfCheck,
authMode: info.preferredAuth,
integrationName: info.integrationName,
secretName: info.secretName,
oauthConnected: info.oauthConnected,
patSaved: info.patSaved,
hasUserUri: false,
setup: {
connectUrl: info.connectUrl,
patUrl: info.patUrl,
callbackUrl: info.callbackUrl,
requiredHost: info.requiredHost,
},
}
}
const user = await getUser(params)
return {
ok: true,
live: true,
selfCheck,
authMode: info.preferredAuth,
integrationName: info.integrationName,
secretName: info.secretName,
oauthConnected: info.oauthConnected,
patSaved: info.patSaved,
hasUserUri: user.uri.length > 0,
setup: {
connectUrl: info.connectUrl,
patUrl: info.patUrl,
callbackUrl: info.callbackUrl,
requiredHost: info.requiredHost,
},
}
}
/**
* Verify Calendly auth without returning account email.
* @example
* import smokeTest from 'kody:@kody/calendly/smoke-test'
* const result = await smokeTest({ dryRun: true })
*/
export default async function smokeTestEntrypoint(
params: SmokeTestInput & Record<string, unknown> = {},
) {
const input = requireRecord(params, 'smoke-test')
return smokeTest({
integrationName: optionalString(input.integrationName, 'integrationName'),
integration: optionalString(input.integration, 'integration'),
account: optionalString(input.account, 'account'),
secretName: optionalString(input.secretName, 'secretName'),
auth: requireAuthMode(input.auth),
setupOnly: input.setupOnly === true,
dryRun: input.dryRun === true,
})
}