diff --git a/src/resolver.js b/src/resolver.js index 40cd831..6a28766 100644 --- a/src/resolver.js +++ b/src/resolver.js @@ -5,6 +5,7 @@ const pointer = require('json-pointer') const URI = require('uri-js') const Ajv = require('ajv') const omit = require('lodash/omit') +const merge = require('lodash/merge') const ajv = new Ajv() @@ -103,6 +104,13 @@ function resolveLink(ldo, instance, instanceUri) { resolved.hrefInputTemplates = [ldo.href] resolved.hrefPrepopulatedInput = getDefaultInputValues(ldo.href, ldo, instance) resolved.hrefFixedInput = omit(getTemplateData(ldo.href, ldo, instance), Object.keys(resolved.hrefPrepopulatedInput)) + resolved.fillHref = function(userSupplied) { + var fixedData = omit(getTemplateData(ldo.href, ldo, instance), Object.keys(resolved.hrefPrepopulatedInput)) + var allData = merge({}, userSupplied, fixedData) + var template = uriTemplates(ldo.href) + resolved.targetUri = template.fill(allData) + return resolved.targetUri + } } else { let template = uriTemplates(ldo.href) let uri diff --git a/test/specs/resolver.spec.js b/test/specs/resolver.spec.js index f07f803..b9147cc 100644 --- a/test/specs/resolver.spec.js +++ b/test/specs/resolver.spec.js @@ -1,6 +1,7 @@ const chai = require('chai') const resolver = require('../../src/resolver') const expect = chai.expect +const _ = require('lodash') describe('resolver', function() { var link @@ -288,7 +289,7 @@ describe('resolver', function() { author: 'Martin' }, 'https://example.com') - expect(resolved).to.eql([{ + expect(resolved.map(o => _.omit(o, 'fillHref'))).to.eql([{ contextUri: 'https://example.com', contextPointer: '', rel: 'author', @@ -321,7 +322,7 @@ describe('resolver', function() { author: 'Martin' }, 'https://example.com') - expect(resolved).to.eql([{ + expect(resolved.map(o => _.omit(o, 'fillHref'))).to.eql([{ contextUri: 'https://example.com', contextPointer: '', rel: 'author', @@ -338,7 +339,33 @@ describe('resolver', function() { }) }) - it('provides a function for fully templating the template') + it('provides a function for fully templating the template and enforces prefilled values', function() { + var resolved = resolver.resolve({ + links: [{ + rel: 'author', + href: '/authors/{author}/{extra}', + hrefSchema: { + properties: { + author: false, + extra: true + } + } + }] + }, { + author: 'Martin' + }, 'https://example.com') + + expect(resolved[0].fillHref).to.be.a('function') + + var targetUri = resolved[0].fillHref({ + author: 'I should not be used', + extra: 'I should be used' + }) + + expect(targetUri).to.equal('/authors/Martin/' + encodeURIComponent('I should be used')) + expect(targetUri).to.equal(resolved[0].targetUri) + }) + it('does not allow changing the hrefFixedInput') it('considers base')