@rdfine/hydra
Version:
> ## @rdfine/hydra > ### Generated JavaScript types for Hydra Core Vocabulary
67 lines (66 loc) • 2.21 kB
JavaScript
import URITemplate from 'es6-url-template';
export class TemplateExpander {
constructor(template) {
this.__template = template;
}
expand(baseOrFirst, ...models) {
if (!this.__template.template) {
return '';
}
let base = '';
let expansionModels;
if (typeof baseOrFirst === 'string') {
base = baseOrFirst;
expansionModels = models;
}
else {
const parent = this.findNamedParent();
if (parent) {
base = parent.id.value;
}
expansionModels = baseOrFirst ? [baseOrFirst, ...models] : models;
}
const uriTemplate = new URITemplate(this.__template.template);
const variables = expansionModels.reduce((variables, model) => {
return {
...variables,
...this.buildExpansionModel(this.__template.mapping, 'id' in model ? model.pointer : model),
};
}, {});
const expanded = uriTemplate.expand(variables);
if (base) {
return new URL(expanded, base).toString();
}
return expanded;
}
findNamedParent() {
let parent = this.__template._parent;
do {
if (parent && !parent.isAnonymous) {
return parent;
}
parent = parent?._parent;
} while (parent);
return undefined;
}
buildExpansionModel(mappings, templateValues) {
return mappings.reduce((model, mapping) => {
const { property, variable } = mapping;
if (!property || !variable) {
return model;
}
const values = templateValues.out(property.id)
.map(({ term }) => {
const variableRepresentation = mapping.variableRepresentation || this.__template.variableRepresentation;
return variableRepresentation?.mapValue(term) || term.value;
});
if (values.length === 0) {
return model;
}
return {
...model,
[variable]: values,
};
}, {});
}
}