import { accounts } from './accounts.ts' import { insertRows } from './insert-rows.ts' import { managementRequest } from './management-request.ts' import { setupUrls } from './setup.ts' import { optionalBoolean, optionalString, type SupabaseAuthInput } from './types.ts' import { listProjects } from './list-projects.ts' import { listBuckets } from './list-buckets.ts' export type SmokeTestInput = SupabaseAuthInput & { setupOnly?: boolean dryRun?: boolean } /** * Verify package wiring. Without credentials this still returns setup URLs. * With a PAT it lists project refs/names only. With a service role and * projectRef it lists bucket names only. Never writes. * * This no-argument default is also the disabled `smoke` job wrapper. * @example * import smokeTest from 'kody:@kody/supabase/smoke-test' * const result = await smokeTest() */ export async function smokeTest(params: SmokeTestInput = {}) { const setup = setupUrls(params) const account = await accounts(params) const dryRunInsert = await insertRows({ projectRef: params.projectRef ?? 'exampleprojectref1', table: 'items', rows: [{ name: 'kody-supabase-dry-run' }], dryRun: true, }) const dryRunManagement = await managementRequest({ path: '/v1/projects', method: 'POST', body: { name: 'kody-supabase-dry-run' }, dryRun: true, }) const local = { ok: true as const, live: false as const, hasPatSecret: account.hasPatSecret, hasServiceRoleSecret: account.hasServiceRoleSecret, patSecretName: account.patSecretName, serviceRoleSecretName: account.serviceRoleSecretName, setup, dryRunInsert, dryRunManagement, } if (params.setupOnly || params.dryRun || (!account.hasPatSecret && !account.hasServiceRoleSecret)) { return local } const live: { projects?: { count: number; refs: Array } buckets?: { count: number; names: Array } } = {} if (account.hasPatSecret) { const projects = await listProjects(params) live.projects = { count: projects.count, refs: projects.items.map((item) => item.ref), } } if (account.hasServiceRoleSecret && (params.projectRef || params.projectUrl)) { const buckets = await listBuckets(params) live.buckets = { count: buckets.count, names: buckets.items.map((item) => item.name), } } return { ...local, ok: true as const, live: true as const, ...live, } } /** * Verify package wiring without mutating Supabase. * @example * import smokeTest from 'kody:@kody/supabase/smoke-test' * const result = await smokeTest({ setupOnly: true }) */ export default async function smokeTestEntrypoint( params: SmokeTestInput & Record = {}, ) { return await smokeTest({ account: optionalString(params.account, 'account'), secretName: optionalString(params.secretName, 'secretName'), patSecretName: optionalString(params.patSecretName, 'patSecretName'), serviceRoleSecretName: optionalString( params.serviceRoleSecretName, 'serviceRoleSecretName', ), projectRef: optionalString(params.projectRef, 'projectRef'), projectUrl: optionalString(params.projectUrl, 'projectUrl'), setupOnly: optionalBoolean(params.setupOnly, 'setupOnly'), dryRun: optionalBoolean(params.dryRun, 'dryRun'), }) }