{"version":3,"sources":["../src/downloadAndSave.ts","../src/getSpreadsheetJson.ts","../src/getSpreadsheetRaw.ts","../src/auth.ts","../src/log.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { getComment, jsonToFile } from '@lskjs/stringify';\n\nimport getSpreadsheetJson from './getSpreadsheetJson';\nimport getSpreadsheetRaw from './getSpreadsheetRaw';\nimport { log } from './log';\n\nexport type Options = {\n  out?: string;\n  format?: 'csv' | 'json' | 'jsonEachRow' | 'js' | 'yml' | 'dotenv';\n  type?: 'array' | 'objects' | 'object';\n  nested?: boolean;\n  mapper?: (any) => any;\n  filter?: (any) => any;\n};\n\nexport async function downloadAndSave(\n  url,\n  {\n    out,\n    format = 'csv',\n    nested,\n    type = 'objects',\n    mapper = (a) => a,\n    filter = (a) => a,\n  }: Options = {},\n) {\n  if (url.indexOf('#') === -1) {\n    // eslint-disable-next-line no-param-reassign\n    url += '#gid=0';\n  }\n  // if (!out) {\n  //   // eslint-disable-next-line no-param-reassign\n  //   out = `spreadsheet.${format}`;\n  // }\n  // log.trace('options', url, out, filename, format);\n  let res;\n  const columns = type === 'objects' || type === 'object';\n  if (format === 'csv') {\n    res = await getSpreadsheetRaw(url);\n  } else {\n    res = await getSpreadsheetJson(url, {\n      columns: Boolean(+columns),\n      type,\n      nested,\n      mapper,\n      filter,\n    });\n  }\n\n  if (out) {\n    const filename = (out[0] !== '~' && out[0] !== '/' ? `${process.cwd()}/` : '') + out;\n    await jsonToFile(filename, res, {\n      type: format,\n      comment: getComment({\n        name: out,\n        url,\n      }),\n    });\n    log.debug('[save]', url, out);\n  } else {\n    // eslint-disable-next-line no-lonely-if\n    if (format === 'jsonEachRow') {\n      // eslint-disable-next-line no-console\n      res.forEach((row) => console.log(JSON.stringify(row)));\n    } else {\n      // eslint-disable-next-line no-console\n      console.log(JSON.stringify(res));\n    }\n  }\n}\n\nexport default downloadAndSave;\n","/* eslint-disable no-param-reassign */\n/* eslint-disable no-console */\nimport parse from 'csv-parse';\nimport dot from 'dot-object';\n\nimport { getSpreadsheetRaw } from './getSpreadsheetRaw';\n\nexport async function getSpreadsheetJson(\n  url,\n  {\n    columns = true,\n    nested = false,\n    type = 'objects',\n    mapper = (a) => a,\n    filter = (a) => a,\n    ...params\n  } = {},\n) {\n  const spreadsheet = await getSpreadsheetRaw(url);\n  return new Promise((resolve, reject) => {\n    parse(spreadsheet, { columns, ...params }, (err, res) => {\n      if (err) return reject(err);\n      res = res.filter((item) => filter(item));\n      if (nested) {\n        res = res.map((item) => dot.object(item));\n      }\n      res = res.map((item) => mapper(item));\n      if (type === 'object') {\n        // eslint-disable-next-line prefer-destructuring\n        res = res[0];\n      }\n      return resolve(res);\n    });\n  });\n}\n\nexport default getSpreadsheetJson;\n","/* eslint-disable prefer-regex-literals */\n/* eslint-disable no-console */\nimport axios from 'axios';\nimport { google } from 'googleapis';\n\nimport { auth2 } from './auth';\n// import { log } from './log';\n\nexport async function getFileWithAuth(fileId: string) {\n  const token = await auth2();\n  // gid\n  // console.log('google', auth, fileId);\n  const drive = google.drive({ version: 'v3', auth: token });\n  // console.log('drive', drive);\n  return new Promise((resolve, reject) => {\n    drive.files.export(\n      {\n        fileId,\n        mimeType: 'text/csv',\n      },\n      (err, res) => {\n        if (err) return reject(err);\n        return resolve(res.data);\n      },\n    );\n  });\n}\n\nexport async function getSpreadsheetRaw(url) {\n  try {\n    const s = new RegExp('/spreadsheets/d/([a-zA-Z0-9-_]+)').exec(url);\n    let spreadsheetId;\n    if (s) {\n      // eslint-disable-next-line prefer-destructuring\n      spreadsheetId = s[1];\n    } else {\n      throw new Error('invalid url');\n    }\n    const sh = new RegExp('[#&]gid=([0-9]+)').exec(url);\n    let sheetId;\n    if (sh) {\n      // eslint-disable-next-line prefer-destructuring\n      sheetId = sh[1];\n    } else {\n      throw new Error('invalid gid');\n    }\n    const exportURL = `https://docs.google.com/spreadsheets/d/${spreadsheetId}/export?gid=${sheetId}&format=csv`;\n    const response = await axios(exportURL);\n    let { data } = response;\n    const { responseUrl = '' } = response.request.res;\n    if (responseUrl.includes('ServiceLogin')) {\n      // log.debug('need auth');\n      // sheetId\n      data = await getFileWithAuth(spreadsheetId);\n    }\n    return data;\n  } catch (e) {\n    if (e && e.statusCode === '404') {\n      console.log('File not found');\n    } else {\n      console.log(e);\n    }\n  }\n  return null;\n}\n\nexport default getSpreadsheetRaw;\n","/* eslint-disable camelcase */\nimport { createInterface } from 'node:readline/promises';\n\nimport { set } from '@lskjs/algos';\nimport { getLskConfig } from '@lskjs/cli-utils';\nimport { Err } from '@lskjs/err';\nimport { jsonToFile } from '@lskjs/stringify';\nimport { OAuth2Client } from 'google-auth-library';\nimport { google } from 'googleapis';\n\nimport { log } from './log';\n\nconst SCOPES = ['https://www.googleapis.com/auth/drive.readonly'];\n\nexport const setLskConfig = async (key, value, { path }: any = {}) => {\n  const cwd = process.cwd();\n  // eslint-disable-next-line no-param-reassign\n  if (!path) path = `${cwd}/.lskjs.js`;\n  let config = {};\n  log.debug(`${path}`, key, value);\n  try {\n    // eslint-disable-next-line import/no-dynamic-require\n    config = require(`${path}`);\n  } catch (err) {\n    log.error('[setLskConfig]', err);\n    config = {};\n  }\n  set(config, key, value);\n  await jsonToFile(`${path}`, config, { type: 'js' });\n};\n\n// 1. open google cloud\n// 2. create app with oAutg 2.0 Client ID for Desktop\n// 3. copy creds in .lskjs.js .getspreadsheet.app\n\nexport async function auth2(): Promise<OAuth2Client> {\n  const lskjsrc = getLskConfig();\n  if (!lskjsrc?.getspreadsheet) throw new Err('!lskjsrc.getspreadsheet');\n  if (!lskjsrc?.getspreadsheet?.app) {\n    throw new Err('!lskjsrc.getspreadsheet.app');\n  }\n  const { client_secret, client_id, redirect_uris } = lskjsrc?.getspreadsheet?.app || {};\n\n  const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uris[0]);\n  let token = lskjsrc?.getspreadsheet?.token;\n  if (!token) {\n    const authUrl = oAuth2Client.generateAuthUrl({\n      access_type: 'offline',\n      scope: SCOPES,\n    });\n    log.warn('Authorize this app by visiting this url:\\n\\n', authUrl, '\\n\\n');\n    const rl = createInterface({\n      input: process.stdin,\n      output: process.stdout,\n    });\n    const code = await rl.question('Enter the code from that page here: ');\n    const { tokens } = await oAuth2Client.getToken(code);\n    token = tokens;\n    await setLskConfig('getspreadsheet.token', token, { path: lskjsrc.path });\n    const cwd = process.cwd();\n    log.debug('Token stored to', `${cwd}/.lskjs.js`);\n  }\n  oAuth2Client.setCredentials(token);\n  return oAuth2Client;\n}\n\nexport default auth2;\n","/* eslint-disable no-console */\nimport { Logger } from '@lskjs/log';\n\nexport const log = new Logger({ ns: 'getspreadsheet' });\n\nexport default log;\n"],"mappings":"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","names":["getComment","jsonToFile","parse","dot","axios","google","createInterface","set","getLskConfig","Err","jsonToFile","google","Logger","log","ns","SCOPES","setLskConfig","__name","key","value","path","cwd","process","config","log","debug","require","err","error","set","jsonToFile","type","auth2","lskjsrc","getLskConfig","getspreadsheet","Err","app","client_secret","client_id","redirect_uris","oAuth2Client","google","auth","OAuth2","token","authUrl","generateAuthUrl","access_type","scope","warn","code","createInterface","input","stdin","output","stdout","question","tokens","getToken","setCredentials","getFileWithAuth","fileId","token","auth2","drive","google","version","auth","Promise","resolve","reject","files","export","mimeType","err","res","data","getSpreadsheetRaw","url","s","RegExp","exec","spreadsheetId","Error","sh","sheetId","exportURL","response","axios","responseUrl","request","includes","e","statusCode","console","log","getSpreadsheetRaw_default","getSpreadsheetJson","url","columns","nested","type","mapper","__name","a","filter","params","spreadsheet","getSpreadsheetRaw","Promise","resolve","reject","parse","err","res","item","map","dot","object","getSpreadsheetJson_default","downloadAndSave","url","out","format","nested","type","mapper","__name","a","filter","indexOf","res","getSpreadsheetRaw","getSpreadsheetJson","columns","Boolean","filename","process","cwd","jsonToFile","comment","getComment","name","log","debug","forEach","row","console","JSON","stringify","downloadAndSave_default"]}