UNPKG

eyereasoner

Version:

Distributing the [EYE](https://github.com/eyereasoner/eye) reasoner for browser and node using WebAssembly.

124 lines (123 loc) 4.77 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.loadEyeImage = void 0; exports.loadImage = loadImage; exports.SwiplEye = SwiplEye; exports.runQuery = runQuery; exports.executeBasicEyeQuery = executeBasicEyeQuery; exports.n3reasoner = n3reasoner; exports.linguareasoner = linguareasoner; const n3_1 = require("n3"); const swipl_bundle_no_data_1 = __importDefault(require("swipl-wasm/dist/swipl/swipl-bundle-no-data")); const strToBuffer_1 = __importDefault(require("swipl-wasm/dist/strToBuffer")); const n3Writer_temp_1 = require("./n3Writer.temp"); const eye_1 = __importDefault(require("./eye")); const lingua_1 = __importDefault(require("./lingua")); const query_1 = require("./query"); function loadImage(image) { return (swipl) => (options) => swipl({ ...options, arguments: ['-q', '-x', 'eye.pvm'], // @ts-ignore preRun: (module) => module.FS.writeFile('eye.pvm', (0, strToBuffer_1.default)(image)), }); } exports.loadEyeImage = loadImage(eye_1.default); /** * Creates default SWIPL image loaded with EYE */ function SwiplEye(options) { return (0, exports.loadEyeImage)(swipl_bundle_no_data_1.default)(options); } function runQuery(Module, data, queryString, { output, cb } = {}, // eslint-disable-line default-param-last noOptions) { const args = noOptions ? [] : ['--nope', '--quiet']; for (let i = 0; i < data.length; i += 1) { args.push(`data_${i}.n3s`); Module.FS.writeFile(`data_${i}.n3s`, data[i]); } if (queryString) { if (output) { throw new Error('Cannot use explicit output with explicit query'); } Module.FS.writeFile('query.n3s', queryString); args.push('--query', './query.n3s'); } else if (!noOptions) { switch (output) { case undefined: case 'derivations': args.push('--pass-only-new'); break; case 'deductive_closure': args.push('--pass'); break; case 'deductive_closure_plus_rules': args.push('--pass-all'); break; case 'grounded_deductive_closure_plus_rules': args.push('--pass-all-ground'); break; case 'none': break; default: throw new Error(`Unknown output option: ${output}`); } } if (cb) { return (0, query_1.qaQuery)(Module, 'main', args, cb).then(() => Module); } (0, query_1.queryOnce)(Module, 'main', args); return Module; } function parse(res) { const parser = new n3_1.Parser({ format: 'text/n3' }); // Workaround for https://github.com/rdfjs/N3.js/issues/324 // @ts-expect-error // eslint-disable-next-line no-underscore-dangle parser._supportsRDFStar = true; try { return parser.parse(res); } catch (e) { throw new Error(`Error while parsing query result: [${e}]. Query result: [${res}]`); } } function inputDataToStrings(data) { if (typeof data === 'string') { return [data]; } if (typeof data[0] === 'string') { return data; } return data.length > 0 ? [(0, n3Writer_temp_1.write)(data)] : []; } async function executeBasicEyeQuery(swipl, data, query, options) { /* eslint-enable max-len */ const outputType = options?.outputType; let res = ''; const err = []; const Module = await (options?.imageLoader ?? exports.loadEyeImage)(swipl)({ print: (str) => { res += `${str}\n`; }, printErr: (str) => { err.push(str); }, }); await runQuery(Module, inputDataToStrings(data), query && (typeof query === 'string' ? query : (0, n3Writer_temp_1.write)(query)), options, !!options?.imageLoader); if (err.length > 0) { throw new Error(`Error while executing query: ${err.join('\n')}`); } // eslint-disable-next-line no-nested-ternary return (outputType === 'quads' || (typeof data !== 'string' && typeof data[0] !== 'string' && outputType !== 'string')) ? (options?.imageLoader ? ((new n3_1.Parser({ format: 'trig' })).parse(res)) : parse(res)) : res; } async function n3reasoner(data, query, options) { /* eslint-enable max-len */ return executeBasicEyeQuery(options?.SWIPL || swipl_bundle_no_data_1.default, data, query, options); } async function linguareasoner(data, query, options) { return executeBasicEyeQuery(options?.SWIPL || swipl_bundle_no_data_1.default, data, query, { ...options, imageLoader: loadImage(lingua_1.default) }); } /* eslint-enable max-len */