bodevops-features 1.0.0 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +388 -10
- package/dist/cjs/index.js +1702 -5
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +1681 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/types/gg-drive/config.d.ts +66 -0
- package/dist/types/gg-drive/google-drive.d.ts +214 -0
- package/dist/types/gg-drive/index.d.ts +29 -1
- package/dist/types/gg-drive/types.d.ts +176 -0
- package/dist/types/gg-drive/utils.d.ts +111 -0
- package/dist/types/gg-sheet/config.d.ts +65 -0
- package/dist/types/gg-sheet/google-sheet.d.ts +255 -0
- package/dist/types/gg-sheet/index.d.ts +35 -0
- package/dist/types/gg-sheet/types.d.ts +250 -0
- package/dist/types/gg-sheet/utils.d.ts +172 -0
- package/dist/types/index.d.ts +21 -0
- package/package.json +50 -44
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/gg-drive/test.ts"],"sourcesContent":["export const test = () => {\n console.log('test');\n};\n"],"names":[],"mappings":"AAAO,MAAM,IAAI,GAAG,MAAK;AACvB,IAAA,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AACrB,CAAC;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/gg-drive/config.ts","../../../src/gg-drive/utils.ts","../../../src/gg-drive/google-drive.ts","../../../src/gg-drive/index.ts","../../../src/gg-sheet/config.ts","../../../src/gg-sheet/types.ts","../../../src/gg-sheet/utils.ts","../../../src/gg-sheet/google-sheet.ts","../../../src/gg-sheet/index.ts"],"sourcesContent":["/**\n * Google Drive Feature Library - Configuration Module\n * @description Configuration management for Google Drive client initialization and authentication.\n * @module gg-drive/config\n */\n\nimport { IGoogleDriveConfig, IGoogleServiceAccountCredentials } from './types';\n\n/**\n * Default OAuth scopes required for Google Drive operations.\n * These scopes provide full access to Drive files.\n */\nexport const DEFAULT_DRIVE_SCOPES = [\n 'https://www.googleapis.com/auth/drive',\n 'https://www.googleapis.com/auth/drive.file',\n];\n\n/**\n * Google Drive Configuration Manager.\n * Handles validation and normalization of configuration options for the Google Drive client.\n *\n * @example\n * ```typescript\n * // Using key file path\n * const config = new GoogleDriveConfig({\n * keyFilePath: './service-account.json'\n * });\n *\n * // Using credentials object\n * const config = new GoogleDriveConfig({\n * credentials: {\n * type: 'service_account',\n * project_id: 'my-project',\n * private_key: '-----BEGIN PRIVATE KEY-----\\n...',\n * client_email: 'service-account@my-project.iam.gserviceaccount.com',\n * // ... other fields\n * }\n * });\n * ```\n */\nexport class GoogleDriveConfig {\n /** Path to the service account key file */\n public readonly keyFilePath?: string;\n\n /** Service account credentials object */\n public readonly credentials?: IGoogleServiceAccountCredentials;\n\n /** OAuth scopes for Google Drive API */\n public readonly scopes: string[];\n\n /**\n * Creates a new GoogleDriveConfig instance.\n *\n * @param config - Configuration options for Google Drive client\n * @throws Error if neither keyFilePath nor credentials is provided\n */\n constructor({ keyFilePath, credentials, scopes }: IGoogleDriveConfig) {\n // Validate that at least one authentication method is provided\n if (!keyFilePath && !credentials) {\n throw new Error('GoogleDriveConfig: Either keyFilePath or credentials must be provided');\n }\n\n this.keyFilePath = keyFilePath;\n this.credentials = credentials;\n this.scopes = scopes || DEFAULT_DRIVE_SCOPES;\n\n // Validate credentials structure if provided\n if (credentials) {\n this.validateCredentials(credentials);\n }\n }\n\n /**\n * Validates that the credentials object contains all required fields.\n *\n * @param credentials - The credentials object to validate\n * @throws Error if required fields are missing\n */\n private validateCredentials(credentials: IGoogleServiceAccountCredentials): void {\n const requiredFields: (keyof IGoogleServiceAccountCredentials)[] = [\n 'type',\n 'project_id',\n 'private_key',\n 'client_email',\n ];\n\n for (const field of requiredFields) {\n if (!credentials[field]) {\n throw new Error(`GoogleDriveConfig: Missing required credential field: ${field}`);\n }\n }\n\n if (credentials.type !== 'service_account') {\n throw new Error(\n `GoogleDriveConfig: Invalid credential type. Expected 'service_account', got '${credentials.type}'`\n );\n }\n }\n\n /**\n * Returns the authentication configuration object suitable for googleapis.\n *\n * @returns Authentication options for Google Auth\n */\n public getAuthOptions(): {\n keyFile?: string;\n credentials?: IGoogleServiceAccountCredentials;\n scopes: string[];\n } {\n if (this.keyFilePath) {\n return {\n keyFile: this.keyFilePath,\n scopes: this.scopes,\n };\n }\n\n return {\n credentials: this.credentials,\n scopes: this.scopes,\n };\n }\n}\n","/**\n * Google Drive Feature Library - Utility Functions\n * @description Helper functions for file handling, formatting, and validation in Google Drive operations.\n * @module gg-drive/utils\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * Size units for human-readable byte formatting.\n */\nconst SIZE_UNITS = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n/**\n * Base value for byte conversions (1024 bytes = 1 KB).\n */\nconst BYTE_BASE = 1024;\n\n/**\n * Converts a byte count into a human-readable string format.\n *\n * @param bytes - The number of bytes to format\n * @returns A human-readable string representation (e.g., \"1.5 GB\")\n *\n * @example\n * ```typescript\n * formatBytes(0); // \"0 Bytes\"\n * formatBytes(1024); // \"1 KB\"\n * formatBytes(1536); // \"1.5 KB\"\n * formatBytes(1073741824); // \"1 GB\"\n * ```\n */\nexport function formatBytes({ bytes }: { bytes: number }): string {\n if (bytes === 0) {\n return '0 Bytes';\n }\n\n const exponent = Math.floor(Math.log(bytes) / Math.log(BYTE_BASE));\n const value = bytes / Math.pow(BYTE_BASE, exponent);\n const formattedValue = parseFloat(value.toFixed(2));\n\n return `${formattedValue} ${SIZE_UNITS[exponent]}`;\n}\n\n/**\n * Normalizes a file path to use the correct path separators for the current OS.\n * Also resolves relative paths to absolute paths.\n *\n * @param filePath - The file path to normalize\n * @returns The normalized absolute file path\n *\n * @example\n * ```typescript\n * normalizeFilePath({ filePath: './documents/file.pdf' });\n * // Returns: \"D:\\\\MyFolder\\\\documents\\\\file.pdf\" (on Windows)\n * ```\n */\nexport function normalizeFilePath({ filePath }: { filePath: string }): string {\n // Resolve to absolute path if relative\n const absolutePath = path.resolve(filePath);\n\n // Normalize path separators for current OS\n return path.normalize(absolutePath);\n}\n\n/**\n * Validates that a file exists at the specified path.\n *\n * @param filePath - The absolute path to the file to validate\n * @returns True if the file exists, false otherwise\n *\n * @example\n * ```typescript\n * const exists = validateFileExists({ filePath: 'D:\\\\MyFolder\\\\file.pdf' });\n * if (!exists) {\n * console.log('File not found!');\n * }\n * ```\n */\nexport function validateFileExists({ filePath }: { filePath: string }): boolean {\n try {\n return fs.existsSync(filePath);\n } catch {\n return false;\n }\n}\n\n/**\n * Gets detailed information about a local file.\n *\n * @param filePath - The absolute path to the file\n * @returns File information object or null if file doesn't exist\n *\n * @example\n * ```typescript\n * const info = getFileInfo({ filePath: './document.pdf' });\n * if (info) {\n * console.log(`File size: ${info.sizeFormatted}`);\n * }\n * ```\n */\nexport function getFileInfo({ filePath }: { filePath: string }): {\n name: string;\n extension: string;\n directory: string;\n size: number;\n sizeFormatted: string;\n} | null {\n const normalizedPath = normalizeFilePath({ filePath });\n\n if (!validateFileExists({ filePath: normalizedPath })) {\n return null;\n }\n\n const stats = fs.statSync(normalizedPath);\n\n return {\n name: path.basename(normalizedPath),\n extension: path.extname(normalizedPath).slice(1),\n directory: path.dirname(normalizedPath),\n size: stats.size,\n sizeFormatted: formatBytes({ bytes: stats.size }),\n };\n}\n\n/**\n * Parses a folder path string into an array of folder names.\n *\n * @param folderPath - The folder path to parse (e.g., \"folder1/folder2/folder3\")\n * @returns An array of folder names\n *\n * @example\n * ```typescript\n * parseFolderPath({ folderPath: 'a/b/c' }); // ['a', 'b', 'c']\n * parseFolderPath({ folderPath: '/' }); // []\n * parseFolderPath({ folderPath: '' }); // []\n * ```\n */\nexport function parseFolderPath({ folderPath }: { folderPath: string }): string[] {\n if (!folderPath || folderPath === '/' || folderPath === '') {\n return [];\n }\n\n return folderPath.split('/').filter((folder) => folder.trim() !== '');\n}\n\n/**\n * Creates a readable stream for a local file.\n *\n * @param filePath - The absolute path to the file\n * @returns A readable stream for the file\n * @throws Error if the file doesn't exist\n *\n * @example\n * ```typescript\n * const stream = createFileReadStream({ filePath: './document.pdf' });\n * // Use stream for upload\n * ```\n */\nexport function createFileReadStream({ filePath }: { filePath: string }): fs.ReadStream {\n const normalizedPath = normalizeFilePath({ filePath });\n\n if (!validateFileExists({ filePath: normalizedPath })) {\n throw new Error(`File does not exist: ${normalizedPath}`);\n }\n\n return fs.createReadStream(normalizedPath);\n}\n","/**\n * Google Drive Feature Library - Main Client Class\n * @description A framework-agnostic client for interacting with Google Drive API.\n * Provides methods for file upload, download, sharing, and storage management.\n * @module gg-drive/google-drive\n */\n\nimport { google, drive_v3 } from 'googleapis';\nimport { GoogleDriveConfig } from './config';\nimport {\n IGoogleDriveConfig,\n IUploadFileResult,\n IFileInfo,\n IStorageInfo,\n TRoleShare,\n IUploadFileParams,\n IUploadFileAndShareParams,\n IListFilesParams,\n IDeleteFileParams,\n IMakeFilePublicParams,\n ITransferOwnershipParams,\n IShareFolderParams,\n IGetFolderIdParams,\n IFileExistsParams,\n} from './types';\nimport {\n formatBytes,\n normalizeFilePath,\n validateFileExists,\n parseFolderPath,\n createFileReadStream,\n} from './utils';\n\n/**\n * Google Drive Client for managing files and folders in Google Drive.\n *\n * @example\n * ```typescript\n * import { GoogleDriveClient } from 'bodevops-features/gg-drive';\n *\n * const client = new GoogleDriveClient({\n * keyFilePath: './service-account.json'\n * });\n *\n * // Get storage information\n * const storage = await client.getStorageInfo();\n * console.log(`Used: ${storage.formattedUsed} of ${storage.formattedTotal}`);\n *\n * // Upload a file\n * const result = await client.uploadFile({\n * localFilePath: './document.pdf',\n * driveFolder: 'MyFolder/Documents',\n * fileName: 'my-document.pdf'\n * });\n * console.log(`Uploaded: ${result.webViewLink}`);\n * ```\n */\nexport class GoogleDriveClient {\n private readonly config: GoogleDriveConfig;\n\n /**\n * Creates a new GoogleDriveClient instance.\n *\n * @param configOptions - Configuration options for the Google Drive client\n */\n constructor(configOptions: IGoogleDriveConfig) {\n this.config = new GoogleDriveConfig(configOptions);\n }\n\n /**\n * Creates and returns an authenticated Google Drive API client.\n *\n * @returns A Promise that resolves to an authenticated Drive API client\n */\n private async getDriveClient(): Promise<drive_v3.Drive> {\n const authOptions = this.config.getAuthOptions();\n\n const auth = new google.auth.GoogleAuth({\n keyFile: authOptions.keyFile,\n credentials: authOptions.credentials,\n scopes: authOptions.scopes,\n });\n\n const authClient = await auth.getClient();\n\n return google.drive({\n version: 'v3',\n auth: authClient as Parameters<typeof google.drive>[0]['auth'],\n });\n }\n\n /**\n * Retrieves storage quota information for the Google Drive account.\n *\n * @returns A Promise that resolves to storage information including used/total space\n * @throws Error if unable to retrieve storage information\n *\n * @example\n * ```typescript\n * const storage = await client.getStorageInfo();\n * console.log(`Storage: ${storage.formattedUsed} / ${storage.formattedTotal} (${storage.percentage}%)`);\n * ```\n */\n public async getStorageInfo(): Promise<IStorageInfo> {\n const driveInstance = await this.getDriveClient();\n\n const response = await driveInstance.about.get({\n fields: 'storageQuota',\n });\n\n const quota = response.data.storageQuota;\n\n if (!quota) {\n throw new Error('Unable to retrieve storage quota information');\n }\n\n const used = parseInt(quota.usage || '0', 10);\n const total = parseInt(quota.limit || '0', 10);\n const usedInDrive = parseInt(quota.usageInDrive || '0', 10);\n const percentage = total > 0 ? (used / total) * 100 : 0;\n\n return {\n used,\n total,\n usedInDrive,\n percentage: parseFloat(percentage.toFixed(2)),\n formattedUsed: formatBytes({ bytes: used }),\n formattedTotal: formatBytes({ bytes: total }),\n formattedUsedInDrive: formatBytes({ bytes: usedInDrive }),\n };\n }\n\n /**\n * Gets an existing folder by name or creates it if it doesn't exist.\n *\n * @param folderName - The name of the folder to find or create\n * @param parentId - The ID of the parent folder (default: 'root')\n * @returns A Promise that resolves to the folder ID\n */\n private async getOrCreateFolder({\n folderName,\n parentId = 'root',\n }: {\n folderName: string;\n parentId?: string;\n }): Promise<string> {\n const driveInstance = await this.getDriveClient();\n\n // Search for existing folder\n const query = `name='${folderName}' and mimeType='application/vnd.google-apps.folder' and '${parentId}' in parents and trashed=false`;\n\n const response = await driveInstance.files.list({\n q: query,\n fields: 'files(id, name)',\n });\n\n const folders = response.data.files || [];\n\n if (folders.length > 0 && folders[0].id) {\n // Folder exists, return its ID\n return folders[0].id;\n }\n\n // Folder doesn't exist, create it\n const folderMetadata = {\n name: folderName,\n mimeType: 'application/vnd.google-apps.folder',\n parents: [parentId],\n };\n\n const folder = await driveInstance.files.create({\n requestBody: folderMetadata,\n fields: 'id',\n });\n\n if (!folder.data.id) {\n throw new Error(`Failed to create folder: ${folderName}`);\n }\n\n return folder.data.id;\n }\n\n /**\n * Creates a folder hierarchy from a path string (e.g., \"a/b/c\") and returns the ID of the final folder.\n *\n * @param folderPath - The folder path to create (e.g., \"folder1/folder2/folder3\")\n * @returns A Promise that resolves to the ID of the innermost folder\n */\n private async createFolderHierarchy({ folderPath }: { folderPath: string }): Promise<string> {\n const folders = parseFolderPath({ folderPath });\n\n if (folders.length === 0) {\n return 'root';\n }\n\n let currentParentId = 'root';\n\n for (const folderName of folders) {\n currentParentId = await this.getOrCreateFolder({\n folderName,\n parentId: currentParentId,\n });\n }\n\n return currentParentId;\n }\n\n /**\n * Uploads a file to Google Drive and automatically makes it public.\n *\n * @param params - Upload parameters including local file path and destination folder\n * @returns A Promise that resolves to the upload result containing file ID and links\n * @throws Error if the local file doesn't exist or upload fails\n *\n * @example\n * ```typescript\n * const result = await client.uploadFile({\n * localFilePath: './document.pdf',\n * driveFolder: 'MyFolder/Documents',\n * fileName: 'my-document.pdf' // Optional\n * });\n * console.log(`View at: ${result.webViewLink}`);\n * ```\n */\n public async uploadFile({\n localFilePath,\n driveFolder,\n fileName,\n }: IUploadFileParams): Promise<IUploadFileResult> {\n // Normalize and validate the local file path\n const normalizedPath = normalizeFilePath({ filePath: localFilePath });\n\n if (!validateFileExists({ filePath: normalizedPath })) {\n throw new Error(\n `File does not exist: ${normalizedPath}. Please check the file path and ensure the file exists.`\n );\n }\n\n // Use the local filename if fileName is not provided\n const finalFileName = fileName || normalizedPath.split(/[\\\\/]/).pop() || 'unnamed';\n\n const driveInstance = await this.getDriveClient();\n\n // Create the folder hierarchy and get the ID of the innermost folder\n const folderId = await this.createFolderHierarchy({ folderPath: driveFolder });\n\n // File metadata\n const fileMetadata = {\n name: finalFileName,\n parents: [folderId],\n };\n\n // Create media upload\n const media = {\n mimeType: 'application/octet-stream',\n body: createFileReadStream({ filePath: normalizedPath }),\n };\n\n const file = await driveInstance.files.create({\n requestBody: fileMetadata,\n media: media,\n fields: 'id, name, webViewLink, webContentLink',\n });\n\n const result: IUploadFileResult = {\n id: file.data.id || '',\n name: file.data.name || '',\n webViewLink: file.data.webViewLink || undefined,\n webContentLink: file.data.webContentLink || undefined,\n };\n\n // Always make file public\n await this.makeFilePublic({ fileId: result.id });\n\n return result;\n }\n\n /**\n * Uploads a file and shares it with a specified email address.\n *\n * @param params - Upload and share parameters\n * @returns A Promise that resolves to the upload result\n *\n * @example\n * ```typescript\n * const result = await client.uploadFileAndShare({\n * localFilePath: './report.pdf',\n * driveFolder: 'SharedReports',\n * shareWithEmail: 'colleague@example.com',\n * role: 'writer'\n * });\n * ```\n */\n public async uploadFileAndShare({\n localFilePath,\n driveFolder,\n fileName,\n shareWithEmail,\n role = 'reader',\n }: IUploadFileAndShareParams): Promise<IUploadFileResult> {\n // Upload file normally\n const result = await this.uploadFile({\n localFilePath,\n driveFolder,\n fileName,\n });\n\n // Get folder ID and share it with specified role\n const folderId = await this.getFolderIdByPath({ folderPath: driveFolder });\n await this.shareFolderWithEmail({\n folderId,\n emailAddress: shareWithEmail,\n role,\n });\n\n return result;\n }\n\n /**\n * Deletes a file from Google Drive.\n * Note: Only the file owner can delete the file.\n *\n * @param params - Delete parameters including file ID\n * @returns A Promise that resolves to true if deletion was successful\n * @throws Error if deletion fails (e.g., permission denied)\n *\n * @example\n * ```typescript\n * await client.deleteFile({ fileId: '1abc123def456' });\n * ```\n */\n public async deleteFile({ fileId }: IDeleteFileParams): Promise<boolean> {\n const driveInstance = await this.getDriveClient();\n\n await driveInstance.files.delete({\n fileId: fileId,\n });\n\n return true;\n }\n\n /**\n * Lists all files and folders in a specified folder.\n *\n * @param params - List parameters including folder ID\n * @returns A Promise that resolves to an array of file information objects\n *\n * @example\n * ```typescript\n * const files = await client.listFilesInFolder({ folderId: 'root' });\n * for (const file of files) {\n * console.log(`${file.name} (${file.mimeType})`);\n * }\n * ```\n */\n public async listFilesInFolder({ folderId = 'root' }: IListFilesParams = {}): Promise<\n IFileInfo[]\n > {\n const driveInstance = await this.getDriveClient();\n\n const query = `'${folderId}' in parents and trashed=false`;\n\n const response = await driveInstance.files.list({\n q: query,\n fields: 'files(id, name, mimeType, webViewLink, parents)',\n orderBy: 'name',\n });\n\n const files = response.data.files || [];\n\n return files.map((file: drive_v3.Schema$File) => ({\n id: file.id || '',\n name: file.name || '',\n mimeType: file.mimeType || '',\n webViewLink: file.webViewLink || undefined,\n parents: file.parents || undefined,\n }));\n }\n\n /**\n * Makes a file publicly accessible to anyone with the link.\n *\n * @param params - Parameters including file ID\n * @returns A Promise that resolves to true if successful\n *\n * @example\n * ```typescript\n * await client.makeFilePublic({ fileId: '1abc123def456' });\n * // File is now accessible via its webViewLink\n * ```\n */\n public async makeFilePublic({ fileId }: IMakeFilePublicParams): Promise<boolean> {\n const driveInstance = await this.getDriveClient();\n\n await driveInstance.permissions.create({\n fileId: fileId,\n requestBody: {\n role: 'reader',\n type: 'anyone',\n },\n });\n\n return true;\n }\n\n /**\n * Transfers ownership of a file to another user.\n *\n * @param params - Transfer parameters including file ID and new owner email\n * @returns A Promise that resolves to true if successful\n *\n * @example\n * ```typescript\n * await client.transferFileOwnership({\n * fileId: '1abc123def456',\n * newOwnerEmail: 'newowner@example.com'\n * });\n * ```\n */\n public async transferFileOwnership({\n fileId,\n newOwnerEmail,\n role = 'reader',\n }: ITransferOwnershipParams): Promise<boolean> {\n const driveInstance = await this.getDriveClient();\n\n await driveInstance.permissions.create({\n fileId: fileId,\n requestBody: {\n role: role,\n type: 'user',\n emailAddress: newOwnerEmail,\n },\n transferOwnership: true,\n sendNotificationEmail: true,\n });\n\n return true;\n }\n\n /**\n * Shares a folder with a specified email address.\n *\n * @param params - Share parameters including folder ID, email, and role\n * @returns A Promise that resolves to true if successful\n *\n * @example\n * ```typescript\n * await client.shareFolderWithEmail({\n * folderId: '1abc123def456',\n * emailAddress: 'user@example.com',\n * role: 'writer'\n * });\n * ```\n */\n public async shareFolderWithEmail({\n folderId,\n emailAddress,\n role = 'writer',\n }: IShareFolderParams): Promise<boolean> {\n const driveInstance = await this.getDriveClient();\n\n const requestBody: drive_v3.Schema$Permission = {\n role: role,\n type: 'user',\n emailAddress: emailAddress,\n };\n\n const requestOptions: drive_v3.Params$Resource$Permissions$Create = {\n fileId: folderId,\n requestBody: requestBody,\n };\n\n // Configure notification email based on role\n if (role === 'owner') {\n requestOptions.transferOwnership = true;\n requestOptions.sendNotificationEmail = true;\n } else {\n requestOptions.sendNotificationEmail = false;\n }\n\n await driveInstance.permissions.create(requestOptions);\n\n return true;\n }\n\n /**\n * Gets a folder ID by its path, creating the folder hierarchy if it doesn't exist.\n *\n * @param params - Parameters including folder path\n * @returns A Promise that resolves to the folder ID\n *\n * @example\n * ```typescript\n * const folderId = await client.getFolderIdByPath({\n * folderPath: 'folder1/folder2/folder3'\n * });\n * ```\n */\n public async getFolderIdByPath({ folderPath }: IGetFolderIdParams): Promise<string> {\n return this.createFolderHierarchy({ folderPath });\n }\n\n /**\n * Checks if a file with the specified name exists in a folder.\n *\n * @param params - Parameters including file name and folder ID\n * @returns A Promise that resolves to the file ID if found, or null if not found\n *\n * @example\n * ```typescript\n * const fileId = await client.fileExistsInFolder({\n * fileName: 'document.pdf',\n * folderId: 'root'\n * });\n * if (fileId) {\n * console.log(`File exists with ID: ${fileId}`);\n * }\n * ```\n */\n public async fileExistsInFolder({\n fileName,\n folderId = 'root',\n }: IFileExistsParams): Promise<string | null> {\n const driveInstance = await this.getDriveClient();\n\n const query = `name='${fileName}' and '${folderId}' in parents and trashed=false`;\n\n const response = await driveInstance.files.list({\n q: query,\n fields: 'files(id, name)',\n });\n\n const files = response.data.files || [];\n\n if (files.length > 0 && files[0].id) {\n return files[0].id;\n }\n\n return null;\n }\n}\n","/**\n * Google Drive Feature Library\n * @description A framework-agnostic library for interacting with Google Drive API.\n * Provides easy-to-use methods for file upload, sharing, and storage management.\n * @module gg-drive\n *\n * @example\n * ```typescript\n * import { GoogleDriveClient } from 'bodevops-features/gg-drive';\n *\n * const client = new GoogleDriveClient({\n * keyFilePath: './service-account.json'\n * });\n *\n * // Upload a file\n * const result = await client.uploadFile({\n * localFilePath: './document.pdf',\n * driveFolder: 'MyFolder/Documents'\n * });\n *\n * // Get storage info\n * const storage = await client.getStorageInfo();\n * console.log(`Used: ${storage.formattedUsed}`);\n * ```\n */\n\n// Export main client class\nexport { GoogleDriveClient } from './google-drive';\n\n// Export configuration class\nexport { GoogleDriveConfig, DEFAULT_DRIVE_SCOPES } from './config';\n\n// Export all types\nexport type {\n IGoogleDriveConfig,\n IGoogleServiceAccountCredentials,\n IUploadFileResult,\n IFileInfo,\n IStorageInfo,\n TRoleShare,\n IUploadFileParams,\n IUploadFileAndShareParams,\n IListFilesParams,\n IDeleteFileParams,\n IMakeFilePublicParams,\n ITransferOwnershipParams,\n IShareFolderParams,\n IGetFolderIdParams,\n IFileExistsParams,\n} from './types';\n\n// Export utility functions\nexport {\n formatBytes,\n normalizeFilePath,\n validateFileExists,\n getFileInfo,\n parseFolderPath,\n createFileReadStream,\n} from './utils';\n","/**\n * Google Sheet Feature Library - Configuration Module\n * @description Configuration management for Google Sheet client initialization and authentication.\n * @module gg-sheet/config\n */\n\nimport { IGoogleSheetConfig, IGoogleServiceAccountCredentials } from './types';\n\n/**\n * Default OAuth scope required for Google Sheets operations.\n */\nexport const DEFAULT_SHEET_SCOPES = ['https://www.googleapis.com/auth/spreadsheets'];\n\n/**\n * Google Sheet Configuration Manager.\n * Handles validation and normalization of configuration options for the Google Sheet client.\n *\n * @example\n * ```typescript\n * // Using key file path\n * const config = new GoogleSheetConfig({\n * keyFilePath: './service-account.json'\n * });\n *\n * // Using credentials object\n * const config = new GoogleSheetConfig({\n * credentials: {\n * type: 'service_account',\n * project_id: 'my-project',\n * private_key: '-----BEGIN PRIVATE KEY-----\\n...',\n * client_email: 'service-account@my-project.iam.gserviceaccount.com',\n * // ... other fields\n * }\n * });\n * ```\n */\nexport class GoogleSheetConfig {\n /** Path to the service account key file */\n public readonly keyFilePath?: string;\n\n /** Service account credentials object */\n public readonly credentials?: IGoogleServiceAccountCredentials;\n\n /** OAuth scopes for Google Sheets API */\n public readonly scopes: string[];\n\n /**\n * Creates a new GoogleSheetConfig instance.\n *\n * @param config - Configuration options for Google Sheet client\n * @throws Error if neither keyFilePath nor credentials is provided\n */\n constructor({ keyFilePath, credentials, scopes }: IGoogleSheetConfig) {\n // Validate that at least one authentication method is provided\n if (!keyFilePath && !credentials) {\n throw new Error('GoogleSheetConfig: Either keyFilePath or credentials must be provided');\n }\n\n this.keyFilePath = keyFilePath;\n this.credentials = credentials;\n this.scopes = scopes || DEFAULT_SHEET_SCOPES;\n\n // Validate credentials structure if provided\n if (credentials) {\n this.validateCredentials(credentials);\n }\n }\n\n /**\n * Validates that the credentials object contains all required fields.\n *\n * @param credentials - The credentials object to validate\n * @throws Error if required fields are missing\n */\n private validateCredentials(credentials: IGoogleServiceAccountCredentials): void {\n const requiredFields: (keyof IGoogleServiceAccountCredentials)[] = [\n 'type',\n 'project_id',\n 'private_key',\n 'client_email',\n ];\n\n for (const field of requiredFields) {\n if (!credentials[field]) {\n throw new Error(`GoogleSheetConfig: Missing required credential field: ${field}`);\n }\n }\n\n if (credentials.type !== 'service_account') {\n throw new Error(\n `GoogleSheetConfig: Invalid credential type. Expected 'service_account', got '${credentials.type}'`\n );\n }\n }\n\n /**\n * Returns the authentication configuration object suitable for googleapis.\n *\n * @returns Authentication options for Google Auth\n */\n public getAuthOptions(): {\n keyFile?: string;\n credentials?: IGoogleServiceAccountCredentials;\n scopes: string[];\n } {\n if (this.keyFilePath) {\n return {\n keyFile: this.keyFilePath,\n scopes: this.scopes,\n };\n }\n\n return {\n credentials: this.credentials,\n scopes: this.scopes,\n };\n }\n}\n","/**\n * Google Sheet Feature Library - Type Definitions\n * @description Type definitions for Google Sheet operations including reading, writing, and exporting data.\n * @module gg-sheet/types\n */\n\n/**\n * Configuration options for Google Sheet client initialization.\n * Supports either a path to a service account key file or a direct credentials object.\n */\nexport interface IGoogleSheetConfig {\n /** Path to the service account JSON key file */\n keyFilePath?: string;\n\n /** Service account credentials object (alternative to keyFilePath) */\n credentials?: IGoogleServiceAccountCredentials;\n\n /** OAuth scopes for Google Sheets API access */\n scopes?: string[];\n}\n\n/**\n * Google Service Account credentials structure.\n * This matches the structure of the downloaded JSON key file from Google Cloud Console.\n */\nexport interface IGoogleServiceAccountCredentials {\n /** The type of account, typically \"service_account\" */\n type: string;\n\n /** The unique identifier for the project */\n project_id: string;\n\n /** The private key identifier */\n private_key_id: string;\n\n /** The private key in PEM format */\n private_key: string;\n\n /** The service account email address */\n client_email: string;\n\n /** The unique client identifier */\n client_id: string;\n\n /** The authentication URI */\n auth_uri: string;\n\n /** The token URI for obtaining access tokens */\n token_uri: string;\n\n /** The authentication provider certificate URL */\n auth_provider_x509_cert_url: string;\n\n /** The client certificate URL */\n client_x509_cert_url: string;\n}\n\n/**\n * Information about a sheet (tab) within a Google Spreadsheet.\n */\nexport interface ISheetChildrenInfo {\n /** The title/name of the sheet tab */\n title: string;\n\n /** The unique identifier of the sheet within the spreadsheet */\n sheetId: number;\n\n /** The total number of rows in the sheet */\n rowCount: number;\n\n /** The total number of columns in the sheet */\n columnCount: number;\n}\n\n/**\n * Structure for updating a single cell in a sheet.\n */\nexport interface ISheetValUpdateCell {\n /** Row index (0-based) */\n row: number;\n\n /** Column index (0-based) */\n col: number;\n\n /** The content to write to the cell */\n content: string;\n}\n\n/**\n * Export type enumeration for sheet export operations.\n */\nexport enum ETypeExport {\n /** Append data to the end of existing data */\n Append = 'Append',\n\n /** Overwrite all existing data starting from row 1 */\n Overwrite = 'Overwrite',\n}\n\n/**\n * Information about a Google Spreadsheet.\n */\nexport interface ISpreadsheetInfo {\n /** The title of the spreadsheet */\n spreadsheetTitle: string;\n\n /** Array of sheet tabs within the spreadsheet */\n sheets: ISheetChildrenInfo[];\n}\n\n/**\n * Parameters for getting sheet information.\n */\nexport interface IGetSheetInfoParams {\n /** The URL of the Google Spreadsheet */\n sheetUrl: string;\n}\n\n/**\n * Parameters for reading values from a sheet.\n */\nexport interface IGetValuesParams {\n /** The URL of the Google Spreadsheet */\n sheetUrl: string;\n\n /** The name of the specific sheet tab to read from */\n sheetName: string;\n\n /** Optional limit on the number of rows to read */\n endRow?: number;\n}\n\n/**\n * Parameters for finding a row index by column value.\n */\nexport interface IGetIdxRowParams {\n /** The URL of the Google Spreadsheet */\n sheetUrl: string;\n\n /** The name of the specific sheet tab */\n sheetName: string;\n\n /** The column name to search in (e.g., \"A\", \"B\", \"AB\") */\n colName: string;\n\n /** The value to search for */\n value: string;\n}\n\n/**\n * Parameters for exporting data to a sheet.\n */\nexport interface IExportParams {\n /** The URL of the Google Spreadsheet */\n sheetUrl: string;\n\n /** The name of the specific sheet tab to write to */\n sheetName: string;\n\n /** Array of column headers */\n listCols: string[];\n\n /** Matrix of data values to export (each inner array is a row) */\n valsExport: string[][];\n\n /** Export type: Append or Overwrite */\n typeExport: ETypeExport;\n}\n\n/**\n * Parameters for updating multiple cells at specific positions.\n */\nexport interface IUpdateMultiCellsParams {\n /** The URL of the Google Spreadsheet */\n sheetUrl: string;\n\n /** The name of the specific sheet tab */\n sheetName: string;\n\n /** Array of cell updates with row, column, and content */\n cells: ISheetValUpdateCell[];\n\n /**\n * Row offset for data rows.\n * - 0: Header at row 1, data starts at row 2 (default)\n * - 1: Header at row 1, skip row 2, data starts at row 3\n */\n rowOffset?: number;\n}\n\n/**\n * Structure for column-value pair when updating multiple columns in a row.\n */\nexport interface IColValuePair {\n /** The content to write */\n content: string;\n\n /** Column index (0-based) */\n col: number;\n}\n\n/**\n * Parameters for updating multiple columns in a single row.\n */\nexport interface IUpdateMultiColsByRowParams {\n /** The URL of the Google Spreadsheet */\n sheetUrl: string;\n\n /** The name of the specific sheet tab */\n sheetName: string;\n\n /** The row index to update (0-based) */\n row: number;\n\n /** Array of column-value pairs to update */\n values: IColValuePair[];\n\n /** Row offset for data rows (default: 0) */\n rowOffset?: number;\n}\n\n/**\n * Structure for row-value pair when updating multiple rows in a column.\n */\nexport interface IRowValuePair {\n /** The content to write */\n content: string;\n\n /** Row index (0-based) */\n row: number;\n}\n\n/**\n * Parameters for updating multiple rows in a single column.\n */\nexport interface IUpdateMultiRowsByColParams {\n /** The URL of the Google Spreadsheet */\n sheetUrl: string;\n\n /** The name of the specific sheet tab */\n sheetName: string;\n\n /** The column index to update (0-based) */\n col: number;\n\n /** Array of row-value pairs to update */\n values: IRowValuePair[];\n\n /** Row offset for data rows (default: 0) */\n rowOffset?: number;\n}\n\n/**\n * Parameters for updating a range of rows and columns.\n */\nexport interface IUpdateMultiRowsMultiColsParams {\n /** The URL of the Google Spreadsheet */\n sheetUrl: string;\n\n /** The name of the specific sheet tab */\n sheetName: string;\n\n /** Matrix of values to write (rows x columns) */\n values: string[][];\n\n /** Starting row index (0-based, default: 0) */\n startRow?: number;\n\n /** Ending row index (0-based, optional) */\n endRow?: number;\n\n /** Starting column index (0-based, default: 0) */\n startCol?: number;\n\n /** Row offset for data rows (default: 0) */\n rowOffset?: number;\n}\n\n/**\n * Parameters for deleting a row from a sheet.\n */\nexport interface IDeleteRowParams {\n /** The URL of the Google Spreadsheet */\n sheetUrl: string;\n\n /** The name of the specific sheet tab */\n sheetName: string;\n\n /** The row index to delete (0-based) */\n row: number;\n\n /** Row offset for data rows (default: 0) */\n rowOffset?: number;\n}\n\n/**\n * Parameters for converting raw sheet values to typed objects.\n */\nexport interface IConvertValueSheetParams<T> {\n /** Raw values from the sheet (2D array) */\n values: string[][] | null | undefined;\n\n /**\n * Row offset to skip before the header row.\n * - 0: First row is the header (default)\n * - 1: First row is skipped, second row is header\n */\n rowOffset?: number;\n}\n\n/**\n * Result structure for column and value extraction.\n */\nexport interface IListColsAndValsExport {\n /** Array of column headers */\n listCols: string[];\n\n /** Matrix of data values */\n valsExport: string[][];\n}\n","/**\n * Google Sheet Feature Library - Utility Functions\n * @description Helper functions for sheet operations, column conversion, and data transformation.\n * @module gg-sheet/utils\n */\n\nimport { IListColsAndValsExport } from './types';\n\n/**\n * Regular expression pattern to extract spreadsheet ID from a Google Sheets URL.\n */\nconst SPREADSHEET_ID_PATTERN = /\\/spreadsheets\\/d\\/([a-zA-Z0-9-_]+)/;\n\n/**\n * Extracts the spreadsheet ID from a Google Sheets URL.\n *\n * @param sheetUrl - The full URL of the Google Spreadsheet\n * @returns The spreadsheet ID or null if not found\n *\n * @example\n * ```typescript\n * const id = getSheetIdFromUrl({\n * sheetUrl: 'https://docs.google.com/spreadsheets/d/1abc123def/edit'\n * });\n * // Returns: '1abc123def'\n * ```\n */\nexport function getSheetIdFromUrl({ sheetUrl }: { sheetUrl: string }): string | null {\n const match = sheetUrl.match(SPREADSHEET_ID_PATTERN);\n\n if (match && match[1]) {\n return match[1];\n }\n\n return null;\n}\n\n/**\n * Converts a 0-based column index to a column letter (e.g., 0 → A, 25 → Z, 26 → AA).\n *\n * @param columnIndex - The 0-based column index\n * @returns The column letter(s) (e.g., \"A\", \"B\", \"AA\", \"AB\")\n *\n * @example\n * ```typescript\n * convertIndexToColumnName({ columnIndex: 0 }); // \"A\"\n * convertIndexToColumnName({ columnIndex: 25 }); // \"Z\"\n * convertIndexToColumnName({ columnIndex: 26 }); // \"AA\"\n * convertIndexToColumnName({ columnIndex: 701 }); // \"ZZ\"\n * ```\n */\nexport function convertIndexToColumnName({ columnIndex }: { columnIndex: number }): string {\n let columnName = '';\n let index = columnIndex;\n\n while (index >= 0) {\n columnName = String.fromCharCode((index % 26) + 'A'.charCodeAt(0)) + columnName;\n index = Math.floor(index / 26) - 1;\n }\n\n return columnName;\n}\n\n/**\n * Converts a column letter to a 0-based column index (e.g., A → 0, Z → 25, AA → 26).\n *\n * @param columnName - The column letter(s) (e.g., \"A\", \"B\", \"AA\")\n * @returns The 0-based column index\n * @throws Error if the column name contains invalid characters\n *\n * @example\n * ```typescript\n * convertColumnNameToIndex({ columnName: 'A' }); // 0\n * convertColumnNameToIndex({ columnName: 'Z' }); // 25\n * convertColumnNameToIndex({ columnName: 'AA' }); // 26\n * convertColumnNameToIndex({ columnName: 'ZZ' }); // 701\n * ```\n */\nexport function convertColumnNameToIndex({ columnName }: { columnName: string }): number {\n // Convert to uppercase to handle both lower and upper case\n const upperColumnName = columnName.toUpperCase().trim();\n\n // Validate input - only accept A-Z characters\n if (!/^[A-Z]+$/.test(upperColumnName)) {\n throw new Error(`Invalid column name: '${columnName}'. Only letters A-Z are allowed.`);\n }\n\n let result = 0;\n\n for (let i = 0; i < upperColumnName.length; i++) {\n const charCode = upperColumnName.charCodeAt(i) - 'A'.charCodeAt(0);\n result = result * 26 + (charCode + 1);\n }\n\n // Convert to 0-based index\n return result - 1;\n}\n\n/**\n * Converts raw sheet values (2D array) into an array of typed objects.\n * Uses the first row (or row at rowOffset) as keys for the objects.\n *\n * @param values - Raw 2D array from sheet\n * @param rowOffset - Number of rows to skip before the header row (default: 0)\n * @returns Array of typed objects, or null if values is null/undefined\n *\n * @example\n * ```typescript\n * const rawData = [\n * ['name', 'age', 'email'],\n * ['John', '30', 'john@example.com'],\n * ['Jane', '25', 'jane@example.com']\n * ];\n *\n * interface Person { name: string; age: string; email: string; }\n *\n * const people = convertValueSheet<Person>({ values: rawData });\n * // Returns: [\n * // { name: 'John', age: '30', email: 'john@example.com' },\n * // { name: 'Jane', age: '25', email: 'jane@example.com' }\n * // ]\n * ```\n */\nexport function convertValueSheet<T>({\n values,\n rowOffset = 0,\n}: {\n values: string[][] | null | undefined;\n rowOffset?: number;\n}): T[] | null {\n if (!values || values.length === 0) {\n return null;\n }\n\n // Get header row (keys for the objects)\n const keys = values[rowOffset];\n\n if (!keys || keys.length === 0) {\n return null;\n }\n\n // Map remaining rows to objects\n return values.slice(rowOffset + 1).map((row) => {\n return keys.reduce((acc, key, index) => {\n (acc as Record<string, string>)[key] = row[index] || '';\n return acc;\n }, {} as T);\n });\n}\n\n/**\n * Gets the index of a column key in the list of keys.\n *\n * @param key - The key to find\n * @param listKeys - Array of all keys\n * @returns The index of the key, or -1 if not found\n *\n * @example\n * ```typescript\n * interface Person { id: string; name: string; email: string; }\n * const keys: (keyof Person)[] = ['id', 'name', 'email'];\n *\n * getIndexCol({ key: 'name', listKeys: keys }); // 1\n * getIndexCol({ key: 'email', listKeys: keys }); // 2\n * ```\n */\nexport function getIndexCol<T>({ key, listKeys }: { key: keyof T; listKeys: (keyof T)[] }): number {\n return listKeys.indexOf(key);\n}\n\n/**\n * Extracts column headers and data values from a result set for export.\n * Takes an object mapping field keys to column names and an array of items.\n *\n * @param colsForSheet - Object mapping field keys to column header names\n * @param resultItems - Array of items to export\n * @returns Object containing listCols (headers) and valsExport (data matrix)\n *\n * @example\n * ```typescript\n * const colsMapping = { id: 'ID', name: 'Full Name', email: 'Email Address' };\n * const items = [\n * { id: '1', name: 'John Doe', email: 'john@example.com' },\n * { id: '2', name: 'Jane Doe', email: 'jane@example.com' }\n * ];\n *\n * const { listCols, valsExport } = getListColsAndValsExport({\n * colsForSheet: colsMapping,\n * resultItems: items\n * });\n * // listCols: ['ID', 'Full Name', 'Email Address']\n * // valsExport: [['1', 'John Doe', 'john@example.com'], ['2', 'Jane Doe', 'jane@example.com']]\n * ```\n */\nexport function getListColsAndValsExport<T extends Record<string, unknown>>({\n colsForSheet,\n resultItems,\n}: {\n colsForSheet: Record<keyof T, string>;\n resultItems: T[];\n}): IListColsAndValsExport {\n // Extract column headers from the mapping values\n const listCols: string[] = Object.values(colsForSheet) as string[];\n\n // Extract data rows\n const valsExport: string[][] = [];\n\n for (const item of resultItems) {\n const row: string[] = [];\n\n // Iterate through colsForSheet keys to ensure correct order\n for (const fieldKey of Object.keys(colsForSheet) as (keyof T)[]) {\n const fieldValue = item[fieldKey];\n\n // Convert value to string, handling different data types\n let cellValue = '';\n\n if (fieldValue === null || fieldValue === undefined) {\n cellValue = '';\n } else if (fieldValue instanceof Date) {\n cellValue = fieldValue.toISOString();\n } else if (typeof fieldValue === 'object') {\n // Handle nested objects (like relations)\n cellValue = JSON.stringify(fieldValue);\n } else {\n cellValue = String(fieldValue);\n }\n\n row.push(cellValue);\n }\n\n valsExport.push(row);\n }\n\n return { listCols, valsExport };\n}\n\n/**\n * Validates that a sheet URL is in the correct format.\n *\n * @param sheetUrl - The URL to validate\n * @returns True if the URL is valid, false otherwise\n *\n * @example\n * ```typescript\n * isValidSheetUrl({ sheetUrl: 'https://docs.google.com/spreadsheets/d/1abc123/edit' }); // true\n * isValidSheetUrl({ sheetUrl: 'https://example.com/sheet' }); // false\n * ```\n */\nexport function isValidSheetUrl({ sheetUrl }: { sheetUrl: string }): boolean {\n return SPREADSHEET_ID_PATTERN.test(sheetUrl);\n}\n\n/**\n * Calculates the actual row index in the sheet based on the data row index and offset.\n * This accounts for header row(s) and any additional offset rows.\n *\n * @param dataRowIndex - The 0-based index in the data (not counting headers)\n * @param rowOffset - Additional rows to skip after the header (default: 0)\n * @returns The 1-based row number in the actual sheet\n *\n * @example\n * ```typescript\n * // With rowOffset=0: header at row 1, data starts at row 2\n * calculateActualRow({ dataRowIndex: 0, rowOffset: 0 }); // 2 (first data row)\n * calculateActualRow({ dataRowIndex: 5, rowOffset: 0 }); // 7 (sixth data row)\n *\n * // With rowOffset=1: header at row 1, skip row 2, data starts at row 3\n * calculateActualRow({ dataRowIndex: 0, rowOffset: 1 }); // 3 (first data row)\n * ```\n */\nexport function calculateActualRow({\n dataRowIndex,\n rowOffset = 0,\n}: {\n dataRowIndex: number;\n rowOffset?: number;\n}): number {\n // Row 1 is header, so data starts at row 2\n // Add 2 for: 0-based to 1-based conversion + header row\n return dataRowIndex + 2 + rowOffset;\n}\n","/**\n * Google Sheet Feature Library - Main Client Class\n * @description A framework-agnostic client for interacting with Google Sheets API.\n * Provides methods for reading, writing, and managing spreadsheet data.\n * @module gg-sheet/google-sheet\n */\n\nimport { google, sheets_v4 } from 'googleapis';\nimport { GoogleSheetConfig } from './config';\nimport {\n IGoogleSheetConfig,\n ISheetChildrenInfo,\n ISpreadsheetInfo,\n ETypeExport,\n IGetSheetInfoParams,\n IGetValuesParams,\n IGetIdxRowParams,\n IExportParams,\n IUpdateMultiCellsParams,\n IUpdateMultiColsByRowParams,\n IUpdateMultiRowsByColParams,\n IUpdateMultiRowsMultiColsParams,\n IDeleteRowParams,\n} from './types';\nimport { getSheetIdFromUrl, convertIndexToColumnName, calculateActualRow } from './utils';\n\n/**\n * Google Sheet Client for managing spreadsheet data.\n *\n * @example\n * ```typescript\n * import { GoogleSheetClient } from 'bodevops-features/gg-sheet';\n *\n * const client = new GoogleSheetClient({\n * keyFilePath: './service-account.json'\n * });\n *\n * // Read data from a sheet\n * const data = await client.getValues({\n * sheetUrl: 'https://docs.google.com/spreadsheets/d/...',\n * sheetName: 'Sheet1'\n * });\n *\n * // Update specific cells\n * await client.updateValuesMultiCells({\n * sheetUrl: 'https://docs.google.com/spreadsheets/d/...',\n * sheetName: 'Sheet1',\n * cells: [\n * { row: 0, col: 0, content: 'Hello' },\n * { row: 0, col: 1, content: 'World' }\n * ]\n * });\n * ```\n */\nexport class GoogleSheetClient {\n private readonly config: GoogleSheetConfig;\n\n /**\n * Creates a new GoogleSheetClient instance.\n *\n * @param configOptions - Configuration options for the Google Sheet client\n */\n constructor(configOptions: IGoogleSheetConfig) {\n this.config = new GoogleSheetConfig(configOptions);\n }\n\n /**\n * Creates and returns an authenticated Google Sheets API client.\n *\n * @returns A Promise that resolves to an authenticated Sheets API client\n */\n private async getSheetsClient(): Promise<sheets_v4.Sheets> {\n const authOptions = this.config.getAuthOptions();\n\n const auth = new google.auth.GoogleAuth({\n keyFile: authOptions.keyFile,\n credentials: authOptions.credentials,\n scopes: authOptions.scopes,\n });\n\n const authClient = await auth.getClient();\n\n return google.sheets({\n version: 'v4',\n auth: authClient as Parameters<typeof google.sheets>[0]['auth'],\n });\n }\n\n /**\n * Extracts the spreadsheet ID from a URL and validates it.\n *\n * @param sheetUrl - The Google Sheets URL\n * @returns The spreadsheet ID\n * @throws Error if the URL is invalid\n */\n private extractSheetId({ sheetUrl }: { sheetUrl: string }): string {\n const sheetId = getSheetIdFromUrl({ sheetUrl });\n\n if (!sheetId) {\n throw new Error(`Invalid Google Sheet URL: ${sheetUrl}`);\n }\n\n return sheetId;\n }\n\n /**\n * Retrieves information about a Google Spreadsheet, including all sheet tabs.\n *\n * @param params - Parameters including the sheet URL\n * @returns A Promise that resolves to spreadsheet information\n *\n * @example\n * ```typescript\n * const info = await client.getSheetInfo({\n * sheetUrl: 'https://docs.google.com/spreadsheets/d/...'\n * });\n * console.log(`Spreadsheet: ${info.spreadsheetTitle}`);\n * console.log(`Sheets: ${info.sheets.map(s => s.title).join(', ')}`);\n * ```\n */\n public async getSheetInfo({ sheetUrl }: IGetSheetInfoParams): Promise<ISpreadsheetInfo> {\n const sheetsInstance = await this.getSheetsClient();\n const spreadsheetId = this.extractSheetId({ sheetUrl });\n\n const response = await sheetsInstance.spreadsheets.get({\n spreadsheetId,\n includeGridData: false,\n });\n\n const spreadsheetTitle = response.data.properties?.title || '';\n const sheets: ISheetChildrenInfo[] =\n response.data.sheets?.map((sheet: sheets_v4.Schema$Sheet) => ({\n title: sheet.properties?.title || '',\n sheetId: sheet.properties?.sheetId || 0,\n rowCount: sheet.properties?.gridProperties?.rowCount || 0,\n columnCount: sheet.properties?.gridProperties?.columnCount || 0,\n })) || [];\n\n return {\n spreadsheetTitle,\n sheets,\n };\n }\n\n /**\n * Reads all values from a specific sheet tab.\n *\n * @param params - Parameters including sheet URL, sheet name, and optional row limit\n * @returns A Promise that resolves to a 2D array of string values\n *\n * @example\n * ```typescript\n * const data = await client.getValues({\n * sheetUrl: 'https://docs.google.com/spreadsheets/d/...',\n * sheetName: 'Sheet1',\n * endRow: 100 // Optional: limit to first 100 rows\n * });\n *\n * for (const row of data) {\n * console.log(row.join(', '));\n * }\n * ```\n */\n public async getValues({ sheetUrl, sheetName, endRow }: IGetValuesParams): Promise<string[][]> {\n const sheetsInstance = await this.getSheetsClient();\n const spreadsheetId = this.extractSheetId({ sheetUrl });\n\n // Get sheet info to determine column count\n const sheetInfo = await this.getSheetInfo({ sheetUrl });\n const sheet = sheetInfo.sheets.find((s) => s.title === sheetName);\n\n if (!sheet) {\n throw new Error(`Sheet not found: ${sheetName}`);\n }\n\n // Build the range\n let range = sheetName;\n\n if (endRow) {\n const endCol = convertIndexToColumnName({\n columnIndex: sheet.columnCount - 1,\n });\n range = `${sheetName}!A1:${endCol}${endRow}`;\n }\n\n const result = await sheetsInstance.spreadsheets.values.get({\n spreadsheetId,\n range,\n });\n\n return (result.data.values as string[][]) || [];\n }\n\n /**\n * Finds the row index (0-based) where a specific value appears in a column.\n *\n * @param params - Parameters including sheet URL, sheet name, column name, and value to find\n * @returns A Promise that resolves to the row index (0-based), or -1 if not found\n *\n * @example\n * ```typescript\n * const rowIndex = await client.getIdxRow({\n * sheetUrl: 'https://docs.google.com/spreadsheets/d/...',\n * sheetName: 'Sheet1',\n * colName: 'A',\n * value: 'John Doe'\n * });\n *\n * if (rowIndex >= 0) {\n * console.log(`Found at row index: ${rowIndex}`);\n * }\n * ```\n */\n public async getIdxRow({\n sheetUrl,\n sheetName,\n colName,\n value,\n }: IGetIdxRowParams): Promise<number> {\n const sheetsInstance = await this.getSheetsClient();\n const spreadsheetId = this.extractSheetId({ sheetUrl });\n\n // Get sheet info to determine row count\n const sheetInfo = await this.getSheetInfo({ sheetUrl });\n const sheet = sheetInfo.sheets.find((s) => s.title === sheetName);\n\n if (!sheet) {\n throw new Error(`Sheet not found: ${sheetName}`);\n }\n\n const range = `${sheetName}!${colName}1:${colName}${sheet.rowCount}`;\n\n const result = await sheetsInstance.spreadsheets.values.get({\n spreadsheetId,\n range,\n });\n\n const values = result.data.values || [];\n\n // Find the index (0-based)\n const index = values.findIndex((row: string[]) => {\n if (!row || row.length === 0) return false;\n return row[0] === value;\n });\n\n return index;\n }\n\n /**\n * Exports data to a Google Sheet with either Append or Overwrite mode.\n *\n * @param params - Export parameters including data and export type\n * @returns A Promise that resolves to true if successful\n *\n * @example\n * ```typescript\n * // Overwrite existing data\n * await client.export({\n * sheetUrl: 'https://docs.google.com/spreadsheets/d/...',\n * sheetName: 'Sheet1',\n * listCols: ['Name', 'Email', 'Age'],\n * valsExport: [\n * ['John', 'john@example.com', '30'],\n * ['Jane', 'jane@example.com', '25']\n * ],\n * typeExport: ETypeExport.Overwrite\n * });\n *\n * // Append to existing data\n * await client.export({\n * sheetUrl: 'https://docs.google.com/spreadsheets/d/...',\n * sheetName: 'Sheet1',\n * listCols: ['Name', 'Email', 'Age'],\n * valsExport: [['New User', 'new@example.com', '28']],\n * typeExport: ETypeExport.Append\n * });\n * ```\n */\n public async export({\n sheetUrl,\n sheetName,\n listCols,\n valsExport,\n typeExport,\n }: IExportParams): Promise<boolean> {\n const sheetsInstance = await this.getSheetsClient();\n const spreadsheetId = this.extractSheetId({ sheetUrl });\n\n if (typeExport === ETypeExport.Overwrite) {\n return this.executeOverwriteExport({\n sheetsInstance,\n spreadsheetId,\n sheetName,\n listCols,\n valsExport,\n });\n } else if (typeExport === ETypeExport.Append) {\n return this.executeAppendExport({\n sheetsInstance,\n spreadsheetId,\n sheetName,\n listCols,\n valsExport,\n });\n } else {\n throw new Error(`Invalid export type: ${typeExport}`);\n }\n }\n\n /**\n * Executes an overwrite export - writes headers and data from row 1.\n */\n private async executeOverwriteExport({\n sheetsInstance,\n spreadsheetId,\n sheetName,\n listCols,\n valsExport,\n }: {\n sheetsInstance: sheets_v4.Sheets;\n spreadsheetId: string;\n sheetName: string;\n listCols: string[];\n valsExport: string[][];\n }): Promise<boolean> {\n // Prepare data matrix: headers + data rows\n const exportData: string[][] = [listCols, ...valsExport];\n\n const numCols = listCols.length;\n const numRows = exportData.length;\n\n // Calculate range: A1 to [LastCol][LastRow]\n const endCol = convertIndexToColumnName({ columnIndex: numCols - 1 });\n const range = `${sheetName}!A1:${endCol}${numRows}`;\n\n await sheetsInstance.spreadsheets.values.batchUpdate({\n spreadsheetId,\n requestBody: {\n valueInputOption: 'RAW',\n data: [\n {\n range,\n values: exportData,\n },\n ],\n },\n });\n\n return true;\n }\n\n /**\n * Executes an append export - finds empty rows and appends data.\n */\n private async executeAppendExport({\n sheetsInstance,\n spreadsheetId,\n sheetName,\n listCols,\n valsExport,\n }: {\n sheetsInstance: sheets_v4.Sheets;\n spreadsheetId: string;\n sheetName: string;\n listCols: string[];\n valsExport: string[][];\n }): Promise<boolean> {\n // Get sheet info to determine max rows\n const sheetInfo = await sheetsInstance.spreadsheets.get({\n spreadsheetId,\n ranges: [sheetName],\n includeGridData: false,\n });\n\n const sheet = sheetInfo.data.sheets?.find(\n (s: sheets_v4.Schema$Sheet) => s.properties?.title === sheetName\n );\n const maxRows = sheet?.properties?.gridProperties?.rowCount || 1000;\n\n // Read current data to find the last used row\n const readRange = `${sheetName}!A1:A${maxRows}`;\n const readResponse = await sheetsInstance.spreadsheets.values.get({\n spreadsheetId,\n range: readRange,\n });\n\n const currentData = readResponse.data.values || [];\n\n // Find the first empty row (last row with data + 1)\n let startRow = 1;\n\n if (currentData.length > 0) {\n let lastUsedRow = 0;\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (\n currentData[i] &&\n currentData[i].length > 0 &&\n currentData[i][0] &&\n String(currentData[i][0]).trim() !== ''\n ) {\n lastUsedRow = i + 1;\n break;\n }\n }\n startRow = lastUsedRow + 1;\n }\n\n // Check if we need to write headers\n let dataToWrite = valsExport;\n const writeStartRow = startRow;\n\n // If sheet is empty, include headers\n if (startRow === 1) {\n dataToWrite = [listCols, ...valsExport];\n }\n\n // Calculate range for writing\n const numCols = listCols.length;\n const numRows = dataToWrite.length;\n const endCol = convertIndexToColumnName({ columnIndex: numCols - 1 });\n const endRow = writeStartRow + numRows - 1;\n const writeRange = `${sheetName}!A${writeStartRow}:${endCol}${endRow}`;\n\n await sheetsInstance.spreadsheets.values.batchUpdate({\n spreadsheetId,\n requestBody: {\n valueInputOption: 'RAW',\n data: [\n {\n range: writeRange,\n values: dataToWrite,\n },\n ],\n },\n });\n\n return true;\n }\n\n /**\n * Updates multiple cells at specific row and column positions.\n *\n * @param params - Update parameters including cells to update\n * @returns A Promise that resolves to true if successful\n *\n * @example\n * ```typescript\n * await client.updateValuesMultiCells({\n * sheetUrl: 'https://docs.google.com/spreadsheets/d/...',\n * sheetName: 'Sheet1',\n * cells: [\n * { row: 0, col: 0, content: 'Updated A2' },\n * { row: 1, col: 1, content: 'Updated B3' },\n * { row: 2, col: 2, content: 'Updated C4' }\n * ],\n * rowOffset: 0 // Header at row 1, data starts at row 2\n * });\n * ```\n */\n public async updateValuesMultiCells({\n sheetUrl,\n sheetName,\n cells,\n rowOffset = 0,\n }: IUpdateMultiCellsParams): Promise<boolean> {\n if (!cells || cells.length === 0) {\n throw new Error('No cells provided for update');\n }\n\n const sheetsInstance = await this.getSheetsClient();\n const spreadsheetId = this.extractSheetId({ sheetUrl });\n\n // Create update requests for each cell\n const requests = cells.map((cell) => {\n const colName = convertIndexToColumnName({ columnIndex: cell.col });\n const actualRow = calculateActualRow({\n dataRowIndex: cell.row,\n rowOffset,\n });\n const sheetRange = `${sheetName}!${colName}${actualRow}`;\n\n return {\n range: sheetRange,\n values: [[cell.content]],\n };\n });\n\n await sheetsInstance.spreadsheets.values.batchUpdate({\n spreadsheetId,\n requestBody: {\n valueInputOption: 'RAW',\n data: requests,\n },\n });\n\n return true;\n }\n\n /**\n * Updates multiple columns in a single row.\n *\n * @param params - Update parameters including row and column values\n * @returns A Promise that resolves to true if successful\n *\n * @example\n * ```typescript\n * await client.updateValuesMultiColsByRow({\n * sheetUrl: 'https://docs.google.com/spreadsheets/d/...',\n * sheetName: 'Sheet1',\n * row: 5,\n * values: [\n * { col: 0, content: 'Value for A7' },\n * { col: 1, content: 'Value for B7' },\n * { col: 2, content: 'Value for C7' }\n * ]\n * });\n * ```\n */\n public async updateValuesMultiColsByRow({\n sheetUrl,\n sheetName,\n row,\n values,\n rowOffset = 0,\n }: IUpdateMultiColsByRowParams): Promise<boolean> {\n if (!values || values.length === 0) {\n throw new Error('No values provided for update');\n }\n\n const sheetsInstance = await this.getSheetsClient();\n const spreadsheetId = this.extractSheetId({ sheetUrl });\n\n const actualRow = calculateActualRow({ dataRowIndex: row, rowOffset });\n\n const requests = values.map((valPair) => {\n const colName = convertIndexToColumnName({ columnIndex: valPair.col });\n const sheetRange = `${sheetName}!${colName}${actualRow}`;\n\n return {\n range: sheetRange,\n values: [[valPair.content]],\n };\n });\n\n await sheetsInstance.spreadsheets.values.batchUpdate({\n spreadsheetId,\n requestBody: {\n valueInputOption: 'RAW',\n data: requests,\n },\n });\n\n return true;\n }\n\n /**\n * Updates multiple rows in a single column.\n *\n * @param params - Update parameters including column and row values\n * @returns A Promise that resolves to true if successful\n *\n * @example\n * ```typescript\n * await client.updateValuesMultiRowsByCol({\n * sheetUrl: 'https://docs.google.com/spreadsheets/d/...',\n * sheetName: 'Sheet1',\n * col: 2,\n * values: [\n * { row: 0, content: 'Row 1 Col C' },\n * { row: 1, content: 'Row 2 Col C' },\n * { row: 2, content: 'Row 3 Col C' }\n * ]\n * });\n * ```\n */\n public async updateValuesMultiRowsByCol({\n sheetUrl,\n sheetName,\n col,\n values,\n rowOffset = 0,\n }: IUpdateMultiRowsByColParams): Promise<boolean> {\n if (!values || values.length === 0) {\n throw new Error('No values provided for update');\n }\n\n const sheetsInstance = await this.getSheetsClient();\n const spreadsheetId = this.extractSheetId({ sheetUrl });\n\n const colName = convertIndexToColumnName({ columnIndex: col });\n\n const requests = values.map((valPair) => {\n const actualRow = calculateActualRow({\n dataRowIndex: valPair.row,\n rowOffset,\n });\n const sheetRange = `${sheetName}!${colName}${actualRow}`;\n\n return {\n range: sheetRange,\n values: [[valPair.content]],\n };\n });\n\n await sheetsInstance.spreadsheets.values.batchUpdate({\n spreadsheetId,\n requestBody: {\n valueInputOption: 'RAW',\n data: requests,\n },\n });\n\n return true;\n }\n\n /**\n * Updates a range of multiple rows and columns at once.\n *\n * @param params - Update parameters including value matrix\n * @returns A Promise that resolves to true if successful\n *\n * @example\n * ```typescript\n * await client.updateValuesMultiRowsMultiCols({\n * sheetUrl: 'https://docs.google.com/spreadsheets/d/...',\n * sheetName: 'Sheet1',\n * values: [\n * ['A1', 'B1', 'C1'],\n * ['A2', 'B2', 'C2'],\n * ['A3', 'B3', 'C3']\n * ],\n * startRow: 0,\n * startCol: 0\n * });\n * ```\n */\n public async updateValuesMultiRowsMultiCols({\n sheetUrl,\n sheetName,\n values,\n startRow = 0,\n endRow,\n startCol = 0,\n rowOffset = 0,\n }: IUpdateMultiRowsMultiColsParams): Promise<boolean> {\n if (!values || values.length === 0 || values[0].length === 0) {\n throw new Error('Invalid values matrix: no data to update');\n }\n\n const sheetsInstance = await this.getSheetsClient();\n const spreadsheetId = this.extractSheetId({ sheetUrl });\n\n const numRows = values.length;\n const numCols = values[0].length;\n\n const startColName = convertIndexToColumnName({ columnIndex: startCol });\n const endColName = convertIndexToColumnName({\n columnIndex: startCol + numCols - 1,\n });\n\n const startRowIndex = calculateActualRow({\n dataRowIndex: startRow,\n rowOffset,\n });\n\n let endRowIndex: number;\n if (endRow !== undefined) {\n endRowIndex = calculateActualRow({ dataRowIndex: endRow, rowOffset });\n } else {\n endRowIndex = startRowIndex + numRows - 1;\n }\n\n const sheetRange = `${sheetName}!${startColName}${startRowIndex}:${endColName}${endRowIndex}`;\n\n await sheetsInstance.spreadsheets.values.batchUpdate({\n spreadsheetId,\n requestBody: {\n valueInputOption: 'RAW',\n data: [\n {\n range: sheetRange,\n values,\n },\n ],\n },\n });\n\n return true;\n }\n\n /**\n * Deletes a row from a sheet.\n *\n * @param params - Delete parameters including row index\n * @returns A Promise that resolves to true if successful\n *\n * @example\n * ```typescript\n * await client.deleteRowSheet({\n * sheetUrl: 'https://docs.google.com/spreadsheets/d/...',\n * sheetName: 'Sheet1',\n * row: 5 // Delete data row at index 5\n * });\n * ```\n */\n public async deleteRowSheet({\n sheetUrl,\n sheetName,\n row,\n rowOffset = 0,\n }: IDeleteRowParams): Promise<boolean> {\n const sheetsInstance = await this.getSheetsClient();\n const spreadsheetId = this.extractSheetId({ sheetUrl });\n\n // Get sheet ID\n const sheetInfo = await sheetsInstance.spreadsheets.get({\n spreadsheetId,\n ranges: [sheetName],\n includeGridData: false,\n });\n\n const sheet = sheetInfo.data.sheets?.find(\n (s: sheets_v4.Schema$Sheet) => s.properties?.title === sheetName\n );\n\n const sheetId = sheet?.properties?.sheetId;\n\n if (sheetId === undefined || sheetId === null) {\n throw new Error(`Sheet not found: ${sheetName}`);\n }\n\n // Calculate actual row index\n // +1 for header row, +rowOffset\n const actualRowIndex = row + 1 + rowOffset;\n\n const request = {\n deleteDimension: {\n range: {\n sheetId,\n dimension: 'ROWS',\n startIndex: actualRowIndex,\n endIndex: actualRowIndex + 1,\n },\n },\n };\n\n await sheetsInstance.spreadsheets.batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: [request],\n },\n });\n\n return true;\n }\n}\n","/**\n * Google Sheet Feature Library\n * @description A framework-agnostic library for interacting with Google Sheets API.\n * Provides easy-to-use methods for reading, writing, and managing spreadsheet data.\n * @module gg-sheet\n *\n * @example\n * ```typescript\n * import { GoogleSheetClient, ETypeExport } from 'bodevops-features/gg-sheet';\n *\n * const client = new GoogleSheetClient({\n * keyFilePath: './service-account.json'\n * });\n *\n * // Read data from a sheet\n * const data = await client.getValues({\n * sheetUrl: 'https://docs.google.com/spreadsheets/d/...',\n * sheetName: 'Sheet1'\n * });\n *\n * // Export data\n * await client.export({\n * sheetUrl: 'https://docs.google.com/spreadsheets/d/...',\n * sheetName: 'Sheet1',\n * listCols: ['Name', 'Email'],\n * valsExport: [['John', 'john@example.com']],\n * typeExport: ETypeExport.Append\n * });\n * ```\n */\n\n// Export main client class\nexport { GoogleSheetClient } from './google-sheet';\n\n// Export configuration class\nexport { GoogleSheetConfig, DEFAULT_SHEET_SCOPES } from './config';\n\n// Export all types\nexport type {\n IGoogleSheetConfig,\n IGoogleServiceAccountCredentials,\n ISheetChildrenInfo,\n ISheetValUpdateCell,\n ISpreadsheetInfo,\n IGetSheetInfoParams,\n IGetValuesParams,\n IGetIdxRowParams,\n IExportParams,\n IUpdateMultiCellsParams,\n IColValuePair,\n IUpdateMultiColsByRowParams,\n IRowValuePair,\n IUpdateMultiRowsByColParams,\n IUpdateMultiRowsMultiColsParams,\n IDeleteRowParams,\n IConvertValueSheetParams,\n IListColsAndValsExport,\n} from './types';\n\n// Export enum\nexport { ETypeExport } from './types';\n\n// Export utility functions\nexport {\n getSheetIdFromUrl,\n convertIndexToColumnName,\n convertColumnNameToIndex,\n convertValueSheet,\n getIndexCol,\n getListColsAndValsExport,\n isValidSheetUrl,\n calculateActualRow,\n} from './utils';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Drive Feature Library - Configuration Module
|
|
3
|
+
* @description Configuration management for Google Drive client initialization and authentication.
|
|
4
|
+
* @module gg-drive/config
|
|
5
|
+
*/
|
|
6
|
+
import { IGoogleDriveConfig, IGoogleServiceAccountCredentials } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Default OAuth scopes required for Google Drive operations.
|
|
9
|
+
* These scopes provide full access to Drive files.
|
|
10
|
+
*/
|
|
11
|
+
export declare const DEFAULT_DRIVE_SCOPES: string[];
|
|
12
|
+
/**
|
|
13
|
+
* Google Drive Configuration Manager.
|
|
14
|
+
* Handles validation and normalization of configuration options for the Google Drive client.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // Using key file path
|
|
19
|
+
* const config = new GoogleDriveConfig({
|
|
20
|
+
* keyFilePath: './service-account.json'
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* // Using credentials object
|
|
24
|
+
* const config = new GoogleDriveConfig({
|
|
25
|
+
* credentials: {
|
|
26
|
+
* type: 'service_account',
|
|
27
|
+
* project_id: 'my-project',
|
|
28
|
+
* private_key: '-----BEGIN PRIVATE KEY-----\n...',
|
|
29
|
+
* client_email: 'service-account@my-project.iam.gserviceaccount.com',
|
|
30
|
+
* // ... other fields
|
|
31
|
+
* }
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare class GoogleDriveConfig {
|
|
36
|
+
/** Path to the service account key file */
|
|
37
|
+
readonly keyFilePath?: string;
|
|
38
|
+
/** Service account credentials object */
|
|
39
|
+
readonly credentials?: IGoogleServiceAccountCredentials;
|
|
40
|
+
/** OAuth scopes for Google Drive API */
|
|
41
|
+
readonly scopes: string[];
|
|
42
|
+
/**
|
|
43
|
+
* Creates a new GoogleDriveConfig instance.
|
|
44
|
+
*
|
|
45
|
+
* @param config - Configuration options for Google Drive client
|
|
46
|
+
* @throws Error if neither keyFilePath nor credentials is provided
|
|
47
|
+
*/
|
|
48
|
+
constructor({ keyFilePath, credentials, scopes }: IGoogleDriveConfig);
|
|
49
|
+
/**
|
|
50
|
+
* Validates that the credentials object contains all required fields.
|
|
51
|
+
*
|
|
52
|
+
* @param credentials - The credentials object to validate
|
|
53
|
+
* @throws Error if required fields are missing
|
|
54
|
+
*/
|
|
55
|
+
private validateCredentials;
|
|
56
|
+
/**
|
|
57
|
+
* Returns the authentication configuration object suitable for googleapis.
|
|
58
|
+
*
|
|
59
|
+
* @returns Authentication options for Google Auth
|
|
60
|
+
*/
|
|
61
|
+
getAuthOptions(): {
|
|
62
|
+
keyFile?: string;
|
|
63
|
+
credentials?: IGoogleServiceAccountCredentials;
|
|
64
|
+
scopes: string[];
|
|
65
|
+
};
|
|
66
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Drive Feature Library - Main Client Class
|
|
3
|
+
* @description A framework-agnostic client for interacting with Google Drive API.
|
|
4
|
+
* Provides methods for file upload, download, sharing, and storage management.
|
|
5
|
+
* @module gg-drive/google-drive
|
|
6
|
+
*/
|
|
7
|
+
import { IGoogleDriveConfig, IUploadFileResult, IFileInfo, IStorageInfo, IUploadFileParams, IUploadFileAndShareParams, IListFilesParams, IDeleteFileParams, IMakeFilePublicParams, ITransferOwnershipParams, IShareFolderParams, IGetFolderIdParams, IFileExistsParams } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Google Drive Client for managing files and folders in Google Drive.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { GoogleDriveClient } from 'bodevops-features/gg-drive';
|
|
14
|
+
*
|
|
15
|
+
* const client = new GoogleDriveClient({
|
|
16
|
+
* keyFilePath: './service-account.json'
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* // Get storage information
|
|
20
|
+
* const storage = await client.getStorageInfo();
|
|
21
|
+
* console.log(`Used: ${storage.formattedUsed} of ${storage.formattedTotal}`);
|
|
22
|
+
*
|
|
23
|
+
* // Upload a file
|
|
24
|
+
* const result = await client.uploadFile({
|
|
25
|
+
* localFilePath: './document.pdf',
|
|
26
|
+
* driveFolder: 'MyFolder/Documents',
|
|
27
|
+
* fileName: 'my-document.pdf'
|
|
28
|
+
* });
|
|
29
|
+
* console.log(`Uploaded: ${result.webViewLink}`);
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare class GoogleDriveClient {
|
|
33
|
+
private readonly config;
|
|
34
|
+
/**
|
|
35
|
+
* Creates a new GoogleDriveClient instance.
|
|
36
|
+
*
|
|
37
|
+
* @param configOptions - Configuration options for the Google Drive client
|
|
38
|
+
*/
|
|
39
|
+
constructor(configOptions: IGoogleDriveConfig);
|
|
40
|
+
/**
|
|
41
|
+
* Creates and returns an authenticated Google Drive API client.
|
|
42
|
+
*
|
|
43
|
+
* @returns A Promise that resolves to an authenticated Drive API client
|
|
44
|
+
*/
|
|
45
|
+
private getDriveClient;
|
|
46
|
+
/**
|
|
47
|
+
* Retrieves storage quota information for the Google Drive account.
|
|
48
|
+
*
|
|
49
|
+
* @returns A Promise that resolves to storage information including used/total space
|
|
50
|
+
* @throws Error if unable to retrieve storage information
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const storage = await client.getStorageInfo();
|
|
55
|
+
* console.log(`Storage: ${storage.formattedUsed} / ${storage.formattedTotal} (${storage.percentage}%)`);
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
getStorageInfo(): Promise<IStorageInfo>;
|
|
59
|
+
/**
|
|
60
|
+
* Gets an existing folder by name or creates it if it doesn't exist.
|
|
61
|
+
*
|
|
62
|
+
* @param folderName - The name of the folder to find or create
|
|
63
|
+
* @param parentId - The ID of the parent folder (default: 'root')
|
|
64
|
+
* @returns A Promise that resolves to the folder ID
|
|
65
|
+
*/
|
|
66
|
+
private getOrCreateFolder;
|
|
67
|
+
/**
|
|
68
|
+
* Creates a folder hierarchy from a path string (e.g., "a/b/c") and returns the ID of the final folder.
|
|
69
|
+
*
|
|
70
|
+
* @param folderPath - The folder path to create (e.g., "folder1/folder2/folder3")
|
|
71
|
+
* @returns A Promise that resolves to the ID of the innermost folder
|
|
72
|
+
*/
|
|
73
|
+
private createFolderHierarchy;
|
|
74
|
+
/**
|
|
75
|
+
* Uploads a file to Google Drive and automatically makes it public.
|
|
76
|
+
*
|
|
77
|
+
* @param params - Upload parameters including local file path and destination folder
|
|
78
|
+
* @returns A Promise that resolves to the upload result containing file ID and links
|
|
79
|
+
* @throws Error if the local file doesn't exist or upload fails
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const result = await client.uploadFile({
|
|
84
|
+
* localFilePath: './document.pdf',
|
|
85
|
+
* driveFolder: 'MyFolder/Documents',
|
|
86
|
+
* fileName: 'my-document.pdf' // Optional
|
|
87
|
+
* });
|
|
88
|
+
* console.log(`View at: ${result.webViewLink}`);
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
uploadFile({ localFilePath, driveFolder, fileName, }: IUploadFileParams): Promise<IUploadFileResult>;
|
|
92
|
+
/**
|
|
93
|
+
* Uploads a file and shares it with a specified email address.
|
|
94
|
+
*
|
|
95
|
+
* @param params - Upload and share parameters
|
|
96
|
+
* @returns A Promise that resolves to the upload result
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const result = await client.uploadFileAndShare({
|
|
101
|
+
* localFilePath: './report.pdf',
|
|
102
|
+
* driveFolder: 'SharedReports',
|
|
103
|
+
* shareWithEmail: 'colleague@example.com',
|
|
104
|
+
* role: 'writer'
|
|
105
|
+
* });
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
uploadFileAndShare({ localFilePath, driveFolder, fileName, shareWithEmail, role, }: IUploadFileAndShareParams): Promise<IUploadFileResult>;
|
|
109
|
+
/**
|
|
110
|
+
* Deletes a file from Google Drive.
|
|
111
|
+
* Note: Only the file owner can delete the file.
|
|
112
|
+
*
|
|
113
|
+
* @param params - Delete parameters including file ID
|
|
114
|
+
* @returns A Promise that resolves to true if deletion was successful
|
|
115
|
+
* @throws Error if deletion fails (e.g., permission denied)
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```typescript
|
|
119
|
+
* await client.deleteFile({ fileId: '1abc123def456' });
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
deleteFile({ fileId }: IDeleteFileParams): Promise<boolean>;
|
|
123
|
+
/**
|
|
124
|
+
* Lists all files and folders in a specified folder.
|
|
125
|
+
*
|
|
126
|
+
* @param params - List parameters including folder ID
|
|
127
|
+
* @returns A Promise that resolves to an array of file information objects
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```typescript
|
|
131
|
+
* const files = await client.listFilesInFolder({ folderId: 'root' });
|
|
132
|
+
* for (const file of files) {
|
|
133
|
+
* console.log(`${file.name} (${file.mimeType})`);
|
|
134
|
+
* }
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
listFilesInFolder({ folderId }?: IListFilesParams): Promise<IFileInfo[]>;
|
|
138
|
+
/**
|
|
139
|
+
* Makes a file publicly accessible to anyone with the link.
|
|
140
|
+
*
|
|
141
|
+
* @param params - Parameters including file ID
|
|
142
|
+
* @returns A Promise that resolves to true if successful
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* ```typescript
|
|
146
|
+
* await client.makeFilePublic({ fileId: '1abc123def456' });
|
|
147
|
+
* // File is now accessible via its webViewLink
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
makeFilePublic({ fileId }: IMakeFilePublicParams): Promise<boolean>;
|
|
151
|
+
/**
|
|
152
|
+
* Transfers ownership of a file to another user.
|
|
153
|
+
*
|
|
154
|
+
* @param params - Transfer parameters including file ID and new owner email
|
|
155
|
+
* @returns A Promise that resolves to true if successful
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* await client.transferFileOwnership({
|
|
160
|
+
* fileId: '1abc123def456',
|
|
161
|
+
* newOwnerEmail: 'newowner@example.com'
|
|
162
|
+
* });
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
transferFileOwnership({ fileId, newOwnerEmail, role, }: ITransferOwnershipParams): Promise<boolean>;
|
|
166
|
+
/**
|
|
167
|
+
* Shares a folder with a specified email address.
|
|
168
|
+
*
|
|
169
|
+
* @param params - Share parameters including folder ID, email, and role
|
|
170
|
+
* @returns A Promise that resolves to true if successful
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* ```typescript
|
|
174
|
+
* await client.shareFolderWithEmail({
|
|
175
|
+
* folderId: '1abc123def456',
|
|
176
|
+
* emailAddress: 'user@example.com',
|
|
177
|
+
* role: 'writer'
|
|
178
|
+
* });
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
shareFolderWithEmail({ folderId, emailAddress, role, }: IShareFolderParams): Promise<boolean>;
|
|
182
|
+
/**
|
|
183
|
+
* Gets a folder ID by its path, creating the folder hierarchy if it doesn't exist.
|
|
184
|
+
*
|
|
185
|
+
* @param params - Parameters including folder path
|
|
186
|
+
* @returns A Promise that resolves to the folder ID
|
|
187
|
+
*
|
|
188
|
+
* @example
|
|
189
|
+
* ```typescript
|
|
190
|
+
* const folderId = await client.getFolderIdByPath({
|
|
191
|
+
* folderPath: 'folder1/folder2/folder3'
|
|
192
|
+
* });
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
getFolderIdByPath({ folderPath }: IGetFolderIdParams): Promise<string>;
|
|
196
|
+
/**
|
|
197
|
+
* Checks if a file with the specified name exists in a folder.
|
|
198
|
+
*
|
|
199
|
+
* @param params - Parameters including file name and folder ID
|
|
200
|
+
* @returns A Promise that resolves to the file ID if found, or null if not found
|
|
201
|
+
*
|
|
202
|
+
* @example
|
|
203
|
+
* ```typescript
|
|
204
|
+
* const fileId = await client.fileExistsInFolder({
|
|
205
|
+
* fileName: 'document.pdf',
|
|
206
|
+
* folderId: 'root'
|
|
207
|
+
* });
|
|
208
|
+
* if (fileId) {
|
|
209
|
+
* console.log(`File exists with ID: ${fileId}`);
|
|
210
|
+
* }
|
|
211
|
+
* ```
|
|
212
|
+
*/
|
|
213
|
+
fileExistsInFolder({ fileName, folderId, }: IFileExistsParams): Promise<string | null>;
|
|
214
|
+
}
|
|
@@ -1 +1,29 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Google Drive Feature Library
|
|
3
|
+
* @description A framework-agnostic library for interacting with Google Drive API.
|
|
4
|
+
* Provides easy-to-use methods for file upload, sharing, and storage management.
|
|
5
|
+
* @module gg-drive
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { GoogleDriveClient } from 'bodevops-features/gg-drive';
|
|
10
|
+
*
|
|
11
|
+
* const client = new GoogleDriveClient({
|
|
12
|
+
* keyFilePath: './service-account.json'
|
|
13
|
+
* });
|
|
14
|
+
*
|
|
15
|
+
* // Upload a file
|
|
16
|
+
* const result = await client.uploadFile({
|
|
17
|
+
* localFilePath: './document.pdf',
|
|
18
|
+
* driveFolder: 'MyFolder/Documents'
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* // Get storage info
|
|
22
|
+
* const storage = await client.getStorageInfo();
|
|
23
|
+
* console.log(`Used: ${storage.formattedUsed}`);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export { GoogleDriveClient } from './google-drive';
|
|
27
|
+
export { GoogleDriveConfig, DEFAULT_DRIVE_SCOPES } from './config';
|
|
28
|
+
export type { IGoogleDriveConfig, IGoogleServiceAccountCredentials, IUploadFileResult, IFileInfo, IStorageInfo, TRoleShare, IUploadFileParams, IUploadFileAndShareParams, IListFilesParams, IDeleteFileParams, IMakeFilePublicParams, ITransferOwnershipParams, IShareFolderParams, IGetFolderIdParams, IFileExistsParams, } from './types';
|
|
29
|
+
export { formatBytes, normalizeFilePath, validateFileExists, getFileInfo, parseFolderPath, createFileReadStream, } from './utils';
|