@ariadng/sheets 0.4.0 → 0.4.2

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.
Files changed (47) hide show
  1. package/dist/cli.cjs +1610 -0
  2. package/dist/cli.cjs.map +1 -0
  3. package/dist/cli.d.cts +1 -0
  4. package/dist/cli.d.ts +0 -6
  5. package/dist/cli.js +1318 -595
  6. package/dist/cli.js.map +1 -1
  7. package/dist/index.cjs +858 -0
  8. package/dist/index.cjs.map +1 -0
  9. package/dist/index.d.cts +356 -0
  10. package/dist/index.d.ts +355 -10
  11. package/dist/index.js +810 -11
  12. package/dist/index.js.map +1 -1
  13. package/package.json +5 -3
  14. package/dist/api/index.d.ts +0 -60
  15. package/dist/api/index.d.ts.map +0 -1
  16. package/dist/api/index.js +0 -347
  17. package/dist/api/index.js.map +0 -1
  18. package/dist/auth/constants.d.ts +0 -13
  19. package/dist/auth/constants.d.ts.map +0 -1
  20. package/dist/auth/constants.js +0 -21
  21. package/dist/auth/constants.js.map +0 -1
  22. package/dist/auth/index.d.ts +0 -13
  23. package/dist/auth/index.d.ts.map +0 -1
  24. package/dist/auth/index.js +0 -22
  25. package/dist/auth/index.js.map +0 -1
  26. package/dist/auth/oauth.d.ts +0 -32
  27. package/dist/auth/oauth.d.ts.map +0 -1
  28. package/dist/auth/oauth.js +0 -80
  29. package/dist/auth/oauth.js.map +0 -1
  30. package/dist/auth/service-account.d.ts +0 -18
  31. package/dist/auth/service-account.d.ts.map +0 -1
  32. package/dist/auth/service-account.js +0 -92
  33. package/dist/auth/service-account.js.map +0 -1
  34. package/dist/auth/user-auth.d.ts +0 -24
  35. package/dist/auth/user-auth.d.ts.map +0 -1
  36. package/dist/auth/user-auth.js +0 -230
  37. package/dist/auth/user-auth.js.map +0 -1
  38. package/dist/cli.d.ts.map +0 -1
  39. package/dist/http/index.d.ts +0 -19
  40. package/dist/http/index.d.ts.map +0 -1
  41. package/dist/http/index.js +0 -68
  42. package/dist/http/index.js.map +0 -1
  43. package/dist/index.d.ts.map +0 -1
  44. package/dist/types/index.d.ts +0 -200
  45. package/dist/types/index.d.ts.map +0 -1
  46. package/dist/types/index.js +0 -16
  47. package/dist/types/index.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO;AACP,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,kBAAkB,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGrI,OAAO;AACP,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAkD7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"sources":["../src/types/index.ts","../src/http/index.ts","../src/auth/constants.ts","../src/auth/oauth.ts","../src/auth/service-account.ts","../src/auth/user-auth.ts","../src/auth/index.ts","../src/api/index.ts"],"sourcesContent":["/**\n * Google Sheets API Type Definitions\n */\n\n// === Grid Properties ===\n\nexport interface GridProperties {\n rowCount: number;\n columnCount: number;\n frozenRowCount?: number;\n frozenColumnCount?: number;\n hideGridlines?: boolean;\n}\n\n// === Sheet Properties ===\n\nexport interface SheetProperties {\n sheetId: number;\n title: string;\n index: number;\n sheetType?: 'GRID' | 'OBJECT' | 'DATA_SOURCE';\n gridProperties?: GridProperties;\n hidden?: boolean;\n rightToLeft?: boolean;\n}\n\n// === Spreadsheet ===\n\nexport interface SpreadsheetProperties {\n title: string;\n locale?: string;\n timeZone?: string;\n autoRecalc?: 'ON_CHANGE' | 'MINUTE' | 'HOUR';\n defaultFormat?: CellFormat;\n}\n\nexport interface Spreadsheet {\n spreadsheetId: string;\n properties: SpreadsheetProperties;\n sheets: { properties: SheetProperties }[];\n spreadsheetUrl?: string;\n}\n\n// === Cell Format ===\n\nexport interface CellFormat {\n numberFormat?: {\n type: string;\n pattern?: string;\n };\n backgroundColor?: Color;\n textFormat?: TextFormat;\n}\n\nexport interface Color {\n red?: number;\n green?: number;\n blue?: number;\n alpha?: number;\n}\n\nexport interface TextFormat {\n foregroundColor?: Color;\n fontFamily?: string;\n fontSize?: number;\n bold?: boolean;\n italic?: boolean;\n strikethrough?: boolean;\n underline?: boolean;\n}\n\n// === Cell Value ===\n\nexport interface CellValue {\n value: string | number | boolean | null;\n formula?: string;\n formattedValue?: string;\n}\n\n// === Value Range ===\n\nexport type ValueRenderOption = 'FORMATTED_VALUE' | 'UNFORMATTED_VALUE' | 'FORMULA';\nexport type DateTimeRenderOption = 'SERIAL_NUMBER' | 'FORMATTED_STRING';\nexport type MajorDimension = 'ROWS' | 'COLUMNS';\n\nexport interface ValueRange {\n range: string;\n majorDimension: MajorDimension;\n values: CellValue[][];\n}\n\nexport interface GetValuesOptions {\n valueRenderOption?: ValueRenderOption;\n dateTimeRenderOption?: DateTimeRenderOption;\n majorDimension?: MajorDimension;\n}\n\nexport interface BatchGetValuesResponse {\n spreadsheetId: string;\n valueRanges: ValueRange[];\n}\n\n// === Clear Values ===\n\nexport interface ClearValuesResponse {\n spreadsheetId: string;\n clearedRange: string;\n}\n\nexport interface BatchClearValuesResponse {\n spreadsheetId: string;\n clearedRanges: string[];\n}\n\n// === Write Values ===\n\nexport type ValueInputOption = 'RAW' | 'USER_ENTERED';\nexport type InsertDataOption = 'OVERWRITE' | 'INSERT_ROWS';\nexport type RawCellValue = string | number | boolean | null;\n\nexport interface UpdateValuesOptions {\n valueInputOption?: ValueInputOption;\n majorDimension?: MajorDimension;\n includeValuesInResponse?: boolean;\n responseValueRenderOption?: ValueRenderOption;\n responseDateTimeRenderOption?: DateTimeRenderOption;\n}\n\nexport interface AppendValuesOptions extends UpdateValuesOptions {\n insertDataOption?: InsertDataOption;\n}\n\nexport interface UpdateValuesResponse {\n spreadsheetId: string;\n updatedRange: string;\n updatedRows: number;\n updatedColumns: number;\n updatedCells: number;\n updatedData?: ValueRange;\n}\n\nexport interface BatchUpdateValuesResponse {\n spreadsheetId: string;\n totalUpdatedRows: number;\n totalUpdatedColumns: number;\n totalUpdatedCells: number;\n totalUpdatedSheets: number;\n responses: UpdateValuesResponse[];\n}\n\nexport interface AppendValuesResponse {\n spreadsheetId: string;\n tableRange?: string;\n updates: UpdateValuesResponse;\n}\n\n// === Search Values ===\n\nexport interface SearchMatch {\n sheet: string;\n sheetId: number;\n address: string;\n row: number;\n column: number;\n value: string | number | boolean | null;\n}\n\nexport interface SearchOptions {\n range?: string;\n sheetIndex?: number;\n gid?: number;\n caseSensitive?: boolean;\n exactMatch?: boolean;\n regex?: boolean;\n limit?: number;\n}\n\nexport interface SearchResult {\n query: string;\n matchType: 'contains' | 'exact' | 'regex';\n caseSensitive: boolean;\n totalMatches: number;\n matches: SearchMatch[];\n}\n\n// === Authentication ===\n\nexport interface OAuthConfig {\n type: 'oauth';\n accessToken: string;\n refreshToken?: string;\n clientId?: string;\n clientSecret?: string;\n expiresAt?: number; // Unix timestamp in ms when access token expires\n}\n\nexport interface ServiceAccountConfig {\n type: 'service-account';\n credentialsPath?: string;\n credentials?: ServiceAccountCredentials;\n}\n\nexport interface ServiceAccountCredentials {\n type: 'service_account';\n project_id: string;\n private_key_id: string;\n private_key: string;\n client_email: string;\n client_id: string;\n auth_uri: string;\n token_uri: string;\n}\n\nexport interface UserAuthConfig {\n type: 'user';\n}\n\nexport interface StoredTokens {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n email?: string;\n}\n\nexport type AuthConfig = OAuthConfig | ServiceAccountConfig | UserAuthConfig;\n\nexport interface SheetsClientOptions {\n auth: AuthConfig;\n}\n\n// === Error Types ===\n\nexport interface SheetsApiErrorDetail {\n '@type'?: string;\n reason?: string;\n domain?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface SheetsApiError {\n code: number;\n message: string;\n status: string;\n details?: SheetsApiErrorDetail[];\n}\n\nexport class SheetsError extends Error {\n code: number;\n status: string;\n details?: SheetsApiErrorDetail[];\n\n constructor(error: SheetsApiError) {\n super(error.message);\n this.name = 'SheetsError';\n this.code = error.code;\n this.status = error.status;\n this.details = error.details;\n }\n}\n","/**\n * HTTP Client for Google Sheets API\n * Uses native Node.js fetch (Node 18+)\n */\n\nimport { SheetsError } from '../types/index.js';\n\nconst BASE_URL = 'https://sheets.googleapis.com/v4';\nconst MAX_RETRIES = 3;\nconst INITIAL_BACKOFF_MS = 1000;\n\nexport interface HttpClientOptions {\n getAccessToken: () => Promise<string>;\n}\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE';\n body?: unknown;\n params?: Record<string, string>;\n}\n\nexport class HttpClient {\n private getAccessToken: () => Promise<string>;\n\n constructor(options: HttpClientOptions) {\n this.getAccessToken = options.getAccessToken;\n }\n\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const { method = 'GET', body, params } = options;\n\n let url = `${BASE_URL}${path}`;\n if (params) {\n const searchParams = new URLSearchParams(params);\n url += `?${searchParams.toString()}`;\n }\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n const accessToken = await this.getAccessToken();\n\n const response = await fetch(url, {\n method,\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (response.status === 429) {\n const backoffMs = INITIAL_BACKOFF_MS * Math.pow(2, attempt);\n await this.sleep(backoffMs);\n continue;\n }\n\n const data = await response.json() as { error?: { code: number; message: string; status: string } };\n\n if (!response.ok) {\n if (data.error) {\n throw new SheetsError({\n code: data.error.code,\n message: data.error.message,\n status: data.error.status,\n });\n }\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return data as T;\n } catch (error) {\n lastError = error as Error;\n\n if (error instanceof SheetsError && error.code !== 429 && error.code !== 500 && error.code !== 503) {\n throw error;\n }\n\n if (attempt < MAX_RETRIES - 1) {\n const backoffMs = INITIAL_BACKOFF_MS * Math.pow(2, attempt);\n await this.sleep(backoffMs);\n }\n }\n }\n\n throw lastError || new Error('Request failed after retries');\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n","/**\n * OAuth Client Constants\n * Replace with your Google Cloud OAuth client credentials\n */\n\n// Built-in OAuth client (Desktop app type)\n// Project: ariadng-sheets\nexport const OAUTH_CLIENT_ID = '344941894490-jmdvo5ghomqi7vuisfrf80hfassk1ma5.apps.googleusercontent.com';\nexport const OAUTH_CLIENT_SECRET = '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';\n\n// Redirect URI for local callback server\nexport const OAUTH_REDIRECT_URI = 'http://localhost:8085/callback';\nexport const OAUTH_CALLBACK_PORT = 8085;\n\n// OAuth endpoints\nexport const OAUTH_AUTH_URL = 'https://accounts.google.com/o/oauth2/v2/auth';\nexport const OAUTH_TOKEN_URL = 'https://oauth2.googleapis.com/token';\nexport const OAUTH_USERINFO_URL = 'https://www.googleapis.com/oauth2/v2/userinfo';\n\n// Scopes\nexport const OAUTH_SCOPES = [\n 'https://www.googleapis.com/auth/spreadsheets',\n 'https://www.googleapis.com/auth/userinfo.email',\n];\n","/**\n * OAuth 2.0 Authentication\n * Supports pre-obtained access tokens with optional auto-refresh\n *\n * For automation (e.g., n8n), provide:\n * - accessToken: Current access token\n * - refreshToken: For obtaining new tokens when expired\n * - clientId: OAuth client ID\n * - clientSecret: OAuth client secret\n * - expiresAt: When the access token expires (Unix timestamp in ms)\n */\n\nimport type { OAuthConfig } from '../types/index.js';\nimport { OAUTH_TOKEN_URL } from './constants.js';\n\ninterface TokenResponse {\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n token_type: string;\n}\n\nexport class OAuthAuth {\n private config: OAuthConfig;\n private cachedToken: string;\n private expiresAt: number;\n\n constructor(config: OAuthConfig) {\n this.config = config;\n this.cachedToken = config.accessToken;\n this.expiresAt = config.expiresAt || 0;\n }\n\n async getAccessToken(): Promise<string> {\n // If no expiration tracking or no refresh credentials, return cached token\n if (!this.canRefresh()) {\n return this.cachedToken;\n }\n\n // Check if token is expired (with 60 second buffer)\n if (this.isExpired()) {\n await this.refreshToken();\n }\n\n return this.cachedToken;\n }\n\n private canRefresh(): boolean {\n return !!(\n this.config.refreshToken &&\n this.config.clientId &&\n this.config.clientSecret &&\n this.expiresAt > 0\n );\n }\n\n private isExpired(): boolean {\n return Date.now() >= this.expiresAt - 60000;\n }\n\n private async refreshToken(): Promise<void> {\n if (!this.config.refreshToken || !this.config.clientId || !this.config.clientSecret) {\n throw new Error('Token expired and missing refresh credentials (refreshToken, clientId, clientSecret)');\n }\n\n const response = await fetch(OAUTH_TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n refresh_token: this.config.refreshToken,\n grant_type: 'refresh_token',\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Token refresh failed: ${error}`);\n }\n\n const tokenResponse = await response.json() as TokenResponse;\n\n this.cachedToken = tokenResponse.access_token;\n this.expiresAt = Date.now() + (tokenResponse.expires_in * 1000);\n\n // Update config with new refresh token if provided\n if (tokenResponse.refresh_token) {\n this.config.refreshToken = tokenResponse.refresh_token;\n }\n }\n\n /**\n * Get current token state for persistence in automation tools\n * Returns updated tokens after any refresh operations\n */\n getTokenState(): { accessToken: string; refreshToken?: string; expiresAt: number } {\n return {\n accessToken: this.cachedToken,\n refreshToken: this.config.refreshToken,\n expiresAt: this.expiresAt,\n };\n }\n}\n","/**\n * Service Account JWT Authentication\n * Uses RS256 signing to exchange JWT for access token\n */\n\nimport * as crypto from 'crypto';\nimport * as fs from 'fs/promises';\nimport type { ServiceAccountConfig, ServiceAccountCredentials } from '../types/index.js';\n\nconst TOKEN_URI = 'https://oauth2.googleapis.com/token';\nconst SCOPE = 'https://www.googleapis.com/auth/spreadsheets';\nconst TOKEN_LIFETIME_SECONDS = 3600;\n\ninterface TokenResponse {\n access_token: string;\n expires_in: number;\n token_type: string;\n}\n\nexport class ServiceAccountAuth {\n private config: ServiceAccountConfig;\n private credentials: ServiceAccountCredentials | null = null;\n private cachedToken: string | null = null;\n private tokenExpiresAt: number = 0;\n\n constructor(config: ServiceAccountConfig) {\n this.config = config;\n }\n\n async getAccessToken(): Promise<string> {\n if (this.cachedToken && Date.now() < this.tokenExpiresAt - 60000) {\n return this.cachedToken;\n }\n\n await this.loadCredentials();\n const jwt = this.createJwt();\n const token = await this.exchangeJwtForToken(jwt);\n\n this.cachedToken = token.access_token;\n this.tokenExpiresAt = Date.now() + (token.expires_in * 1000);\n\n return this.cachedToken;\n }\n\n private async loadCredentials(): Promise<void> {\n if (this.credentials) return;\n\n if (this.config.credentials) {\n this.credentials = this.config.credentials;\n return;\n }\n\n if (!this.config.credentialsPath) {\n throw new Error('Service account requires credentialsPath or credentials');\n }\n\n const content = await fs.readFile(this.config.credentialsPath, 'utf-8');\n this.credentials = JSON.parse(content) as ServiceAccountCredentials;\n }\n\n private createJwt(): string {\n if (!this.credentials) {\n throw new Error('Credentials not loaded');\n }\n\n const now = Math.floor(Date.now() / 1000);\n\n const header = {\n alg: 'RS256',\n typ: 'JWT',\n };\n\n const payload = {\n iss: this.credentials.client_email,\n scope: SCOPE,\n aud: TOKEN_URI,\n iat: now,\n exp: now + TOKEN_LIFETIME_SECONDS,\n };\n\n const encodedHeader = this.base64UrlEncode(JSON.stringify(header));\n const encodedPayload = this.base64UrlEncode(JSON.stringify(payload));\n const signatureInput = `${encodedHeader}.${encodedPayload}`;\n\n const sign = crypto.createSign('RSA-SHA256');\n sign.update(signatureInput);\n const signature = sign.sign(this.credentials.private_key);\n const encodedSignature = this.base64UrlEncode(signature);\n\n return `${signatureInput}.${encodedSignature}`;\n }\n\n private base64UrlEncode(input: string | Buffer): string {\n const buffer = typeof input === 'string' ? Buffer.from(input) : input;\n return buffer.toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n }\n\n private async exchangeJwtForToken(jwt: string): Promise<TokenResponse> {\n const response = await fetch(TOKEN_URI, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n assertion: jwt,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Token exchange failed: ${error}`);\n }\n\n return await response.json() as TokenResponse;\n }\n}\n","/**\n * User OAuth Authentication\n * OAuth 2.0 Authorization Code flow with PKCE for personal Google accounts\n */\n\nimport * as crypto from 'crypto';\nimport * as fs from 'fs/promises';\nimport * as http from 'http';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { exec } from 'child_process';\nimport type { StoredTokens } from '../types/index.js';\nimport {\n OAUTH_CLIENT_ID,\n OAUTH_CLIENT_SECRET,\n OAUTH_REDIRECT_URI,\n OAUTH_CALLBACK_PORT,\n OAUTH_AUTH_URL,\n OAUTH_TOKEN_URL,\n OAUTH_USERINFO_URL,\n OAUTH_SCOPES,\n} from './constants.js';\n\nexport interface OAuthClientCredentials {\n clientId: string;\n clientSecret: string;\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), '.sheets');\nconst TOKENS_FILE = path.join(CONFIG_DIR, 'tokens.json');\n\n// === PKCE ===\n\ninterface PKCEPair {\n codeVerifier: string;\n codeChallenge: string;\n}\n\nexport function generatePKCE(): PKCEPair {\n const codeVerifier = crypto.randomBytes(32).toString('base64url');\n const codeChallenge = crypto\n .createHash('sha256')\n .update(codeVerifier)\n .digest('base64url');\n return { codeVerifier, codeChallenge };\n}\n\n// === Browser ===\n\nfunction openBrowser(url: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const platform = process.platform;\n let command: string;\n\n if (platform === 'darwin') {\n command = `open \"${url}\"`;\n } else if (platform === 'win32') {\n command = `start \"\" \"${url}\"`;\n } else {\n command = `xdg-open \"${url}\"`;\n }\n\n exec(command, (error) => {\n if (error) {\n reject(new Error(`Failed to open browser: ${error.message}`));\n } else {\n resolve();\n }\n });\n });\n}\n\n// === Callback Server ===\n\nfunction startCallbackServer(): Promise<string> {\n return new Promise((resolve, reject) => {\n let timeoutId: NodeJS.Timeout;\n\n const server = http.createServer((req, res) => {\n const url = new URL(req.url || '', `http://localhost:${OAUTH_CALLBACK_PORT}`);\n\n if (url.pathname === '/callback') {\n const code = url.searchParams.get('code');\n const error = url.searchParams.get('error');\n\n if (error) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end('<html><body><h1>Authorization Failed</h1><p>You can close this window.</p></body></html>');\n clearTimeout(timeoutId);\n server.close();\n reject(new Error(`Authorization error: ${error}`));\n return;\n }\n\n if (code) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end('<html><body><h1>Authorization Successful</h1><p>You can close this window.</p></body></html>');\n clearTimeout(timeoutId);\n server.close();\n resolve(code);\n return;\n }\n\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end('<html><body><h1>Missing Code</h1></body></html>');\n } else {\n res.writeHead(404);\n res.end();\n }\n });\n\n server.on('error', (err) => {\n clearTimeout(timeoutId);\n reject(new Error(`Callback server error: ${err.message}`));\n });\n\n server.listen(OAUTH_CALLBACK_PORT, () => {\n // Server started, waiting for callback\n });\n\n // Timeout after 5 minutes\n timeoutId = setTimeout(() => {\n server.close();\n reject(new Error('Authorization timeout'));\n }, 5 * 60 * 1000);\n });\n}\n\n// === Authorization URL ===\n\nexport function getAuthorizationUrl(codeChallenge: string, clientId?: string): string {\n const params = new URLSearchParams({\n client_id: clientId || OAUTH_CLIENT_ID,\n redirect_uri: OAUTH_REDIRECT_URI,\n response_type: 'code',\n scope: OAUTH_SCOPES.join(' '),\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n access_type: 'offline',\n prompt: 'consent',\n });\n\n return `${OAUTH_AUTH_URL}?${params.toString()}`;\n}\n\n// === Token Exchange ===\n\ninterface TokenResponse {\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n token_type: string;\n}\n\nasync function exchangeCodeForTokens(code: string, codeVerifier: string, credentials?: OAuthClientCredentials): Promise<TokenResponse> {\n const response = await fetch(OAUTH_TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: credentials?.clientId || OAUTH_CLIENT_ID,\n client_secret: credentials?.clientSecret || OAUTH_CLIENT_SECRET,\n code,\n code_verifier: codeVerifier,\n grant_type: 'authorization_code',\n redirect_uri: OAUTH_REDIRECT_URI,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Token exchange failed: ${error}`);\n }\n\n return await response.json() as TokenResponse;\n}\n\nasync function refreshAccessToken(refreshToken: string): Promise<TokenResponse> {\n const response = await fetch(OAUTH_TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: OAUTH_CLIENT_ID,\n client_secret: OAUTH_CLIENT_SECRET,\n refresh_token: refreshToken,\n grant_type: 'refresh_token',\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Token refresh failed: ${error}`);\n }\n\n return await response.json() as TokenResponse;\n}\n\n// === User Info ===\n\ninterface UserInfo {\n email: string;\n id: string;\n}\n\nasync function getUserInfo(accessToken: string): Promise<UserInfo> {\n const response = await fetch(OAUTH_USERINFO_URL, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n if (!response.ok) {\n throw new Error('Failed to get user info');\n }\n\n return await response.json() as UserInfo;\n}\n\n// === Token Storage ===\n\nasync function ensureConfigDir(): Promise<void> {\n try {\n await fs.mkdir(CONFIG_DIR, { recursive: true });\n } catch {\n // Directory already exists\n }\n}\n\nexport async function loadStoredTokens(): Promise<StoredTokens | null> {\n try {\n const content = await fs.readFile(TOKENS_FILE, 'utf-8');\n return JSON.parse(content) as StoredTokens;\n } catch {\n return null;\n }\n}\n\nasync function saveTokens(tokens: StoredTokens): Promise<void> {\n await ensureConfigDir();\n await fs.writeFile(TOKENS_FILE, JSON.stringify(tokens, null, 2));\n}\n\nexport async function deleteTokens(): Promise<void> {\n try {\n await fs.unlink(TOKENS_FILE);\n } catch {\n // File doesn't exist\n }\n}\n\n// === Login Flow ===\n\nexport async function login(credentials?: OAuthClientCredentials): Promise<StoredTokens> {\n const { codeVerifier, codeChallenge } = generatePKCE();\n const authUrl = getAuthorizationUrl(codeChallenge, credentials?.clientId);\n\n console.log('Opening browser for Google login...');\n\n // Start server first, then open browser\n const codePromise = startCallbackServer();\n await openBrowser(authUrl);\n\n console.log('Waiting for authorization...');\n const code = await codePromise;\n\n console.log('Exchanging code for tokens...');\n const tokenResponse = await exchangeCodeForTokens(code, codeVerifier, credentials);\n\n const userInfo = await getUserInfo(tokenResponse.access_token);\n\n const tokens: StoredTokens = {\n accessToken: tokenResponse.access_token,\n refreshToken: tokenResponse.refresh_token || '',\n expiresAt: Date.now() + (tokenResponse.expires_in * 1000),\n email: userInfo.email,\n };\n\n await saveTokens(tokens);\n return tokens;\n}\n\n// === Auth Provider ===\n\nexport class UserAuth {\n private tokens: StoredTokens | null = null;\n\n async getAccessToken(): Promise<string> {\n if (!this.tokens) {\n this.tokens = await loadStoredTokens();\n }\n\n if (!this.tokens) {\n throw new Error('Not logged in. Run \"sheets login\" first.');\n }\n\n // Refresh if expired (with 1 minute buffer)\n if (Date.now() >= this.tokens.expiresAt - 60000) {\n if (!this.tokens.refreshToken) {\n throw new Error('Token expired and no refresh token. Run \"sheets login\" again.');\n }\n\n const tokenResponse = await refreshAccessToken(this.tokens.refreshToken);\n this.tokens.accessToken = tokenResponse.access_token;\n this.tokens.expiresAt = Date.now() + (tokenResponse.expires_in * 1000);\n\n if (tokenResponse.refresh_token) {\n this.tokens.refreshToken = tokenResponse.refresh_token;\n }\n\n await saveTokens(this.tokens);\n }\n\n return this.tokens.accessToken;\n }\n}\n","/**\n * Authentication Module Exports\n */\n\nimport type { AuthConfig } from '../types/index.js';\nimport { OAuthAuth } from './oauth.js';\nimport { ServiceAccountAuth } from './service-account.js';\nimport { UserAuth } from './user-auth.js';\n\nexport { OAuthAuth } from './oauth.js';\nexport { ServiceAccountAuth } from './service-account.js';\nexport { UserAuth, login, loadStoredTokens, deleteTokens } from './user-auth.js';\nexport type { OAuthClientCredentials } from './user-auth.js';\n\nexport interface AuthProvider {\n getAccessToken(): Promise<string>;\n}\n\nexport function createAuthProvider(config: AuthConfig): AuthProvider {\n switch (config.type) {\n case 'oauth':\n return new OAuthAuth(config);\n case 'service-account':\n return new ServiceAccountAuth(config);\n case 'user':\n return new UserAuth();\n default:\n throw new Error(`Unknown auth type: ${(config as { type: string }).type}`);\n }\n}\n","/**\n * Google Sheets API Client\n */\n\nimport type {\n Spreadsheet,\n SheetProperties,\n ValueRange,\n GetValuesOptions,\n SheetsClientOptions,\n BatchGetValuesResponse,\n ClearValuesResponse,\n BatchClearValuesResponse,\n RawCellValue,\n UpdateValuesOptions,\n UpdateValuesResponse,\n BatchUpdateValuesResponse,\n AppendValuesOptions,\n AppendValuesResponse,\n SearchOptions,\n SearchResult,\n SearchMatch,\n} from '../types/index.js';\nimport { HttpClient } from '../http/index.js';\nimport { createAuthProvider } from '../auth/index.js';\n\ninterface RawValueRange {\n range: string;\n majorDimension?: 'ROWS' | 'COLUMNS';\n values?: (string | number | boolean | null)[][];\n}\n\ninterface RawBatchGetResponse {\n spreadsheetId: string;\n valueRanges?: RawValueRange[];\n}\n\n/**\n * Convert column letter(s) to 1-based column number\n * A=1, B=2, ..., Z=26, AA=27, AB=28, etc.\n */\nfunction columnLetterToNumber(letters: string): number {\n let result = 0;\n for (let i = 0; i < letters.length; i++) {\n result = result * 26 + (letters.charCodeAt(i) - 64);\n }\n return result;\n}\n\n/**\n * Convert 1-based column number to column letter(s)\n * 1=A, 2=B, ..., 26=Z, 27=AA, 28=AB, etc.\n */\nfunction columnNumberToLetter(num: number): string {\n let result = '';\n while (num > 0) {\n const remainder = (num - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n num = Math.floor((num - 1) / 26);\n }\n return result;\n}\n\n/**\n * Parse A1 notation to extract starting row and column\n * Returns { startRow, startCol } (1-based)\n */\nfunction parseA1Range(range: string): { startRow: number; startCol: number } {\n // Remove sheet name if present (e.g., \"Sheet1!A1:D10\" -> \"A1:D10\")\n const cellRef = range.includes('!') ? range.split('!')[1] : range;\n\n // Extract first cell (e.g., \"A1:D10\" -> \"A1\", \"A1\" -> \"A1\")\n const firstCell = cellRef.split(':')[0];\n\n // Parse column letters and row number\n const match = firstCell.match(/^([A-Z]+)(\\d+)$/i);\n if (!match) {\n return { startRow: 1, startCol: 1 };\n }\n\n return {\n startCol: columnLetterToNumber(match[1].toUpperCase()),\n startRow: parseInt(match[2], 10),\n };\n}\n\nexport class SheetsClient {\n private http: HttpClient;\n\n constructor(options: SheetsClientOptions) {\n const authProvider = createAuthProvider(options.auth);\n this.http = new HttpClient({\n getAccessToken: () => authProvider.getAccessToken(),\n });\n }\n\n /**\n * Get a spreadsheet by ID\n */\n async getSpreadsheet(spreadsheetId: string): Promise<Spreadsheet> {\n return this.http.request<Spreadsheet>(`/spreadsheets/${spreadsheetId}`);\n }\n\n /**\n * Get list of sheets in a spreadsheet\n */\n async getSheets(spreadsheetId: string): Promise<SheetProperties[]> {\n const spreadsheet = await this.getSpreadsheet(spreadsheetId);\n return spreadsheet.sheets.map(sheet => sheet.properties);\n }\n\n /**\n * Read cell values from a range\n */\n async getValues(spreadsheetId: string, range: string, options?: GetValuesOptions): Promise<ValueRange> {\n const params: Record<string, string> = {};\n\n if (options?.valueRenderOption) {\n params.valueRenderOption = options.valueRenderOption;\n }\n if (options?.dateTimeRenderOption) {\n params.dateTimeRenderOption = options.dateTimeRenderOption;\n }\n if (options?.majorDimension) {\n params.majorDimension = options.majorDimension;\n }\n\n const encodedRange = encodeURIComponent(range);\n const response = await this.http.request<RawValueRange>(\n `/spreadsheets/${spreadsheetId}/values/${encodedRange}`,\n { params }\n );\n\n return this.normalizeValueRange(response);\n }\n\n /**\n * Read cell formulas from a range\n */\n async getFormulas(spreadsheetId: string, range: string): Promise<ValueRange> {\n return this.getValues(spreadsheetId, range, { valueRenderOption: 'FORMULA' });\n }\n\n /**\n * Read multiple ranges at once\n */\n async batchGetValues(spreadsheetId: string, ranges: string[], options?: GetValuesOptions): Promise<BatchGetValuesResponse> {\n const params: Record<string, string> = {\n ranges: ranges.join(','),\n };\n\n if (options?.valueRenderOption) {\n params.valueRenderOption = options.valueRenderOption;\n }\n if (options?.dateTimeRenderOption) {\n params.dateTimeRenderOption = options.dateTimeRenderOption;\n }\n if (options?.majorDimension) {\n params.majorDimension = options.majorDimension;\n }\n\n const response = await this.http.request<RawBatchGetResponse>(\n `/spreadsheets/${spreadsheetId}/values:batchGet`,\n { params }\n );\n\n return {\n spreadsheetId: response.spreadsheetId,\n valueRanges: (response.valueRanges || []).map(vr => this.normalizeValueRange(vr)),\n };\n }\n\n /**\n * Clear values from a single range\n */\n async clearValues(spreadsheetId: string, range: string): Promise<ClearValuesResponse> {\n const encodedRange = encodeURIComponent(range);\n return this.http.request<ClearValuesResponse>(\n `/spreadsheets/${spreadsheetId}/values/${encodedRange}:clear`,\n { method: 'POST' }\n );\n }\n\n /**\n * Clear values from multiple ranges\n */\n async batchClearValues(spreadsheetId: string, ranges: string[]): Promise<BatchClearValuesResponse> {\n return this.http.request<BatchClearValuesResponse>(\n `/spreadsheets/${spreadsheetId}/values:batchClear`,\n { method: 'POST', body: { ranges } }\n );\n }\n\n /**\n * Write values to a range (or starting cell)\n * Range can be \"A1\" or \"A1:D10\" - data array determines actual extent\n */\n async updateValues(\n spreadsheetId: string,\n range: string,\n values: RawCellValue[][],\n options?: UpdateValuesOptions\n ): Promise<UpdateValuesResponse> {\n const params: Record<string, string> = {\n valueInputOption: options?.valueInputOption || 'USER_ENTERED',\n };\n\n if (options?.includeValuesInResponse) {\n params.includeValuesInResponse = 'true';\n }\n if (options?.responseValueRenderOption) {\n params.responseValueRenderOption = options.responseValueRenderOption;\n }\n if (options?.responseDateTimeRenderOption) {\n params.responseDateTimeRenderOption = options.responseDateTimeRenderOption;\n }\n\n const encodedRange = encodeURIComponent(range);\n return this.http.request<UpdateValuesResponse>(\n `/spreadsheets/${spreadsheetId}/values/${encodedRange}`,\n {\n method: 'PUT',\n params,\n body: {\n majorDimension: options?.majorDimension || 'ROWS',\n values,\n },\n }\n );\n }\n\n /**\n * Write to multiple ranges in one request\n */\n async batchUpdateValues(\n spreadsheetId: string,\n data: { range: string; values: RawCellValue[][] }[],\n options?: UpdateValuesOptions\n ): Promise<BatchUpdateValuesResponse> {\n return this.http.request<BatchUpdateValuesResponse>(\n `/spreadsheets/${spreadsheetId}/values:batchUpdate`,\n {\n method: 'POST',\n body: {\n valueInputOption: options?.valueInputOption || 'USER_ENTERED',\n data: data.map(d => ({\n range: d.range,\n majorDimension: options?.majorDimension || 'ROWS',\n values: d.values,\n })),\n includeValuesInResponse: options?.includeValuesInResponse || false,\n responseValueRenderOption: options?.responseValueRenderOption,\n responseDateTimeRenderOption: options?.responseDateTimeRenderOption,\n },\n }\n );\n }\n\n /**\n * Append rows after the last row of detected table\n */\n async appendValues(\n spreadsheetId: string,\n range: string,\n values: RawCellValue[][],\n options?: AppendValuesOptions\n ): Promise<AppendValuesResponse> {\n const params: Record<string, string> = {\n valueInputOption: options?.valueInputOption || 'USER_ENTERED',\n };\n\n if (options?.insertDataOption) {\n params.insertDataOption = options.insertDataOption;\n }\n if (options?.includeValuesInResponse) {\n params.includeValuesInResponse = 'true';\n }\n if (options?.responseValueRenderOption) {\n params.responseValueRenderOption = options.responseValueRenderOption;\n }\n if (options?.responseDateTimeRenderOption) {\n params.responseDateTimeRenderOption = options.responseDateTimeRenderOption;\n }\n\n const encodedRange = encodeURIComponent(range);\n return this.http.request<AppendValuesResponse>(\n `/spreadsheets/${spreadsheetId}/values/${encodedRange}:append`,\n {\n method: 'POST',\n params,\n body: {\n majorDimension: options?.majorDimension || 'ROWS',\n values,\n },\n }\n );\n }\n\n /**\n * Search for values matching a query across sheets\n */\n async searchValues(\n spreadsheetId: string,\n query: string,\n options?: SearchOptions\n ): Promise<SearchResult> {\n const caseSensitive = options?.caseSensitive ?? false;\n const exactMatch = options?.exactMatch ?? false;\n const useRegex = options?.regex ?? false;\n const limit = options?.limit;\n\n // Determine match type for response\n const matchType = useRegex ? 'regex' : (exactMatch ? 'exact' : 'contains');\n\n // Build the matcher function\n let matcher: (cellValue: string) => boolean;\n\n if (useRegex) {\n const flags = caseSensitive ? '' : 'i';\n const regex = new RegExp(query, flags);\n matcher = (cellValue) => regex.test(cellValue);\n } else if (exactMatch) {\n if (caseSensitive) {\n matcher = (cellValue) => cellValue === query;\n } else {\n const lowerQuery = query.toLowerCase();\n matcher = (cellValue) => cellValue.toLowerCase() === lowerQuery;\n }\n } else {\n // Contains match (default)\n if (caseSensitive) {\n matcher = (cellValue) => cellValue.includes(query);\n } else {\n const lowerQuery = query.toLowerCase();\n matcher = (cellValue) => cellValue.toLowerCase().includes(lowerQuery);\n }\n }\n\n const matches: SearchMatch[] = [];\n\n // Get sheets to search\n const allSheets = await this.getSheets(spreadsheetId);\n let sheetsToSearch: SheetProperties[];\n\n if (options?.sheetIndex !== undefined) {\n const sheet = allSheets.find(s => s.index === options.sheetIndex);\n if (!sheet) {\n throw new Error(`Sheet index ${options.sheetIndex} not found.`);\n }\n sheetsToSearch = [sheet];\n } else if (options?.gid !== undefined) {\n const sheet = allSheets.find(s => s.sheetId === options.gid);\n if (!sheet) {\n throw new Error(`Sheet with gid ${options.gid} not found.`);\n }\n sheetsToSearch = [sheet];\n } else if (options?.range && options.range.includes('!')) {\n // Range includes sheet name, use as-is\n sheetsToSearch = []; // Will handle specially below\n } else {\n // Search all sheets\n sheetsToSearch = allSheets.filter(s => !s.hidden);\n }\n\n // Search logic\n if (options?.range && options.range.includes('!')) {\n // Specific range with sheet name provided\n const valueRange = await this.getValues(spreadsheetId, options.range);\n const sheetName = options.range.split('!')[0].replace(/^'|'$/g, '').replace(/''/g, \"'\");\n const sheet = allSheets.find(s => s.title === sheetName);\n const { startRow, startCol } = parseA1Range(options.range);\n\n this.collectMatches(\n valueRange,\n sheetName,\n sheet?.sheetId ?? 0,\n startRow,\n startCol,\n matcher,\n matches,\n limit\n );\n } else {\n // Search across sheets\n for (const sheet of sheetsToSearch) {\n if (limit && matches.length >= limit) break;\n\n const escapedTitle = sheet.title.replace(/'/g, \"''\");\n const range = options?.range\n ? `'${escapedTitle}'!${options.range}`\n : `'${escapedTitle}'`; // Entire sheet\n\n try {\n const valueRange = await this.getValues(spreadsheetId, range);\n const { startRow, startCol } = parseA1Range(valueRange.range);\n\n this.collectMatches(\n valueRange,\n sheet.title,\n sheet.sheetId,\n startRow,\n startCol,\n matcher,\n matches,\n limit\n );\n } catch {\n // Skip sheets that fail (e.g., empty sheets)\n continue;\n }\n }\n }\n\n return {\n query,\n matchType,\n caseSensitive,\n totalMatches: matches.length,\n matches,\n };\n }\n\n private collectMatches(\n valueRange: ValueRange,\n sheetName: string,\n sheetId: number,\n startRow: number,\n startCol: number,\n matcher: (value: string) => boolean,\n matches: SearchMatch[],\n limit?: number\n ): void {\n for (let rowIndex = 0; rowIndex < valueRange.values.length; rowIndex++) {\n if (limit && matches.length >= limit) return;\n\n const row = valueRange.values[rowIndex];\n for (let colIndex = 0; colIndex < row.length; colIndex++) {\n if (limit && matches.length >= limit) return;\n\n const cell = row[colIndex];\n const cellValue = cell.value;\n\n // Skip null/undefined values\n if (cellValue == null) continue;\n\n // Convert to string for matching\n const stringValue = String(cellValue);\n\n if (matcher(stringValue)) {\n const actualRow = startRow + rowIndex;\n const actualCol = startCol + colIndex;\n\n matches.push({\n sheet: sheetName,\n sheetId,\n address: columnNumberToLetter(actualCol) + actualRow,\n row: actualRow,\n column: actualCol,\n value: cellValue,\n });\n }\n }\n }\n }\n\n private normalizeValueRange(raw: RawValueRange): ValueRange {\n const values = (raw.values || []).map(row =>\n row.map(cell => ({\n value: cell,\n }))\n );\n\n return {\n range: raw.range,\n majorDimension: raw.majorDimension || 'ROWS',\n values,\n };\n }\n}\n\nexport function createClient(options: SheetsClientOptions): SheetsClient {\n return new SheetsClient(options);\n}\n"],"mappings":"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","names":["path","crypto","fs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ariadng/sheets",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Google Sheets CLI and API client. Read spreadsheet data from the command line or Node.js. No external SDK required.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -10,8 +10,9 @@
10
10
  },
