import { requestGoogle } from './core.ts' import type { JsonObject } from './types.ts' export type DriveAboutParams = { account: string; fields?: string } export type DriveSearchParams = { account: string; query?: string; q?: string; pageSize?: number; pageToken?: string; orderBy?: string; fields?: string } export type DriveFileParams = { account: string; fileId: string; fields?: string } export type DriveExportParams = { account: string; fileId: string; mimeType?: string } export async function getDriveAbout(params: DriveAboutParams): Promise { const { fields = 'user(displayName,emailAddress),storageQuota(limit,usage)' } = params; return await requestGoogle({ ...params, api: 'google', path: '/drive/v3/about', query: { fields } }) as JsonObject } export async function searchFiles(params: DriveSearchParams): Promise { const { query, q = query, pageSize = 10, pageToken, orderBy, fields = 'files(id,name,mimeType,webViewLink,modifiedTime),nextPageToken' } = params; return await requestGoogle({ ...params, api: 'google', path: '/drive/v3/files', query: { q, pageSize, pageToken, orderBy, fields } }) as JsonObject } export async function getFileMetadata(params: DriveFileParams): Promise { const { fileId, fields = 'id,name,mimeType,webViewLink,modifiedTime,size,owners(displayName,emailAddress)' } = params; if (!fileId) throw new Error('getFileMetadata requires fileId.'); return await requestGoogle({ ...params, api: 'google', path: '/drive/v3/files/' + encodeURIComponent(fileId), query: { fields } }) as JsonObject } export async function exportFile(params: DriveExportParams): Promise { const { fileId, mimeType = 'text/plain' } = params; if (!fileId) throw new Error('exportFile requires fileId.'); return await requestGoogle({ ...params, api: 'google', path: '/drive/v3/files/' + encodeURIComponent(fileId) + '/export', query: { mimeType } }) } /** * Return the Google Drive helper namespace for about, search, metadata, and export. * @example * import drive from 'kody:@kentcdodds/google/drive' * const files = await drive().searchFiles({ account: 'personal', query: "name contains 'notes'" }) * // => { files: [...], nextPageToken: null } */ export default function drive() { return { getDriveAbout, searchFiles, getFileMetadata, exportFile } }