{"version":3,"file":"sdf-parser.js","sources":["../node_modules/isutf8/dist/index.esm.js","../node_modules/ensure-string/lib-esm/index.js","../src/getEntriesBoundaries.js","../src/util/getMolecule.js","../src/parse.js","../node_modules/dynamic-typing/src/parseString.js","../src/iterator.js"],"sourcesContent":["/*\n    https://tools.ietf.org/html/rfc3629\n\n    UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4\n\n    UTF8-1    = %x00-7F\n\n    UTF8-2    = %xC2-DF UTF8-tail\n\n    UTF8-3    = %xE0 %xA0-BF UTF8-tail\n                %xE1-EC 2( UTF8-tail )\n                %xED %x80-9F UTF8-tail\n                %xEE-EF 2( UTF8-tail )\n\n    UTF8-4    = %xF0 %x90-BF 2( UTF8-tail )\n                %xF1-F3 3( UTF8-tail )\n                %xF4 %x80-8F 2( UTF8-tail )\n\n    UTF8-tail = %x80-BF\n*/\n/**\n * Check if a Node.js Buffer or Uint8Array is UTF-8.\n */\nfunction isUtf8(buf) {\n    if (!buf) {\n        return false;\n    }\n    var i = 0;\n    var len = buf.length;\n    while (i < len) {\n        // UTF8-1 = %x00-7F\n        if (buf[i] <= 0x7F) {\n            i++;\n            continue;\n        }\n        // UTF8-2 = %xC2-DF UTF8-tail\n        if (buf[i] >= 0xC2 && buf[i] <= 0xDF) {\n            // if(buf[i + 1] >= 0x80 && buf[i + 1] <= 0xBF) {\n            if (buf[i + 1] >> 6 === 2) {\n                i += 2;\n                continue;\n            }\n            else {\n                return false;\n            }\n        }\n        // UTF8-3 = %xE0 %xA0-BF UTF8-tail\n        // UTF8-3 = %xED %x80-9F UTF8-tail\n        if (((buf[i] === 0xE0 && buf[i + 1] >= 0xA0 && buf[i + 1] <= 0xBF) ||\n            (buf[i] === 0xED && buf[i + 1] >= 0x80 && buf[i + 1] <= 0x9F)) && buf[i + 2] >> 6 === 2) {\n            i += 3;\n            continue;\n        }\n        // UTF8-3 = %xE1-EC 2( UTF8-tail )\n        // UTF8-3 = %xEE-EF 2( UTF8-tail )\n        if (((buf[i] >= 0xE1 && buf[i] <= 0xEC) ||\n            (buf[i] >= 0xEE && buf[i] <= 0xEF)) &&\n            buf[i + 1] >> 6 === 2 &&\n            buf[i + 2] >> 6 === 2) {\n            i += 3;\n            continue;\n        }\n        // UTF8-4 = %xF0 %x90-BF 2( UTF8-tail )\n        //          %xF1-F3 3( UTF8-tail )\n        //          %xF4 %x80-8F 2( UTF8-tail )\n        if (((buf[i] === 0xF0 && buf[i + 1] >= 0x90 && buf[i + 1] <= 0xBF) ||\n            (buf[i] >= 0xF1 && buf[i] <= 0xF3 && buf[i + 1] >> 6 === 2) ||\n            (buf[i] === 0xF4 && buf[i + 1] >= 0x80 && buf[i + 1] <= 0x8F)) &&\n            buf[i + 2] >> 6 === 2 &&\n            buf[i + 3] >> 6 === 2) {\n            i += 4;\n            continue;\n        }\n        return false;\n    }\n    return true;\n}\n\nexport { isUtf8 as default };\n","import isutf8 from 'isutf8';\n/**\n * Ensure that the data is string. If it is an ArrayBuffer it will be converted to string using TextDecoder.\n * @param blob\n * @param options\n * @returns\n */\nexport function ensureString(blob, options = {}) {\n    if (typeof blob === 'string') {\n        return blob;\n    }\n    if (ArrayBuffer.isView(blob) || blob instanceof ArrayBuffer) {\n        const { encoding = guessEncoding(blob) } = options;\n        const decoder = new TextDecoder(encoding);\n        return decoder.decode(blob);\n    }\n    throw new TypeError(`blob must be a string, ArrayBuffer or ArrayBufferView`);\n}\nfunction guessEncoding(blob) {\n    const uint8 = ArrayBuffer.isView(blob)\n        ? new Uint8Array(blob.buffer, blob.byteOffset, blob.byteLength)\n        : new Uint8Array(blob);\n    if (uint8.length >= 2) {\n        if (uint8[0] === 0xfe && uint8[1] === 0xff) {\n            return 'utf-16be';\n        }\n        if (uint8[0] === 0xff && uint8[1] === 0xfe) {\n            return 'utf-16le';\n        }\n    }\n    //@ts-expect-error an ArrayBuffer is also ok\n    if (!isutf8(blob))\n        return 'latin1';\n    return 'utf-8';\n}\n//# sourceMappingURL=index.js.map","export function getEntriesBoundaries(string, substring, eol) {\n  const res = [];\n  let previous = 0;\n  let next = 0;\n  while (next !== -1) {\n    next = string.indexOf(substring, previous);\n    if (next !== -1) {\n      res.push([previous, next]);\n      const nextMatch = string.indexOf(eol, next + substring.length);\n      if (nextMatch === -1) {\n        next = -1;\n      } else {\n        previous = nextMatch + eol.length;\n        next = previous;\n      }\n    } else {\n      res.push([previous, string.length]);\n    }\n  }\n  return res;\n}\n","export function getMolecule(sdfPart, labels, currentLabels, options) {\n  let parts = sdfPart.split(`${options.eol}>`);\n  if (parts.length === 0 || parts[0].length <= 5) return;\n  let molecule = {};\n  molecule.molfile = parts[0] + options.eol;\n  for (let j = 1; j < parts.length; j++) {\n    let lines = parts[j].split(options.eol);\n    let from = lines[0].indexOf('<');\n    let to = lines[0].indexOf('>');\n    let label = lines[0].substring(from + 1, to);\n    currentLabels.push(label);\n    if (!labels[label]) {\n      labels[label] = {\n        counter: 0,\n        isNumeric: options.dynamicTyping,\n        keep: false,\n      };\n      if (\n        (!options.exclude || options.exclude.indexOf(label) === -1) &&\n        (!options.include || options.include.indexOf(label) > -1)\n      ) {\n        labels[label].keep = true;\n        if (options.modifiers[label]) {\n          labels[label].modifier = options.modifiers[label];\n        }\n        if (options.forEach[label]) {\n          labels[label].forEach = options.forEach[label];\n        }\n      }\n    }\n    if (labels[label].keep) {\n      for (let k = 1; k < lines.length - 1; k++) {\n        if (molecule[label]) {\n          molecule[label] += options.eol + lines[k];\n        } else {\n          molecule[label] = lines[k];\n        }\n      }\n      if (labels[label].modifier) {\n        let modifiedValue = labels[label].modifier(molecule[label]);\n        if (modifiedValue === undefined || modifiedValue === null) {\n          delete molecule[label];\n        } else {\n          molecule[label] = modifiedValue;\n        }\n      }\n      if (labels[label].isNumeric) {\n        if (!isFinite(molecule[label]) || molecule[label].match(/^0[0-9]/)) {\n          labels[label].isNumeric = false;\n        }\n      }\n    }\n  }\n  return molecule;\n}\n","import { ensureString } from 'ensure-string';\n\nimport { getEntriesBoundaries } from './getEntriesBoundaries';\nimport { getMolecule } from './util/getMolecule';\n/**\n *  Parse a SDF file\n * @param {string|ArrayBuffer|Uint8Array} sdf SDF file to parse\n * @param {object} [options={}]\n * @param {string[]} [options.include] List of fields to include\n * @param {string[]} [options.exclude] List of fields to exclude\n * @param {Function} [options.filter] Callback allowing to filter the molecules\n * @param {boolean} [options.dynamicTyping] Dynamically type the data\n * @param {object} [options.modifiers] Object containing callbacks to apply on some specific fields\n * @param {boolean} [options.mixedEOL=false] Set to true if you know there is a mixture between \\r\\n and \\n\n * @param {string} [options.eol] Specify the end of line character. Default will be the one found in the file\n */\nexport function parse(sdf, options = {}) {\n  options = { ...options };\n  if (options.modifiers === undefined) options.modifiers = {};\n  if (options.forEach === undefined) options.forEach = {};\n  if (options.dynamicTyping === undefined) options.dynamicTyping = true;\n\n  sdf = ensureString(sdf);\n  if (typeof sdf !== 'string') {\n    throw new TypeError('Parameter \"sdf\" must be a string');\n  }\n\n  if (options.eol === undefined) {\n    options.eol = '\\n';\n    if (options.mixedEOL) {\n      sdf = sdf.replace(/\\r\\n/g, '\\n');\n      sdf = sdf.replace(/\\r/g, '\\n');\n    } else {\n      // we will find the delimiter in order to be much faster and not use regular expression\n      let header = sdf.substr(0, 1000);\n      if (header.indexOf('\\r\\n') > -1) {\n        options.eol = '\\r\\n';\n      } else if (header.indexOf('\\r') > -1) {\n        options.eol = '\\r';\n      }\n    }\n  }\n\n  let entriesBoundaries = getEntriesBoundaries(\n    sdf,\n    `${options.eol}$$$$`,\n    options.eol,\n  );\n  let molecules = [];\n  let labels = {};\n\n  let start = Date.now();\n\n  for (let i = 0; i < entriesBoundaries.length; i++) {\n    let sdfPart = sdf.substring(...entriesBoundaries[i]);\n\n    let currentLabels = [];\n    const molecule = getMolecule(sdfPart, labels, currentLabels, options);\n    if (!molecule) continue;\n    if (!options.filter || options.filter(molecule)) {\n      molecules.push(molecule);\n      // only now we can increase the counter\n      for (let j = 0; j < currentLabels.length; j++) {\n        labels[currentLabels[j]].counter++;\n      }\n    }\n  }\n  // all numeric fields should be converted to numbers\n  for (let label in labels) {\n    let currentLabel = labels[label];\n    if (currentLabel.isNumeric) {\n      currentLabel.minValue = Infinity;\n      currentLabel.maxValue = -Infinity;\n      for (let j = 0; j < molecules.length; j++) {\n        if (molecules[j][label]) {\n          let value = parseFloat(molecules[j][label]);\n          molecules[j][label] = value;\n          if (value > currentLabel.maxValue) {\n            currentLabel.maxValue = value;\n          }\n          if (value < currentLabel.minValue) {\n            currentLabel.minValue = value;\n          }\n        }\n      }\n    }\n  }\n\n  // we check that a label is in all the records\n  for (let key in labels) {\n    if (labels[key].counter === molecules.length) {\n      labels[key].always = true;\n    } else {\n      labels[key].always = false;\n    }\n  }\n\n  let statistics = [];\n  for (let key in labels) {\n    let statistic = labels[key];\n    statistic.label = key;\n    statistics.push(statistic);\n  }\n\n  return {\n    time: Date.now() - start,\n    molecules,\n    labels: Object.keys(labels),\n    statistics,\n  };\n}\n","/**\n * Dynamically type a string\n * @param {string} value String to dynamically type\n * @returns {boolean|string|number}\n */\nexport function parseString(value) {\n  if (value.length === 4 || value.length === 5) {\n    let lowercase = value.toLowerCase();\n\n    if (lowercase === 'true') return true;\n    if (lowercase === 'false') return false;\n  }\n  let number = Number(value);\n  if (number === 0 && !value.includes('0')) {\n    return value;\n  }\n  if (!Number.isNaN(number)) return number;\n  return value;\n}\n","import { createInterface } from 'readline';\n\nimport { parseString } from 'dynamic-typing';\n/**\n *  Parse a SDF file\n * @param {string|ArrayBuffer|Uint8Array} sdf SDF file to parse\n * @param {object} [options={}]\n * @param {Function} [options.filter] Callback allowing to filter the molecules\n * @param {boolean} [options.dynamicTyping] Dynamically type the data\n */\n\nexport async function* iterator(readStream, options = {}) {\n  const lines = createInterface(readStream);\n  const currentLines = [];\n  options = { ...options };\n  if (options.dynamicTyping === undefined) options.dynamicTyping = true;\n\n  options.eol = '\\n';\n  for await (let line of lines) {\n    if (line.startsWith('$$$$')) {\n      const molecule = getMolecule(currentLines.join(options.eol), options);\n      if (!options.filter || options.filter(molecule)) {\n        yield molecule;\n      }\n      currentLines.length = 0;\n    } else {\n      currentLines.push(line);\n    }\n  }\n}\n\nfunction getMolecule(sdfPart, options) {\n  let parts = sdfPart.split(`${options.eol}>`);\n  if (parts.length === 0 || parts[0].length <= 5) return;\n  let molecule = {};\n  molecule.molfile = parts[0] + options.eol;\n  for (let j = 1; j < parts.length; j++) {\n    let lines = parts[j].split(options.eol);\n    let from = lines[0].indexOf('<');\n    let to = lines[0].indexOf('>');\n    let label = lines[0].substring(from + 1, to);\n    for (let k = 1; k < lines.length - 1; k++) {\n      if (molecule[label]) {\n        molecule[label] += options.eol + lines[k];\n      } else {\n        molecule[label] = lines[k];\n      }\n    }\n    if (options.dynamicTyping) {\n      molecule[label] = parseString(molecule[label]);\n    }\n  }\n  return molecule;\n}\n"],"names":["isUtf8","buf","i","len","length","ensureString","blob","options","ArrayBuffer","isView","encoding","guessEncoding","decoder","TextDecoder","decode","TypeError","uint8","Uint8Array","buffer","byteOffset","byteLength","isutf8","getEntriesBoundaries","string","substring","eol","res","previous","next","indexOf","push","nextMatch","getMolecule","sdfPart","labels","currentLabels","parts","split","molecule","molfile","j","lines","from","to","label","counter","isNumeric","dynamicTyping","keep","exclude","include","modifiers","modifier","forEach","k","modifiedValue","undefined","isFinite","match","parse","sdf","mixedEOL","replace","header","substr","entriesBoundaries","molecules","start","Date","now","filter","currentLabel","minValue","Infinity","maxValue","value","parseFloat","key","always","statistics","statistic","time","Object","keys","parseString","lowercase","toLowerCase","number","Number","includes","isNaN","iterator","readStream","createInterface","currentLines","line","startsWith","join"],"mappings":"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"}