{"version":3,"file":"index.cjs","sources":["../lib/iterateTsvLines.ts","../lib/schema.ts","../lib/loadDataset.ts","../lib/getImportPath.ts","../index.ts"],"sourcesContent":["import * as fs from 'node:fs';\n\nconst LF = '\\n'.charCodeAt(0);\nconst TAB = '\\t'.charCodeAt(0);\nexport default function* iterateTsvLines(pathname: string, encoding: BufferEncoding): Generator<string[], void> {\n  const fd = fs.openSync(pathname, 'r');\n\n  const byteBuffer = Buffer.alloc(1);\n  let fragmentBytes: number[] = [];\n  let lineColumns: string[] = [];\n\n  const step = (): number => fs.readSync(fd, byteBuffer, 0, 1, null);\n\n  const endColumn = () => {\n    lineColumns.push(Buffer.from(fragmentBytes).toString(encoding));\n    fragmentBytes = [];\n  };\n\n  while (true) {\n    // Read next byte\n    if (step() === 0) {\n      // End of file\n      break;\n    }\n\n    const byte = byteBuffer[0];\n    if (byte === TAB) {\n      // End of column\n      endColumn();\n      continue;\n    }\n\n    if (byte === LF) {\n      // End of line\n      endColumn();\n      if (lineColumns.length > 0) {\n        yield lineColumns;\n        lineColumns = [];\n      }\n\n      continue;\n    }\n\n    // Regular byte\n    if (byte != null) {\n      fragmentBytes.push(byte);\n    }\n  }\n\n  // Output incomplete line\n  if (fragmentBytes.length > 0) {\n    endColumn();\n  }\n  if (lineColumns.length > 0) {\n    yield lineColumns;\n  }\n}\n","export interface FieldTypes {\n  string: string;\n  int: number;\n  float: number;\n  array: string[];\n  date: Date;\n}\n\nexport type Schema = typeof schema;\n\nconst schema = {\n  geonameId: { type: 'int', nullable: false },\n  name: { type: 'string', nullable: false },\n  asciiName: { type: 'string', nullable: true },\n  alternateNames: { type: 'array', nullable: true },\n  latitude: { type: 'float', nullable: false },\n  longitude: { type: 'float', nullable: false },\n  featureClass: { type: 'string', nullable: false },\n  featureCode: { type: 'string', nullable: false },\n  countryCode: { type: 'string', nullable: false },\n  cc2: { type: 'string', nullable: true },\n  admin1Code: { type: 'string', nullable: true },\n  admin2Code: { type: 'string', nullable: true },\n  admin3Code: { type: 'string', nullable: true },\n  admin4Code: { type: 'string', nullable: true },\n  population: { type: 'int', nullable: false },\n  elevation: { type: 'int', nullable: true },\n  dem: { type: 'int', nullable: false },\n  timezone: { type: 'string', nullable: false },\n  modificationDate: { type: 'date', nullable: false },\n} as const satisfies Record<string, { type: keyof FieldTypes; nullable: boolean }>;\n\nexport default schema;\n","import iterateTsvLines from './iterateTsvLines';\nimport schema from './schema';\nimport type { FieldTypes, Schema } from './schema';\n\nexport type DataGenerator = Generator<Row, void>;\n\ntype Row = {\n  [key in keyof Schema]: Schema[key]['nullable'] extends true\n    ? FieldTypes[Schema[key]['type']] | undefined\n    : FieldTypes[Schema[key]['type']];\n};\n\nconst casters: { [key in keyof FieldTypes]: (value: string) => FieldTypes[key] | undefined } = {\n  string: (value) => value,\n  int: (value) => parseInt(value, 10),\n  float: (value) => parseFloat(value),\n  array: (value) => value.split(','),\n  date: (value) => new Date(`${value}T00:00:00Z`),\n};\n\nexport default function* loadDataset(pathname: string): DataGenerator {\n  const parseField = (field: keyof Schema, value: string): Row[typeof field] => {\n    const { type, nullable } = schema[field];\n    if (value === '') {\n      if (!nullable) {\n        throw new Error(`Field \"${String(field)}\" cannot be empty`);\n      }\n      return (type === 'array' ? [] : undefined) as Row[typeof field];\n    }\n    return casters[type](value);\n  };\n\n  for (const row of iterateTsvLines(pathname, 'utf8')) {\n    yield Object.fromEntries(\n      Object.keys(schema).map((field, index) => [field, parseField(field as keyof Schema, row[index] ?? '')]),\n    ) as Row;\n  }\n}\n","import { dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport default function getImportPath(importUrl: string, basename: string): string {\n  return `${dirname(fileURLToPath(importUrl))}/${basename}`;\n}\n","import loadDataset from './lib/loadDataset';\nimport type { DataGenerator } from './lib/loadDataset';\nimport getImportPath from './lib/getImportPath';\n\nexport default function cities15000(): DataGenerator {\n  return loadDataset(getImportPath(import.meta.url, 'cities15000.txt'));\n}\n"],"names":["LF","charCodeAt","TAB","iterateTsvLines","pathname","encoding","fd","fs","openSync","byteBuffer","Buffer","alloc","fragmentBytes","lineColumns","step","readSync","endColumn","push","from","toString","byte","length","schema","geonameId","type","nullable","name","asciiName","alternateNames","latitude","longitude","featureClass","featureCode","countryCode","cc2","admin1Code","admin2Code","admin3Code","admin4Code","population","elevation","dem","timezone","modificationDate","casters","string","value","int","parseInt","float","parseFloat","array","split","date","Date","loadDataset","parseField","field","Error","String","undefined","row","Object","fromEntries","keys","map","index","getImportPath","importUrl","basename","dirname","fileURLToPath","cities15000","import"],"mappings":"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"}