11
11
  "exports": {
12
12
  ".": {
13
+ "types": "./dist/index.d.ts",
13
14
  "import": "./dist/index.js",
14
- "types": "./dist/index.d.ts"
15
+ "require": "./dist/index.cjs"
15
16
  }
16
17
  },
17
18
  "files": [
@@ -20,7 +21,7 @@
20
21
  "LICENSE"
21
22
  ],
22
23
  "scripts": {
23
- "build": "tsc",
24
+ "build": "tsup",
24
25
  "dev": "tsx watch src/cli.ts",
25
26
  "start": "node dist/cli.js",
26
27
  "test": "echo \"No tests yet\" && exit 0",
@@ -54,6 +55,7 @@
54
55
  },
55
56
  "devDependencies": {
56
57
  "@types/node": "^22.0.0",
58
+ "tsup": "^8.5.1",
57
59
  "tsx": "^4.0.0",
58
60
  "typescript": "^5.0.0"
59
61
  }
@@ -1,60 +0,0 @@
1
- /**
2
- * Google Sheets API Client
3
- */
4
- import type { Spreadsheet, SheetProperties, ValueRange, GetValuesOptions, SheetsClientOptions, BatchGetValuesResponse, ClearValuesResponse, BatchClearValuesResponse, RawCellValue, UpdateValuesOptions, UpdateValuesResponse, BatchUpdateValuesResponse, AppendValuesOptions, AppendValuesResponse, SearchOptions, SearchResult } from '../types/index.js';
5
- export declare class SheetsClient {
6
- private http;
7
- constructor(options: SheetsClientOptions);
8
- /**
9
- * Get a spreadsheet by ID
10
- */
11
- getSpreadsheet(spreadsheetId: string): Promise<Spreadsheet>;
12
- /**
13
- * Get list of sheets in a spreadsheet
14
- */
15
- getSheets(spreadsheetId: string): Promise<SheetProperties[]>;
16
- /**
17
- * Read cell values from a range
18
- */
19
- getValues(spreadsheetId: string, range: string, options?: GetValuesOptions): Promise<ValueRange>;
20
- /**
21
- * Read cell formulas from a range
22
- */
23
- getFormulas(spreadsheetId: string, range: string): Promise<ValueRange>;
24
- /**
25
- * Read multiple ranges at once
26
- */
27
- batchGetValues(spreadsheetId: string, ranges: string[], options?: GetValuesOptions): Promise<BatchGetValuesResponse>;
28
- /**
29
- * Clear values from a single range
30
- */
31
- clearValues(spreadsheetId: string, range: string): Promise<ClearValuesResponse>;
32
- /**
33
- * Clear values from multiple ranges
34
- */
35
- batchClearValues(spreadsheetId: string, ranges: string[]): Promise<BatchClearValuesResponse>;
36
- /**
37
- * Write values to a range (or starting cell)
38
- * Range can be "A1" or "A1:D10" - data array determines actual extent
39
- */
40
- updateValues(spreadsheetId: string, range: string, values: RawCellValue[][], options?: UpdateValuesOptions): Promise<UpdateValuesResponse>;
41
- /**
42
- * Write to multiple ranges in one request
43
- */
44
- batchUpdateValues(spreadsheetId: string, data: {
45
- range: string;
46
- values: RawCellValue[][];
47
- }[], options?: UpdateValuesOptions): Promise<BatchUpdateValuesResponse>;
48
- /**
49
- * Append rows after the last row of detected table
50
- */
51
- appendValues(spreadsheetId: string, range: string, values: RawCellValue[][], options?: AppendValuesOptions): Promise<AppendValuesResponse>;
52
- /**
53
- * Search for values matching a query across sheets
54
- */
55
- searchValues(spreadsheetId: string, query: string, options?: SearchOptions): Promise<SearchResult>;
56
- private collectMatches;
57
- private normalizeValueRange;
58
- }
59
- export declare function createClient(options: SheetsClientOptions): SheetsClient;
60
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACR,WAAW,EACX,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,YAAY,EAEf,MAAM,mBAAmB,CAAC;AAgE3B,qBAAa,YAAY;IACrB,OAAO,CAAC,IAAI,CAAa;gBAEb,OAAO,EAAE,mBAAmB;IAOxC;;OAEG;IACG,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIjE;;OAEG;IACG,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAKlE;;OAEG;IACG,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAsBtG;;OAEG;IACG,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAI5E;;OAEG;IACG,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IA0B1H;;OAEG;IACG,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAQrF;;OAEG;IACG,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAOlG;;;OAGG;IACG,YAAY,CACd,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,YAAY,EAAE,EAAE,EACxB,OAAO,CAAC,EAAE,mBAAmB,GAC9B,OAAO,CAAC,oBAAoB,CAAC;IA6BhC;;OAEG;IACG,iBAAiB,CACnB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,EAAE,EAAE,CAAA;KAAE,EAAE,EACnD,OAAO,CAAC,EAAE,mBAAmB,GAC9B,OAAO,CAAC,yBAAyB,CAAC;IAoBrC;;OAEG;IACG,YAAY,CACd,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,YAAY,EAAE,EAAE,EACxB,OAAO,CAAC,EAAE,mBAAmB,GAC9B,OAAO,CAAC,oBAAoB,CAAC;IAgChC;;OAEG;IACG,YAAY,CACd,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,aAAa,GACxB,OAAO,CAAC,YAAY,CAAC;IAqHxB,OAAO,CAAC,cAAc;IA2CtB,OAAO,CAAC,mBAAmB;CAa9B;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAEvE"}
package/dist/api/index.js DELETED
@@ -1,347 +0,0 @@
1
- /**
2
- * Google Sheets API Client
3
- */
4
- import { HttpClient } from '../http/index.js';
5
- import { createAuthProvider } from '../auth/index.js';
6
- /**
7
- * Convert column letter(s) to 1-based column number
8
- * A=1, B=2, ..., Z=26, AA=27, AB=28, etc.
9
- */
10
- function columnLetterToNumber(letters) {
11
- let result = 0;
12
- for (let i = 0; i < letters.length; i++) {
13
- result = result * 26 + (letters.charCodeAt(i) - 64);
14
- }
15
- return result;
16
- }
17
- /**
18
- * Convert 1-based column number to column letter(s)
19
- * 1=A, 2=B, ..., 26=Z, 27=AA, 28=AB, etc.
20
- */
21
- function columnNumberToLetter(num) {
22
- let result = '';
23
- while (num > 0) {
24
- const remainder = (num - 1) % 26;
25
- result = String.fromCharCode(65 + remainder) + result;
26
- num = Math.floor((num - 1) / 26);
27
- }
28
- return result;
29
- }
30
- /**
31
- * Parse A1 notation to extract starting row and column
32
- * Returns { startRow, startCol } (1-based)
33
- */
34
- function parseA1Range(range) {
35
- // Remove sheet name if present (e.g., "Sheet1!A1:D10" -> "A1:D10")
36
- const cellRef = range.includes('!') ? range.split('!')[1] : range;
37
- // Extract first cell (e.g., "A1:D10" -> "A1", "A1" -> "A1")
38
- const firstCell = cellRef.split(':')[0];
39
- // Parse column letters and row number
40
- const match = firstCell.match(/^([A-Z]+)(\d+)$/i);
41
- if (!match) {
42
- return { startRow: 1, startCol: 1 };
43
- }
44
- return {
45
- startCol: columnLetterToNumber(match[1].toUpperCase()),
46
- startRow: parseInt(match[2], 10),
47
- };
48
- }
49
- export class SheetsClient {
50
- http;
51
- constructor(options) {
52
- const authProvider = createAuthProvider(options.auth);
53
- this.http = new HttpClient({
54
- getAccessToken: () => authProvider.getAccessToken(),
55
- });
56
- }
57
- /**
58
- * Get a spreadsheet by ID
59
- */
60
- async getSpreadsheet(spreadsheetId) {
61
- return this.http.request(`/spreadsheets/${spreadsheetId}`);
62
- }
63
- /**
64
- * Get list of sheets in a spreadsheet
65
- */
66
- async getSheets(spreadsheetId) {
67
- const spreadsheet = await this.getSpreadsheet(spreadsheetId);
68
- return spreadsheet.sheets.map(sheet => sheet.properties);
69
- }
70
- /**
71
- * Read cell values from a range
72
- */
73
- async getValues(spreadsheetId, range, options) {
74
- const params = {};
75
- if (options?.valueRenderOption) {
76
- params.valueRenderOption = options.valueRenderOption;
77
- }
78
- if (options?.dateTimeRenderOption) {
79
- params.dateTimeRenderOption = options.dateTimeRenderOption;
80
- }
81
- if (options?.majorDimension) {
82
- params.majorDimension = options.majorDimension;
83
- }
84
- const encodedRange = encodeURIComponent(range);
85
- const response = await this.http.request(`/spreadsheets/${spreadsheetId}/values/${encodedRange}`, { params });
86
- return this.normalizeValueRange(response);
87
- }
88
- /**
89
- * Read cell formulas from a range
90
- */
91
- async getFormulas(spreadsheetId, range) {
92
- return this.getValues(spreadsheetId, range, { valueRenderOption: 'FORMULA' });
93
- }
94
- /**
95
- * Read multiple ranges at once
96
- */
97
- async batchGetValues(spreadsheetId, ranges, options) {
98
- const params = {
99
- ranges: ranges.join(','),
100
- };
101
- if (options?.valueRenderOption) {
102
- params.valueRenderOption = options.valueRenderOption;
103
- }
104
- if (options?.dateTimeRenderOption) {
105
- params.dateTimeRenderOption = options.dateTimeRenderOption;
106
- }
107
- if (options?.majorDimension) {
108
- params.majorDimension = options.majorDimension;
109
- }
110
- const response = await this.http.request(`/spreadsheets/${spreadsheetId}/values:batchGet`, { params });
111
- return {
112
- spreadsheetId: response.spreadsheetId,
113
- valueRanges: (response.valueRanges || []).map(vr => this.normalizeValueRange(vr)),
114
- };
115
- }
116
- /**
117
- * Clear values from a single range
118
- */
119
- async clearValues(spreadsheetId, range) {
120
- const encodedRange = encodeURIComponent(range);
121
- return this.http.request(`/spreadsheets/${spreadsheetId}/values/${encodedRange}:clear`, { method: 'POST' });
122
- }
123
- /**
124
- * Clear values from multiple ranges
125
- */
126
- async batchClearValues(spreadsheetId, ranges) {
127
- return this.http.request(`/spreadsheets/${spreadsheetId}/values:batchClear`, { method: 'POST', body: { ranges } });
128
- }
129
- /**
130
- * Write values to a range (or starting cell)
131
- * Range can be "A1" or "A1:D10" - data array determines actual extent
132
- */
133
- async updateValues(spreadsheetId, range, values, options) {
134
- const params = {
135
- valueInputOption: options?.valueInputOption || 'USER_ENTERED',
136
- };
137
- if (options?.includeValuesInResponse) {
138
- params.includeValuesInResponse = 'true';
139
- }
140
- if (options?.responseValueRenderOption) {
141
- params.responseValueRenderOption = options.responseValueRenderOption;
142
- }
143
- if (options?.responseDateTimeRenderOption) {
144
- params.responseDateTimeRenderOption = options.responseDateTimeRenderOption;
145
- }
146
- const encodedRange = encodeURIComponent(range);
147
- return this.http.request(`/spreadsheets/${spreadsheetId}/values/${encodedRange}`, {
148
- method: 'PUT',
149
- params,
150
- body: {
151
- majorDimension: options?.majorDimension || 'ROWS',
152
- values,
153
- },
154
- });
155
- }
156
- /**
157
- * Write to multiple ranges in one request
158
- */
159
- async batchUpdateValues(spreadsheetId, data, options) {
160
- return this.http.request(`/spreadsheets/${spreadsheetId}/values:batchUpdate`, {
161
- method: 'POST',
162
- body: {
163
- valueInputOption: options?.valueInputOption || 'USER_ENTERED',
164
- data: data.map(d => ({
165
- range: d.range,
166
- majorDimension: options?.majorDimension || 'ROWS',
167
- values: d.values,
168
- })),
169
- includeValuesInResponse: options?.includeValuesInResponse || false,
170
- responseValueRenderOption: options?.responseValueRenderOption,
171
- responseDateTimeRenderOption: options?.responseDateTimeRenderOption,
172
- },
173
- });
174
- }
175
- /**
176
- * Append rows after the last row of detected table
177
- */
178
- async appendValues(spreadsheetId, range, values, options) {
179
- const params = {
180
- valueInputOption: options?.valueInputOption || 'USER_ENTERED',
181
- };
182
- if (options?.insertDataOption) {
183
- params.insertDataOption = options.insertDataOption;
184
- }
185
- if (options?.includeValuesInResponse) {
186
- params.includeValuesInResponse = 'true';
187
- }
188
- if (options?.responseValueRenderOption) {
189
- params.responseValueRenderOption = options.responseValueRenderOption;
190
- }
191
- if (options?.responseDateTimeRenderOption) {
192
- params.responseDateTimeRenderOption = options.responseDateTimeRenderOption;
193
- }
194
- const encodedRange = encodeURIComponent(range);
195
- return this.http.request(`/spreadsheets/${spreadsheetId}/values/${encodedRange}:append`, {
196
- method: 'POST',
197
- params,
198
- body: {
199
- majorDimension: options?.majorDimension || 'ROWS',
200
- values,
201
- },
202
- });
203
- }
204
- /**
205
- * Search for values matching a query across sheets
206
- */
207
- async searchValues(spreadsheetId, query, options) {
208
- const caseSensitive = options?.caseSensitive ?? false;
209
- const exactMatch = options?.exactMatch ?? false;
210
- const useRegex = options?.regex ?? false;
211
- const limit = options?.limit;
212
- // Determine match type for response
213
- const matchType = useRegex ? 'regex' : (exactMatch ? 'exact' : 'contains');
214
- // Build the matcher function
215
- let matcher;
216
- if (useRegex) {
217
- const flags = caseSensitive ? '' : 'i';
218
- const regex = new RegExp(query, flags);
219
- matcher = (cellValue) => regex.test(cellValue);
220
- }
221
- else if (exactMatch) {
222
- if (caseSensitive) {
223
- matcher = (cellValue) => cellValue === query;
224
- }
225
- else {
226
- const lowerQuery = query.toLowerCase();
227
- matcher = (cellValue) => cellValue.toLowerCase() === lowerQuery;
228
- }
229
- }
230
- else {
231
- // Contains match (default)
232
- if (caseSensitive) {
233
- matcher = (cellValue) => cellValue.includes(query);
234
- }
235
- else {
236
- const lowerQuery = query.toLowerCase();
237
- matcher = (cellValue) => cellValue.toLowerCase().includes(lowerQuery);
238
- }
239
- }
240
- const matches = [];
241
- // Get sheets to search
242
- const allSheets = await this.getSheets(spreadsheetId);
243
- let sheetsToSearch;
244
- if (options?.sheetIndex !== undefined) {
245
- const sheet = allSheets.find(s => s.index === options.sheetIndex);
246
- if (!sheet) {
247
- throw new Error(`Sheet index ${options.sheetIndex} not found.`);
248
- }
249
- sheetsToSearch = [sheet];
250
- }
251
- else if (options?.gid !== undefined) {
252
- const sheet = allSheets.find(s => s.sheetId === options.gid);
253
- if (!sheet) {
254
- throw new Error(`Sheet with gid ${options.gid} not found.`);
255
- }
256
- sheetsToSearch = [sheet];
257
- }
258
- else if (options?.range && options.range.includes('!')) {
259
- // Range includes sheet name, use as-is
260
- sheetsToSearch = []; // Will handle specially below
261
- }
262
- else {
263
- // Search all sheets
264
- sheetsToSearch = allSheets.filter(s => !s.hidden);
265
- }
266
- // Search logic
267
- if (options?.range && options.range.includes('!')) {
268
- // Specific range with sheet name provided
269
- const valueRange = await this.getValues(spreadsheetId, options.range);
270
- const sheetName = options.range.split('!')[0].replace(/^'|'$/g, '').replace(/''/g, "'");
271
- const sheet = allSheets.find(s => s.title === sheetName);
272
- const { startRow, startCol } = parseA1Range(options.range);
273
- this.collectMatches(valueRange, sheetName, sheet?.sheetId ?? 0, startRow, startCol, matcher, matches, limit);
274
- }
275
- else {
276
- // Search across sheets
277
- for (const sheet of sheetsToSearch) {
278
- if (limit && matches.length >= limit)
279
- break;
280
- const escapedTitle = sheet.title.replace(/'/g, "''");
281
- const range = options?.range
282
- ? `'${escapedTitle}'!${options.range}`
283
- : `'${escapedTitle}'`; // Entire sheet
284
- try {
285
- const valueRange = await this.getValues(spreadsheetId, range);
286
- const { startRow, startCol } = parseA1Range(valueRange.range);
287
- this.collectMatches(valueRange, sheet.title, sheet.sheetId, startRow, startCol, matcher, matches, limit);
288
- }
289
- catch {
290
- // Skip sheets that fail (e.g., empty sheets)
291
- continue;
292
- }
293
- }
294
- }
295
- return {
296
- query,
297
- matchType,
298
- caseSensitive,
299
- totalMatches: matches.length,
300
- matches,
301
- };
302
- }
303
- collectMatches(valueRange, sheetName, sheetId, startRow, startCol, matcher, matches, limit) {
304
- for (let rowIndex = 0; rowIndex < valueRange.values.length; rowIndex++) {
305
- if (limit && matches.length >= limit)
306
- return;
307
- const row = valueRange.values[rowIndex];
308
- for (let colIndex = 0; colIndex < row.length; colIndex++) {
309
- if (limit && matches.length >= limit)
310
- return;
311
- const cell = row[colIndex];
312
- const cellValue = cell.value;
313
- // Skip null/undefined values
314
- if (cellValue == null)
315
- continue;
316
- // Convert to string for matching
317
- const stringValue = String(cellValue);
318
- if (matcher(stringValue)) {
319
- const actualRow = startRow + rowIndex;
320
- const actualCol = startCol + colIndex;
321
- matches.push({
322
- sheet: sheetName,
323
- sheetId,
324
- address: columnNumberToLetter(actualCol) + actualRow,
325
- row: actualRow,
326
- column: actualCol,
327
- value: cellValue,
328
- });
329
- }
330
- }
331
- }
332
- }
333
- normalizeValueRange(raw) {
334
- const values = (raw.values || []).map(row => row.map(cell => ({
335
- value: cell,
336
- })));
337
- return {
338
- range: raw.range,
339
- majorDimension: raw.majorDimension || 'ROWS',
340
- values,
341
- };
342
- }
343
- }
344
- export function createClient(options) {
345
- return new SheetsClient(options);
346
- }
347
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- /**
2
- * OAuth Client Constants
3
- * Replace with your Google Cloud OAuth client credentials
4
- */
5
- export declare const OAUTH_CLIENT_ID = "344941894490-jmdvo5ghomqi7vuisfrf80hfassk1ma5.apps.googleusercontent.com";
6
- export declare const OAUTH_CLIENT_SECRET = "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";
7
- export declare const OAUTH_REDIRECT_URI = "http://localhost:8085/callback";
8
- export declare const OAUTH_CALLBACK_PORT = 8085;
9
- export declare const OAUTH_AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
10
- export declare const OAUTH_TOKEN_URL = "https://oauth2.googleapis.com/token";
11
- export declare const OAUTH_USERINFO_URL = "https://www.googleapis.com/oauth2/v2/userinfo";
12
- export declare const OAUTH_SCOPES: string[];
13
- //# sourceMappingURL=constants.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/auth/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,eAAO,MAAM,eAAe,6EAA6E,CAAC;AAC1G,eAAO,MAAM,mBAAmB,wCAAwC,CAAC;AAGzE,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AACnE,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAGxC,eAAO,MAAM,cAAc,iDAAiD,CAAC;AAC7E,eAAO,MAAM,eAAe,wCAAwC,CAAC;AACrE,eAAO,MAAM,kBAAkB,kDAAkD,CAAC;AAGlF,eAAO,MAAM,YAAY,UAGxB,CAAC"}