{"version":3,"sources":["../src/log.ts","../src/auth.ts","../src/getSpreadsheetRaw.ts","../src/getSpreadsheetJson.ts","../src/downloadAndSave.ts","../src/cli.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { Logger } from '@lskjs/log';\n\nexport const log = new Logger({ ns: 'getspreadsheet' });\n\nexport default log;\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 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 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","#!/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","#!/usr/bin/env node\n/* eslint-disable max-len */\nimport { program } from 'commander';\n\nimport { downloadAndSave } from './downloadAndSave';\n\nprogram\n  // .version(require('../package.json').version)\n  .command('getspreadsheet <url>')\n  // .requiredOption('-u, --url <url>', 'url to the Google Spreadsheet document')\n  .option('-o, --out <file>', 'path to json file with result')\n  .option('-f, --format <csv|json|jsonEachRow|js|yaml|keyval|dotenv>', 'output format ', 'json')\n  .option(\n    '-t, --type <array|objects|object>',\n    'type of data in spreadsheet.  array = raw array of string, objects = forst row is keys, object = first row is keys, second as values',\n    'objects',\n  )\n  .option('-n, --nested <fn>', 'works with nested fields')\n  .option('-m, --mapper <fn>', 'mapper function')\n  .action((url, { out, format, nested, type, mapper: mapperStr, filter: filterStr }) => {\n    // eslint-disable-next-line no-eval\n    const mapper: (a: any) => any | null = mapperStr ? eval(mapperStr) : undefined;\n    // eslint-disable-next-line no-eval\n    const filter: (a: any) => any | null = filterStr ? eval(filterStr) : undefined;\n    if (mapper) mapper({});\n    if (filter) filter({});\n    // console.log(url, { out, format, nested, type, mapperStr, mapper, filterStr, filter });\n    return downloadAndSave(url, { out, format, nested, type, mapper, filter });\n  })\n  .parse(process.argv);\n"],"mappings":"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","names":["Logger","log","init_log","__esmMin","ns","createInterface","set","getLskConfig","Err","jsonToFile","google","auth2","lskjsrc","getspreadsheet","app","client_secret","client_id","redirect_uris","oAuth2Client","auth","OAuth2","token","authUrl","generateAuthUrl","access_type","scope","SCOPES","log","warn","code","input","process","stdin","output","stdout","question","tokens","getToken","setLskConfig","path","cwd","debug","setCredentials","init_auth","__esmMin","init_log","__name","key","value","config","require","err","error","type","axios","google","getFileWithAuth","fileId","token","auth2","drive","version","auth","Promise","resolve","reject","files","export","mimeType","err","res","data","getSpreadsheetRaw","url","s","RegExp","exec","spreadsheetId","Error","sh","sheetId","exportURL","response","responseUrl","request","includes","e","statusCode","console","log","getSpreadsheetRaw_default","init_getSpreadsheetRaw","__esmMin","init_auth","parse","dot","getSpreadsheetJson","url","columns","nested","type","mapper","__name","a","filter","params","spreadsheet","getSpreadsheetRaw","Promise","resolve","reject","err","res","item","map","object","getSpreadsheetJson_default","init_getSpreadsheetJson","__esmMin","init_getSpreadsheetRaw","getComment","jsonToFile","downloadAndSave","url","out","format","nested","type","mapper","__name","a","filter","indexOf","res","getSpreadsheetRaw","getSpreadsheetJson","columns","Boolean","filename","process","cwd","comment","name","log","debug","forEach","row","console","JSON","stringify","init_getSpreadsheetJson","init_getSpreadsheetRaw","init_log","program","init_downloadAndSave","command","option","action","url","out","format","nested","type","mapper","mapperStr","filter","filterStr","eval","undefined","downloadAndSave","parse","process","argv"]}