UNPKG

longcelot-sheet-db

Version:

Google Sheets-backed staging database adapter for Node.js with schema-first design

75 lines 3.37 kB
import { SheetClient } from './sheetClient'; import { CRUDOperations } from './crud'; import type { DatabaseAdapter } from './types'; import { TableSchema, UserContext, SchemaMismatchBehaviour, ActorPermission, DriveFolderConfig, TokenStore, StorageAdapter, UploadOptions, CreateUserSheetOptions, SheetStyleConfig, SheetReadCacheConfig } from '../schema/types'; export interface SheetAdapterConfig { adminSheetId: string; credentials: { clientId: string; clientSecret: string; redirectUri: string; }; tokens: unknown; onSchemaMismatch?: SchemaMismatchBehaviour; permissions?: Record<string, ActorPermission>; /** Place sheets in this Drive folder hierarchy. */ driveFolder?: DriveFolderConfig; /** When set, all Drive file operations target this Shared Drive. */ sharedDriveId?: string; /** Per-actor token store. Adapter calls get(userId) in createUserSheet when actorTokens not passed directly. */ tokenStore?: TokenStore; /** File upload provider. Pass new DriveStorageAdapter() for built-in Drive upload. */ storage?: StorageAdapter; /** Header fill color, frozen rows/columns. Auto-resize and boolean/enum dropdowns are always applied. */ sheetStyle?: SheetStyleConfig; /** In-memory read cache for values.get() calls — smooths out Sheets API read-quota (429) errors. Enabled by default with a 2s TTL. */ cache?: SheetReadCacheConfig; } export declare class SheetAdapter implements DatabaseAdapter { private client; private credentials; private adminSheetId; private schemas; private context?; private onSchemaMismatch?; private permissions?; private driveFolder?; private sharedDriveId?; private tokenStore?; private storage?; private sheetStyle; private cacheConfig?; /** Cached Drive folder IDs: role -> folderId */ private _folderCache; /** Pending schema version check promise set by withContext() */ private _pendingSchemaCheck?; constructor(config: SheetAdapterConfig); registerSchema(schema: TableSchema): void; registerSchemas(schemas: TableSchema[]): void; withContext(context: UserContext): SheetAdapter; asActor(targetActor: string, targetSheetId: string): SheetAdapter; table(tableName: string): CRUDOperations; createUserSheet(userId: string, role: string, email: string, options?: CreateUserSheetOptions): Promise<string>; upload(file: Buffer, options: UploadOptions): Promise<string>; deleteFile(url: string): Promise<void>; syncSchema(schema: TableSchema): Promise<void>; upsertSchemaVersion(actorSheetId: string, tableName: string, schemaHash: string, columnCount: number): Promise<void>; getSchemaVersion(actorSheetId: string, tableName: string): Promise<{ schema_hash: string; synced_at: string; column_count: number; } | null>; private _applySheetFormatting; private _svCrud; private _ensureSchemaVersionsSheet; private _doSchemaVersionCheck; private resolveFolderForRole; private createFKResolver; private detectCircularRefs; private resolveSpreadsheetId; private hasPermission; private sheetExists; getClient(): SheetClient; } export declare function createSheetAdapter(config: SheetAdapterConfig): SheetAdapter; //# sourceMappingURL=sheetAdapter.d.ts.map