eyereasoner
Version:
Distributing the [EYE](https://github.com/eyereasoner/eye) reasoner for browser and node using WebAssembly.
124 lines (123 loc) • 4.77 kB
JavaScript
;
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 */