{"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/lib-esm/parseString.js","../src/MolfileStream.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","/**\n *\n * @param {*} string\n * @param {*} substring\n * @param {*} eol\n * @returns\n */\nexport 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","/**\n * Parse the molfile and the properties with > < labels >\n * @param {string} sdfPart\n * @param {*} labels\n * @param {*} currentLabels\n * @param {object} options\n * @returns\n */\nexport 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].slice(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.includes(label)) &&\n        (!options.include || options.include.includes(label))\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 (\n        labels[label].isNumeric &&\n        (!Number.isFinite(+molecule[label]) || molecule[label].match(/^0[0-9]/))\n      ) {\n        labels[label].isNumeric = false;\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 * @returns {object} - Object containing the molecules, the labels and the statistics\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.replaceAll('\\r\\n', '\\n');\n      sdf = sdf.replaceAll('\\r', '\\n');\n    } else {\n      // we will find the delimiter in order to be much faster and not use regular expression\n      let header = new Set(sdf.slice(0, 1000));\n      if (header.has('\\r\\n')) {\n        options.eol = '\\r\\n';\n      } else if (header.has('\\r')) {\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.slice(...entriesBoundaries[i]);\n    if (sdfPart.length < 40) continue;\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 = Number.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","export function parseString(value) {\n    if (value.length === 4 || value.length === 5) {\n        const lowercase = value.toLowerCase();\n        if (lowercase === 'true')\n            return true;\n        if (lowercase === 'false')\n            return false;\n    }\n    const number = Number(value);\n    if (number === 0 && !value.includes('0')) {\n        return value;\n    }\n    if (!Number.isNaN(number))\n        return number;\n    return value;\n}\n//# sourceMappingURL=parseString.js.map","export class MolfileStream extends TransformStream {\n  #buffer = '';\n\n  constructor() {\n    super({\n      transform: (chunk, controller) => {\n        this.#buffer += chunk;\n        let begin = 0;\n        let index = 0;\n        while ((index = this.#buffer.indexOf('$$$$', index)) !== -1) {\n          // we need to check if the delimiter '\\n' is in the current buffer\n          // if it is not we need to wait for the next chunk\n          const endOfDelimiter = this.#buffer.indexOf('\\n', index);\n          if (endOfDelimiter === -1) {\n            index = begin;\n            break;\n          }\n          const eolLength = this.#buffer[endOfDelimiter - 1] === '\\r' ? 2 : 1;\n          // need to remove the last eol because we will split on eol+'>' in getMolecule\n          if (index - eolLength - begin > 40) {\n            controller.enqueue(this.#buffer.slice(begin, index - eolLength));\n          }\n          index = endOfDelimiter + eolLength;\n          begin = index;\n        }\n        this.#buffer = this.#buffer.slice(begin);\n      },\n      flush: (controller) => {\n        if (this.#buffer && this.#buffer.length > 40) {\n          controller.enqueue(this.#buffer);\n        }\n      },\n    });\n  }\n}\n","import { parseString } from 'dynamic-typing';\n\nimport { MolfileStream } from './MolfileStream.js';\n\n/**\n *  Parse a SDF file as an iterator\n * @param {ReadableStream} readStream - SDF file to parse\n * @param {object} [options={}] - iterator options\n * @param {Function} [options.filter] - Callback allowing to filter the molecules\n * @param {string} [options.eol='\\n'] - End of line character\n * @param {boolean} [options.dynamicTyping] - Dynamically type the data\n * @yields {object} - Molecule object\n */\nexport async function* iterator(readStream, options = {}) {\n  const { eol = '\\n', dynamicTyping = true } = options;\n\n  const moleculeStream = readStream.pipeThrough(new MolfileStream({ eol }));\n  for await (const entry of moleculeStream) {\n    const molecule = getMolecule(entry, {\n      eol,\n      dynamicTyping,\n    });\n    if (!options.filter || options.filter(molecule)) {\n      yield molecule;\n    }\n  }\n}\n\n/**\n * Convert a SDF part to an object\n * @param {string} sdfPart - text containing the molfile\n * @param {object} options - options\n * @param {string} options.eol - end of line character\n * @param {boolean} options.dynamicTyping - Dynamically type the data (create numbers and booleans)\n * @returns\n */\nfunction getMolecule(sdfPart, options) {\n  const { eol, dynamicTyping } = options;\n  let parts = sdfPart.split(`${eol}>`);\n  if (parts.length === 0 || parts[0].length <= 5) return;\n  let molecule = {};\n  molecule.molfile = parts[0] + eol;\n  for (let j = 1; j < parts.length; j++) {\n    let lines = parts[j].split(eol);\n    let from = lines[0].indexOf('<');\n    let to = lines[0].indexOf('>');\n    let label = lines[0].slice(from + 1, to);\n    for (let k = 1; k < lines.length - 1; k++) {\n      if (molecule[label]) {\n        molecule[label] += eol + lines[k];\n      } else {\n        molecule[label] = lines[k];\n      }\n    }\n    if (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","slice","counter","isNumeric","dynamicTyping","keep","exclude","includes","include","modifiers","modifier","forEach","k","modifiedValue","undefined","Number","isFinite","match","parse","sdf","mixedEOL","replaceAll","header","Set","has","entriesBoundaries","molecules","start","Date","now","filter","currentLabel","minValue","Infinity","maxValue","value","parseFloat","key","always","statistics","statistic","time","Object","keys","parseString","lowercase","toLowerCase","number","isNaN","MolfileStream","TransformStream","constructor","transform","chunk","controller","begin","index","endOfDelimiter","eolLength","enqueue","flush","iterator","readStream","moleculeStream","pipeThrough","entry"],"mappings":"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","x_google_ignoreList":[0,1,5]}