@jeswr/shacl2shex
Version:
Convert SHACL to ShEx
43 lines (42 loc) • 1.72 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getSubjects = getSubjects;
exports.shapeFromDataset = shapeFromDataset;
exports.shapeMatches = shapeMatches;
const ldo_1 = require("@ldo/ldo");
const neighborhood_rdfjs_1 = __importDefault(require("@shexjs/neighborhood-rdfjs"));
const validator_1 = require("@shexjs/validator");
const term_set_1 = __importDefault(require("@rdfjs/term-set"));
function getSubjects(dataset) {
const subjects = new term_set_1.default();
for (const quad of dataset) {
if (quad.subject.termType === 'NamedNode'
|| quad.subject.termType === 'BlankNode')
subjects.add(quad.subject);
}
return subjects;
}
function shapeFromDataset(shapeType, dataset, subject) {
const validator = new validator_1.ShExValidator(shapeType.schema, neighborhood_rdfjs_1.default.ctor(dataset));
const validationResult = validator.validateShapeMap([{
node: typeof subject === 'string' ? subject : subject.value,
shape: shapeType.shape,
}]);
if (validationResult[0].status !== 'conformant') {
throw new Error(JSON.stringify(validationResult, null, 2));
}
return (0, ldo_1.createLdoDataset)([...dataset]).usingType(shapeType).fromSubject(subject);
}
function* shapeMatches(shapeType, dataset) {
for (const subject of getSubjects(dataset)) {
try {
yield shapeFromDataset(shapeType, dataset, subject);
}
catch (e) {
// Do nothing, not all subjects will match every shape
}
}
}