@corsair-dev/googlesheets 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/endpoints/types.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../endpoints/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EACX,oBAAoB,EACpB,8BAA8B,EAC9B,yBAAyB,EACzB,mBAAmB,EACnB,WAAW,EACX,oBAAoB,EACpB,UAAU,EACV,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../endpoints/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EACX,oBAAoB,EACpB,8BAA8B,EAC9B,yBAAyB,EACzB,mBAAmB,EACnB,WAAW,EACX,oBAAoB,EACpB,UAAU,EACV,MAAM,UAAU,CAAC;AAyFlB,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWnC,CAAC;AAEX,MAAM,MAAM,0BAA0B,GAAG;KACvC,CAAC,IAAI,MAAM,OAAO,gCAAgC,GAAG,CAAC,CAAC,KAAK,CAC5D,CAAC,OAAO,gCAAgC,CAAC,CAAC,CAAC,CAAC,CAC5C;CACD,CAAC;AAyDF,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWpC,CAAC;AAEX,MAAM,MAAM,2BAA2B,GAAG;IACzC,kBAAkB,EAAE,WAAW,CAAC;IAChC,kBAAkB,EAAE,IAAI,CAAC;IACzB,eAAe,EAAE,yBAAyB,CAAC;IAC3C,uBAAuB,EAAE,oBAAoB,GAAG,oBAAoB,CAAC;IACrE,aAAa,EAAE,UAAU,CAAC;IAC1B,eAAe,EAAE,yBAAyB,CAAC;IAC3C,gBAAgB,EAAE,mBAAmB,CAAC;IACtC,iBAAiB,EAAE,8BAA8B,CAAC;IAClD,iBAAiB,EAAE,8BAA8B,CAAC;IAClD,yBAAyB,EAAE,8BAA8B,CAAC;CAC1D,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{request as Z}from"corsair/http";var b=class extends Error{constructor(o,a){super(o);this.code=a;this.name="GoogleSheetsAPIError"}},J="https://sheets.googleapis.com/v4";async function Q(s,e,o){let a=await fetch("https://oauth2.googleapis.com/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:s,client_secret:e,refresh_token:o,grant_type:"refresh_token"})});if(!a.ok){let r=await a.text();throw new b(`Failed to refresh access token: ${r}`,a.status)}return await a.json()}async function I({accessToken:s,expiresAt:e,clientId:o,clientSecret:a,refreshToken:n,forceRefresh:r=!1}){let p=Math.floor(Date.now()/1e3);if(!r&&s&&e&&Number(e)>p+300)return{accessToken:s,expiresAt:Number(e),refreshed:!1};let l=await Q(o,a,n);return{accessToken:l.access_token,expiresAt:p+l.expires_in,refreshed:!0}}async function v(s,e,o={}){let{method:a="GET",body:n,query:r}=o;return await Z({BASE:J,VERSION:"1.0.0",WITH_CREDENTIALS:!1,CREDENTIALS:"omit",TOKEN:e,HEADERS:{"Content-Type":"application/json"}},{method:a,url:s,body:a==="POST"||a==="PUT"||a==="PATCH"?n:void 0,mediaType:"application/json",query:r})}function X(s){return s instanceof Error&&"status"in s&&s.status===401}async function c(s,e,o={}){try{return await v(s,e.key,o)}catch(a){if(X(a)&&e._refreshAuth){let n=await e._refreshAuth();return await v(s,n,o)}throw a}}import{logEventFromContext as R}from"corsair/core";var T=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!A:Z`,a=e.values?[e.values]:[],n=await c(`/spreadsheets/${e.spreadsheetId}/values/${o}:append`,s,{method:"POST",query:{valueInputOption:e.valueInputOption||"USER_ENTERED",insertDataOption:e.insertDataOption||"INSERT_ROWS"},body:{values:a,majorDimension:"ROWS"}});if(n.responses&&n.responses.length>0&&s.db.rows)try{let r=n.responses[0];if(r){let p=r.updatedRange||o,d=e.sheetName||"Sheet1",l=`${e.spreadsheetId}_${d}_${p}`;await s.db.rows.upsertByEntityId(l,{rowId:l,spreadsheetId:e.spreadsheetId,sheetName:d,range:p,values:e.values,createdAt:new Date})}}catch(r){console.warn("Failed to save row to database:",r)}return await R(s,"googlesheets.sheets.appendRow",{...e},"completed"),n},U=async(s,e)=>{let o=e.sheetName||"Sheet1",a=e.keyColumn||"A",n=e.keyValue;if(!n)throw new Error("keyValue is required for appendOrUpdateRow");let r=`${o}!${a}:${a}`,p=await c(`/spreadsheets/${e.spreadsheetId}/values/${r}`,s,{method:"GET"}),d=-1;if(p.values){for(let g=0;g<p.values.length;g++)if(p.values[g]?.[0]===String(n)){d=g;break}}let l=e.values?[e.values]:[],m=d>=0?`${o}!${d+1}:${d+1}`:`${o}!A:Z`;if(d>=0){let g=await c(`/spreadsheets/${e.spreadsheetId}/values/${m}`,s,{method:"PUT",query:{valueInputOption:e.valueInputOption||"USER_ENTERED"},body:{values:l,majorDimension:"ROWS"}});if(s.db.rows)try{let w=g.updatedRange||m,E=`${e.spreadsheetId}_${o}_${w}`;await s.db.rows.upsertByEntityId(E,{rowId:E,spreadsheetId:e.spreadsheetId,sheetName:o,range:w,values:e.values,createdAt:new Date})}catch(w){console.warn("Failed to update row in database:",w)}return await R(s,"googlesheets.sheets.appendOrUpdateRow",{...e,action:"update"},"completed"),g}else{let g=await c(`/spreadsheets/${e.spreadsheetId}/values/${m}:append`,s,{method:"POST",query:{valueInputOption:e.valueInputOption||"USER_ENTERED",insertDataOption:e.insertDataOption||"INSERT_ROWS"},body:{values:l,majorDimension:"ROWS"}});if(s.db.rows)try{let w=g.updates?.updatedRange||m,E=`${e.spreadsheetId}_${o}_${w}`;await s.db.rows.upsertByEntityId(E,{rowId:E,spreadsheetId:e.spreadsheetId,sheetName:o,range:w,values:e.values,createdAt:new Date})}catch(w){console.warn("Failed to save row to database:",w)}return await R(s,"googlesheets.sheets.appendOrUpdateRow",{...e,action:"append"},"completed"),g}},A=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!A:Z`,a=await c(`/spreadsheets/${e.spreadsheetId}/values/${o}`,s,{method:"GET",query:{valueRenderOption:e.valueRenderOption||"FORMATTED_VALUE",dateTimeRenderOption:e.dateTimeRenderOption||"FORMATTED_STRING"}});if(a.values&&s.db.rows)try{let n=e.sheetName||"Sheet1";for(let r=0;r<a.values.length;r++){let p=a.values[r];if(p){let d=r+1,l=`${n}!${d}:${d}`,m=`${e.spreadsheetId}_${n}_${l}`;await s.db.rows.upsertByEntityId(m,{rowId:m,spreadsheetId:e.spreadsheetId,sheetName:n,range:l,values:p,createdAt:new Date})}}}catch(n){console.warn("Failed to save rows to database:",n)}return await R(s,"googlesheets.sheets.getRows",{...e},"completed"),a},C=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!${e.rowIndex||1}:${e.rowIndex||1}`,a=e.values?[e.values]:[],n=await c(`/spreadsheets/${e.spreadsheetId}/values/${o}`,s,{method:"PUT",query:{valueInputOption:e.valueInputOption||"USER_ENTERED"},body:{values:a,majorDimension:"ROWS"}});if(n.responses&&n.responses.length>0&&s.db.rows)try{let r=n.responses[0];if(r){let p=r.updatedRange||o,d=e.sheetName||"Sheet1",l=`${e.spreadsheetId}_${d}_${p}`;await s.db.rows.upsertByEntityId(l,{rowId:l,spreadsheetId:e.spreadsheetId,sheetName:d,range:p,values:e.values,createdAt:new Date})}}catch(r){console.warn("Failed to update row in database:",r)}return await R(s,"googlesheets.sheets.updateRow",{...e},"completed"),n},_=async(s,e)=>{let o=e.range||e.sheetName||"Sheet1",a=await c(`/spreadsheets/${e.spreadsheetId}/values/${o}:clear`,s,{method:"POST"});if(a.clearedRange&&s.db.rows)try{let n=e.sheetName||"Sheet1",r=a.clearedRange,p=`${e.spreadsheetId}_${n}_${r}`;await s.db.rows.deleteByEntityId(p)}catch(n){console.warn("Failed to delete rows from database:",n)}return await R(s,"googlesheets.sheets.clearSheet",{...e},"completed"),a},D=async(s,e)=>{let o=await c(`/spreadsheets/${e.spreadsheetId}:batchUpdate`,s,{method:"POST",body:{requests:[{addSheet:{properties:{title:e.title||"Sheet1"}}}]}});if(o.replies&&o.replies.length>0&&s.db.sheets)try{let n=o.replies[0].addSheet?.properties;n?.sheetId!==void 0&&await s.db.sheets.upsertByEntityId(String(n.sheetId),{sheetId:String(n.sheetId),spreadsheetId:e.spreadsheetId,title:n.title||e.title||"Sheet1",index:n.index,createdAt:new Date})}catch(a){console.warn("Failed to save sheet to database:",a)}return await R(s,"googlesheets.sheets.createSheet",{...e},"completed"),o},P=async(s,e)=>{let o=await c(`/spreadsheets/${e.spreadsheetId}:batchUpdate`,s,{method:"POST",body:{requests:[{deleteSheet:{sheetId:e.sheetId}}]}});if(s.db.sheets)try{await s.db.sheets.deleteByEntityId(String(e.sheetId))}catch(a){console.warn("Failed to delete sheet from database:",a)}return await R(s,"googlesheets.sheets.deleteSheet",{...e},"completed"),o},N=async(s,e)=>{let o=e.dimension||"ROWS",a=e.startIndex||0,n=e.endIndex||a+1,r=await c(`/spreadsheets/${e.spreadsheetId}:batchUpdate`,s,{method:"POST",body:{requests:[{deleteDimension:{range:{sheetId:e.sheetId,dimension:o,startIndex:a,endIndex:n}}}]}});if(o==="ROWS"&&s.db.rows)try{let p=`Sheet_${e.sheetId}`;for(let d=a;d<n;d++){let l=d+1,m=`${p}!${l}:${l}`,g=`${e.spreadsheetId}_${p}_${m}`;await s.db.rows.deleteByEntityId(g)}}catch(p){console.warn("Failed to delete rows from database:",p)}return await R(s,"googlesheets.sheets.deleteRowsOrColumns",{...e},"completed"),r};import{logEventFromContext as $}from"corsair/core";var x=async(s,e)=>{let o=await c("/spreadsheets",s,{method:"POST",body:{properties:e.properties}});if(o.spreadsheetId&&s.db.spreadsheets)try{await s.db.spreadsheets.upsertByEntityId(o.spreadsheetId,{spreadsheetId:o.spreadsheetId,title:o.properties?.title,spreadsheetUrl:o.spreadsheetUrl,createdAt:new Date})}catch(a){console.warn("Failed to save spreadsheet to database:",a)}return await $(s,"googlesheets.spreadsheets.create",{...e},"completed"),o},W=async(s,e)=>{let o=await fetch(`https://www.googleapis.com/drive/v3/files/${e.spreadsheetId}`,{method:"DELETE",headers:{Authorization:`Bearer ${s.key}`}});if(!o.ok&&o.status!==404){let a=await o.text();throw new Error(`Failed to delete spreadsheet: ${o.status} ${a}`)}if(s.db.spreadsheets)try{await s.db.spreadsheets.deleteByEntityId(e.spreadsheetId)}catch(a){console.warn("Failed to delete spreadsheet from database:",a)}await $(s,"googlesheets.spreadsheets.delete",{...e},"completed")};import{z as t}from"zod";var te=t.object({properties:t.object({title:t.string().optional(),locale:t.string().optional(),timeZone:t.string().optional()}).optional()}),se=t.object({spreadsheetId:t.string()}),oe=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional(),values:t.array(t.union([t.string(),t.number(),t.boolean(),t.null()])).optional(),valueInputOption:t.enum(["RAW","USER_ENTERED"]).optional(),insertDataOption:t.enum(["OVERWRITE","INSERT_ROWS"]).optional()}),ae=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),keyColumn:t.string().optional(),keyValue:t.union([t.string(),t.number()]).optional(),values:t.array(t.union([t.string(),t.number(),t.boolean(),t.null()])).optional(),valueInputOption:t.enum(["RAW","USER_ENTERED"]).optional(),insertDataOption:t.enum(["OVERWRITE","INSERT_ROWS"]).optional()}),ne=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional(),valueRenderOption:t.enum(["FORMATTED_VALUE","UNFORMATTED_VALUE","FORMULA"]).optional(),dateTimeRenderOption:t.enum(["SERIAL_NUMBER","FORMATTED_STRING"]).optional()}),re=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional(),rowIndex:t.number().optional(),values:t.array(t.union([t.string(),t.number(),t.boolean(),t.null()])).optional(),valueInputOption:t.enum(["RAW","USER_ENTERED"]).optional()}),pe=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional()}),de=t.object({spreadsheetId:t.string(),title:t.string().optional()}),he=t.object({spreadsheetId:t.string(),sheetId:t.number()}),ie=t.object({spreadsheetId:t.string(),sheetId:t.number(),dimension:t.enum(["ROWS","COLUMNS"]).optional(),startIndex:t.number().optional(),endIndex:t.number().optional()}),u={spreadsheetsCreate:te,spreadsheetsDelete:se,sheetsAppendRow:oe,sheetsAppendOrUpdateRow:ae,sheetsGetRows:ne,sheetsUpdateRow:re,sheetsClearSheet:pe,sheetsCreateSheet:de,sheetsDeleteSheet:he,sheetsDeleteRowsOrColumns:ie},le=t.object({title:t.string().optional(),locale:t.string().optional(),autoRecalc:t.enum(["ON_CHANGE","ON_UPDATE","HOUR","MINUTE"]).optional(),timeZone:t.string().optional()}),B=t.object({spreadsheetId:t.string().optional(),properties:le.optional(),spreadsheetUrl:t.string().optional()}),V=t.object({range:t.string().optional(),majorDimension:t.enum(["ROWS","COLUMNS","DIMENSION_UNSPECIFIED"]).optional(),values:t.array(t.array(t.union([t.string(),t.number(),t.boolean(),t.null()]))).optional()}),f=t.object({spreadsheetId:t.string().optional(),totalUpdatedRows:t.number().optional(),totalUpdatedColumns:t.number().optional(),totalUpdatedCells:t.number().optional(),totalUpdatedSheets:t.number().optional(),responses:t.array(V).optional()}),ce=t.object({spreadsheetId:t.string().optional(),clearedRange:t.string().optional()}),ge=t.object({sheetId:t.number().optional(),title:t.string().optional(),index:t.number().optional(),sheetType:t.enum(["GRID","OBJECT","DATA_SOURCE"]).optional(),hidden:t.boolean().optional()}),Ue=t.object({properties:ge.optional()}),k=t.object({spreadsheetId:t.string().optional(),replies:t.array(t.any()).optional(),updatedSpreadsheet:B.optional()}),S={spreadsheetsCreate:B,spreadsheetsDelete:t.void(),sheetsAppendRow:f,sheetsAppendOrUpdateRow:f,sheetsGetRows:V,sheetsUpdateRow:f,sheetsClearSheet:ce,sheetsCreateSheet:k,sheetsDeleteSheet:k,sheetsDeleteRowsOrColumns:k};var O={create:x,delete:W},y={appendRow:T,appendOrUpdateRow:U,getRows:A,updateRow:C,clearSheet:_,createSheet:D,deleteSheet:P,deleteRowsOrColumns:N};import{z as i}from"zod";var j=i.object({spreadsheetId:i.string(),title:i.string().optional(),spreadsheetUrl:i.string().optional(),createdAt:i.coerce.date().optional()}),q=i.object({sheetId:i.string(),spreadsheetId:i.string(),title:i.string().optional(),index:i.number().optional(),createdAt:i.coerce.date().optional()}),F=i.object({rowId:i.string(),spreadsheetId:i.string(),sheetName:i.string().optional(),range:i.string().optional(),values:i.array(i.union([i.string(),i.number(),i.boolean(),i.null()])).optional(),createdAt:i.coerce.date().optional()});var L={version:"1.0.0",entities:{spreadsheets:j,sheets:q,rows:F}};import{logEventFromContext as Se}from"corsair/core";import{z as h}from"zod";var M=h.object({spreadsheetId:h.string().optional(),sheetName:h.string().optional(),range:h.string().optional(),values:h.array(h.union([h.string(),h.number(),h.boolean(),h.null()])).optional(),eventType:h.literal("rangeUpdated").optional(),timestamp:h.string().optional(),event:h.unknown().optional()}),K=h.object({eventType:h.literal("rangeUpdated"),spreadsheetId:h.string(),sheetName:h.string(),range:h.string(),values:h.array(h.union([h.string(),h.number(),h.boolean(),h.null()])),timestamp:h.string()});function ue(s){return typeof s=="string"?JSON.parse(s):s}function G(s){return e=>ue(e.body).eventType===s}var z={match:G("rangeUpdated"),handler:async(s,e)=>{let o=e.payload;if(!o.spreadsheetId||!o.values)return{success:!1,error:"Missing required fields: spreadsheetId or values"};let a={eventType:"rangeUpdated",spreadsheetId:o.spreadsheetId,sheetName:o.sheetName||"Sheet1",range:o.range||"A:Z",values:o.values,timestamp:o.timestamp||new Date().toISOString()};if(s.db.rows)try{let n=`${o.spreadsheetId}_${o.sheetName}_${o.range||"A:Z"}`;await s.db.rows.upsertByEntityId(n,{rowId:n,spreadsheetId:o.spreadsheetId,sheetName:o.sheetName||"Sheet1",range:o.range||"A:Z",values:o.values,createdAt:new Date})}catch(n){console.warn("Failed to save/update range in database:",n)}return await Se(s,"googlesheets.webhook.rangeUpdated",{...a},"completed"),{success:!0,data:a}}};var H={rangeUpdated:z};var me={spreadsheets:{create:O.create,delete:O.delete},sheets:{appendRow:y.appendRow,appendOrUpdateRow:y.appendOrUpdateRow,getRows:y.getRows,updateRow:y.updateRow,clearSheet:y.clearSheet,createSheet:y.createSheet,deleteSheet:y.deleteSheet,deleteRowsOrColumns:y.deleteRowsOrColumns}},we={"spreadsheets.create":{input:u.spreadsheetsCreate,output:S.spreadsheetsCreate},"spreadsheets.delete":{input:u.spreadsheetsDelete,output:S.spreadsheetsDelete},"sheets.appendRow":{input:u.sheetsAppendRow,output:S.sheetsAppendRow},"sheets.appendOrUpdateRow":{input:u.sheetsAppendOrUpdateRow,output:S.sheetsAppendOrUpdateRow},"sheets.getRows":{input:u.sheetsGetRows,output:S.sheetsGetRows},"sheets.updateRow":{input:u.sheetsUpdateRow,output:S.sheetsUpdateRow},"sheets.clearSheet":{input:u.sheetsClearSheet,output:S.sheetsClearSheet},"sheets.createSheet":{input:u.sheetsCreateSheet,output:S.sheetsCreateSheet},"sheets.deleteSheet":{input:u.sheetsDeleteSheet,output:S.sheetsDeleteSheet},"sheets.deleteRowsOrColumns":{input:u.sheetsDeleteRowsOrColumns,output:S.sheetsDeleteRowsOrColumns}},Re={rangeUpdated:H.rangeUpdated},ye={rangeUpdated:{description:"A range of cells in a Google Sheet was updated",payload:M,response:K}},Ee="oauth_2",be={"spreadsheets.create":{riskLevel:"write",description:"Create a new spreadsheet"},"spreadsheets.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a spreadsheet [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"sheets.appendRow":{riskLevel:"write",description:"Append a new row to a sheet"},"sheets.appendOrUpdateRow":{riskLevel:"write",description:"Append a new row or update an existing one"},"sheets.getRows":{riskLevel:"read",description:"Read rows from a sheet"},"sheets.updateRow":{riskLevel:"write",description:"Update an existing row in a sheet"},"sheets.clearSheet":{riskLevel:"destructive",description:"Clear all data from a sheet [DESTRUCTIVE]"},"sheets.createSheet":{riskLevel:"write",description:"Add a new sheet tab to a spreadsheet"},"sheets.deleteSheet":{riskLevel:"destructive",irreversible:!0,description:"Delete a sheet tab and all its data [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"sheets.deleteRowsOrColumns":{riskLevel:"destructive",description:"Delete rows or columns from a sheet [DESTRUCTIVE]"}};function Qe(s={}){let e={...s,authType:s.authType??Ee};return{id:"googlesheets",schema:L,options:e,oauthConfig:{providerName:"Google",authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:["https://www.googleapis.com/auth/spreadsheets"],authParams:{access_type:"offline",prompt:"consent"}},hooks:e.hooks,webhookHooks:e.webhookHooks,endpoints:me,webhooks:Re,endpointMeta:be,endpointSchemas:we,webhookSchemas:ye,keyBuilder:async o=>{if(e.key)return e.key;if(o.authType==="oauth_2"){let[a,n,r]=await Promise.all([o.keys.get_access_token(),o.keys.get_expires_at(),o.keys.get_refresh_token()]);if(!r)throw new Error("[corsair:googlesheets] No refresh token. Cannot get access token.");let p=await o.keys.get_integration_credentials();if(!p.client_id||!p.client_secret)throw new Error("[corsair:googlesheets] No client id or client secret");try{let d=await I({accessToken:a,expiresAt:n,refreshToken:r,clientId:p.client_id,clientSecret:p.client_secret});return d.refreshed&&await Promise.all([o.keys.set_access_token(d.accessToken),o.keys.set_expires_at(String(d.expiresAt))]),o._refreshAuth=async()=>{let l=await I({accessToken:null,expiresAt:null,refreshToken:r,clientId:p.client_id,clientSecret:p.client_secret,forceRefresh:!0});return await o.keys.set_access_token(l.accessToken),await o.keys.set_expires_at(String(l.expiresAt)),l.accessToken},d.accessToken}catch(d){throw new Error(`[corsair:googlesheets] Failed to get valid access token: ${d instanceof Error?d.message:String(d)}`)}}return""},pluginWebhookMatcher:o=>{let a=o.body;if(!a)return!1;let n=typeof a?.spreadsheetId=="string",r=a?.eventType==="rangeUpdated";return n||r}}}export{G as createGoogleSheetsWebhookMatcher,Qe as googlesheets,we as googlesheetsEndpointSchemas};
|
|
1
|
+
import{request as Z}from"corsair/http";var b=class extends Error{constructor(o,a){super(o);this.code=a;this.name="GoogleSheetsAPIError"}},J="https://sheets.googleapis.com/v4";async function Q(s,e,o){let a=await fetch("https://oauth2.googleapis.com/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:s,client_secret:e,refresh_token:o,grant_type:"refresh_token"})});if(!a.ok){let r=await a.text();throw new b(`Failed to refresh access token: ${r}`,a.status)}return await a.json()}async function I({accessToken:s,expiresAt:e,clientId:o,clientSecret:a,refreshToken:n,forceRefresh:r=!1}){let p=Math.floor(Date.now()/1e3);if(!r&&s&&e&&Number(e)>p+300)return{accessToken:s,expiresAt:Number(e),refreshed:!1};let l=await Q(o,a,n);return{accessToken:l.access_token,expiresAt:p+l.expires_in,refreshed:!0}}async function v(s,e,o={}){let{method:a="GET",body:n,query:r}=o;return await Z({BASE:J,VERSION:"1.0.0",WITH_CREDENTIALS:!1,CREDENTIALS:"omit",TOKEN:e,HEADERS:{"Content-Type":"application/json"}},{method:a,url:s,body:a==="POST"||a==="PUT"||a==="PATCH"?n:void 0,mediaType:"application/json",query:r})}function X(s){return s instanceof Error&&"status"in s&&s.status===401}async function c(s,e,o={}){try{return await v(s,e.key,o)}catch(a){if(X(a)&&e._refreshAuth){let n=await e._refreshAuth();return await v(s,n,o)}throw a}}import{logEventFromContext as R}from"corsair/core";var T=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!A:Z`,a=e.values?[e.values]:[],n=await c(`/spreadsheets/${e.spreadsheetId}/values/${o}:append`,s,{method:"POST",query:{valueInputOption:e.valueInputOption||"USER_ENTERED",insertDataOption:e.insertDataOption||"INSERT_ROWS"},body:{values:a,majorDimension:"ROWS"}});if(n.responses&&n.responses.length>0&&s.db.rows)try{let r=n.responses[0];if(r){let p=r.updatedRange||o,d=e.sheetName||"Sheet1",l=`${e.spreadsheetId}_${d}_${p}`;await s.db.rows.upsertByEntityId(l,{rowId:l,spreadsheetId:e.spreadsheetId,sheetName:d,range:p,values:e.values,createdAt:new Date})}}catch(r){console.warn("Failed to save row to database:",r)}return await R(s,"googlesheets.sheets.appendRow",{...e},"completed"),n},U=async(s,e)=>{let o=e.sheetName||"Sheet1",a=e.keyColumn||"A",n=e.keyValue;if(!n)throw new Error("keyValue is required for appendOrUpdateRow");let r=`${o}!${a}:${a}`,p=await c(`/spreadsheets/${e.spreadsheetId}/values/${r}`,s,{method:"GET"}),d=-1;if(p.values){for(let g=0;g<p.values.length;g++)if(p.values[g]?.[0]===String(n)){d=g;break}}let l=e.values?[e.values]:[],m=d>=0?`${o}!${d+1}:${d+1}`:`${o}!A:Z`;if(d>=0){let g=await c(`/spreadsheets/${e.spreadsheetId}/values/${m}`,s,{method:"PUT",query:{valueInputOption:e.valueInputOption||"USER_ENTERED"},body:{values:l,majorDimension:"ROWS"}});if(s.db.rows)try{let w=g.updatedRange||m,E=`${e.spreadsheetId}_${o}_${w}`;await s.db.rows.upsertByEntityId(E,{rowId:E,spreadsheetId:e.spreadsheetId,sheetName:o,range:w,values:e.values,createdAt:new Date})}catch(w){console.warn("Failed to update row in database:",w)}return await R(s,"googlesheets.sheets.appendOrUpdateRow",{...e,action:"update"},"completed"),g}else{let g=await c(`/spreadsheets/${e.spreadsheetId}/values/${m}:append`,s,{method:"POST",query:{valueInputOption:e.valueInputOption||"USER_ENTERED",insertDataOption:e.insertDataOption||"INSERT_ROWS"},body:{values:l,majorDimension:"ROWS"}});if(s.db.rows)try{let w=g.updates?.updatedRange||m,E=`${e.spreadsheetId}_${o}_${w}`;await s.db.rows.upsertByEntityId(E,{rowId:E,spreadsheetId:e.spreadsheetId,sheetName:o,range:w,values:e.values,createdAt:new Date})}catch(w){console.warn("Failed to save row to database:",w)}return await R(s,"googlesheets.sheets.appendOrUpdateRow",{...e,action:"append"},"completed"),g}},C=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!A:Z`,a=await c(`/spreadsheets/${e.spreadsheetId}/values/${o}`,s,{method:"GET",query:{valueRenderOption:e.valueRenderOption||"FORMATTED_VALUE",dateTimeRenderOption:e.dateTimeRenderOption||"FORMATTED_STRING"}});if(a.values&&s.db.rows)try{let n=e.sheetName||"Sheet1";for(let r=0;r<a.values.length;r++){let p=a.values[r];if(p){let d=r+1,l=`${n}!${d}:${d}`,m=`${e.spreadsheetId}_${n}_${l}`;await s.db.rows.upsertByEntityId(m,{rowId:m,spreadsheetId:e.spreadsheetId,sheetName:n,range:l,values:p,createdAt:new Date})}}}catch(n){console.warn("Failed to save rows to database:",n)}return await R(s,"googlesheets.sheets.getRows",{...e},"completed"),a},A=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!${e.rowIndex||1}:${e.rowIndex||1}`,a=e.values?[e.values]:[],n=await c(`/spreadsheets/${e.spreadsheetId}/values/${o}`,s,{method:"PUT",query:{valueInputOption:e.valueInputOption||"USER_ENTERED"},body:{values:a,majorDimension:"ROWS"}});if(n.responses&&n.responses.length>0&&s.db.rows)try{let r=n.responses[0];if(r){let p=r.updatedRange||o,d=e.sheetName||"Sheet1",l=`${e.spreadsheetId}_${d}_${p}`;await s.db.rows.upsertByEntityId(l,{rowId:l,spreadsheetId:e.spreadsheetId,sheetName:d,range:p,values:e.values,createdAt:new Date})}}catch(r){console.warn("Failed to update row in database:",r)}return await R(s,"googlesheets.sheets.updateRow",{...e},"completed"),n},_=async(s,e)=>{let o=e.range||e.sheetName||"Sheet1",a=await c(`/spreadsheets/${e.spreadsheetId}/values/${o}:clear`,s,{method:"POST"});if(a.clearedRange&&s.db.rows)try{let n=e.sheetName||"Sheet1",r=a.clearedRange,p=`${e.spreadsheetId}_${n}_${r}`;await s.db.rows.deleteByEntityId(p)}catch(n){console.warn("Failed to delete rows from database:",n)}return await R(s,"googlesheets.sheets.clearSheet",{...e},"completed"),a},D=async(s,e)=>{let o=await c(`/spreadsheets/${e.spreadsheetId}:batchUpdate`,s,{method:"POST",body:{requests:[{addSheet:{properties:{title:e.title||"Sheet1"}}}]}});if(o.replies&&o.replies.length>0&&s.db.sheets)try{let n=o.replies[0].addSheet?.properties;n?.sheetId!==void 0&&await s.db.sheets.upsertByEntityId(String(n.sheetId),{sheetId:String(n.sheetId),spreadsheetId:e.spreadsheetId,title:n.title||e.title||"Sheet1",index:n.index,createdAt:new Date})}catch(a){console.warn("Failed to save sheet to database:",a)}return await R(s,"googlesheets.sheets.createSheet",{...e},"completed"),o},P=async(s,e)=>{let o=await c(`/spreadsheets/${e.spreadsheetId}:batchUpdate`,s,{method:"POST",body:{requests:[{deleteSheet:{sheetId:e.sheetId}}]}});if(s.db.sheets)try{await s.db.sheets.deleteByEntityId(String(e.sheetId))}catch(a){console.warn("Failed to delete sheet from database:",a)}return await R(s,"googlesheets.sheets.deleteSheet",{...e},"completed"),o},N=async(s,e)=>{let o=e.dimension||"ROWS",a=e.startIndex||0,n=e.endIndex||a+1,r=await c(`/spreadsheets/${e.spreadsheetId}:batchUpdate`,s,{method:"POST",body:{requests:[{deleteDimension:{range:{sheetId:e.sheetId,dimension:o,startIndex:a,endIndex:n}}}]}});if(o==="ROWS"&&s.db.rows)try{let p=`Sheet_${e.sheetId}`;for(let d=a;d<n;d++){let l=d+1,m=`${p}!${l}:${l}`,g=`${e.spreadsheetId}_${p}_${m}`;await s.db.rows.deleteByEntityId(g)}}catch(p){console.warn("Failed to delete rows from database:",p)}return await R(s,"googlesheets.sheets.deleteRowsOrColumns",{...e},"completed"),r};import{logEventFromContext as $}from"corsair/core";var x=async(s,e)=>{let o=await c("/spreadsheets",s,{method:"POST",body:{properties:e.properties}});if(o.spreadsheetId&&s.db.spreadsheets)try{await s.db.spreadsheets.upsertByEntityId(o.spreadsheetId,{spreadsheetId:o.spreadsheetId,title:o.properties?.title,spreadsheetUrl:o.spreadsheetUrl,createdAt:new Date})}catch(a){console.warn("Failed to save spreadsheet to database:",a)}return await $(s,"googlesheets.spreadsheets.create",{...e},"completed"),o},W=async(s,e)=>{let o=await fetch(`https://www.googleapis.com/drive/v3/files/${e.spreadsheetId}`,{method:"DELETE",headers:{Authorization:`Bearer ${s.key}`}});if(!o.ok&&o.status!==404){let a=await o.text();throw new Error(`Failed to delete spreadsheet: ${o.status} ${a}`)}if(s.db.spreadsheets)try{await s.db.spreadsheets.deleteByEntityId(e.spreadsheetId)}catch(a){console.warn("Failed to delete spreadsheet from database:",a)}await $(s,"googlesheets.spreadsheets.delete",{...e},"completed")};import{z as t}from"zod";var te=t.object({properties:t.object({title:t.string().optional(),locale:t.string().optional(),timeZone:t.string().optional()}).optional()}),se=t.object({spreadsheetId:t.string()}),oe=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional(),values:t.array(t.union([t.string(),t.number(),t.boolean(),t.null()])).optional(),valueInputOption:t.enum(["RAW","USER_ENTERED"]).optional(),insertDataOption:t.enum(["OVERWRITE","INSERT_ROWS"]).optional()}),ae=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),keyColumn:t.string().describe('Column letter (e.g. "A"), not a header name (e.g. "Company Name")').optional(),keyValue:t.union([t.string(),t.number()]).optional(),values:t.array(t.union([t.string(),t.number(),t.boolean(),t.null()])).optional(),valueInputOption:t.enum(["RAW","USER_ENTERED"]).optional(),insertDataOption:t.enum(["OVERWRITE","INSERT_ROWS"]).optional()}),ne=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional(),valueRenderOption:t.enum(["FORMATTED_VALUE","UNFORMATTED_VALUE","FORMULA"]).optional(),dateTimeRenderOption:t.enum(["SERIAL_NUMBER","FORMATTED_STRING"]).optional()}),re=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional(),rowIndex:t.number().optional(),values:t.array(t.union([t.string(),t.number(),t.boolean(),t.null()])).optional(),valueInputOption:t.enum(["RAW","USER_ENTERED"]).optional()}),pe=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional()}),de=t.object({spreadsheetId:t.string(),title:t.string().optional()}),he=t.object({spreadsheetId:t.string(),sheetId:t.number()}),ie=t.object({spreadsheetId:t.string(),sheetId:t.number(),dimension:t.enum(["ROWS","COLUMNS"]).optional(),startIndex:t.number().optional(),endIndex:t.number().optional()}),u={spreadsheetsCreate:te,spreadsheetsDelete:se,sheetsAppendRow:oe,sheetsAppendOrUpdateRow:ae,sheetsGetRows:ne,sheetsUpdateRow:re,sheetsClearSheet:pe,sheetsCreateSheet:de,sheetsDeleteSheet:he,sheetsDeleteRowsOrColumns:ie},le=t.object({title:t.string().optional(),locale:t.string().optional(),autoRecalc:t.enum(["ON_CHANGE","ON_UPDATE","HOUR","MINUTE"]).optional(),timeZone:t.string().optional()}),B=t.object({spreadsheetId:t.string().optional(),properties:le.optional(),spreadsheetUrl:t.string().optional()}),V=t.object({range:t.string().optional(),majorDimension:t.enum(["ROWS","COLUMNS","DIMENSION_UNSPECIFIED"]).optional(),values:t.array(t.array(t.union([t.string(),t.number(),t.boolean(),t.null()]))).optional()}),f=t.object({spreadsheetId:t.string().optional(),totalUpdatedRows:t.number().optional(),totalUpdatedColumns:t.number().optional(),totalUpdatedCells:t.number().optional(),totalUpdatedSheets:t.number().optional(),responses:t.array(V).optional()}),ce=t.object({spreadsheetId:t.string().optional(),clearedRange:t.string().optional()}),ge=t.object({sheetId:t.number().optional(),title:t.string().optional(),index:t.number().optional(),sheetType:t.enum(["GRID","OBJECT","DATA_SOURCE"]).optional(),hidden:t.boolean().optional()}),Ue=t.object({properties:ge.optional()}),k=t.object({spreadsheetId:t.string().optional(),replies:t.array(t.any()).optional(),updatedSpreadsheet:B.optional()}),S={spreadsheetsCreate:B,spreadsheetsDelete:t.void(),sheetsAppendRow:f,sheetsAppendOrUpdateRow:f,sheetsGetRows:V,sheetsUpdateRow:f,sheetsClearSheet:ce,sheetsCreateSheet:k,sheetsDeleteSheet:k,sheetsDeleteRowsOrColumns:k};var O={create:x,delete:W},y={appendRow:T,appendOrUpdateRow:U,getRows:C,updateRow:A,clearSheet:_,createSheet:D,deleteSheet:P,deleteRowsOrColumns:N};import{z as i}from"zod";var j=i.object({spreadsheetId:i.string(),title:i.string().optional(),spreadsheetUrl:i.string().optional(),createdAt:i.coerce.date().optional()}),q=i.object({sheetId:i.string(),spreadsheetId:i.string(),title:i.string().optional(),index:i.number().optional(),createdAt:i.coerce.date().optional()}),F=i.object({rowId:i.string(),spreadsheetId:i.string(),sheetName:i.string().optional(),range:i.string().optional(),values:i.array(i.union([i.string(),i.number(),i.boolean(),i.null()])).optional(),createdAt:i.coerce.date().optional()});var L={version:"1.0.0",entities:{spreadsheets:j,sheets:q,rows:F}};import{logEventFromContext as Se}from"corsair/core";import{z as h}from"zod";var M=h.object({spreadsheetId:h.string().optional(),sheetName:h.string().optional(),range:h.string().optional(),values:h.array(h.union([h.string(),h.number(),h.boolean(),h.null()])).optional(),eventType:h.literal("rangeUpdated").optional(),timestamp:h.string().optional(),event:h.unknown().optional()}),K=h.object({eventType:h.literal("rangeUpdated"),spreadsheetId:h.string(),sheetName:h.string(),range:h.string(),values:h.array(h.union([h.string(),h.number(),h.boolean(),h.null()])),timestamp:h.string()});function ue(s){return typeof s=="string"?JSON.parse(s):s}function G(s){return e=>ue(e.body).eventType===s}var z={match:G("rangeUpdated"),handler:async(s,e)=>{let o=e.payload;if(!o.spreadsheetId||!o.values)return{success:!1,error:"Missing required fields: spreadsheetId or values"};let a={eventType:"rangeUpdated",spreadsheetId:o.spreadsheetId,sheetName:o.sheetName||"Sheet1",range:o.range||"A:Z",values:o.values,timestamp:o.timestamp||new Date().toISOString()};if(s.db.rows)try{let n=`${o.spreadsheetId}_${o.sheetName}_${o.range||"A:Z"}`;await s.db.rows.upsertByEntityId(n,{rowId:n,spreadsheetId:o.spreadsheetId,sheetName:o.sheetName||"Sheet1",range:o.range||"A:Z",values:o.values,createdAt:new Date})}catch(n){console.warn("Failed to save/update range in database:",n)}return await Se(s,"googlesheets.webhook.rangeUpdated",{...a},"completed"),{success:!0,data:a}}};var H={rangeUpdated:z};var me={spreadsheets:{create:O.create,delete:O.delete},sheets:{appendRow:y.appendRow,appendOrUpdateRow:y.appendOrUpdateRow,getRows:y.getRows,updateRow:y.updateRow,clearSheet:y.clearSheet,createSheet:y.createSheet,deleteSheet:y.deleteSheet,deleteRowsOrColumns:y.deleteRowsOrColumns}},we={"spreadsheets.create":{input:u.spreadsheetsCreate,output:S.spreadsheetsCreate},"spreadsheets.delete":{input:u.spreadsheetsDelete,output:S.spreadsheetsDelete},"sheets.appendRow":{input:u.sheetsAppendRow,output:S.sheetsAppendRow},"sheets.appendOrUpdateRow":{input:u.sheetsAppendOrUpdateRow,output:S.sheetsAppendOrUpdateRow},"sheets.getRows":{input:u.sheetsGetRows,output:S.sheetsGetRows},"sheets.updateRow":{input:u.sheetsUpdateRow,output:S.sheetsUpdateRow},"sheets.clearSheet":{input:u.sheetsClearSheet,output:S.sheetsClearSheet},"sheets.createSheet":{input:u.sheetsCreateSheet,output:S.sheetsCreateSheet},"sheets.deleteSheet":{input:u.sheetsDeleteSheet,output:S.sheetsDeleteSheet},"sheets.deleteRowsOrColumns":{input:u.sheetsDeleteRowsOrColumns,output:S.sheetsDeleteRowsOrColumns}},Re={rangeUpdated:H.rangeUpdated},ye={rangeUpdated:{description:"A range of cells in a Google Sheet was updated",payload:M,response:K}},Ee="oauth_2",be={"spreadsheets.create":{riskLevel:"write",description:"Create a new spreadsheet"},"spreadsheets.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a spreadsheet [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"sheets.appendRow":{riskLevel:"write",description:"Append a new row to a sheet"},"sheets.appendOrUpdateRow":{riskLevel:"write",description:"Append a new row or update an existing one"},"sheets.getRows":{riskLevel:"read",description:"Read rows from a sheet"},"sheets.updateRow":{riskLevel:"write",description:"Update an existing row in a sheet"},"sheets.clearSheet":{riskLevel:"destructive",description:"Clear all data from a sheet [DESTRUCTIVE]"},"sheets.createSheet":{riskLevel:"write",description:"Add a new sheet tab to a spreadsheet"},"sheets.deleteSheet":{riskLevel:"destructive",irreversible:!0,description:"Delete a sheet tab and all its data [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"sheets.deleteRowsOrColumns":{riskLevel:"destructive",description:"Delete rows or columns from a sheet [DESTRUCTIVE]"}};function Qe(s={}){let e={...s,authType:s.authType??Ee};return{id:"googlesheets",schema:L,options:e,oauthConfig:{providerName:"Google",authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:["https://www.googleapis.com/auth/spreadsheets"],authParams:{access_type:"offline",prompt:"consent"}},hooks:e.hooks,webhookHooks:e.webhookHooks,endpoints:me,webhooks:Re,endpointMeta:be,endpointSchemas:we,webhookSchemas:ye,keyBuilder:async o=>{if(e.key)return e.key;if(o.authType==="oauth_2"){let[a,n,r]=await Promise.all([o.keys.get_access_token(),o.keys.get_expires_at(),o.keys.get_refresh_token()]);if(!r)throw new Error("[corsair:googlesheets] No refresh token. Cannot get access token.");let p=await o.keys.get_integration_credentials();if(!p.client_id||!p.client_secret)throw new Error("[corsair:googlesheets] No client id or client secret");try{let d=await I({accessToken:a,expiresAt:n,refreshToken:r,clientId:p.client_id,clientSecret:p.client_secret});return d.refreshed&&await Promise.all([o.keys.set_access_token(d.accessToken),o.keys.set_expires_at(String(d.expiresAt))]),o._refreshAuth=async()=>{let l=await I({accessToken:null,expiresAt:null,refreshToken:r,clientId:p.client_id,clientSecret:p.client_secret,forceRefresh:!0});return await o.keys.set_access_token(l.accessToken),await o.keys.set_expires_at(String(l.expiresAt)),l.accessToken},d.accessToken}catch(d){throw new Error(`[corsair:googlesheets] Failed to get valid access token: ${d instanceof Error?d.message:String(d)}`)}}return""},pluginWebhookMatcher:o=>{let a=o.body;if(!a)return!1;let n=typeof a?.spreadsheetId=="string",r=a?.eventType==="rangeUpdated";return n||r}}}export{G as createGoogleSheetsWebhookMatcher,Qe as googlesheets,we as googlesheetsEndpointSchemas};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@corsair-dev/googlesheets",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Googlesheets plugin for Corsair",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"tsup": "^8.0.1",
|
|
22
22
|
"typescript": "^5.9.3",
|
|
23
23
|
"zod": "^3.25.76",
|
|
24
|
-
"corsair": "0.1.
|
|
24
|
+
"corsair": "0.1.51"
|
|
25
25
|
},
|
|
26
26
|
"keywords": [
|
|
27
27
|
"corsair",
|