Skip to content

Commit

Permalink
feat: make googleSpreadsheet() available for an instance or options
Browse files Browse the repository at this point in the history
  • Loading branch information
Gumball12 committed Mar 10, 2024
1 parent f19ce1c commit 938bd4e
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 19 deletions.
22 changes: 22 additions & 0 deletions src/__tests__/parser.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,28 @@ describe.skipIf(!hasPrivate)('GoogleSpreadsheet', () => {

expect(parsed).toEqual(expected);
});

it('Common forms :: Pass options', async () => {
const jwt = new JWT({
email: privateEmail,
key: privateKey,
scopes: PRIVATE_SHEETS_SCOPES,
});

const parsed = await googleSpreadsheet(
{
auth: jwt,
spreadsheetId: SPREADSHEET_ID,
sheetInfo: 0,
},
{
path: ['Key', 'Property'],
typeName: 'Type',
},
)();

expect(parsed).toEqual(expected);
});
});

describe('filledDataToObject', () => {
Expand Down
44 changes: 27 additions & 17 deletions src/parser/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,9 @@ A parser that parses **public** Google Sheets. This parser uses [public-google-s
import { generateDtsFile } from 'google-spreadsheet-dts';
import { publicGoogleSheetsParser } from 'google-spreadsheet-dts/parser';

import PublicGoogleSheetsParser from 'public-google-sheets-parser';

// Define parser
const parser = publicGoogleSheetsParser(
// You can pass an instance of PublicGoogleSheetsParser
{
spreadsheetId: '1j23zhzHcPd_LzDQ7uPrXgMJfPoZYs289boUKoKnAjUo',
},
Expand Down Expand Up @@ -102,22 +101,21 @@ A parser that parses **private** Google Sheets. This parser uses [google-spreads
```ts
import { generateDtsFile } from 'google-spreadsheet-dts';
import { googleSpreadsheet } from 'google-spreadsheet-dts/parser';

import { JWT } from 'google-auth-library';
import { GoogleSpreadsheet } from 'google-spreadsheet';

// Load private Google Sheets data
const jwt = new JWT(/* ... */);
const doc = new GoogleSpreadsheet(/* ... */);
await doc.loadInfo();

const sheet = doc.sheetsByIndex[0];

// Define parser
const parser = googleSpreadsheet(sheet, {
path: ['Key', 'Property'],
typeName: 'Type',
});
// You can pass an instance of GoogleSpreadsheetWorksheet
const parser = googleSpreadsheet(
{
auth: new JWT(/* ... */),
spreadsheetId: '...',
sheetInfo: 0, // Index of the sheet
},
{
path: ['Key', 'Property'],
typeName: 'Type',
},
);

// Generate d.ts file
generateDtsFile({
Expand All @@ -135,15 +133,27 @@ Note that you need to pass the [sheet instance](https://theoephraim.github.io/no

```ts
function googleSpreadsheet(
sheetInstance: GoogleSpreadsheetWorksheet,
instanceOrOptions: GoogleSpreadsheetWorksheet | GoogleSpreadsheetOptions,
params: {
path: string[];
typeName: string;
},
): Parser;

interface GoogleSpreadsheetOptions {
auth: JWT;
spreadsheetId: string;
sheetInfo: SheetName | SheetIndex;
}

type SheetName = string;
type SheetIndex = number;
```

- `sheetInstance`: An instance of [`GoogleSpreadsheetWorksheet`](https://theoephraim.github.io/node-google-spreadsheet/#/classes/google-spreadsheet-worksheet)
- `sheetInstance`: An instance of [`GoogleSpreadsheetWorksheet`](https://theoephraim.github.io/node-google-spreadsheet/#/classes/google-spreadsheet-worksheet) or an object with the following properties:
- `auth`: An instance of [`JWT`](https://www.npmjs.com/package/google-auth-library#json-web-tokens) from [`google-auth-library`](https://www.npmjs.com/package/google-auth-library)
- `spreadsheetId`: The ID of the Google Sheets
- `sheetInfo`: The sheet name or the index of the sheet
- `path`: List of column names where object property names exists
- `typeName`: Column name where the type name exists

Expand Down
35 changes: 33 additions & 2 deletions src/parser/googleSpreadsheet.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { type GoogleSpreadsheetWorksheet } from 'google-spreadsheet';
import {
GoogleSpreadsheet,
GoogleSpreadsheetWorksheet,
} from 'google-spreadsheet';
import { filledDataToObject } from './utils/filledDataToObject';
import { FilledData } from './types/data';

Expand All @@ -7,12 +10,22 @@ type GoogleSpreadsheetParams = {
typeName: string;
};

type SheetName = string;
type SheetIndex = number;

type GoogleSpreadsheetOptions = {
auth: ConstructorParameters<typeof GoogleSpreadsheet>[1];
spreadsheetId: ConstructorParameters<typeof GoogleSpreadsheet>[0];
sheetInfo: SheetName | SheetIndex;
};

export const googleSpreadsheet =
(
sheetInstance: GoogleSpreadsheetWorksheet,
instanceOfOptions: GoogleSpreadsheetWorksheet | GoogleSpreadsheetOptions,
{ path, typeName }: GoogleSpreadsheetParams,
) =>
async (): Promise<object> => {
const sheetInstance = await getSheetInstance(instanceOfOptions);
const rows = await sheetInstance.getRows();
const filledData = rows.reduce<FilledData>((filledData, row, index) => {
const prevData = filledData[index - 1];
Expand All @@ -28,3 +41,21 @@ export const googleSpreadsheet =

return filledDataToObject(filledData, path, typeName);
};

const getSheetInstance = async (
instanceOfOptions: GoogleSpreadsheetWorksheet | GoogleSpreadsheetOptions,
) => {
if (instanceOfOptions instanceof GoogleSpreadsheetWorksheet) {
return instanceOfOptions;
}

const { auth, spreadsheetId, sheetInfo } = instanceOfOptions;
const doc = new GoogleSpreadsheet(spreadsheetId, auth);
await doc.loadInfo();

if (typeof sheetInfo === 'number') {
return doc.sheetsByIndex[sheetInfo];
}

return doc.sheetsByTitle[sheetInfo];
};

0 comments on commit 938bd4e

Please sign in to comment.