import { kody } from 'kody:runtime' import { getExportName, optionalString, asRecord } from './helpers.ts' export type GetPackageInput = { packageId?: string kodyId?: string } export type GetPackageResult = { packageId: string kodyId: string name: string description: string tags: string[] hasApp: boolean exports: Array<{ subpath: string exportName: string importSpecifier: string runtimeTarget: string | null typesPath: string | null description: string | null typeDefinition: string | null tokenSetupUrl: string | null invocationUrl: string | null }> } /** * Load one saved package and expose its callable export metadata. * * @param params.packageId - Saved package id (preferred). * @param params.kodyId - Lookup package id by kody id when packageId is omitted. * @returns Package metadata with export subpaths and import specifiers. * * @example * import getPackage from 'kody:@kody/raycast/get-package' * const pkg = await getPackage({ kodyId: 'notify' }) */ export default async function getPackage( input: GetPackageInput = {}, ): Promise { const record = asRecord(input) let packageId = optionalString(record, 'packageId') const kodyId = optionalString(record, 'kodyId') if (!packageId && kodyId) { const list = await kody.packageList({}) packageId = list.packages.find(pkg => pkg.kody_id === kodyId)?.package_id } if (!packageId) { throw new Error('Pass packageId or kodyId.') } const pkg = await kody.packageGet({ package_id: packageId }) return { packageId: pkg.package_id, kodyId: pkg.kody_id, name: pkg.name, description: pkg.description, tags: pkg.tags, hasApp: pkg.has_app, exports: pkg.exports.map(entry => ({ subpath: entry.subpath, exportName: getExportName(entry.subpath), importSpecifier: entry.import_specifier, runtimeTarget: entry.runtime_target, typesPath: entry.types_path, description: entry.description, typeDefinition: entry.type_definition, tokenSetupUrl: entry.external_invocation?.token_setup_url ?? null, invocationUrl: entry.external_invocation?.url ?? null, })), } }