{"version":3,"file":"sdf-parser.esm.js","sources":["../node_modules/ensure-string/lib/index.js","../lib/getEntriesBoundaries.js","../lib/util/getMolecule.js","../lib/parse.js","../node_modules/dynamic-typing/lib/parseString.js","../lib/MolfileStream.js","../lib/iterator.js"],"sourcesContent":["/**\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        if (options.encoding) {\n            return new TextDecoder(options.encoding).decode(blob);\n        }\n        else {\n            return decodeText(blob);\n        }\n    }\n    throw new TypeError(`blob must be a string, ArrayBuffer or ArrayBufferView`);\n}\nfunction decodeText(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 new TextDecoder('utf-16be').decode(uint8);\n        }\n        if (uint8[0] === 0xff && uint8[1] === 0xfe) {\n            return new TextDecoder('utf-16le').decode(uint8);\n        }\n    }\n    try {\n        return new TextDecoder('utf-8', { fatal: true }).decode(uint8);\n    }\n    catch {\n        return new TextDecoder('latin1').decode(uint8);\n    }\n}\n//# sourceMappingURL=index.js.map","/**\n * Get the [start, end] boundaries of each SDF entry in a string.\n *\n * Uses `indexOf` for fast splitting without regex overhead.\n * @param string - The full SDF string.\n * @param substring - The delimiter to search for (e.g. `'\\n$$$$'`).\n * @param eol - The end-of-line character used to skip past the delimiter line.\n * @returns An array of `[start, end]` index pairs, one per SDF entry.\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            }\n            else {\n                previous = nextMatch + eol.length;\n                next = previous;\n            }\n        }\n        else {\n            res.push([previous, string.length]);\n        }\n    }\n    return res;\n}\n//# sourceMappingURL=getEntriesBoundaries.js.map","/**\n * Parse a single SDF entry string into a molecule object.\n * @param sdfPart - A single SDF record (everything before the `$$$$` line).\n * @param labels - Shared label tracking object, mutated in place.\n * @param currentLabels - Array to collect label names found in this entry.\n * @param options - Resolved parse options.\n * @returns The molecule object, or `undefined` if the entry is too short.\n */\nexport function getMolecule(sdfPart, labels, currentLabels, options) {\n    const { eol, dynamicTyping, include, exclude, modifiers, forEach } = options;\n    const parts = sdfPart.split(`${eol}>`);\n    if (parts.length === 0 || parts[0].length <= 5)\n        return undefined;\n    const molecule = { molfile: parts[0] + eol };\n    for (let j = 1; j < parts.length; j++) {\n        const lines = parts[j].split(eol);\n        const from = lines[0].indexOf('<');\n        const to = lines[0].indexOf('>');\n        const label = lines[0].slice(from + 1, to);\n        currentLabels.push(label);\n        if (!labels[label]) {\n            labels[label] = {\n                counter: 0,\n                isNumeric: dynamicTyping,\n                keep: false,\n            };\n            if (!exclude?.includes(label) && (!include || include.includes(label))) {\n                labels[label].keep = true;\n                if (modifiers[label])\n                    labels[label].modifier = modifiers[label];\n                if (forEach[label])\n                    labels[label].forEach = forEach[label];\n            }\n        }\n        if (labels[label].keep) {\n            for (let k = 1; k < lines.length - 1; k++) {\n                if (molecule[label]) {\n                    molecule[label] = `${molecule[label]}${eol}${lines[k]}`;\n                }\n                else {\n                    molecule[label] = lines[k];\n                }\n            }\n            if (labels[label].modifier) {\n                const modifiedValue = labels[label].modifier(molecule[label]);\n                if (modifiedValue === undefined || modifiedValue === null) {\n                    // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n                    delete molecule[label];\n                }\n                else {\n                    molecule[label] = modifiedValue;\n                }\n            }\n            if (labels[label].isNumeric &&\n                (!Number.isFinite(+molecule[label]) ||\n                    molecule[label].match(/^0[0-9]/))) {\n                labels[label].isNumeric = false;\n            }\n        }\n    }\n    return molecule;\n}\n//# sourceMappingURL=getMolecule.js.map","import { ensureString } from 'ensure-string';\nimport { getEntriesBoundaries } from \"./getEntriesBoundaries.js\";\nimport { getMolecule } from \"./util/getMolecule.js\";\n/**\n * Synchronously parse an SDF file into an array of molecule objects.\n * @param sdf - The SDF content as a string, `ArrayBuffer`, or `ArrayBufferView`.\n * @param options - Parsing options.\n * @returns A {@link ParseResult} containing molecules and statistics.\n * @example\n * ```ts\n * import { readFileSync } from 'node:fs';\n * import { parse } from 'sdf-parser';\n *\n * const sdf = readFileSync('compounds.sdf', 'utf8');\n * const { molecules, statistics } = parse(sdf);\n * ```\n */\nexport function parse(sdf, options = {}) {\n    options = { ...options };\n    if (options.modifiers === undefined)\n        options.modifiers = {};\n    if (options.forEach === undefined)\n        options.forEach = {};\n    if (options.dynamicTyping === undefined)\n        options.dynamicTyping = true;\n    // ensureString converts ArrayBuffer/ArrayBufferView to string\n    const sdfString = ensureString(sdf);\n    if (typeof sdfString !== 'string') {\n        throw new TypeError('Parameter \"sdf\" must be a string');\n    }\n    if (options.eol === undefined) {\n        options.eol = '\\n';\n        if (options.mixedEOL) {\n            // Normalize all line endings to \\n\n            // We work on a local variable so no issue here\n        }\n        else {\n            // Note: new Set(string) creates a Set of individual characters.\n            // '\\r\\n' is two characters so header.has('\\r\\n') would always be false.\n            // This preserves the original detection behaviour.\n            const header = new Set(sdfString.slice(0, 1000));\n            if (header.has('\\r\\n')) {\n                options.eol = '\\r\\n';\n            }\n            else if (header.has('\\r')) {\n                options.eol = '\\r';\n            }\n        }\n    }\n    let workingSdf = sdfString;\n    if (options.mixedEOL) {\n        workingSdf = workingSdf.replaceAll('\\r\\n', '\\n');\n        workingSdf = workingSdf.replaceAll('\\r', '\\n');\n    }\n    const eol = options.eol;\n    const modifiers = options.modifiers;\n    const forEachMap = options.forEach;\n    const dynamicTyping = options.dynamicTyping;\n    const entriesBoundaries = getEntriesBoundaries(workingSdf, `${eol}$$$$`, eol);\n    const molecules = [];\n    const labels = {};\n    const start = Date.now();\n    for (const boundary of entriesBoundaries) {\n        const sdfPart = workingSdf.slice(...boundary);\n        if (sdfPart.length < 40)\n            continue;\n        const currentLabels = [];\n        const molecule = getMolecule(sdfPart, labels, currentLabels, {\n            eol,\n            dynamicTyping,\n            modifiers,\n            forEach: forEachMap,\n            include: options.include,\n            exclude: options.exclude,\n        });\n        if (!molecule)\n            continue;\n        if (!options.filter || options.filter(molecule)) {\n            molecules.push(molecule);\n            for (const label of currentLabels) {\n                labels[label].counter++;\n            }\n        }\n    }\n    // Convert all numeric fields and compute min/max\n    for (const label in labels) {\n        const currentLabel = labels[label];\n        if (currentLabel.isNumeric) {\n            currentLabel.minValue = Infinity;\n            currentLabel.maxValue = -Infinity;\n            for (const molecule of molecules) {\n                if (molecule[label]) {\n                    const value = Number.parseFloat(molecule[label]);\n                    molecule[label] = value;\n                    if (value > (currentLabel.maxValue ?? -Infinity)) {\n                        currentLabel.maxValue = value;\n                    }\n                    if (value < (currentLabel.minValue ?? Infinity)) {\n                        currentLabel.minValue = value;\n                    }\n                }\n            }\n        }\n    }\n    for (const key in labels) {\n        labels[key].always = labels[key].counter === molecules.length;\n    }\n    const statistics = [];\n    for (const key in labels) {\n        const info = labels[key];\n        statistics.push({\n            label: key,\n            counter: info.counter,\n            isNumeric: info.isNumeric,\n            keep: info.keep,\n            minValue: info.minValue,\n            maxValue: info.maxValue,\n            always: info.always ?? false,\n        });\n    }\n    return {\n        time: Date.now() - start,\n        molecules,\n        labels: Object.keys(labels),\n        statistics,\n    };\n}\n//# sourceMappingURL=parse.js.map","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","/**\n * A Web Streams API `TransformStream` that splits an incoming text stream on\n * the `$$$$` SDF record delimiter and emits individual molfile strings.\n *\n * Entries shorter than 40 characters are discarded.\n * @example\n * ```ts\n * const stream = readStream.pipeThrough(new MolfileStream());\n * for await (const molfile of stream) {\n *   console.log(molfile);\n * }\n * ```\n */\nexport class MolfileStream extends TransformStream {\n    #buffer = [];\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    constructor(_options) {\n        super({\n            transform: (chunk, controller) => {\n                this.#buffer.push(chunk);\n                const combined = this.#buffer.join('');\n                this.#buffer.length = 0;\n                let begin = 0;\n                let index = 0;\n                while ((index = combined.indexOf('$$$$', index)) !== -1) {\n                    const endOfDelimiter = combined.indexOf('\\n', index);\n                    if (endOfDelimiter === -1) {\n                        index = begin;\n                        break;\n                    }\n                    const eolLength = combined[endOfDelimiter - 1] === '\\r' ? 2 : 1;\n                    // Remove the last eol before enqueuing\n                    if (index - eolLength - begin > 40) {\n                        controller.enqueue(combined.slice(begin, index - eolLength));\n                    }\n                    index = endOfDelimiter + eolLength;\n                    begin = index;\n                }\n                if (begin < combined.length) {\n                    this.#buffer.push(combined.slice(begin));\n                }\n            },\n            flush: (controller) => {\n                const remaining = this.#buffer.join('');\n                if (remaining && remaining.length > 40) {\n                    controller.enqueue(remaining);\n                }\n            },\n        });\n    }\n}\n//# sourceMappingURL=MolfileStream.js.map","import { parseString } from 'dynamic-typing';\nimport { MolfileStream } from \"./MolfileStream.js\";\n/**\n * Asynchronously iterate over molecules from a text-decoded SDF stream.\n * @param readStream - A `ReadableStream<string>` supplying SDF text content.\n * @param options - Iterator options.\n * @yields {IteratorMolecule} Individual molecule objects.\n * @example\n * ```ts\n * import { openAsBlob } from 'node:fs';\n * import { iterator } from 'sdf-parser';\n *\n * const blob = await openAsBlob('compounds.sdf');\n * const textDecoder = new TextDecoderStream();\n * for await (const molecule of iterator(blob.stream().pipeThrough(textDecoder))) {\n *   console.log(molecule.molfile);\n * }\n * ```\n */\nexport async function* iterator(readStream, options = {}) {\n    const { eol = '\\n', dynamicTyping = true } = options;\n    const moleculeStream = readStream.pipeThrough(new MolfileStream({ eol }));\n    for await (const entry of moleculeStream) {\n        const molecule = parseMolecule(entry, { eol, dynamicTyping });\n        if (!options.filter || options.filter(molecule)) {\n            yield molecule;\n        }\n    }\n}\nfunction parseMolecule(sdfPart, options) {\n    const { eol, dynamicTyping } = options;\n    const parts = sdfPart.split(`${eol}>`);\n    const molecule = {\n        molfile: parts.length > 0 && parts[0].length > 5 ? parts[0] + eol : '',\n    };\n    for (let j = 1; j < parts.length; j++) {\n        const lines = parts[j].split(eol);\n        const from = lines[0].indexOf('<');\n        const to = lines[0].indexOf('>');\n        const label = lines[0].slice(from + 1, to);\n        for (let k = 1; k < lines.length - 1; k++) {\n            if (molecule[label]) {\n                molecule[label] = `${molecule[label]}${eol}${lines[k]}`;\n            }\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//# sourceMappingURL=iterator.js.map"],"names":["ensureString","blob","options","ArrayBuffer","isView","encoding","TextDecoder","decode","decodeText","TypeError","uint8","Uint8Array","buffer","byteOffset","byteLength","length","fatal","getEntriesBoundaries","string","substring","eol","res","previous","next","indexOf","push","nextMatch","getMolecule","sdfPart","labels","currentLabels","dynamicTyping","include","exclude","modifiers","forEach","parts","split","undefined","molecule","molfile","j","lines","from","to","label","slice","counter","isNumeric","keep","includes","modifier","k","modifiedValue","Number","isFinite","match","parse","sdf","sdfString","mixedEOL","header","Set","has","workingSdf","replaceAll","forEachMap","entriesBoundaries","molecules","start","Date","now","boundary","filter","currentLabel","minValue","Infinity","maxValue","value","parseFloat","key","always","statistics","info","time","Object","keys","parseString","lowercase","toLowerCase","number","isNaN","MolfileStream","TransformStream","constructor","_options","transform","chunk","controller","combined","join","begin","index","endOfDelimiter","eolLength","enqueue","flush","remaining","iterator","readStream","moleculeStream","pipeThrough","entry","parseMolecule"],"mappings":"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","x_google_ignoreList":[0,4]}