{"version":3,"sources":["jsdelivr-header.js","/npm/gtfs-tts@0.3.2/src/lib/gtfs-tts.ts","/npm/gtfs-tts@0.3.2/src/lib/file-utils.ts","/npm/gtfs-tts@0.3.2/src/lib/log-utils.ts","/npm/gtfs-tts@0.3.2/src/lib/utils.ts"],"names":[],"mappings":"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","file":"/npm/gtfs-tts@0.3.2/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/gtfs-tts@0.3.2/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import path from 'node:path';\n\nimport chalk from 'chalk';\nimport { openDb, importGtfs, exportGtfs, getStops, getAgencies } from 'gtfs';\nimport readlineSync from 'readline-sync';\nimport untildify from 'untildify';\nimport say from 'say';\n\nimport { generateFolderName, prepDirectory } from './file-utils.js';\nimport { log, logWarning, logError } from './log-utils.js';\nimport { setDefaultConfig } from './utils.js';\n\ninterface IStop {\n  stop_id: string;\n  stop_name: string;\n  tts_stop_name?: string;\n}\n\n/*\n * Loop through each stop and pronounce each stop name\n */\nconst gtfsTTS = async (initialConfig: {\n  sqlitePath?: string;\n  gtfsPath?: string;\n  gtfsUrl?: string;\n}) => {\n  const config = setDefaultConfig(initialConfig);\n  config.log = log(config);\n  config.logWarning = logWarning(config);\n  config.logError = logError(config);\n\n  let db;\n\n  try {\n    db = openDb(config);\n  } catch (error: any) {\n    if (error?.code === 'SQLITE_CANTOPEN') {\n      config.logError(\n        `Unable to open sqlite database \"${config.sqlitePath}\" defined as \\`sqlitePath\\` config.json. Ensure the parent directory exists or remove \\`sqlitePath\\` from config.json.`,\n      );\n    }\n\n    throw error;\n  }\n\n  if (!config.gtfsPath && !config.gtfsUrl) {\n    throw new Error('No gtfsPath or gtfsUrl provided');\n  }\n\n  if (!config.skipImport) {\n    // Import GTFS\n    await importGtfs({\n      ...config,\n      agencies: [\n        {\n          path: config.gtfsPath,\n          url: config.gtfsUrl,\n        },\n      ],\n    });\n  }\n\n  config.log('Starting GTFS Text-to-Speech Testing');\n  config.log(\n    'For each stop, press \"y\" if pronunciation is correct or \"n\" if incorrect. Press \"r\" to repeat. Press \"e\" to end.\\n',\n  );\n\n  const stops = getStops();\n\n  const readStopName = (stop: IStop) => {\n    say.speak(stop.tts_stop_name ?? stop.stop_name);\n\n    let ttsExistingStopName = '';\n    if (stop.tts_stop_name) {\n      ttsExistingStopName = `*tts_stop_name exists*: ${chalk.blue(stop.tts_stop_name)}`;\n    }\n\n    const answer = readlineSync.keyIn(\n      `Stop ID ${stop.stop_id}: ${chalk.yellow(stop.stop_name)} ${ttsExistingStopName}\\nPronunciation correct? (y/n/r/e): `,\n    );\n\n    say.stop();\n\n    if (answer.trim().toLowerCase() === 'r') {\n      readStopName(stop);\n      return;\n    }\n\n    if (answer.trim().toLowerCase() === 'n') {\n      const statement = db.prepare(\n        \"UPDATE stops SET tts_stop_name = '***NEEDS VALUE***' WHERE stop_id = ?\",\n      );\n      statement.run(stop.stop_id);\n      return;\n    }\n\n    if (answer.trim().toLowerCase() === 'y') {\n      return;\n    }\n\n    if (answer.trim().toLowerCase() === 'e') {\n      throw new Error('End Loop');\n    }\n\n    config.log('Valid options are \"y\", \"n\" and \"r\"\\n');\n    readStopName(stop);\n    return;\n  };\n\n  for (const stop of stops) {\n    try {\n      await readStopName(stop as IStop);\n    } catch (error: any) {\n      if (error?.message === 'End Loop') {\n        break;\n      }\n    }\n  }\n\n  // Get agency name for export folder from first line of agency.txt\n  const agencies = getAgencies({}, ['agency_name']);\n  const folderName = generateFolderName(\n    agencies?.[0].agency_name ?? 'unknown-agency',\n  );\n  const defaultExportPath = path.join(process.cwd(), 'gtfs-output', folderName);\n  const exportPath = untildify(config.exportPath || defaultExportPath);\n\n  await prepDirectory(exportPath);\n\n  // Export GTFS with tts_stop_name field\n  await exportGtfs({\n    agencies: [],\n    exportPath,\n    sqlitePath: config.sqlitePath,\n  });\n\n  const stopTTSCount = db\n    .prepare(\n      \"SELECT COUNT(*) FROM stops WHERE tts_stop_name = '***NEEDS VALUE***';\",\n    )\n    .get();\n\n  config.log(`GTFS Data created at ${exportPath}`);\n  config.log(\n    `${stopTTSCount['COUNT(*)']} stops with incorrect pronunciation found. Look for \"***NEEDS VALUE***\" in the tts_stop_name column in stops.txt.`,\n  );\n};\n\nexport default gtfsTTS;\n","import path from 'node:path';\nimport { mkdir, readFile, rm } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { snakeCase } from 'lodash-es';\nimport sanitize from 'sanitize-filename';\nimport untildify from 'untildify';\n\n/*\n * Attempt to parse the specified config JSON file.\n */\nexport async function getConfig(argv) {\n  let config;\n\n  if (argv.configPath) {\n    // If a `configPath` is specified, try to read it and throw error if it doesn't exist\n    try {\n      const data = await readFile(\n        path.resolve(untildify(argv.configPath)),\n        'utf8',\n      ).catch((error) => {\n        console.error(\n          new Error(\n            `Cannot find configuration file at \\`${argv.configPath}\\`. Use config-sample.json as a starting point, pass --configPath option`,\n          ),\n        );\n        throw error;\n      });\n      config = Object.assign(JSON.parse(data), argv);\n    } catch (error) {\n      console.error(\n        new Error(\n          `Cannot parse configuration file at \\`${argv.configPath}\\`. Check to ensure that it is valid JSON.`,\n        ),\n      );\n      throw error;\n    }\n  } else if (existsSync(path.resolve('./config.json'))) {\n    // Else if `config.json` exists, use config values read from it\n    try {\n      const data = await readFile(path.resolve('./config.json'), 'utf8');\n      config = Object.assign(JSON.parse(data), argv);\n      console.log('Using configuration from ./config.json');\n    } catch (error) {\n      console.error(\n        new Error(\n          'Cannot parse configuration file at `./config.json`. Check to ensure that it is valid JSON.',\n        ),\n      );\n      throw error;\n    }\n  } else {\n    // Use argv values from CLI\n    config = argv;\n  }\n\n  return config;\n}\n\n/*\n * Prepare the specified directory for saving HTML timetables by deleting\n * everything and creating the expected folders.\n */\nexport async function prepDirectory(exportPath) {\n  await rm(exportPath, { recursive: true, force: true });\n  await mkdir(exportPath, { recursive: true });\n}\n\n/*\n * Generate a folder name based on a string.\n */\nexport function generateFolderName(folderName) {\n  return snakeCase(sanitize(folderName));\n}\n","import { clearLine, cursorTo } from 'node:readline';\nimport PrettyError from 'pretty-error';\nimport { noop } from 'lodash-es';\nimport chalk from 'chalk';\n\nconst pe = new PrettyError();\npe.start();\n\n/*\n * Returns a log function based on config settings\n */\nexport function log(config) {\n  if (config.verbose === false) {\n    return noop;\n  }\n\n  if (config.logFunction) {\n    return config.logFunction;\n  }\n\n  return (text, overwrite) => {\n    if (overwrite === true) {\n      clearLine(process.stdout, 0);\n      cursorTo(process.stdout, 0);\n    } else {\n      process.stdout.write('\\n');\n    }\n\n    process.stdout.write(text);\n  };\n}\n\n/*\n * Returns an warning log function based on config settings\n */\nexport function logWarning(config) {\n  if (config.logFunction) {\n    return config.logFunction;\n  }\n\n  return (text) => {\n    process.stdout.write(`\\n${formatWarning(text)}\\n`);\n  };\n}\n\n/*\n * Returns an error log function based on config settings\n */\nexport function logError(config) {\n  if (config.logFunction) {\n    return config.logFunction;\n  }\n\n  return (text) => {\n    process.stdout.write(`\\n${formatError(text)}\\n`);\n  };\n}\n\n/*\n * Format console warning text\n */\nexport function formatWarning(text) {\n  return `${chalk.yellow.underline('Warning')}${chalk.yellow(':')} ${chalk.yellow(text)}`;\n}\n\n/*\n * Format console error text\n */\nexport function formatError(text) {\n  return `${chalk.red.underline('Error')}${chalk.red(':')} ${chalk.red(text)}`;\n}\n","/*\n * Initialize configuration with defaults.\n */\nexport function setDefaultConfig(initialConfig) {\n  const defaults = {\n    skipImport: false,\n    sqlitePath: ':memory:',\n  };\n\n  return Object.assign(defaults, initialConfig);\n}\n"]}