UNPKG

sssom-js

Version:

Simple Standard for Sharing Ontology Mappings (SSOM) JavaScript library

61 lines (52 loc) 1.85 kB
import { inputFrom, readMetadata } from "./input.js" import { validateMappingSet, validateMapping } from "./validate.js" import { DetailledError } from "./error.js" import { propagate } from "./propagate.js" import { sssomOrJskos } from "./jskos.js" const _parseInput = async input => { if (input) { input = inputFrom(input) // we don't use .json() to better support browser and error handling const data = [] for await (const chunk of input) { data.push(chunk) } try { return JSON.parse(data.join("")) } catch (e) { let message = e.message let position = {} // JSON parsing error message format depends on the JavaScript engine. // This catches "(line 1 column 6)" and "at line 1 column 6". let match = message.match(/line ([0-9]+) column ([0-9]+)/) if (match) { message = message.replace(/line [0-9]+ /,"") position.line = match[1] // TODO: column } throw new DetailledError(message, { position }) } } return { mappings: [] } } export const parseJSON = async (input, options) => { const { metadataHandler, mappingHandler } = options // TODO: keep input string to get error locations let { mappings, ...metadata } = await _parseInput(input) if (options.metadata) { metadata = await readMetadata(options.metadata, options) } else { validateMappingSet(metadata, options.liberal) } if (metadataHandler) { metadataHandler(metadata) } mappings.forEach(m => validateMapping(m, options.liberal)) if (options.propapage) { mappings = mappings.map(mapping => propagate(metadata, mapping)) } if (mappingHandler && mappings) { mappings.forEach(mappingHandler) } const result = options.mappings ? { mappings } : { mappings, ...metadata } return sssomOrJskos(result, options) }