@corsair-dev/googlesheets 0.1.6 → 0.1.8
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/README.md +42 -0
- package/dist/client.d.ts +0 -12
- package/dist/client.d.ts.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/webhooks/tenant-matcher.d.ts +3 -0
- package/dist/webhooks/tenant-matcher.d.ts.map +1 -0
- package/package.json +10 -6
package/README.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# @corsair-dev/googlesheets
|
|
2
|
+
|
|
3
|
+
Google sheets plugin for Corsair.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @corsair-dev/googlesheets
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Endpoints
|
|
12
|
+
|
|
13
|
+
| Operation | Operation ID | Risk | Description |
|
|
14
|
+
|-----------|--------------|------|-------------|
|
|
15
|
+
| `sheets.appendOrUpdateRow` | `googlesheets.api.sheets.appendOrUpdateRow` | `write` | Append a new row or update an existing one |
|
|
16
|
+
| `sheets.appendRow` | `googlesheets.api.sheets.appendRow` | `write` | Append a new row to a sheet |
|
|
17
|
+
| `sheets.clearSheet` | `googlesheets.api.sheets.clearSheet` | `destructive` | Clear all data from a sheet [DESTRUCTIVE] |
|
|
18
|
+
| `sheets.createSheet` | `googlesheets.api.sheets.createSheet` | `write` | Add a new sheet tab to a spreadsheet |
|
|
19
|
+
| `sheets.deleteRowsOrColumns` | `googlesheets.api.sheets.deleteRowsOrColumns` | `destructive` | Delete rows or columns from a sheet [DESTRUCTIVE] |
|
|
20
|
+
| `sheets.deleteSheet` | `googlesheets.api.sheets.deleteSheet` | `destructive` | Delete a sheet tab and all its data [DESTRUCTIVE · IRREVERSIBLE] |
|
|
21
|
+
| `sheets.getRows` | `googlesheets.api.sheets.getRows` | `read` | Read rows from a sheet |
|
|
22
|
+
| `sheets.listSheetsInSpreadsheet` | `googlesheets.api.sheets.listSheetsInSpreadsheet` | `read` | List all sheet tabs in a spreadsheet |
|
|
23
|
+
| `sheets.updateRow` | `googlesheets.api.sheets.updateRow` | `write` | Update an existing row in a sheet |
|
|
24
|
+
| `spreadsheets.create` | `googlesheets.api.spreadsheets.create` | `write` | Create a new spreadsheet |
|
|
25
|
+
| `spreadsheets.delete` | `googlesheets.api.spreadsheets.delete` | `destructive` | Permanently delete a spreadsheet [DESTRUCTIVE · IRREVERSIBLE] |
|
|
26
|
+
| `spreadsheets.list` | `googlesheets.api.spreadsheets.list` | `read` | List all spreadsheets in Google Drive |
|
|
27
|
+
|
|
28
|
+
## Auth
|
|
29
|
+
|
|
30
|
+
Auth: OAuth 2.0. Corsair prompts your tenant for credentials on first use.
|
|
31
|
+
|
|
32
|
+
## Webhooks
|
|
33
|
+
|
|
34
|
+
Handles 1 webhook event. See the reference for payloads and `webhookHooks`.
|
|
35
|
+
|
|
36
|
+
## Reference
|
|
37
|
+
|
|
38
|
+
Full docs, types, and examples: https://docs.corsair.dev/plugins/googlesheets
|
|
39
|
+
|
|
40
|
+
## License
|
|
41
|
+
|
|
42
|
+
Apache-2.0
|
package/dist/client.d.ts
CHANGED
|
@@ -2,18 +2,6 @@ export declare class GoogleSheetsAPIError extends Error {
|
|
|
2
2
|
readonly code?: number | undefined;
|
|
3
3
|
constructor(message: string, code?: number | undefined);
|
|
4
4
|
}
|
|
5
|
-
export declare function getValidAccessToken({ accessToken, expiresAt, clientId, clientSecret, refreshToken, forceRefresh, }: {
|
|
6
|
-
clientId: string;
|
|
7
|
-
clientSecret: string;
|
|
8
|
-
accessToken?: string | null;
|
|
9
|
-
expiresAt?: string | null;
|
|
10
|
-
refreshToken: string;
|
|
11
|
-
forceRefresh?: boolean;
|
|
12
|
-
}): Promise<{
|
|
13
|
-
accessToken: string;
|
|
14
|
-
expiresAt: number;
|
|
15
|
-
refreshed: boolean;
|
|
16
|
-
}>;
|
|
17
5
|
type SheetsRequestOptions = {
|
|
18
6
|
method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
19
7
|
body?: Record<string, unknown>;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../client.ts"],"names":[],"mappings":"AAGA,qBAAa,oBAAqB,SAAQ,KAAK;aAG7B,IAAI,CAAC,EAAE,MAAM;gBAD7B,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,MAAM,YAAA;CAK9B;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../client.ts"],"names":[],"mappings":"AAGA,qBAAa,oBAAqB,SAAQ,KAAK;aAG7B,IAAI,CAAC,EAAE,MAAM;gBAD7B,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,MAAM,YAAA;CAK9B;AAID,KAAK,oBAAoB,GAAG;IAC3B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;CAC9D,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,CAAC,EACxC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,oBAAyB,GAChC,OAAO,CAAC,CAAC,CAAC,CA2BZ;AAuBD,wBAAsB,6BAA6B,CAClD,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,EAC1D,OAAO,GAAE,WAAgB,GACvB,OAAO,CAAC,QAAQ,CAAC,CAOnB;AAED,wBAAsB,8BAA8B,CAAC,CAAC,EACrD,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,EAC1D,OAAO,GAAE,oBAAyB,GAChC,OAAO,CAAC,CAAC,CAAC,CAUZ"}
|
package/dist/index.d.ts
CHANGED
|
@@ -345,6 +345,11 @@ export type GoogleSheetsPluginOptions = {
|
|
|
345
345
|
};
|
|
346
346
|
export type GoogleSheetsKeyBuilderContext = KeyBuilderContext<GoogleSheetsPluginOptions>;
|
|
347
347
|
declare const defaultAuthType: "oauth_2";
|
|
348
|
+
export declare const googlesheetsAuthConfig: {
|
|
349
|
+
readonly oauth_2: {
|
|
350
|
+
readonly account: readonly ["spreadsheet_id"];
|
|
351
|
+
};
|
|
352
|
+
};
|
|
348
353
|
export type BaseGoogleSheetsPlugin<T extends GoogleSheetsPluginOptions> = CorsairPlugin<'googlesheets', typeof GoogleSheetsSchema, typeof googleSheetsEndpointsNested, typeof googleSheetsWebhooksNested, T, typeof defaultAuthType>;
|
|
349
354
|
export type InternalGoogleSheetsPlugin = BaseGoogleSheetsPlugin<GoogleSheetsPluginOptions>;
|
|
350
355
|
export type ExternalGoogleSheetsPlugin<T extends GoogleSheetsPluginOptions> = BaseGoogleSheetsPlugin<T>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,aAAa,EACb,YAAY,EACZ,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AuthMissingError as ee}from"corsair/core";import{request as te}from"corsair/http";var f=class extends Error{constructor(o,a){super(o);this.code=a;this.name="GoogleSheetsAPIError"}},se="https://sheets.googleapis.com/v4";async function oe(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 f(`Failed to refresh access token: ${r}`,a.status)}return await a.json()}async function b({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 d=await oe(o,a,n);return{accessToken:d.access_token,expiresAt:p+d.expires_in,refreshed:!0}}async function U(s,e,o={}){let{method:a="GET",body:n,query:r}=o;return await te({BASE:se,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 ae(s){return s instanceof Error&&"status"in s&&s.status===401}var ne="https://www.googleapis.com/drive/v3";async function A(s,e,o={}){return fetch(`${ne}${s}`,{...o,headers:{...o.headers,Authorization:`Bearer ${e}`}})}async function k(s,e,o={}){let a=await A(s,e.key,o);if(a.status===401&&e._refreshAuth){let n=await e._refreshAuth();return A(s,n,o)}return a}async function g(s,e,o={}){try{return await U(s,e.key,o)}catch(a){if(ae(a)&&e._refreshAuth){let n=await e._refreshAuth();return await U(s,n,o)}throw a}}import{logEventFromContext as w}from"corsair/core";var C=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!A:Z`,a=e.values?[e.values]:[],n=await g(`/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,h=e.sheetName||"Sheet1",d=`${e.spreadsheetId}_${h}_${p}`;await s.db.rows.upsertByEntityId(d,{rowId:d,spreadsheetId:e.spreadsheetId,sheetName:h,range:p,values:e.values,createdAt:new Date})}}catch(r){console.warn("Failed to save row to database:",r)}return await w(s,"googlesheets.sheets.appendRow",{...e},"completed"),n},_=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 g(`/spreadsheets/${e.spreadsheetId}/values/${r}`,s,{method:"GET"}),h=-1;if(p.values){for(let m=0;m<p.values.length;m++)if(p.values[m]?.[0]===String(n)){h=m;break}}let d=e.values?[e.values]:[],c=h>=0?`${o}!${h+1}:${h+1}`:`${o}!A:Z`;if(h>=0){let m=await g(`/spreadsheets/${e.spreadsheetId}/values/${c}`,s,{method:"PUT",query:{valueInputOption:e.valueInputOption||"USER_ENTERED"},body:{values:d,majorDimension:"ROWS"}});if(s.db.rows)try{let y=m.updatedRange||c,E=`${e.spreadsheetId}_${o}_${y}`;await s.db.rows.upsertByEntityId(E,{rowId:E,spreadsheetId:e.spreadsheetId,sheetName:o,range:y,values:e.values,createdAt:new Date})}catch(y){console.warn("Failed to update row in database:",y)}return await w(s,"googlesheets.sheets.appendOrUpdateRow",{...e,action:"update"},"completed"),m}else{let m=await g(`/spreadsheets/${e.spreadsheetId}/values/${c}:append`,s,{method:"POST",query:{valueInputOption:e.valueInputOption||"USER_ENTERED",insertDataOption:e.insertDataOption||"INSERT_ROWS"},body:{values:d,majorDimension:"ROWS"}});if(s.db.rows)try{let y=m.updates?.updatedRange||c,E=`${e.spreadsheetId}_${o}_${y}`;await s.db.rows.upsertByEntityId(E,{rowId:E,spreadsheetId:e.spreadsheetId,sheetName:o,range:y,values:e.values,createdAt:new Date})}catch(y){console.warn("Failed to save row to database:",y)}return await w(s,"googlesheets.sheets.appendOrUpdateRow",{...e,action:"append"},"completed"),m}},D=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!A:Z`,a=await g(`/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 h=r+1,d=`${n}!${h}:${h}`,c=`${e.spreadsheetId}_${n}_${d}`;await s.db.rows.upsertByEntityId(c,{rowId:c,spreadsheetId:e.spreadsheetId,sheetName:n,range:d,values:p,createdAt:new Date})}}}catch(n){console.warn("Failed to save rows to database:",n)}return await w(s,"googlesheets.sheets.getRows",{...e},"completed"),a},P=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!${e.rowIndex||1}:${e.rowIndex||1}`,a=e.values?[e.values]:[],n=await g(`/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,h=e.sheetName||"Sheet1",d=`${e.spreadsheetId}_${h}_${p}`;await s.db.rows.upsertByEntityId(d,{rowId:d,spreadsheetId:e.spreadsheetId,sheetName:h,range:p,values:e.values,createdAt:new Date})}}catch(r){console.warn("Failed to update row in database:",r)}return await w(s,"googlesheets.sheets.updateRow",{...e},"completed"),n},N=async(s,e)=>{let o=e.range||e.sheetName||"Sheet1",a=await g(`/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 w(s,"googlesheets.sheets.clearSheet",{...e},"completed"),a},$=async(s,e)=>{let o=await g(`/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 w(s,"googlesheets.sheets.createSheet",{...e},"completed"),o},x=async(s,e)=>{let o=await g(`/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 w(s,"googlesheets.sheets.deleteSheet",{...e},"completed"),o},L=async(s,e)=>{let o=await g(`/spreadsheets/${e.spreadsheetId}`,s,{method:"GET",query:{fields:"spreadsheetId,sheets.properties"}}),a={spreadsheetId:o.spreadsheetId,sheets:o.sheets?.map(n=>n.properties).filter(n=>n!=null)};return await w(s,"googlesheets.sheets.listSheets",{...e},"completed"),a},W=async(s,e)=>{let o=e.dimension||"ROWS",a=e.startIndex||0,n=e.endIndex||a+1,r=await g(`/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 h=a;h<n;h++){let d=h+1,c=`${p}!${d}:${d}`,m=`${e.spreadsheetId}_${p}_${c}`;await s.db.rows.deleteByEntityId(m)}}catch(p){console.warn("Failed to delete rows from database:",p)}return await w(s,"googlesheets.sheets.deleteRowsOrColumns",{...e},"completed"),r};import{logEventFromContext as G}from"corsair/core";var B=async(s,e)=>{let o=await g("/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 G(s,"googlesheets.spreadsheets.create",{...e},"completed"),o},V=async(s,e)=>{let o=await k(`/files/${e.spreadsheetId}`,s,{method:"DELETE"});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 G(s,"googlesheets.spreadsheets.delete",{...e},"completed")},j=async(s,e)=>{let o="mimeType='application/vnd.google-apps.spreadsheet'",a=new URLSearchParams({q:e.query?`${o} AND ${e.query}`:o,fields:"files(id,name,createdTime,modifiedTime,webViewLink),nextPageToken"});e.pageSize&&a.set("pageSize",String(e.pageSize)),e.pageToken&&a.set("pageToken",e.pageToken);let n=await k(`/files?${a.toString()}`,s);if(!n.ok){let p=await n.text();throw new Error(`Failed to list spreadsheets: ${n.status} ${p}`)}let r=await n.json();return await G(s,"googlesheets.spreadsheets.list",{...e},"completed"),r};import{z as t}from"zod";var he=t.object({properties:t.object({title:t.string().optional(),locale:t.string().optional(),timeZone:t.string().optional()}).optional()}),de=t.object({spreadsheetId:t.string()}),ie=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()}),le=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()}),ge=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()}),ce=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()}),ue=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional()}),Se=t.object({spreadsheetId:t.string(),title:t.string().optional()}),me=t.object({spreadsheetId:t.string(),sheetId:t.number()}),we=t.object({spreadsheetId:t.string(),sheetId:t.number(),dimension:t.enum(["ROWS","COLUMNS"]).optional(),startIndex:t.number().optional(),endIndex:t.number().optional()}),Re=t.object({spreadsheetId:t.string()}),ye=t.object({pageSize:t.number().optional(),pageToken:t.string().optional(),query:t.string().optional()}),u={spreadsheetsCreate:he,spreadsheetsDelete:de,spreadsheetsList:ye,sheetsAppendRow:ie,sheetsAppendOrUpdateRow:le,sheetsGetRows:ge,sheetsUpdateRow:ce,sheetsClearSheet:ue,sheetsCreateSheet:Se,sheetsDeleteSheet:me,sheetsDeleteRowsOrColumns:we,sheetsListSheetsInSpreadsheet:Re},Ee=t.object({title:t.string().optional(),locale:t.string().optional(),autoRecalc:t.enum(["ON_CHANGE","ON_UPDATE","HOUR","MINUTE"]).optional(),timeZone:t.string().optional()}),q=t.object({spreadsheetId:t.string().optional(),properties:Ee.optional(),spreadsheetUrl:t.string().optional()}),F=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()}),O=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(F).optional()}),Ie=t.object({spreadsheetId:t.string().optional(),clearedRange:t.string().optional()}),M=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()}),Be=t.object({properties:M.optional()}),T=t.object({spreadsheetId:t.string().optional(),replies:t.array(t.any()).optional(),updatedSpreadsheet:q.optional()}),fe=t.object({spreadsheetId:t.string().optional(),sheets:t.array(M).optional()}),be=t.object({id:t.string().optional(),name:t.string().optional(),createdTime:t.string().optional(),modifiedTime:t.string().optional(),webViewLink:t.string().optional()}),ke=t.object({files:t.array(be).optional(),nextPageToken:t.string().optional()}),S={spreadsheetsCreate:q,spreadsheetsDelete:t.void(),spreadsheetsList:ke,sheetsAppendRow:O,sheetsAppendOrUpdateRow:O,sheetsGetRows:F,sheetsUpdateRow:O,sheetsClearSheet:Ie,sheetsCreateSheet:T,sheetsDeleteSheet:T,sheetsDeleteRowsOrColumns:T,sheetsListSheetsInSpreadsheet:fe};var I={create:B,delete:V,list:j},R={appendRow:C,appendOrUpdateRow:_,getRows:D,updateRow:P,clearSheet:N,createSheet:$,deleteSheet:x,deleteRowsOrColumns:W,listSheetsInSpreadsheet:L};import{z as l}from"zod";var z=l.object({spreadsheetId:l.string(),title:l.string().optional(),spreadsheetUrl:l.string().optional(),createdAt:l.coerce.date().optional()}),K=l.object({sheetId:l.string(),spreadsheetId:l.string(),title:l.string().optional(),index:l.number().optional(),createdAt:l.coerce.date().optional()}),H=l.object({rowId:l.string(),spreadsheetId:l.string(),sheetName:l.string().optional(),range:l.string().optional(),values:l.array(l.union([l.string(),l.number(),l.boolean(),l.null()])).optional(),createdAt:l.coerce.date().optional()});var Z={version:"1.0.0",entities:{spreadsheets:z,sheets:K,rows:H}};import{logEventFromContext as Oe}from"corsair/core";import{z as i}from"zod";var J=i.object({spreadsheetId:i.string().optional(),sheetName:i.string().optional(),range:i.string().optional(),values:i.array(i.union([i.string(),i.number(),i.boolean(),i.null()])).optional(),eventType:i.literal("rangeUpdated").optional(),timestamp:i.string().optional(),event:i.unknown().optional()}),Q=i.object({eventType:i.literal("rangeUpdated"),spreadsheetId:i.string(),sheetName:i.string(),range:i.string(),values:i.array(i.union([i.string(),i.number(),i.boolean(),i.null()])),timestamp:i.string()});function Ge(s){return typeof s=="string"?JSON.parse(s):s}function v(s){return e=>Ge(e.body).eventType===s}var X={match:v("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 Oe(s,"googlesheets.webhook.rangeUpdated",{...a},"completed"),{success:!0,data:a}}};var Y={rangeUpdated:X};var Te={spreadsheets:{create:I.create,delete:I.delete,list:I.list},sheets:{appendRow:R.appendRow,appendOrUpdateRow:R.appendOrUpdateRow,getRows:R.getRows,updateRow:R.updateRow,clearSheet:R.clearSheet,createSheet:R.createSheet,deleteSheet:R.deleteSheet,deleteRowsOrColumns:R.deleteRowsOrColumns,listSheetsInSpreadsheet:R.listSheetsInSpreadsheet}},ve={"spreadsheets.create":{input:u.spreadsheetsCreate,output:S.spreadsheetsCreate},"spreadsheets.delete":{input:u.spreadsheetsDelete,output:S.spreadsheetsDelete},"spreadsheets.list":{input:u.spreadsheetsList,output:S.spreadsheetsList},"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},"sheets.listSheetsInSpreadsheet":{input:u.sheetsListSheetsInSpreadsheet,output:S.sheetsListSheetsInSpreadsheet}},Ue={rangeUpdated:Y.rangeUpdated},Ae={rangeUpdated:{description:"A range of cells in a Google Sheet was updated",payload:J,response:Q}},Ce="oauth_2",_e={"spreadsheets.create":{riskLevel:"write",description:"Create a new spreadsheet"},"spreadsheets.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a spreadsheet [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"spreadsheets.list":{riskLevel:"read",description:"List all spreadsheets in Google Drive"},"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]"},"sheets.listSheetsInSpreadsheet":{riskLevel:"read",description:"List all sheet tabs in a spreadsheet"}};function dt(s={}){let e={...s,authType:s.authType??Ce};return{id:"googlesheets",schema:Z,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","https://www.googleapis.com/auth/drive.readonly"],authParams:{access_type:"offline",prompt:"consent"}},hooks:e.hooks,webhookHooks:e.webhookHooks,endpoints:Te,webhooks:Ue,endpointMeta:_e,endpointSchemas:ve,webhookSchemas:Ae,keyBuilder:async o=>{let a=o.authType;if(e.key)return e.key;if(o.authType==="oauth_2"){let[n,r,p]=await Promise.all([o.keys.get_access_token(),o.keys.get_expires_at(),o.keys.get_refresh_token()]);if(!p)throw new ee("googlesheets","oauth_2");let h=await o.keys.get_integration_credentials();if(!h.client_id||!h.client_secret)throw new Error("[corsair:googlesheets] No client id or client secret");try{let d=await b({accessToken:n,expiresAt:r,refreshToken:p,clientId:h.client_id,clientSecret:h.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 c=await b({accessToken:null,expiresAt:null,refreshToken:p,clientId:h.client_id,clientSecret:h.client_secret,forceRefresh:!0});return await o.keys.set_access_token(c.accessToken),await o.keys.set_expires_at(String(c.expiresAt)),c.accessToken},d.accessToken}catch(d){throw new Error(`[corsair:googlesheets] Failed to get valid access token: ${d instanceof Error?d.message:String(d)}`)}}throw new ee("googlesheets","oauth_2")},pluginWebhookMatcher:o=>{let a=o.body;if(!a)return!1;let n=typeof a?.spreadsheetId=="string",r=a?.eventType==="rangeUpdated";return n||r}}}export{v as createGoogleSheetsWebhookMatcher,dt as googlesheets,ve as googlesheetsEndpointSchemas};
|
|
1
|
+
import{AuthMissingError as ke,getOAuthAccessToken as ve}from"corsair/core";import{logEventFromContext as m}from"corsair/core";import{request as Y}from"corsair/http";var ee="https://sheets.googleapis.com/v4";async function v(s,e,o={}){let{method:a="GET",body:n,query:r}=o;return await Y({BASE:ee,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 te(s){return s instanceof Error&&"status"in s&&s.status===401}var se="https://www.googleapis.com/drive/v3";async function T(s,e,o={}){return fetch(`${se}${s}`,{...o,headers:{...o.headers,Authorization:`Bearer ${e}`}})}async function b(s,e,o={}){let a=await T(s,e.key,o);if(a.status===401&&e._refreshAuth){let n=await e._refreshAuth();return T(s,n,o)}return a}async function g(s,e,o={}){try{return await v(s,e.key,o)}catch(a){if(te(a)&&e._refreshAuth){let n=await e._refreshAuth();return await v(s,n,o)}throw a}}var U=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!A:Z`,a=e.values?[e.values]:[],n=await g(`/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 d=r.updatedRange||o,i=e.sheetName||"Sheet1",l=`${e.spreadsheetId}_${i}_${d}`;await s.db.rows.upsertByEntityId(l,{rowId:l,spreadsheetId:e.spreadsheetId,sheetName:i,range:d,values:e.values,createdAt:new Date})}}catch(r){console.warn("Failed to save row to database:",r)}return await m(s,"googlesheets.sheets.appendRow",{...e},"completed"),n},A=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}`,d=await g(`/spreadsheets/${e.spreadsheetId}/values/${r}`,s,{method:"GET"}),i=-1;if(d.values){for(let c=0;c<d.values.length;c++)if(d.values[c]?.[0]===String(n)){i=c;break}}let l=e.values?[e.values]:[],R=i>=0?`${o}!${i+1}:${i+1}`:`${o}!A:Z`;if(i>=0){let c=await g(`/spreadsheets/${e.spreadsheetId}/values/${R}`,s,{method:"PUT",query:{valueInputOption:e.valueInputOption||"USER_ENTERED"},body:{values:l,majorDimension:"ROWS"}});if(s.db.rows)try{let y=c.updatedRange||R,E=`${e.spreadsheetId}_${o}_${y}`;await s.db.rows.upsertByEntityId(E,{rowId:E,spreadsheetId:e.spreadsheetId,sheetName:o,range:y,values:e.values,createdAt:new Date})}catch(y){console.warn("Failed to update row in database:",y)}return await m(s,"googlesheets.sheets.appendOrUpdateRow",{...e,action:"update"},"completed"),c}else{let c=await g(`/spreadsheets/${e.spreadsheetId}/values/${R}: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 y=c.updates?.updatedRange||R,E=`${e.spreadsheetId}_${o}_${y}`;await s.db.rows.upsertByEntityId(E,{rowId:E,spreadsheetId:e.spreadsheetId,sheetName:o,range:y,values:e.values,createdAt:new Date})}catch(y){console.warn("Failed to save row to database:",y)}return await m(s,"googlesheets.sheets.appendOrUpdateRow",{...e,action:"append"},"completed"),c}},C=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!A:Z`,a=await g(`/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 d=a.values[r];if(d){let i=r+1,l=`${n}!${i}:${i}`,R=`${e.spreadsheetId}_${n}_${l}`;await s.db.rows.upsertByEntityId(R,{rowId:R,spreadsheetId:e.spreadsheetId,sheetName:n,range:l,values:d,createdAt:new Date})}}}catch(n){console.warn("Failed to save rows to database:",n)}return await m(s,"googlesheets.sheets.getRows",{...e},"completed"),a},D=async(s,e)=>{let o=e.range||`${e.sheetName||"Sheet1"}!${e.rowIndex||1}:${e.rowIndex||1}`,a=e.values?[e.values]:[],n=await g(`/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 d=r.updatedRange||o,i=e.sheetName||"Sheet1",l=`${e.spreadsheetId}_${i}_${d}`;await s.db.rows.upsertByEntityId(l,{rowId:l,spreadsheetId:e.spreadsheetId,sheetName:i,range:d,values:e.values,createdAt:new Date})}}catch(r){console.warn("Failed to update row in database:",r)}return await m(s,"googlesheets.sheets.updateRow",{...e},"completed"),n},P=async(s,e)=>{let o=e.range||e.sheetName||"Sheet1",a=await g(`/spreadsheets/${e.spreadsheetId}/values/${o}:clear`,s,{method:"POST"});if(a.clearedRange&&s.db.rows)try{let n=e.sheetName||"Sheet1",r=a.clearedRange,d=`${e.spreadsheetId}_${n}_${r}`;await s.db.rows.deleteByEntityId(d)}catch(n){console.warn("Failed to delete rows from database:",n)}return await m(s,"googlesheets.sheets.clearSheet",{...e},"completed"),a},N=async(s,e)=>{let o=await g(`/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 m(s,"googlesheets.sheets.createSheet",{...e},"completed"),o},$=async(s,e)=>{let o=await g(`/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 m(s,"googlesheets.sheets.deleteSheet",{...e},"completed"),o},x=async(s,e)=>{let o=await g(`/spreadsheets/${e.spreadsheetId}`,s,{method:"GET",query:{fields:"spreadsheetId,sheets.properties"}}),a={spreadsheetId:o.spreadsheetId,sheets:o.sheets?.map(n=>n.properties).filter(n=>n!=null)};return await m(s,"googlesheets.sheets.listSheets",{...e},"completed"),a},W=async(s,e)=>{let o=e.dimension||"ROWS",a=e.startIndex||0,n=e.endIndex||a+1,r=await g(`/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 d=`Sheet_${e.sheetId}`;for(let i=a;i<n;i++){let l=i+1,R=`${d}!${l}:${l}`,c=`${e.spreadsheetId}_${d}_${R}`;await s.db.rows.deleteByEntityId(c)}}catch(d){console.warn("Failed to delete rows from database:",d)}return await m(s,"googlesheets.sheets.deleteRowsOrColumns",{...e},"completed"),r};import{logEventFromContext as f}from"corsair/core";var L=async(s,e)=>{let o=await g("/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 f(s,"googlesheets.spreadsheets.create",{...e},"completed"),o},_=async(s,e)=>{let o=await b(`/files/${e.spreadsheetId}`,s,{method:"DELETE"});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 f(s,"googlesheets.spreadsheets.delete",{...e},"completed")},B=async(s,e)=>{let o="mimeType='application/vnd.google-apps.spreadsheet'",a=new URLSearchParams({q:e.query?`${o} AND ${e.query}`:o,fields:"files(id,name,createdTime,modifiedTime,webViewLink),nextPageToken"});e.pageSize&&a.set("pageSize",String(e.pageSize)),e.pageToken&&a.set("pageToken",e.pageToken);let n=await b(`/files?${a.toString()}`,s);if(!n.ok){let d=await n.text();throw new Error(`Failed to list spreadsheets: ${n.status} ${d}`)}let r=await n.json();return await f(s,"googlesheets.spreadsheets.list",{...e},"completed"),r};import{z as t}from"zod";var ne=t.object({properties:t.object({title:t.string().optional(),locale:t.string().optional(),timeZone:t.string().optional()}).optional()}),re=t.object({spreadsheetId:t.string()}),pe=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()}),he=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()}),de=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()}),ie=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()}),le=t.object({spreadsheetId:t.string(),sheetName:t.string().optional(),range:t.string().optional()}),ge=t.object({spreadsheetId:t.string(),title:t.string().optional()}),ue=t.object({spreadsheetId:t.string(),sheetId:t.number()}),Se=t.object({spreadsheetId:t.string(),sheetId:t.number(),dimension:t.enum(["ROWS","COLUMNS"]).optional(),startIndex:t.number().optional(),endIndex:t.number().optional()}),ce=t.object({spreadsheetId:t.string()}),me=t.object({pageSize:t.number().optional(),pageToken:t.string().optional(),query:t.string().optional()}),u={spreadsheetsCreate:ne,spreadsheetsDelete:re,spreadsheetsList:me,sheetsAppendRow:pe,sheetsAppendOrUpdateRow:he,sheetsGetRows:de,sheetsUpdateRow:ie,sheetsClearSheet:le,sheetsCreateSheet:ge,sheetsDeleteSheet:ue,sheetsDeleteRowsOrColumns:Se,sheetsListSheetsInSpreadsheet:ce},we=t.object({title:t.string().optional(),locale:t.string().optional(),autoRecalc:t.enum(["ON_CHANGE","ON_UPDATE","HOUR","MINUTE"]).optional(),timeZone:t.string().optional()}),q=t.object({spreadsheetId:t.string().optional(),properties:we.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()}),G=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()}),Re=t.object({spreadsheetId:t.string().optional(),clearedRange:t.string().optional()}),j=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()}),Ve=t.object({properties:j.optional()}),O=t.object({spreadsheetId:t.string().optional(),replies:t.array(t.any()).optional(),updatedSpreadsheet:q.optional()}),ye=t.object({spreadsheetId:t.string().optional(),sheets:t.array(j).optional()}),Ee=t.object({id:t.string().optional(),name:t.string().optional(),createdTime:t.string().optional(),modifiedTime:t.string().optional(),webViewLink:t.string().optional()}),Ie=t.object({files:t.array(Ee).optional(),nextPageToken:t.string().optional()}),S={spreadsheetsCreate:q,spreadsheetsDelete:t.void(),spreadsheetsList:Ie,sheetsAppendRow:G,sheetsAppendOrUpdateRow:G,sheetsGetRows:V,sheetsUpdateRow:G,sheetsClearSheet:Re,sheetsCreateSheet:O,sheetsDeleteSheet:O,sheetsDeleteRowsOrColumns:O,sheetsListSheetsInSpreadsheet:ye};var I={create:L,delete:_,list:B},w={appendRow:U,appendOrUpdateRow:A,getRows:C,updateRow:D,clearSheet:P,createSheet:N,deleteSheet:$,deleteRowsOrColumns:W,listSheetsInSpreadsheet:x};import{z as h}from"zod";var F=h.object({spreadsheetId:h.string(),title:h.string().optional(),spreadsheetUrl:h.string().optional(),createdAt:h.coerce.date().optional()}),M=h.object({sheetId:h.string(),spreadsheetId:h.string(),title:h.string().optional(),index:h.number().optional(),createdAt:h.coerce.date().optional()}),z=h.object({rowId:h.string(),spreadsheetId:h.string(),sheetName:h.string().optional(),range:h.string().optional(),values:h.array(h.union([h.string(),h.number(),h.boolean(),h.null()])).optional(),createdAt:h.coerce.date().optional()});var K={version:"1.0.0",entities:{spreadsheets:F,sheets:M,rows:z}};import{logEventFromContext as fe}from"corsair/core";import{z as p}from"zod";var H=p.object({spreadsheetId:p.string().optional(),sheetName:p.string().optional(),range:p.string().optional(),values:p.array(p.union([p.string(),p.number(),p.boolean(),p.null()])).optional(),eventType:p.literal("rangeUpdated").optional(),timestamp:p.string().optional(),event:p.unknown().optional()}),Z=p.object({eventType:p.literal("rangeUpdated"),spreadsheetId:p.string(),sheetName:p.string(),range:p.string(),values:p.array(p.union([p.string(),p.number(),p.boolean(),p.null()])),timestamp:p.string()});function be(s){return typeof s=="string"?JSON.parse(s):s}function k(s){return e=>be(e.body).eventType===s}var J={match:k("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 fe(s,"googlesheets.webhook.rangeUpdated",{...a},"completed"),{success:!0,data:a}}};var Q={rangeUpdated:J};import{firstString as Ge,readBodyRecord as Oe}from"corsair/core";function X(s){let e=Oe(s);if(!e)return null;let o=Ge([e.spreadsheetId]);return o?{linkType:"spreadsheet_id",externalId:o}:null}var Te={spreadsheets:{create:I.create,delete:I.delete,list:I.list},sheets:{appendRow:w.appendRow,appendOrUpdateRow:w.appendOrUpdateRow,getRows:w.getRows,updateRow:w.updateRow,clearSheet:w.clearSheet,createSheet:w.createSheet,deleteSheet:w.deleteSheet,deleteRowsOrColumns:w.deleteRowsOrColumns,listSheetsInSpreadsheet:w.listSheetsInSpreadsheet}},Ue={"spreadsheets.create":{input:u.spreadsheetsCreate,output:S.spreadsheetsCreate},"spreadsheets.delete":{input:u.spreadsheetsDelete,output:S.spreadsheetsDelete},"spreadsheets.list":{input:u.spreadsheetsList,output:S.spreadsheetsList},"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},"sheets.listSheetsInSpreadsheet":{input:u.sheetsListSheetsInSpreadsheet,output:S.sheetsListSheetsInSpreadsheet}},Ae={rangeUpdated:Q.rangeUpdated},Ce={rangeUpdated:{description:"A range of cells in a Google Sheet was updated",payload:H,response:Z}},De="oauth_2",Pe={"spreadsheets.create":{riskLevel:"write",description:"Create a new spreadsheet"},"spreadsheets.delete":{riskLevel:"destructive",irreversible:!0,description:"Permanently delete a spreadsheet [DESTRUCTIVE \xB7 IRREVERSIBLE]"},"spreadsheets.list":{riskLevel:"read",description:"List all spreadsheets in Google Drive"},"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"},"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"},"sheets.listSheetsInSpreadsheet":{riskLevel:"read",description:"List all sheet tabs in a spreadsheet"}},Ne={oauth_2:{account:["spreadsheet_id"]}};function ut(s={}){let e={...s,authType:s.authType??De};return{id:"googlesheets",authConfig:Ne,schema:K,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","https://www.googleapis.com/auth/drive.readonly"],authParams:{access_type:"offline",prompt:"consent"}},hooks:e.hooks,webhookHooks:e.webhookHooks,endpoints:Te,webhooks:Ae,endpointMeta:Pe,endpointSchemas:Ue,webhookSchemas:Ce,keyBuilder:async o=>{let a=o.authType;if(e.key)return e.key;if(o.authType==="oauth_2")return ve(o,{plugin:"googlesheets",tokenUrl:"https://oauth2.googleapis.com/token"});throw new ke("googlesheets","oauth_2")},pluginWebhookMatcher:o=>{let a=o.body;if(!a)return!1;let n=typeof a?.spreadsheetId=="string",r=a?.eventType==="rangeUpdated";return n||r},pluginTenantWebhookMatcher:X}}export{k as createGoogleSheetsWebhookMatcher,ut as googlesheets,Ne as googlesheetsAuthConfig,Ue as googlesheetsEndpointSchemas};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-matcher.d.ts","sourceRoot":"","sources":["../../webhooks/tenant-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAI1E,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,iBAAiB,GACxB,kBAAkB,GAAG,IAAI,CAQ3B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@corsair-dev/googlesheets",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "Google sheets plugin for Corsair",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
20
|
"peerDependencies": {
|
|
21
|
-
"corsair": ">=0.1.
|
|
21
|
+
"corsair": ">=0.1.120",
|
|
22
22
|
"zod": "^4.1.13"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
@@ -27,21 +27,25 @@
|
|
|
27
27
|
"tsup": "^8.0.1",
|
|
28
28
|
"typescript": "^5.9.3",
|
|
29
29
|
"zod": "^4.1.13",
|
|
30
|
-
"
|
|
30
|
+
"jest": "^29.7.0",
|
|
31
|
+
"corsair": "0.1.129"
|
|
31
32
|
},
|
|
32
33
|
"keywords": [
|
|
33
34
|
"corsair",
|
|
34
35
|
"googlesheets",
|
|
35
36
|
"plugin"
|
|
36
37
|
],
|
|
37
|
-
"author": "",
|
|
38
|
+
"author": "Corsair (https://corsair.dev)",
|
|
38
39
|
"license": "Apache-2.0",
|
|
39
40
|
"files": [
|
|
40
41
|
"dist"
|
|
41
42
|
],
|
|
42
|
-
"
|
|
43
|
-
"
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "git+https://github.com/corsairdev/corsair.git",
|
|
46
|
+
"directory": "packages/googlesheets"
|
|
44
47
|
},
|
|
48
|
+
"homepage": "https://docs.corsair.dev/plugins/googlesheets",
|
|
45
49
|
"scripts": {
|
|
46
50
|
"build": "rm -rf dist && tsc --build --force && tsup",
|
|
47
51
|
"typecheck": "tsc --noEmit",
|