UNPKG

@rdfine/hydra

Version:

> ## @rdfine/hydra > ### Generated JavaScript types for Hydra Core Vocabulary

67 lines (66 loc) 2.21 kB
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, }; }, {}); } }