@robinpath/google-drive
Advanced tools
| /** | ||
| * RobinPath Google Drive Module (Node port) | ||
| * | ||
| * Drive API v3 with **service-account** authentication. The user creates | ||
| * a service account in Google Cloud, downloads its JSON key, and stores | ||
| * the `client_email` + `private_key` fields in a `google_service_account` | ||
| * credential. The module signs a JWT (RS256) with the private key and | ||
| * exchanges it for an OAuth2 access token at every call (cached for ~50min | ||
| * in-process). | ||
| * | ||
| * Because service accounts act like standalone users, the user MUST either: | ||
| * (a) share each file/folder with the service account's email, OR | ||
| * (b) configure domain-wide delegation in their Workspace admin console. | ||
| * | ||
| * Uploads use `multipart/related` POSTs to the upload endpoint. Metadata, | ||
| * listing, and search calls hit the JSON API. Binary downloads stream bytes | ||
| * and (optionally) save to disk. | ||
| * | ||
| * Credential type declared by this module (shared with google-sheets): | ||
| * - google_service_account : { client_email, private_key, scopes? } | ||
| * | ||
| * Mirror of packages/php/google-drive/src/index.php — shares the same | ||
| * credential contract, metadata shape, and error taxonomy. | ||
| */ | ||
| import type { BuiltinHandler, CredentialTypeSchema, FunctionMetadata, ModuleHost, ModuleMetadata } from "@robinpath/core"; | ||
| export declare function configureGoogleDrive(h: ModuleHost): void; | ||
| export declare const GoogleDriveFunctions: Record<string, BuiltinHandler>; | ||
| export declare const GoogleDriveCredentialTypes: CredentialTypeSchema[]; | ||
| export declare const GoogleDriveFunctionMetadata: Record<string, FunctionMetadata>; | ||
| export declare const GoogleDriveModuleMetadata: ModuleMetadata; | ||
| //# sourceMappingURL=google-drive.d.ts.map |
| {"version":3,"file":"google-drive.d.ts","sourceRoot":"","sources":["../src/google-drive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAOH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAezB,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAExD;AAq+BD,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAc/D,CAAC;AAIF,eAAO,MAAM,0BAA0B,EAAE,oBAAoB,EAoC5D,CAAC;AAgFF,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAugBxE,CAAC;AAIF,eAAO,MAAM,yBAAyB,EAAE,cAuCvC,CAAC"} |
+1439
| /** | ||
| * RobinPath Google Drive Module (Node port) | ||
| * | ||
| * Drive API v3 with **service-account** authentication. The user creates | ||
| * a service account in Google Cloud, downloads its JSON key, and stores | ||
| * the `client_email` + `private_key` fields in a `google_service_account` | ||
| * credential. The module signs a JWT (RS256) with the private key and | ||
| * exchanges it for an OAuth2 access token at every call (cached for ~50min | ||
| * in-process). | ||
| * | ||
| * Because service accounts act like standalone users, the user MUST either: | ||
| * (a) share each file/folder with the service account's email, OR | ||
| * (b) configure domain-wide delegation in their Workspace admin console. | ||
| * | ||
| * Uploads use `multipart/related` POSTs to the upload endpoint. Metadata, | ||
| * listing, and search calls hit the JSON API. Binary downloads stream bytes | ||
| * and (optionally) save to disk. | ||
| * | ||
| * Credential type declared by this module (shared with google-sheets): | ||
| * - google_service_account : { client_email, private_key, scopes? } | ||
| * | ||
| * Mirror of packages/php/google-drive/src/index.php — shares the same | ||
| * credential contract, metadata shape, and error taxonomy. | ||
| */ | ||
| import { Buffer } from "node:buffer"; | ||
| import { createSign, randomBytes } from "node:crypto"; | ||
| import { readFile, mkdir, writeFile } from "node:fs/promises"; | ||
| import { dirname } from "node:path"; | ||
| // ── Module-local state (populated by configure hook) ──────────────────── | ||
| const state = {}; | ||
| function host() { | ||
| if (!state.host) { | ||
| throw new Error("Google Drive module not initialized. Pass the adapter to rp.registerModule() via loadModule so its configure() hook runs first."); | ||
| } | ||
| return state.host; | ||
| } | ||
| export function configureGoogleDrive(h) { | ||
| state.host = h; | ||
| } | ||
| // ── Constants ────────────────────────────────────────────────────────── | ||
| const TOKEN_URL = "https://oauth2.googleapis.com/token"; | ||
| const DRIVE_API = "https://www.googleapis.com/drive/v3/"; | ||
| const UPLOAD_API = "https://www.googleapis.com/upload/drive/v3/"; | ||
| const DEFAULT_SCOPE = "https://www.googleapis.com/auth/drive"; | ||
| const TOKEN_TTL_MS = 3000 * 1000; // 50 minutes; tokens last 60min, leave a buffer. | ||
| const FOLDER_MIME = "application/vnd.google-apps.folder"; | ||
| const DEFAULT_MIME = "application/octet-stream"; | ||
| const DEFAULT_FIELDS = "id,name,mimeType,size,modifiedTime,createdTime,parents,webViewLink,webContentLink,iconLink"; | ||
| const CREDENTIAL_TYPE = "google_service_account"; | ||
| function errorReturn(error, code, extra = {}) { | ||
| return { error, code, ...extra }; | ||
| } | ||
| function isErrorReturn(v) { | ||
| return typeof v === "object" && v !== null && "error" in v && "code" in v; | ||
| } | ||
| const tokenCache = new Map(); | ||
| // ── JWT / token helpers ──────────────────────────────────────────────── | ||
| function b64url(data) { | ||
| const buf = typeof data === "string" ? Buffer.from(data, "utf8") : data; | ||
| return buf | ||
| .toString("base64") | ||
| .replace(/\+/g, "-") | ||
| .replace(/\//g, "_") | ||
| .replace(/=+$/, ""); | ||
| } | ||
| function buildJwt(email, privateKey, scope) { | ||
| const now = Math.floor(Date.now() / 1000); | ||
| const header = { alg: "RS256", typ: "JWT" }; | ||
| const payload = { | ||
| iss: email, | ||
| scope, | ||
| aud: TOKEN_URL, | ||
| exp: now + 3600, | ||
| iat: now, | ||
| }; | ||
| const h = b64url(JSON.stringify(header)); | ||
| const p = b64url(JSON.stringify(payload)); | ||
| const signingInput = `${h}.${p}`; | ||
| try { | ||
| const signer = createSign("RSA-SHA256"); | ||
| signer.update(signingInput); | ||
| signer.end(); | ||
| const signature = signer.sign(privateKey); | ||
| return `${signingInput}.${b64url(signature)}`; | ||
| } | ||
| catch (e) { | ||
| const msg = e instanceof Error ? e.message : String(e); | ||
| if (/pem|private|parse|asymmetric|decode/i.test(msg)) { | ||
| return errorReturn("Could not parse private key (is it PEM?).", "jwt_sign_failed"); | ||
| } | ||
| return errorReturn(`openssl_sign failed: ${msg}`, "jwt_sign_failed"); | ||
| } | ||
| } | ||
| async function getAccessToken(credentialSlug) { | ||
| if (!credentialSlug) { | ||
| return errorReturn("Credential slug is required.", "credential_not_found"); | ||
| } | ||
| let fields; | ||
| try { | ||
| fields = await host().credentials.get(credentialSlug); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "credential_not_found"); | ||
| } | ||
| if (!fields) { | ||
| return errorReturn(`Credential '${credentialSlug}' not found.`, "credential_not_found"); | ||
| } | ||
| const email = String(fields.client_email ?? ""); | ||
| let key = String(fields.private_key ?? ""); | ||
| const scope = String(fields.scopes ?? "") || DEFAULT_SCOPE; | ||
| if (!email || !key) { | ||
| return errorReturn("Credential is missing `client_email` or `private_key`.", "private_key_missing"); | ||
| } | ||
| // Normalize keys copy-pasted from JSON (literal \n → real newlines). | ||
| if (key.includes("\\n") && !key.includes("\n")) { | ||
| key = key.replace(/\\n/g, "\n"); | ||
| } | ||
| const cacheKey = `${email}|${scope}`; | ||
| const cached = tokenCache.get(cacheKey); | ||
| if (cached && cached.expiresAt > Date.now()) { | ||
| return cached.token; | ||
| } | ||
| const jwt = buildJwt(email, key, scope); | ||
| if (typeof jwt !== "string") | ||
| return jwt; | ||
| let response; | ||
| try { | ||
| response = await fetch(TOKEN_URL, { | ||
| method: "POST", | ||
| headers: { "Content-Type": "application/x-www-form-urlencoded" }, | ||
| body: new URLSearchParams({ | ||
| grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer", | ||
| assertion: jwt, | ||
| }).toString(), | ||
| }); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const raw = await response.text(); | ||
| let decoded = null; | ||
| try { | ||
| decoded = raw ? JSON.parse(raw) : null; | ||
| } | ||
| catch { | ||
| decoded = null; | ||
| } | ||
| const accessToken = decoded && typeof decoded.access_token === "string" | ||
| ? decoded.access_token | ||
| : ""; | ||
| if (response.status < 200 || response.status >= 300 || !accessToken) { | ||
| let message = "Token exchange failed."; | ||
| if (decoded) { | ||
| if (typeof decoded.error_description === "string") { | ||
| message = decoded.error_description; | ||
| } | ||
| else if (typeof decoded.error === "string") { | ||
| message = decoded.error; | ||
| } | ||
| } | ||
| return errorReturn(message, "token_exchange_failed", { | ||
| status: response.status, | ||
| }); | ||
| } | ||
| tokenCache.set(cacheKey, { | ||
| token: accessToken, | ||
| expiresAt: Date.now() + TOKEN_TTL_MS, | ||
| }); | ||
| return accessToken; | ||
| } | ||
| // ── Error body mapper ────────────────────────────────────────────────── | ||
| function httpErrorFromBody(status, rawBody) { | ||
| let decoded = null; | ||
| try { | ||
| decoded = rawBody ? JSON.parse(rawBody) : null; | ||
| } | ||
| catch { | ||
| decoded = null; | ||
| } | ||
| const errField = decoded && typeof decoded === "object" && "error" in decoded | ||
| ? decoded.error | ||
| : null; | ||
| let code = "drive_error"; | ||
| if (status === 429) { | ||
| code = "rate_limited"; | ||
| } | ||
| else if (status === 404) { | ||
| code = "not_found"; | ||
| } | ||
| else if (status === 401 || status === 403) { | ||
| // Inspect reason if present. | ||
| let reason = ""; | ||
| if (errField && typeof errField === "object" && "errors" in errField) { | ||
| const errs = errField.errors; | ||
| if (Array.isArray(errs) && errs.length > 0) { | ||
| const first = errs[0]; | ||
| if (first && typeof first === "object" && "reason" in first) { | ||
| const r = first.reason; | ||
| if (typeof r === "string") | ||
| reason = r; | ||
| } | ||
| } | ||
| } | ||
| if (reason === "userRateLimitExceeded" || reason === "rateLimitExceeded") { | ||
| code = "rate_limited"; | ||
| } | ||
| else if (reason === "storageQuotaExceeded") { | ||
| code = "quota_exceeded"; | ||
| } | ||
| else { | ||
| code = "permission_denied"; | ||
| } | ||
| } | ||
| let message = `Drive API returned HTTP ${status}.`; | ||
| if (errField && typeof errField === "object" && "message" in errField) { | ||
| const m = errField.message; | ||
| if (typeof m === "string") | ||
| message = m; | ||
| } | ||
| return { | ||
| error: message, | ||
| code, | ||
| status, | ||
| drive_error: decoded && typeof decoded === "object" ? decoded : { raw: rawBody }, | ||
| }; | ||
| } | ||
| // ── HTTP helper (JSON, normalized envelope) ──────────────────────────── | ||
| async function call(cred, method, path, body) { | ||
| const token = await getAccessToken(cred); | ||
| if (typeof token !== "string") | ||
| return token; | ||
| const init = { | ||
| method, | ||
| headers: { | ||
| Authorization: `Bearer ${token}`, | ||
| "Content-Type": "application/json", | ||
| }, | ||
| }; | ||
| if (body !== null && body !== undefined) { | ||
| init.body = JSON.stringify(body); | ||
| } | ||
| let response; | ||
| try { | ||
| response = await fetch(`${DRIVE_API}${path}`, init); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const status = response.status; | ||
| // 204 No Content (DELETE) — success with no body. | ||
| if (status === 204) { | ||
| return { success: true }; | ||
| } | ||
| const raw = await response.text(); | ||
| if (status >= 200 && status < 300) { | ||
| let decoded; | ||
| try { | ||
| decoded = raw ? JSON.parse(raw) : null; | ||
| } | ||
| catch { | ||
| decoded = null; | ||
| } | ||
| return decoded && typeof decoded === "object" ? decoded : { raw }; | ||
| } | ||
| return httpErrorFromBody(status, raw); | ||
| } | ||
| // ── Multipart/related upload helper ──────────────────────────────────── | ||
| async function uploadMultipart(cred, method, path, metadata, bytes, mimeType) { | ||
| const token = await getAccessToken(cred); | ||
| if (typeof token !== "string") | ||
| return token; | ||
| const boundary = "robinpath_" + randomBytes(8).toString("hex"); | ||
| const eol = "\r\n"; | ||
| const head = `--${boundary}${eol}` + | ||
| `Content-Type: application/json; charset=UTF-8${eol}${eol}` + | ||
| `${JSON.stringify(metadata)}${eol}` + | ||
| `--${boundary}${eol}` + | ||
| `Content-Type: ${mimeType}${eol}` + | ||
| `Content-Transfer-Encoding: binary${eol}${eol}`; | ||
| const tail = `${eol}--${boundary}--${eol}`; | ||
| const body = Buffer.concat([ | ||
| Buffer.from(head, "utf8"), | ||
| bytes, | ||
| Buffer.from(tail, "utf8"), | ||
| ]); | ||
| let response; | ||
| try { | ||
| response = await fetch(`${UPLOAD_API}${path}`, { | ||
| method, | ||
| headers: { | ||
| Authorization: `Bearer ${token}`, | ||
| "Content-Type": `multipart/related; boundary=${boundary}`, | ||
| "Content-Length": String(body.length), | ||
| }, | ||
| body, | ||
| }); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const status = response.status; | ||
| const raw = await response.text(); | ||
| if (status >= 200 && status < 300) { | ||
| let decoded; | ||
| try { | ||
| decoded = raw ? JSON.parse(raw) : null; | ||
| } | ||
| catch { | ||
| decoded = null; | ||
| } | ||
| return decoded && typeof decoded === "object" ? decoded : { raw }; | ||
| } | ||
| return httpErrorFromBody(status, raw); | ||
| } | ||
| // ── Query helpers ────────────────────────────────────────────────────── | ||
| function buildQueryString(params) { | ||
| const qs = new URLSearchParams(); | ||
| for (const [k, v] of Object.entries(params)) { | ||
| if (v !== null && v !== undefined && v !== "") | ||
| qs.set(k, v); | ||
| } | ||
| return qs.toString(); | ||
| } | ||
| function buildListQuery(opts) { | ||
| const pairs = {}; | ||
| for (const k of ["q", "pageSize", "pageToken", "orderBy", "spaces", "corpora", "driveId"]) { | ||
| const v = opts[k]; | ||
| if (v !== undefined && v !== null && String(v) !== "") { | ||
| pairs[k] = String(v); | ||
| } | ||
| } | ||
| pairs.fields = | ||
| typeof opts.fields === "string" && opts.fields !== "" | ||
| ? opts.fields | ||
| : `nextPageToken,files(${DEFAULT_FIELDS})`; | ||
| if (opts.includeItemsFromAllDrives) | ||
| pairs.includeItemsFromAllDrives = "true"; | ||
| if (opts.supportsAllDrives) | ||
| pairs.supportsAllDrives = "true"; | ||
| return buildQueryString(pairs); | ||
| } | ||
| function toList(value) { | ||
| if (Array.isArray(value)) { | ||
| return value.map((v) => String(v)); | ||
| } | ||
| const s = value === null || value === undefined ? "" : String(value); | ||
| if (s === "") | ||
| return []; | ||
| return [s]; | ||
| } | ||
| function applyMetadataOptions(metadata, opts) { | ||
| if (opts.parents !== undefined) { | ||
| metadata.parents = toList(opts.parents); | ||
| } | ||
| else if (opts.parentId !== undefined) { | ||
| metadata.parents = [String(opts.parentId)]; | ||
| } | ||
| else if (opts.folderId !== undefined) { | ||
| metadata.parents = [String(opts.folderId)]; | ||
| } | ||
| for (const k of ["description", "starred", "properties", "appProperties"]) { | ||
| if (Object.prototype.hasOwnProperty.call(opts, k)) { | ||
| metadata[k] = opts[k]; | ||
| } | ||
| } | ||
| } | ||
| async function resolveContent(content, hintMime) { | ||
| const hint = typeof hintMime === "string" && hintMime !== "" ? hintMime : null; | ||
| let mime = hint; | ||
| // { _file: path } | { file: path } | ||
| if (content && typeof content === "object" && !Array.isArray(content)) { | ||
| const obj = content; | ||
| const path = typeof obj._file === "string" | ||
| ? obj._file | ||
| : typeof obj.file === "string" | ||
| ? obj.file | ||
| : ""; | ||
| if (path === "") { | ||
| // Fall through: JSON-encode the object as bytes. | ||
| const jsonBytes = Buffer.from(JSON.stringify(obj), "utf8"); | ||
| return { bytes: jsonBytes, mimeType: mime ?? "application/json" }; | ||
| } | ||
| let bytes; | ||
| try { | ||
| bytes = await readFile(path); | ||
| } | ||
| catch (e) { | ||
| const msg = e instanceof Error ? e.message : String(e); | ||
| if (/ENOENT|EACCES|EPERM/i.test(msg)) { | ||
| return errorReturn(`File not readable: ${path}`, "drive_error"); | ||
| } | ||
| return errorReturn(`Failed to read file: ${path}`, "drive_error"); | ||
| } | ||
| if (mime === null) | ||
| mime = DEFAULT_MIME; | ||
| return { bytes, mimeType: mime }; | ||
| } | ||
| // Scalar → string. | ||
| const str = typeof content === "string" | ||
| ? content | ||
| : typeof content === "number" || typeof content === "boolean" | ||
| ? String(content) | ||
| : ""; | ||
| // data:<mime>;base64,<payload> | ||
| if (str !== "" && str.startsWith("data:")) { | ||
| const comma = str.indexOf(","); | ||
| if (comma !== -1) { | ||
| const header = str.slice(5, comma); | ||
| const payload = str.slice(comma + 1); | ||
| const isB64 = header.includes(";base64"); | ||
| const dataMime = header.split(";")[0]?.trim() ?? ""; | ||
| if (dataMime !== "" && mime === null) { | ||
| mime = dataMime; | ||
| } | ||
| let bytes; | ||
| try { | ||
| if (isB64) { | ||
| const cleaned = payload.replace(/\s+/g, ""); | ||
| bytes = Buffer.from(cleaned, "base64"); | ||
| // Round-trip sanity check. | ||
| const normalized = cleaned.replace(/=+$/, ""); | ||
| const reencoded = bytes.toString("base64").replace(/=+$/, ""); | ||
| if (normalized.length > 0 && reencoded !== normalized) { | ||
| return errorReturn("Invalid base64 in data URI.", "drive_error"); | ||
| } | ||
| } | ||
| else { | ||
| bytes = Buffer.from(decodeURIComponent(payload), "utf8"); | ||
| } | ||
| } | ||
| catch { | ||
| return errorReturn("Invalid base64 in data URI.", "drive_error"); | ||
| } | ||
| return { bytes, mimeType: mime ?? DEFAULT_MIME }; | ||
| } | ||
| } | ||
| if (mime === null) | ||
| mime = "text/plain"; | ||
| return { bytes: Buffer.from(str, "utf8"), mimeType: mime }; | ||
| } | ||
| // ── Handlers ─────────────────────────────────────────────────────────── | ||
| const listFiles = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const opts = (args[1] && typeof args[1] === "object" ? args[1] : {}); | ||
| const query = buildListQuery(opts); | ||
| const path = `files${query !== "" ? `?${query}` : ""}`; | ||
| return (await call(cred, "GET", path, null)); | ||
| }; | ||
| const search = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const q = String(args[1] ?? ""); | ||
| const opts = (args[2] && typeof args[2] === "object" ? args[2] : {}); | ||
| if (q === "") { | ||
| return errorReturn("query is required.", "drive_error"); | ||
| } | ||
| // `q` in options is overridden by the explicit argument. | ||
| const merged = { ...opts, q }; | ||
| return listFiles([cred, merged]); | ||
| }; | ||
| const getFile = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const fileId = String(args[1] ?? ""); | ||
| const opts = (args[2] && typeof args[2] === "object" ? args[2] : {}); | ||
| if (fileId === "") { | ||
| return errorReturn("fileId is required.", "drive_error"); | ||
| } | ||
| const qs = buildQueryString({ | ||
| fields: typeof opts.fields === "string" && opts.fields !== "" | ||
| ? opts.fields | ||
| : DEFAULT_FIELDS, | ||
| supportsAllDrives: opts.supportsAllDrives ? "true" : null, | ||
| }); | ||
| return (await call(cred, "GET", `files/${encodeURIComponent(fileId)}?${qs}`, null)); | ||
| }; | ||
| const createFile = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const name = String(args[1] ?? ""); | ||
| const content = args[2] ?? ""; | ||
| const opts = (args[3] && typeof args[3] === "object" ? args[3] : {}); | ||
| if (name === "") { | ||
| return errorReturn("name is required.", "drive_error"); | ||
| } | ||
| const resolved = await resolveContent(content, opts.mimeType); | ||
| if (isErrorReturn(resolved)) | ||
| return resolved; | ||
| const metadata = { | ||
| name, | ||
| mimeType: resolved.mimeType, | ||
| }; | ||
| applyMetadataOptions(metadata, opts); | ||
| const fieldsMask = typeof opts.fields === "string" && opts.fields !== "" | ||
| ? opts.fields | ||
| : DEFAULT_FIELDS; | ||
| const qs = buildQueryString({ | ||
| uploadType: "multipart", | ||
| fields: fieldsMask, | ||
| supportsAllDrives: opts.supportsAllDrives ? "true" : null, | ||
| }); | ||
| return (await uploadMultipart(cred, "POST", `files?${qs}`, metadata, resolved.bytes, resolved.mimeType)); | ||
| }; | ||
| const updateFile = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const fileId = String(args[1] ?? ""); | ||
| const content = args[2] ?? ""; | ||
| const opts = (args[3] && typeof args[3] === "object" ? args[3] : {}); | ||
| if (fileId === "") { | ||
| return errorReturn("fileId is required.", "drive_error"); | ||
| } | ||
| const resolved = await resolveContent(content, opts.mimeType); | ||
| if (isErrorReturn(resolved)) | ||
| return resolved; | ||
| const metadata = {}; | ||
| // mimeType only included if caller explicitly set it. | ||
| if (opts.mimeType !== undefined) { | ||
| metadata.mimeType = resolved.mimeType; | ||
| } | ||
| for (const k of ["name", "description", "starred"]) { | ||
| if (Object.prototype.hasOwnProperty.call(opts, k)) { | ||
| metadata[k] = opts[k]; | ||
| } | ||
| } | ||
| const fieldsMask = typeof opts.fields === "string" && opts.fields !== "" | ||
| ? opts.fields | ||
| : DEFAULT_FIELDS; | ||
| const qs = buildQueryString({ | ||
| uploadType: "multipart", | ||
| fields: fieldsMask, | ||
| supportsAllDrives: opts.supportsAllDrives ? "true" : null, | ||
| }); | ||
| return (await uploadMultipart(cred, "PATCH", `files/${encodeURIComponent(fileId)}?${qs}`, metadata, resolved.bytes, resolved.mimeType)); | ||
| }; | ||
| const downloadFile = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const fileId = String(args[1] ?? ""); | ||
| const opts = (args[2] && typeof args[2] === "object" ? args[2] : {}); | ||
| if (fileId === "") { | ||
| return errorReturn("fileId is required.", "drive_error"); | ||
| } | ||
| const exportMime = typeof opts.exportMimeType === "string" ? opts.exportMimeType : ""; | ||
| const savePath = typeof opts.savePath === "string" ? opts.savePath : ""; | ||
| const asText = Object.prototype.hasOwnProperty.call(opts, "asText") | ||
| ? Boolean(opts.asText) | ||
| : null; | ||
| const qsPairs = {}; | ||
| let endpoint; | ||
| if (exportMime !== "") { | ||
| qsPairs.mimeType = exportMime; | ||
| endpoint = `files/${encodeURIComponent(fileId)}/export`; | ||
| } | ||
| else { | ||
| qsPairs.alt = "media"; | ||
| endpoint = `files/${encodeURIComponent(fileId)}`; | ||
| } | ||
| if (opts.supportsAllDrives) | ||
| qsPairs.supportsAllDrives = "true"; | ||
| const token = await getAccessToken(cred); | ||
| if (typeof token !== "string") | ||
| return token; | ||
| const url = `${DRIVE_API}${endpoint}?${buildQueryString(qsPairs)}`; | ||
| let response; | ||
| try { | ||
| response = await fetch(url, { | ||
| method: "GET", | ||
| headers: { Authorization: `Bearer ${token}` }, | ||
| }); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const status = response.status; | ||
| if (status < 200 || status >= 300) { | ||
| const raw = await response.text(); | ||
| return httpErrorFromBody(status, raw); | ||
| } | ||
| const contentType = response.headers.get("content-type") ?? ""; | ||
| const mime = contentType.split(";")[0]?.trim() || contentType; | ||
| const ab = await response.arrayBuffer(); | ||
| const buf = Buffer.from(ab); | ||
| const size = buf.length; | ||
| const result = { | ||
| fileId, | ||
| mimeType: mime, | ||
| size, | ||
| }; | ||
| if (savePath !== "") { | ||
| try { | ||
| const dir = dirname(savePath); | ||
| if (dir && dir !== ".") { | ||
| await mkdir(dir, { recursive: true }); | ||
| } | ||
| } | ||
| catch { | ||
| return errorReturn(`Could not create directory: ${dirname(savePath)}`, "drive_error"); | ||
| } | ||
| try { | ||
| await writeFile(savePath, buf); | ||
| } | ||
| catch { | ||
| return errorReturn(`Could not write to: ${savePath}`, "drive_error"); | ||
| } | ||
| result.savedTo = savePath; | ||
| result.bytesWritten = size; | ||
| return result; | ||
| } | ||
| const isTextual = asText === null | ||
| ? mime.startsWith("text/") || | ||
| mime === "application/json" || | ||
| mime === "application/xml" | ||
| : asText; | ||
| if (isTextual) { | ||
| result.content = buf.toString("utf8"); | ||
| } | ||
| result.content_base64 = buf.toString("base64"); | ||
| return result; | ||
| }; | ||
| const copyFile = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const fileId = String(args[1] ?? ""); | ||
| const opts = (args[2] && typeof args[2] === "object" ? args[2] : {}); | ||
| if (fileId === "") { | ||
| return errorReturn("fileId is required.", "drive_error"); | ||
| } | ||
| const body = {}; | ||
| for (const k of ["name", "description"]) { | ||
| if (Object.prototype.hasOwnProperty.call(opts, k)) { | ||
| body[k] = opts[k]; | ||
| } | ||
| } | ||
| if (opts.parents !== undefined) { | ||
| body.parents = toList(opts.parents); | ||
| } | ||
| else if (opts.folderId !== undefined) { | ||
| body.parents = [String(opts.folderId)]; | ||
| } | ||
| const qs = buildQueryString({ | ||
| fields: typeof opts.fields === "string" && opts.fields !== "" | ||
| ? opts.fields | ||
| : DEFAULT_FIELDS, | ||
| supportsAllDrives: opts.supportsAllDrives ? "true" : null, | ||
| }); | ||
| return (await call(cred, "POST", `files/${encodeURIComponent(fileId)}/copy?${qs}`, body)); | ||
| }; | ||
| const moveFile = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const fileId = String(args[1] ?? ""); | ||
| const opts = (args[2] && typeof args[2] === "object" ? args[2] : {}); | ||
| if (fileId === "") { | ||
| return errorReturn("fileId is required.", "drive_error"); | ||
| } | ||
| let add = []; | ||
| if (opts.addParents !== undefined) { | ||
| add = toList(opts.addParents); | ||
| } | ||
| else if (opts.newFolderId !== undefined) { | ||
| add = [String(opts.newFolderId)]; | ||
| } | ||
| else if (opts.parents !== undefined) { | ||
| add = toList(opts.parents); | ||
| } | ||
| if (add.length === 0 && opts.removeParents === undefined) { | ||
| return errorReturn("moveFile requires `addParents` (or `newFolderId`).", "drive_error"); | ||
| } | ||
| let remove; | ||
| if (opts.removeParents !== undefined) { | ||
| remove = toList(opts.removeParents); | ||
| } | ||
| else { | ||
| const cur = await call(cred, "GET", `files/${encodeURIComponent(fileId)}?fields=parents`, null); | ||
| if (isErrorReturn(cur)) | ||
| return cur; | ||
| remove = | ||
| cur && typeof cur === "object" && Array.isArray(cur.parents) | ||
| ? cur.parents.map((p) => String(p)) | ||
| : []; | ||
| } | ||
| const qsPairs = { | ||
| fields: typeof opts.fields === "string" && opts.fields !== "" | ||
| ? opts.fields | ||
| : DEFAULT_FIELDS, | ||
| }; | ||
| if (add.length > 0) | ||
| qsPairs.addParents = add.join(","); | ||
| if (remove.length > 0) | ||
| qsPairs.removeParents = remove.join(","); | ||
| if (opts.supportsAllDrives) | ||
| qsPairs.supportsAllDrives = "true"; | ||
| // Empty PATCH body — API requires a body, so send `{}`. | ||
| return (await call(cred, "PATCH", `files/${encodeURIComponent(fileId)}?${buildQueryString(qsPairs)}`, {})); | ||
| }; | ||
| const deleteFile = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const fileId = String(args[1] ?? ""); | ||
| const opts = (args[2] && typeof args[2] === "object" ? args[2] : {}); | ||
| if (fileId === "") { | ||
| return errorReturn("fileId is required.", "drive_error"); | ||
| } | ||
| let path = `files/${encodeURIComponent(fileId)}`; | ||
| if (opts.supportsAllDrives) { | ||
| path += "?supportsAllDrives=true"; | ||
| } | ||
| const result = await call(cred, "DELETE", path, null); | ||
| if (isErrorReturn(result)) | ||
| return result; | ||
| return { deleted: true, fileId }; | ||
| }; | ||
| const createFolder = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const name = String(args[1] ?? ""); | ||
| const opts = (args[2] && typeof args[2] === "object" ? args[2] : {}); | ||
| if (name === "") { | ||
| return errorReturn("name is required.", "drive_error"); | ||
| } | ||
| const metadata = { | ||
| name, | ||
| mimeType: FOLDER_MIME, | ||
| }; | ||
| if (opts.parentId !== undefined) { | ||
| metadata.parents = [String(opts.parentId)]; | ||
| } | ||
| else if (opts.parents !== undefined) { | ||
| metadata.parents = toList(opts.parents); | ||
| } | ||
| if (opts.description !== undefined) { | ||
| metadata.description = String(opts.description); | ||
| } | ||
| const qs = buildQueryString({ | ||
| fields: typeof opts.fields === "string" && opts.fields !== "" | ||
| ? opts.fields | ||
| : DEFAULT_FIELDS, | ||
| supportsAllDrives: opts.supportsAllDrives ? "true" : null, | ||
| }); | ||
| return (await call(cred, "POST", `files?${qs}`, metadata)); | ||
| }; | ||
| const share = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const fileId = String(args[1] ?? ""); | ||
| let permission = args[2] ?? null; | ||
| if (fileId === "") { | ||
| return errorReturn("fileId is required.", "drive_error"); | ||
| } | ||
| // Shortcut: passing just an email string. | ||
| if (typeof permission === "string") { | ||
| permission = { | ||
| type: "user", | ||
| role: "reader", | ||
| emailAddress: permission, | ||
| }; | ||
| } | ||
| if (!permission || | ||
| typeof permission !== "object" || | ||
| Array.isArray(permission) || | ||
| Object.keys(permission).length === 0) { | ||
| return errorReturn("permission is required.", "drive_error"); | ||
| } | ||
| const perm = { ...permission }; | ||
| const sendNotif = Object.prototype.hasOwnProperty.call(perm, "sendNotificationEmail") | ||
| ? Boolean(perm.sendNotificationEmail) | ||
| : null; | ||
| const emailMessage = Object.prototype.hasOwnProperty.call(perm, "emailMessage") | ||
| ? String(perm.emailMessage ?? "") | ||
| : null; | ||
| const supportsAllDrives = Object.prototype.hasOwnProperty.call(perm, "supportsAllDrives") | ||
| ? Boolean(perm.supportsAllDrives) | ||
| : null; | ||
| delete perm.sendNotificationEmail; | ||
| delete perm.emailMessage; | ||
| delete perm.supportsAllDrives; | ||
| perm.type = String(perm.type ?? "user"); | ||
| perm.role = String(perm.role ?? "reader"); | ||
| const qsPairs = {}; | ||
| if (sendNotif !== null) { | ||
| qsPairs.sendNotificationEmail = sendNotif ? "true" : "false"; | ||
| } | ||
| if (emailMessage !== null && emailMessage !== "") { | ||
| qsPairs.emailMessage = emailMessage; | ||
| } | ||
| if (supportsAllDrives === true) { | ||
| qsPairs.supportsAllDrives = "true"; | ||
| } | ||
| qsPairs.fields = "id,type,role,emailAddress,domain,displayName"; | ||
| return (await call(cred, "POST", `files/${encodeURIComponent(fileId)}/permissions?${buildQueryString(qsPairs)}`, perm)); | ||
| }; | ||
| const listPermissions = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const fileId = String(args[1] ?? ""); | ||
| const opts = (args[2] && typeof args[2] === "object" ? args[2] : {}); | ||
| if (fileId === "") { | ||
| return errorReturn("fileId is required.", "drive_error"); | ||
| } | ||
| const qs = buildQueryString({ | ||
| fields: typeof opts.fields === "string" && opts.fields !== "" | ||
| ? opts.fields | ||
| : "permissions(id,type,role,emailAddress,domain,displayName,deleted)", | ||
| supportsAllDrives: opts.supportsAllDrives ? "true" : null, | ||
| }); | ||
| return (await call(cred, "GET", `files/${encodeURIComponent(fileId)}/permissions?${qs}`, null)); | ||
| }; | ||
| const deletePermission = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const fileId = String(args[1] ?? ""); | ||
| const permissionId = String(args[2] ?? ""); | ||
| const opts = (args[3] && typeof args[3] === "object" ? args[3] : {}); | ||
| if (fileId === "" || permissionId === "") { | ||
| return errorReturn("fileId and permissionId are required.", "drive_error"); | ||
| } | ||
| let path = `files/${encodeURIComponent(fileId)}/permissions/${encodeURIComponent(permissionId)}`; | ||
| if (opts.supportsAllDrives) { | ||
| path += "?supportsAllDrives=true"; | ||
| } | ||
| const result = await call(cred, "DELETE", path, null); | ||
| if (isErrorReturn(result)) | ||
| return result; | ||
| return { deleted: true, fileId, permissionId }; | ||
| }; | ||
| // ── Exports: functions map ───────────────────────────────────────────── | ||
| export const GoogleDriveFunctions = { | ||
| listFiles, | ||
| search, | ||
| getFile, | ||
| createFile, | ||
| updateFile, | ||
| downloadFile, | ||
| copyFile, | ||
| moveFile, | ||
| deleteFile, | ||
| createFolder, | ||
| share, | ||
| listPermissions, | ||
| deletePermission, | ||
| }; | ||
| // ── Exports: credential types ────────────────────────────────────────── | ||
| export const GoogleDriveCredentialTypes = [ | ||
| { | ||
| slug: CREDENTIAL_TYPE, | ||
| title: "Google Service Account", | ||
| icon: "key-square", | ||
| fields: [ | ||
| { | ||
| name: "client_email", | ||
| title: "Service account email", | ||
| type: "text", | ||
| required: true, | ||
| placeholder: "name@project-id.iam.gserviceaccount.com", | ||
| description: "The `client_email` field from your service-account JSON key. Share each Drive item with this address.", | ||
| pattern: "@[a-z0-9-]+\\.iam\\.gserviceaccount\\.com$", | ||
| }, | ||
| { | ||
| name: "private_key", | ||
| title: "Private key (PEM)", | ||
| type: "textarea", | ||
| required: true, | ||
| placeholder: "-----BEGIN PRIVATE KEY-----\n…\n-----END PRIVATE KEY-----\n", | ||
| description: "The `private_key` field from your service-account JSON. Paste it as-is, including the BEGIN/END lines. Literal `\\n` sequences from a copy-pasted JSON blob are normalized automatically.", | ||
| }, | ||
| { | ||
| name: "scopes", | ||
| title: "Scopes", | ||
| type: "text", | ||
| required: false, | ||
| placeholder: "https://www.googleapis.com/auth/drive", | ||
| description: "Space-separated OAuth scopes. Defaults to `https://www.googleapis.com/auth/drive` (full access). Use `drive.file` for app-created files only, or `drive.readonly` for read-only.", | ||
| }, | ||
| ], | ||
| }, | ||
| ]; | ||
| // ── Metadata: parameter builders ─────────────────────────────────────── | ||
| const credentialParam = { | ||
| name: "credential", | ||
| title: "Credential", | ||
| description: "Slug of a saved `google_service_account` credential.", | ||
| dataType: "string", | ||
| formInputType: "resource", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "my_drive_sa", | ||
| resource: { | ||
| type: "credential", | ||
| listFn: "credential.list", | ||
| modes: ["list", "expression"], | ||
| searchable: true, | ||
| filter: { type: CREDENTIAL_TYPE }, | ||
| }, | ||
| }; | ||
| const fileIdParam = { | ||
| name: "fileId", | ||
| title: "File ID", | ||
| description: "The Drive file ID from the URL: `drive.google.com/file/d/{ID}/view` or the `id` returned by `listFiles` / `createFile`. Works for folders too.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "1AbC2dEfG…", | ||
| }; | ||
| const nameParam = { | ||
| name: "name", | ||
| title: "File name", | ||
| description: "Display name for the file in Drive. Extension is not auto-appended — include it yourself if you want one (e.g. `report.csv`).", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "report.csv", | ||
| }; | ||
| const contentParam = { | ||
| name: "content", | ||
| title: "Content", | ||
| description: "Raw file bytes. Accepts:\n - a plain string (treated as UTF-8 text / whatever `mimeType` says)\n - `data:<mime>;base64,<payload>` data-URI (base64 decoded automatically)\n - `{_file:\"/absolute/path\"}` object (file on disk is read)\nLeave empty to create a file with no content (rare).", | ||
| dataType: "string", | ||
| formInputType: "textarea", | ||
| required: true, | ||
| allowExpression: true, | ||
| rows: 8, | ||
| placeholder: "Hello, world!\n", | ||
| }; | ||
| const commonErrors = { | ||
| credential_not_found: "No credential with that slug exists in the vault.", | ||
| private_key_missing: "The credential is missing `client_email` or `private_key`.", | ||
| jwt_sign_failed: "Could not sign the JWT — `private_key` is malformed (must be PEM).", | ||
| token_exchange_failed: "Google rejected the JWT — check the service account email + private key match.", | ||
| transport: "Network failure calling Google API.", | ||
| drive_error: "Drive API returned an error — see `drive_error.error`.", | ||
| permission_denied: "Service account does not have access — share the file/folder with the credential's email.", | ||
| rate_limited: "Drive API rate limit (~1000 req/100s/user by default).", | ||
| not_found: "File/folder/permission not found — check the ID, or the service account does not have visibility.", | ||
| quota_exceeded: "Drive storage quota for the owning user is full.", | ||
| }; | ||
| // ── Exports: function metadata ───────────────────────────────────────── | ||
| export const GoogleDriveFunctionMetadata = { | ||
| listFiles: { | ||
| title: "List files", | ||
| summary: "List files (optionally filtered and paged)", | ||
| description: "Calls `GET /files` with an optional Drive query. Returns files the service account can see — share files/folders with the credential's email first.\n\nHandy queries:\n mimeType = 'application/pdf'\n 'FOLDER_ID' in parents\n name contains 'invoice' and trashed = false\n modifiedTime > '2024-01-01T00:00:00'", | ||
| group: "discovery", | ||
| action: "query", | ||
| icon: "list", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["drive", "list", "files"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n q : Drive query string (see Google's reference)\n pageSize : 1-1000 (default 100)\n pageToken : cursor from a previous response\n orderBy : 'modifiedTime desc' | 'createdTime' | 'name' | 'folder,modifiedTime desc'\n fields : comma-separated field mask (overrides default)\n spaces : 'drive' (default) | 'appDataFolder' | 'photos'\n includeItemsFromAllDrives : bool (set true + `supportsAllDrives=true` for shared drives)\n supportsAllDrives : bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 5, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ files: [{id, name, mimeType, size, modifiedTime, parents, …}], nextPageToken?: string }", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "List PDFs in a folder", | ||
| code: "google-drive.listFiles \"my_drive_sa\" {q:\"'FOLDER_ID' in parents and mimeType='application/pdf' and trashed=false\", pageSize:50, orderBy:\"modifiedTime desc\"}", | ||
| }, | ||
| ], | ||
| example: 'google-drive.listFiles "my_drive_sa" {pageSize:20}', | ||
| }, | ||
| search: { | ||
| title: "Search", | ||
| summary: "Convenience wrapper over `listFiles` for a Drive query string", | ||
| description: "Shortcut for `listFiles` when all you want is to pass a query. Equivalent to `listFiles(cred, {q, ...options})`.", | ||
| group: "discovery", | ||
| action: "query", | ||
| icon: "search", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["drive", "search", "query"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "query", | ||
| title: "Query (Drive query language)", | ||
| description: "See https://developers.google.com/drive/api/guides/search-files. Common operators: `=`, `!=`, `contains`, `in`, `and`, `or`, `not`. Strings must be single-quoted.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "name contains 'invoice' and trashed = false", | ||
| }, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Same extra keys as `listFiles` (pageSize, orderBy, fields, pageToken, spaces, …). The `q` key is ignored — use the `query` argument.", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ files: [...], nextPageToken?: string }", | ||
| errors: commonErrors, | ||
| example: "google-drive.search \"my_drive_sa\" \"name contains 'invoice'\"", | ||
| }, | ||
| getFile: { | ||
| title: "Get file metadata", | ||
| summary: "Fetch metadata for a single file or folder", | ||
| description: "Calls `GET /files/{fileId}`. Returns the default field set plus `webViewLink` and `webContentLink`. Does not return file content — use `downloadFile` for that.", | ||
| group: "discovery", | ||
| action: "read", | ||
| icon: "info", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["drive", "metadata", "read"], | ||
| parameters: [ | ||
| credentialParam, | ||
| fileIdParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n fields : comma-separated field mask (overrides default)\n supportsAllDrives : bool — set true for shared-drive files", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 3, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ id, name, mimeType, size, modifiedTime, parents, webViewLink, … }", | ||
| errors: commonErrors, | ||
| example: 'google-drive.getFile "my_drive_sa" "1AbC..."', | ||
| }, | ||
| createFile: { | ||
| title: "Create / upload file", | ||
| summary: "Upload a new file with content", | ||
| description: "Multipart upload to `POST /upload/drive/v3/files?uploadType=multipart`. Metadata and bytes are sent in one request — fine for anything under ~5 MB. For larger files consider chunked/resumable uploads (not yet implemented).\n\nContent can be a plain string, a `data:` URI (base64 decoded), or `{_file:\"path\"}` to read from disk.", | ||
| group: "files", | ||
| action: "create", | ||
| icon: "upload", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "writes_remote"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["drive", "upload", "create"], | ||
| parameters: [ | ||
| credentialParam, | ||
| nameParam, | ||
| contentParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n mimeType : defaults to 'application/octet-stream' (or 'text/plain' if content is a plain string)\n parents : array of folder IDs — put file inside these folders\n description : string\n starred : bool\n properties : { key: value } — custom user properties\n appProperties : { key: value } — app-private properties\n fields : field mask for the response\n supportsAllDrives : bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 5, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ id, name, mimeType, size, … }", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "Upload CSV into a folder", | ||
| code: "google-drive.createFile \"my_drive_sa\" \"report.csv\" \"a,b,c\\n1,2,3\" {mimeType:\"text/csv\", parents:[\"FOLDER_ID\"]}", | ||
| }, | ||
| ], | ||
| example: 'google-drive.createFile "my_drive_sa" "hello.txt" "hi!"', | ||
| }, | ||
| updateFile: { | ||
| title: "Update file contents", | ||
| summary: "Replace the bytes of an existing file", | ||
| description: "Multipart upload to `PATCH /upload/drive/v3/files/{fileId}?uploadType=multipart`. Keeps the same file ID (so shares/links stay valid). Metadata keys in `options` are optional — pass only what you want to change.", | ||
| group: "files", | ||
| action: "update", | ||
| icon: "save", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "writes_remote"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["drive", "upload", "update"], | ||
| parameters: [ | ||
| credentialParam, | ||
| fileIdParam, | ||
| contentParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n mimeType : override content type\n name : rename the file\n description : update description\n starred : bool\n fields : response field mask\n supportsAllDrives : bool\nNote: `parents` cannot be changed here — use `moveFile`.", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 5, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ id, name, mimeType, size, modifiedTime, … }", | ||
| errors: commonErrors, | ||
| example: 'google-drive.updateFile "my_drive_sa" "1AbC..." "new contents" {mimeType:"text/plain"}', | ||
| }, | ||
| downloadFile: { | ||
| title: "Download file", | ||
| summary: "Fetch the raw bytes of a file", | ||
| description: "Calls `GET /files/{id}?alt=media`. Returns the bytes either inline (base64-encoded in `content_base64` plus `content` for text payloads) or writes them to disk if `savePath` is set.\n\nFor Google-native types (Docs / Sheets / Slides), use `exportMimeType` to export to PDF / DOCX / XLSX / etc. A raw `alt=media` call on a Google-native file will return 403.", | ||
| group: "files", | ||
| action: "read", | ||
| icon: "download", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "reads_remote", "writes_local"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["drive", "download", "bytes", "export"], | ||
| parameters: [ | ||
| credentialParam, | ||
| fileIdParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n savePath : absolute path to write the bytes to; when set, response omits `content_base64`\n exportMimeType : for Google-native files — export format. E.g. 'application/pdf', 'text/csv', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n asText : bool — decode bytes as UTF-8 into `content`; default auto (true for text/*)\n supportsAllDrives : bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 5, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ fileId, mimeType, size, content?, content_base64?, savedTo? }", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "Save a PDF to disk", | ||
| code: "google-drive.downloadFile \"my_drive_sa\" \"1AbC...\" {savePath:\"/tmp/report.pdf\"}", | ||
| }, | ||
| { | ||
| title: "Export a Google Doc as PDF", | ||
| code: "google-drive.downloadFile \"my_drive_sa\" \"1AbC...\" {exportMimeType:\"application/pdf\", savePath:\"/tmp/doc.pdf\"}", | ||
| }, | ||
| ], | ||
| example: 'google-drive.downloadFile "my_drive_sa" "1AbC..."', | ||
| }, | ||
| copyFile: { | ||
| title: "Copy file", | ||
| summary: "Duplicate a file (optionally rename / move the copy)", | ||
| description: "Calls `POST /files/{fileId}/copy`. Returns the metadata of the newly-created copy. Folders cannot be copied via this API — list + recreate recursively if needed.", | ||
| group: "files", | ||
| action: "create", | ||
| icon: "copy", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "writes_remote"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["drive", "copy", "duplicate"], | ||
| parameters: [ | ||
| credentialParam, | ||
| fileIdParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n name : new name for the copy (defaults to 'Copy of …')\n parents : array of folder IDs\n description : string\n fields : response field mask\n supportsAllDrives : bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ id, name, mimeType, parents, … }", | ||
| errors: commonErrors, | ||
| example: 'google-drive.copyFile "my_drive_sa" "1AbC..." {name:"Copy of Report",parents:["FOLDER_ID"]}', | ||
| }, | ||
| moveFile: { | ||
| title: "Move file", | ||
| summary: "Change a file's parent folder(s)", | ||
| description: "Calls `PATCH /files/{fileId}?addParents=…&removeParents=…`. Without options, the old parents are read via a `GET /files/{id}?fields=parents` and all of them are removed before `addParents` is applied. Override via `removeParents` to be explicit.", | ||
| group: "files", | ||
| action: "update", | ||
| icon: "move", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "writes_remote"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["drive", "move", "parents"], | ||
| parameters: [ | ||
| credentialParam, | ||
| fileIdParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys (at least one of `addParents` / `removeParents` required):\n addParents : string | array — folder ID(s) to add\n removeParents : string | array — folder ID(s) to remove (default: all current parents)\n newFolderId : alias for `addParents` (single folder move; older syntax)\n fields : response field mask\n supportsAllDrives : bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ id, name, parents, … }", | ||
| errors: commonErrors, | ||
| example: 'google-drive.moveFile "my_drive_sa" "1AbC..." {addParents:"DEST_FOLDER_ID"}', | ||
| }, | ||
| deleteFile: { | ||
| title: "Delete file", | ||
| summary: "Permanently delete a file or folder", | ||
| description: "Calls `DELETE /files/{fileId}`. This bypasses the trash — gone immediately. For a recoverable delete, use `updateFile` with `options:{trashed:true}` (not shown here).", | ||
| group: "files", | ||
| action: "delete", | ||
| icon: "trash", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "writes_remote", "destructive"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["drive", "delete", "destructive"], | ||
| parameters: [ | ||
| credentialParam, | ||
| fileIdParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n supportsAllDrives : bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 2, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ deleted: true, fileId }", | ||
| errors: commonErrors, | ||
| example: 'google-drive.deleteFile "my_drive_sa" "1AbC..."', | ||
| }, | ||
| createFolder: { | ||
| title: "Create folder", | ||
| summary: "Create a new folder", | ||
| description: "Calls `POST /files` with `mimeType=application/vnd.google-apps.folder`. Nested folders: pass the parent's ID in `options.parents`.", | ||
| group: "folders", | ||
| action: "create", | ||
| icon: "folder-plus", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "writes_remote"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["drive", "folder", "create"], | ||
| parameters: [ | ||
| credentialParam, | ||
| nameParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n parents : array of folder IDs (or a single string) — place inside these folders\n parentId : shorthand for `parents:[parentId]`\n description : string\n fields : response field mask\n supportsAllDrives : bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ id, name, mimeType, parents, … }", | ||
| errors: commonErrors, | ||
| example: 'google-drive.createFolder "my_drive_sa" "Reports 2026" {parentId:"ROOT_FOLDER_ID"}', | ||
| }, | ||
| share: { | ||
| title: "Share file", | ||
| summary: "Grant a user, group, or domain access to a file", | ||
| description: "Calls `POST /files/{fileId}/permissions`. Default role is `reader`. For email notifications, set `sendNotificationEmail:true` and optionally `emailMessage`.\n\nPermission types: `user`, `group`, `domain`, `anyone`. Roles: `owner`, `organizer`, `fileOrganizer`, `writer`, `commenter`, `reader`.", | ||
| group: "permissions", | ||
| action: "create", | ||
| icon: "share", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "writes_remote"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["drive", "share", "permissions"], | ||
| parameters: [ | ||
| credentialParam, | ||
| fileIdParam, | ||
| { | ||
| name: "permission", | ||
| title: "Permission", | ||
| description: "Permission descriptor. Required keys depend on `type`:\n { type:'user', role:'writer', emailAddress:'ada@example.com' }\n { type:'group', role:'reader', emailAddress:'team@example.com' }\n { type:'domain', role:'reader', domain:'example.com' }\n { type:'anyone', role:'reader' }\nExtras: `sendNotificationEmail` (bool), `emailMessage` (string), `supportsAllDrives` (bool).\nShortcut: pass a plain string and it's treated as `{type:'user', role:'reader', emailAddress:<string>}`.", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 5, | ||
| placeholder: '{\n "type": "user",\n "role": "writer",\n "emailAddress": "ada@example.com"\n}', | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ id, type, role, emailAddress?, domain?, … }", | ||
| errors: commonErrors, | ||
| example: 'google-drive.share "my_drive_sa" "1AbC..." {type:"user",role:"writer",emailAddress:"ada@example.com"}', | ||
| }, | ||
| listPermissions: { | ||
| title: "List permissions", | ||
| summary: "List everyone the file is shared with", | ||
| description: "Calls `GET /files/{fileId}/permissions`. Useful before revoking access.", | ||
| group: "permissions", | ||
| action: "query", | ||
| icon: "users", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["drive", "permissions", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| fileIdParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n fields : comma-separated field mask (default: permissions(id,type,role,emailAddress,domain,displayName))\n supportsAllDrives : bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 3, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ permissions: [{id, type, role, emailAddress?, …}] }", | ||
| errors: commonErrors, | ||
| example: 'google-drive.listPermissions "my_drive_sa" "1AbC..."', | ||
| }, | ||
| deletePermission: { | ||
| title: "Delete permission", | ||
| summary: "Revoke a share", | ||
| description: "Calls `DELETE /files/{fileId}/permissions/{permissionId}`. Get `permissionId` from `listPermissions` or `share` response.", | ||
| group: "permissions", | ||
| action: "delete", | ||
| icon: "user-x", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "writes_remote", "destructive"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["drive", "permissions", "revoke"], | ||
| parameters: [ | ||
| credentialParam, | ||
| fileIdParam, | ||
| { | ||
| name: "permissionId", | ||
| title: "Permission ID", | ||
| description: "The permission's `id`, obtained from `listPermissions` or the response of `share`.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "01234567890123456789", | ||
| }, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n supportsAllDrives : bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 2, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ deleted: true, fileId, permissionId }", | ||
| errors: commonErrors, | ||
| example: 'google-drive.deletePermission "my_drive_sa" "1AbC..." "01234567890"', | ||
| }, | ||
| }; | ||
| // ── Exports: module metadata ─────────────────────────────────────────── | ||
| export const GoogleDriveModuleMetadata = { | ||
| slug: "google-drive", | ||
| title: "Google Drive", | ||
| summary: "Upload, download, search, share, copy, and move files in Google Drive — service-account auth (no user OAuth needed)", | ||
| description: "Programmatic access to Google Drive. Back up generated reports into a folder, archive email attachments, sync exports, share files with teammates, build a Drive-backed CMS.\n\nAuthentication uses a service account — create one at console.cloud.google.com (enable the Drive API on the project), download the JSON key, and paste `client_email` + `private_key` into a `google_service_account` credential.\n\n**Sharing model**: service accounts are standalone identities — they do **not** inherit a user's Drive. Before touching a file or folder, share it with the service account's email (Editor to upload/modify, Viewer to read). For organization-wide access, configure domain-wide delegation in Google Workspace admin.", | ||
| category: "productivity", | ||
| icon: "icon.svg", | ||
| color: "#1FA463", | ||
| version: "0.2.0", | ||
| docsUrl: "https://docs.robinpath.com/modules/google-drive", | ||
| status: "stable", | ||
| requires: [], | ||
| minNodeVersion: "18.0.0", | ||
| credentialsType: CREDENTIAL_TYPE, | ||
| operationGroups: { | ||
| files: { | ||
| title: "Files", | ||
| description: "Upload, download, update, copy, move, delete.", | ||
| order: 1, | ||
| }, | ||
| folders: { | ||
| title: "Folders", | ||
| description: "Create and manage folder hierarchy.", | ||
| order: 2, | ||
| }, | ||
| discovery: { | ||
| title: "Discovery", | ||
| description: "List, search, and inspect file metadata.", | ||
| order: 3, | ||
| }, | ||
| permissions: { | ||
| title: "Permissions", | ||
| description: "Share files and manage access.", | ||
| order: 4, | ||
| }, | ||
| }, | ||
| methods: Object.keys(GoogleDriveFunctions), | ||
| }; | ||
| //# sourceMappingURL=google-drive.js.map |
| {"version":3,"file":"google-drive.js","sourceRoot":"","sources":["../src/google-drive.ts"],"names":[],"mappings":"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"} |
| import type { ModuleAdapter } from "@robinpath/core"; | ||
| declare const GoogleDriveModule: ModuleAdapter; | ||
| export default GoogleDriveModule; | ||
| export { GoogleDriveModule }; | ||
| export { GoogleDriveFunctions, GoogleDriveFunctionMetadata, GoogleDriveModuleMetadata, GoogleDriveCredentialTypes, configureGoogleDrive, } from "./google-drive.js"; | ||
| //# sourceMappingURL=index.d.ts.map |
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AASrD,QAAA,MAAM,iBAAiB,EAAE,aAQxB,CAAC;AAEF,eAAe,iBAAiB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,EACzB,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,mBAAmB,CAAC"} |
| import { GoogleDriveFunctions, GoogleDriveFunctionMetadata, GoogleDriveModuleMetadata, GoogleDriveCredentialTypes, configureGoogleDrive, } from "./google-drive.js"; | ||
| const GoogleDriveModule = { | ||
| name: "google-drive", | ||
| functions: GoogleDriveFunctions, | ||
| functionMetadata: GoogleDriveFunctionMetadata, | ||
| moduleMetadata: GoogleDriveModuleMetadata, | ||
| credentialTypes: GoogleDriveCredentialTypes, | ||
| configure: configureGoogleDrive, | ||
| global: false, | ||
| }; | ||
| export default GoogleDriveModule; | ||
| export { GoogleDriveModule }; | ||
| export { GoogleDriveFunctions, GoogleDriveFunctionMetadata, GoogleDriveModuleMetadata, GoogleDriveCredentialTypes, configureGoogleDrive, } from "./google-drive.js"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,EACzB,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,iBAAiB,GAAkB;IACvC,IAAI,EAAE,cAAc;IACpB,SAAS,EAAE,oBAAoB;IAC/B,gBAAgB,EAAE,2BAA2B;IAC7C,cAAc,EAAE,yBAAyB;IACzC,eAAe,EAAE,0BAA0B;IAC3C,SAAS,EAAE,oBAAoB;IAC/B,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,eAAe,iBAAiB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,EACzB,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,mBAAmB,CAAC"} |
+22
-8
| { | ||
| "name": "@robinpath/google-drive", | ||
| "version": "0.1.1", | ||
| "version": "0.3.0", | ||
| "publishConfig": { | ||
@@ -23,12 +23,20 @@ "access": "public" | ||
| "peerDependencies": { | ||
| "@robinpath/core": ">=0.20.0" | ||
| "@robinpath/core": ">=0.40.0" | ||
| }, | ||
| "devDependencies": { | ||
| "@robinpath/core": "^0.30.1", | ||
| "@robinpath/core": "^0.40.0", | ||
| "typescript": "^5.6.0" | ||
| }, | ||
| "description": "Google Drive module for RobinPath.", | ||
| "description": "Google Drive integration — upload, download, search, copy, move, share, and manage permissions on files and folders. Service-account authentication using a JWT exchange (no user OAuth dance).", | ||
| "keywords": [ | ||
| "googledrive", | ||
| "cloud storage" | ||
| "cloud storage", | ||
| "google", | ||
| "drive", | ||
| "google-drive", | ||
| "storage", | ||
| "files", | ||
| "service-account", | ||
| "upload", | ||
| "download" | ||
| ], | ||
@@ -38,7 +46,13 @@ "license": "MIT", | ||
| "category": "cloud-storage", | ||
| "type": "integration", | ||
| "auth": "api-key", | ||
| "type": "module", | ||
| "auth": "credential-vault", | ||
| "functionCount": 10, | ||
| "baseUrl": "https://www.googleapis.com" | ||
| "baseUrl": "https://www.googleapis.com", | ||
| "language": "nodejs", | ||
| "platforms": [ | ||
| "cloud", | ||
| "cli", | ||
| "desktop" | ||
| ] | ||
| } | ||
| } |
+1
-1
@@ -22,3 +22,3 @@ # @robinpath/google-drive | ||
| ```bash | ||
| npm install @robinpath/google-drive | ||
| robinpath add @robinpath/google-drive | ||
| ``` | ||
@@ -25,0 +25,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Network access
Supply chain riskThis module accesses the network.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Empty package
Supply chain riskPackage does not contain any code. It may be removed, is name squatting, or the result of a faulty package publish.
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
113178
2672.61%10
400%1498
Infinity%2
100%5
150%