🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@robinpath/google-sheets

Package Overview
Dependencies
Maintainers
4
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@robinpath/google-sheets - npm Package Compare versions

Comparing version
0.1.1
to
0.3.0
+26
dist/google-sheets.d.ts
/**
* RobinPath Google Sheets Module (Node port)
*
* Sheets API v4 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).
*
* The user must share each spreadsheet with the service account's email
* address (treat it as a regular Google Workspace user) for read/write to work.
*
* Credential type declared by this module:
* - google_service_account : { client_email, private_key, scopes? }
*
* Mirror of packages/php/google-sheets/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 configureGoogleSheets(h: ModuleHost): void;
export declare const GoogleSheetsFunctions: Record<string, BuiltinHandler>;
export declare const GoogleSheetsCredentialTypes: CredentialTypeSchema[];
export declare const GoogleSheetsFunctionMetadata: Record<string, FunctionMetadata>;
export declare const GoogleSheetsModuleMetadata: ModuleMetadata;
//# sourceMappingURL=google-sheets.d.ts.map
{"version":3,"file":"google-sheets.d.ts","sourceRoot":"","sources":["../src/google-sheets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAezB,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAEzD;AA+WD,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAMhE,CAAC;AAIF,eAAO,MAAM,2BAA2B,EAAE,oBAAoB,EAoC7D,CAAC;AA0FF,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA0JzE,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,cA6BxC,CAAC"}
/**
* RobinPath Google Sheets Module (Node port)
*
* Sheets API v4 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).
*
* The user must share each spreadsheet with the service account's email
* address (treat it as a regular Google Workspace user) for read/write to work.
*
* Credential type declared by this module:
* - google_service_account : { client_email, private_key, scopes? }
*
* Mirror of packages/php/google-sheets/src/index.php — shares the same
* credential contract, metadata shape, and error taxonomy.
*/
import { createSign } from "node:crypto";
// ── Module-local state (populated by configure hook) ────────────────────
const state = {};
function host() {
if (!state.host) {
throw new Error("Google Sheets module not initialized. Pass the adapter to rp.registerModule() via loadModule so its configure() hook runs first.");
}
return state.host;
}
export function configureGoogleSheets(h) {
state.host = h;
}
// ── Constants ──────────────────────────────────────────────────────────
const TOKEN_URL = "https://oauth2.googleapis.com/token";
const SHEETS_API = "https://sheets.googleapis.com/v4/spreadsheets/";
const DEFAULT_SCOPE = "https://www.googleapis.com/auth/spreadsheets";
const TOKEN_TTL_MS = 3000 * 1000; // 50 minutes; tokens last 60min, leave a buffer.
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 ?? "");
const 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");
}
// Cache by email + scope to keep multi-credential setups isolated.
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; // error envelope
// Exchange JWT for access token.
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;
}
// ── HTTP helper (normalized envelope, never throws for API errors) ─────
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(`${SHEETS_API}${path}`, init);
}
catch (e) {
return errorReturn(e instanceof Error ? e.message : String(e), "transport");
}
const status = response.status;
const raw = await response.text();
let decoded;
try {
decoded = raw ? JSON.parse(raw) : null;
}
catch {
decoded = { raw };
}
if (status >= 200 && status < 300) {
return decoded && typeof decoded === "object" ? decoded : { raw };
}
const errObj = decoded && typeof decoded === "object" && "error" in decoded
? decoded.error
: {};
let message = `Sheets API returned HTTP ${status}.`;
if (errObj && typeof errObj === "object" && "message" in errObj) {
message = String(errObj.message);
}
let code = "sheets_error";
if (status === 429)
code = "rate_limited";
else if (status === 403 || status === 401)
code = "permission_denied";
return errorReturn(message, code, {
status,
sheets_error: decoded && typeof decoded === "object" ? decoded : { raw },
});
}
// ── Query helpers ──────────────────────────────────────────────────────
function buildQuery(params) {
const qs = new URLSearchParams();
for (const [k, v] of Object.entries(params)) {
if (v !== null && v !== undefined && v !== "")
qs.set(k, v);
}
const s = qs.toString();
return s ? `?${s}` : "";
}
// ── Handlers ───────────────────────────────────────────────────────────
const readRange = async (args) => {
const cred = String(args[0] ?? "");
const sid = String(args[1] ?? "");
const range = String(args[2] ?? "");
const opts = (args[3] && typeof args[3] === "object" ? args[3] : {});
if (!sid || !range) {
return { error: "spreadsheetId and range are required." };
}
const query = buildQuery({
valueRenderOption: opts.valueRenderOption !== undefined ? String(opts.valueRenderOption) : null,
dateTimeRenderOption: opts.dateTimeRenderOption !== undefined ? String(opts.dateTimeRenderOption) : null,
majorDimension: opts.majorDimension !== undefined ? String(opts.majorDimension) : null,
});
const path = `${encodeURIComponent(sid)}/values/${encodeURIComponent(range)}${query}`;
return (await call(cred, "GET", path, null));
};
const writeRange = async (args) => {
const cred = String(args[0] ?? "");
const sid = String(args[1] ?? "");
const range = String(args[2] ?? "");
const values = Array.isArray(args[3]) ? args[3] : [];
const opts = (args[4] && typeof args[4] === "object" ? args[4] : {});
if (!sid || !range) {
return { error: "spreadsheetId and range are required." };
}
const query = buildQuery({
valueInputOption: String(opts.valueInputOption ?? "USER_ENTERED"),
includeValuesInResponse: opts.includeValuesInResponse !== undefined
? opts.includeValuesInResponse
? "true"
: "false"
: null,
});
const path = `${encodeURIComponent(sid)}/values/${encodeURIComponent(range)}${query}`;
return (await call(cred, "PUT", path, { range, values }));
};
const appendRows = async (args) => {
const cred = String(args[0] ?? "");
const sid = String(args[1] ?? "");
const range = String(args[2] ?? "");
const values = Array.isArray(args[3]) ? args[3] : [];
const opts = (args[4] && typeof args[4] === "object" ? args[4] : {});
if (!sid || !range) {
return { error: "spreadsheetId and range are required." };
}
const query = buildQuery({
valueInputOption: String(opts.valueInputOption ?? "USER_ENTERED"),
insertDataOption: String(opts.insertDataOption ?? "INSERT_ROWS"),
includeValuesInResponse: opts.includeValuesInResponse !== undefined
? opts.includeValuesInResponse
? "true"
: "false"
: null,
});
const path = `${encodeURIComponent(sid)}/values/${encodeURIComponent(range)}:append${query}`;
return (await call(cred, "POST", path, { values }));
};
const clearRange = async (args) => {
const cred = String(args[0] ?? "");
const sid = String(args[1] ?? "");
const range = String(args[2] ?? "");
if (!sid || !range) {
return { error: "spreadsheetId and range are required." };
}
const path = `${encodeURIComponent(sid)}/values/${encodeURIComponent(range)}:clear`;
return (await call(cred, "POST", path, {}));
};
const listSheets = async (args) => {
const cred = String(args[0] ?? "");
const sid = String(args[1] ?? "");
if (!sid)
return { error: "spreadsheetId is required." };
const fields = "sheets(properties(sheetId,title,index,gridProperties))";
const path = `${encodeURIComponent(sid)}?fields=${encodeURIComponent(fields)}`;
const result = await call(cred, "GET", path, null);
if (isErrorReturn(result))
return result;
const sheets = result && typeof result === "object" && Array.isArray(result.sheets)
? result.sheets
: [];
return sheets.map((s) => s && typeof s === "object" && s.properties && typeof s.properties === "object"
? s.properties
: {});
};
// ── Exports: functions map ─────────────────────────────────────────────
export const GoogleSheetsFunctions = {
readRange,
writeRange,
appendRows,
clearRange,
listSheets,
};
// ── Exports: credential types ──────────────────────────────────────────
export const GoogleSheetsCredentialTypes = [
{
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 spreadsheet 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.",
},
{
name: "scopes",
title: "Scopes",
type: "text",
required: false,
placeholder: "https://www.googleapis.com/auth/spreadsheets",
description: "Space-separated OAuth scopes. Defaults to the full Sheets scope.",
},
],
},
];
// ── Exports: metadata ──────────────────────────────────────────────────
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_google_sa",
resource: {
type: "credential",
listFn: "credential.list",
modes: ["list", "expression"],
searchable: true,
filter: { type: CREDENTIAL_TYPE },
},
};
const spreadsheetIdParam = {
name: "spreadsheetId",
title: "Spreadsheet ID",
description: "The long ID from the spreadsheet URL: `docs.google.com/spreadsheets/d/{ID}/edit`. Must be shared with the service account.",
dataType: "string",
formInputType: "text",
required: true,
allowExpression: true,
placeholder: "1AbC2dE…",
};
const rangeParam = {
name: "range",
title: "Range (A1 notation)",
description: "A1-notation range with optional sheet name. Examples:\n Sheet1!A1:B10\n Sheet1!A:C (entire columns)\n Submissions (the whole sheet)",
dataType: "string",
formInputType: "text",
required: true,
allowExpression: true,
placeholder: "Sheet1!A1:C",
};
const valuesParam = {
name: "values",
title: "Values",
description: "Two-dimensional array of row arrays: `[[a,b,c], [d,e,f]]`.",
dataType: "array",
formInputType: "json",
required: true,
allowExpression: true,
language: "json",
rows: 6,
placeholder: '[\n ["Name", "Email"],\n ["Ada", "ada@example.com"]\n]',
};
const writeOptionsParam = {
name: "options",
title: "Options",
description: "Recognized keys:\n valueInputOption : 'USER_ENTERED' (default — formulas evaluated, dates parsed) | 'RAW' (literal strings)\n includeValuesInResponse : bool",
dataType: "object",
formInputType: "json",
required: false,
allowExpression: true,
language: "json",
rows: 4,
advanced: true,
};
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.",
sheets_error: "Sheets API returned an error — see `sheets_error.error`.",
permission_denied: "Service account does not have access — share the spreadsheet with the credential's email.",
rate_limited: "Sheets API rate limit (~60 reads/min/user, 60 writes/min/user).",
};
export const GoogleSheetsFunctionMetadata = {
readRange: {
title: "Read range",
summary: "Read values from a range",
description: "Calls `GET /v4/spreadsheets/{id}/values/{range}`. Returns the raw values 2D array.",
group: "values",
action: "read",
icon: "eye",
capability: "manage_options",
sideEffects: ["makes_http_call"],
idempotent: true,
since: "1.0.0",
tags: ["sheets", "read", "values"],
parameters: [
credentialParam,
spreadsheetIdParam,
rangeParam,
{
name: "options",
title: "Options",
description: "Recognized keys:\n valueRenderOption : 'FORMATTED_VALUE' (default) | 'UNFORMATTED_VALUE' | 'FORMULA'\n dateTimeRenderOption : 'SERIAL_NUMBER' | 'FORMATTED_STRING' (default)\n majorDimension : 'ROWS' (default) | 'COLUMNS'",
dataType: "object",
formInputType: "json",
required: false,
allowExpression: true,
language: "json",
rows: 4,
advanced: true,
},
],
returnType: "object",
returnDescription: "{ range, majorDimension, values: [[…], …] }",
errors: commonErrors,
examples: [
{
title: "Read first 100 rows",
code: 'google-sheets.readRange "my_google_sa" "1AbC..." "Submissions!A1:E100"',
},
],
example: 'google-sheets.readRange "my_google_sa" "1AbC..." "Sheet1!A1:C10"',
},
writeRange: {
title: "Write range",
summary: "Overwrite values in a range",
description: "Calls `PUT /v4/spreadsheets/{id}/values/{range}`. Replaces existing values; sized to the supplied 2D array.",
group: "values",
action: "write",
icon: "pencil",
capability: "manage_options",
sideEffects: ["makes_http_call"],
idempotent: true,
since: "1.0.0",
tags: ["sheets", "write", "update"],
parameters: [
credentialParam,
spreadsheetIdParam,
rangeParam,
valuesParam,
writeOptionsParam,
],
returnType: "object",
returnDescription: "{ spreadsheetId, updatedRange, updatedRows, updatedColumns, updatedCells }",
errors: commonErrors,
example: 'google-sheets.writeRange "my_google_sa" "1AbC..." "Sheet1!A1" [["x","y"]]',
},
appendRows: {
title: "Append rows",
summary: "Append rows to the bottom of a range",
description: "Calls `POST /v4/spreadsheets/{id}/values/{range}:append`. Finds the first empty row in the range and inserts there. Ideal for log-style sheets.",
group: "values",
action: "write",
icon: "plus",
capability: "manage_options",
sideEffects: ["makes_http_call"],
idempotent: false,
since: "1.0.0",
tags: ["sheets", "append", "log"],
parameters: [
credentialParam,
spreadsheetIdParam,
rangeParam,
valuesParam,
{
name: "options",
title: "Options",
description: "Recognized keys:\n valueInputOption : 'USER_ENTERED' (default) | 'RAW'\n insertDataOption : 'INSERT_ROWS' (default — push existing data down) | 'OVERWRITE'\n includeValuesInResponse: bool",
dataType: "object",
formInputType: "json",
required: false,
allowExpression: true,
language: "json",
rows: 4,
advanced: true,
},
],
returnType: "object",
returnDescription: "{ spreadsheetId, tableRange, updates: { … } }",
errors: commonErrors,
examples: [
{
title: "Log a form submission",
code: 'google-sheets.appendRows "my_google_sa" "1AbC..." "Submissions!A:D" [[\n {{ now }}, {{ form.email }}, {{ form.name }}, {{ form.plan }}\n]]',
},
],
example: 'google-sheets.appendRows "my_google_sa" "1AbC..." "A:C" [["a","b","c"]]',
},
clearRange: {
title: "Clear range",
summary: "Empty all cells in a range (formatting preserved)",
description: "Calls `POST /v4/spreadsheets/{id}/values/{range}:clear`.",
group: "values",
action: "delete",
icon: "eraser",
capability: "manage_options",
sideEffects: ["makes_http_call"],
idempotent: true,
since: "1.0.0",
tags: ["sheets", "clear", "delete"],
parameters: [credentialParam, spreadsheetIdParam, rangeParam],
returnType: "object",
errors: commonErrors,
example: 'google-sheets.clearRange "my_google_sa" "1AbC..." "Sheet1!A2:Z"',
},
listSheets: {
title: "List sheets in spreadsheet",
summary: "List all sheet tabs and their metadata",
description: "Calls `GET /v4/spreadsheets/{id}` with a fields mask. Returns each sheet's `{sheetId, title, index, gridProperties: {rowCount, columnCount}}`.",
group: "meta",
action: "query",
icon: "list",
capability: "manage_options",
sideEffects: ["makes_http_call"],
idempotent: true,
since: "1.0.0",
tags: ["sheets", "metadata", "tabs"],
parameters: [credentialParam, spreadsheetIdParam],
returnType: "array",
returnDescription: "Array of sheet property objects.",
errors: commonErrors,
example: 'google-sheets.listSheets "my_google_sa" "1AbC..."',
},
};
export const GoogleSheetsModuleMetadata = {
slug: "google-sheets",
title: "Google Sheets",
summary: "Read, write, append, and clear ranges in Google Sheets — service-account auth (no user OAuth needed)",
description: "Read and write spreadsheets directly. Lead capture into a sheet, sync inventory, build dashboards from sheet data.\n\nAuthentication uses a service account — create one at console.cloud.google.com, download the JSON key, and paste `client_email` + `private_key` into a `google_service_account` credential. Then **share each spreadsheet with the service account's email** (Editor for write, Viewer for read).",
category: "productivity",
icon: "icon.svg",
color: "#0F9D58",
version: "0.2.0",
docsUrl: "https://docs.robinpath.com/modules/google-sheets",
status: "stable",
requires: [],
minNodeVersion: "18.0.0",
credentialsType: CREDENTIAL_TYPE,
operationGroups: {
values: {
title: "Values",
description: "Range read/write/append/clear.",
order: 1,
},
meta: {
title: "Metadata",
description: "Sheet/spreadsheet introspection.",
order: 2,
},
},
methods: Object.keys(GoogleSheetsFunctions),
};
//# sourceMappingURL=google-sheets.js.map
{"version":3,"file":"google-sheets.js","sourceRoot":"","sources":["../src/google-sheets.ts"],"names":[],"mappings":"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"}
import type { ModuleAdapter } from "@robinpath/core";
declare const GoogleSheetsModule: ModuleAdapter;
export default GoogleSheetsModule;
export { GoogleSheetsModule };
export { GoogleSheetsFunctions, GoogleSheetsFunctionMetadata, GoogleSheetsModuleMetadata, GoogleSheetsCredentialTypes, } from "./google-sheets.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,kBAAkB,EAAE,aAQzB,CAAC;AAEF,eAAe,kBAAkB,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC"}
import { GoogleSheetsFunctions, GoogleSheetsFunctionMetadata, GoogleSheetsModuleMetadata, GoogleSheetsCredentialTypes, configureGoogleSheets, } from "./google-sheets.js";
const GoogleSheetsModule = {
name: "google-sheets",
functions: GoogleSheetsFunctions,
functionMetadata: GoogleSheetsFunctionMetadata,
moduleMetadata: GoogleSheetsModuleMetadata,
credentialTypes: GoogleSheetsCredentialTypes,
configure: configureGoogleSheets,
global: false,
};
export default GoogleSheetsModule;
export { GoogleSheetsModule };
export { GoogleSheetsFunctions, GoogleSheetsFunctionMetadata, GoogleSheetsModuleMetadata, GoogleSheetsCredentialTypes, } from "./google-sheets.js";
//# sourceMappingURL=index.js.map
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,0BAA0B,EAC1B,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,kBAAkB,GAAkB;IACxC,IAAI,EAAE,eAAe;IACrB,SAAS,EAAE,qBAAqB;IAChC,gBAAgB,EAAE,4BAA4B;IAC9C,cAAc,EAAE,0BAA0B;IAC1C,eAAe,EAAE,2BAA2B;IAC5C,SAAS,EAAE,qBAAqB;IAChC,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,eAAe,kBAAkB,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC"}
+20
-8
{
"name": "@robinpath/google-sheets",
"version": "0.1.1",
"version": "0.3.0",
"publishConfig": {

@@ -23,12 +23,18 @@ "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 Sheets module for RobinPath.",
"description": "Google Sheets integration — read, write, append, clear ranges and list sheet metadata. Service-account authentication using a JWT exchange (no user OAuth dance).",
"keywords": [
"googlesheets",
"productivity"
"productivity",
"google",
"sheets",
"spreadsheet",
"google-sheets",
"service-account",
"data"
],

@@ -38,6 +44,12 @@ "license": "MIT",

"category": "productivity",
"type": "integration",
"auth": "api-key",
"functionCount": 10
"type": "module",
"auth": "credential-vault",
"functionCount": 10,
"language": "nodejs",
"platforms": [
"cloud",
"cli",
"desktop"
]
}
}

@@ -22,3 +22,3 @@ # @robinpath/google-sheets

```bash
npm install @robinpath/google-sheets
robinpath add @robinpath/google-sheets
```

@@ -25,0 +25,0 @@