From f71fcd41b816434945ffc1d95c0a2647f597c8f9 Mon Sep 17 00:00:00 2001 From: Martin Maillard Date: Tue, 8 Feb 2022 14:40:15 +0100 Subject: [PATCH] fix: parsing multi-valued param in explicit mode --- lib/middleware/iriTemplate.js | 19 ++++++++++++------- test/iriTemplate.test.js | 26 ++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/lib/middleware/iriTemplate.js b/lib/middleware/iriTemplate.js index 1704e34..b725da2 100644 --- a/lib/middleware/iriTemplate.js +++ b/lib/middleware/iriTemplate.js @@ -19,17 +19,22 @@ function createTermFromVariable ({ template, value }) { return value } - const matches = value.match(literalValueRegex) - if (matches) { - let datatypeOrLanguage = matches.groups.language - if (matches.groups.datatype) { - datatypeOrLanguage = rdf.namedNode(matches.groups.datatype) + const parseValue = value => { + const matches = value.match(literalValueRegex) + if (matches) { + let datatypeOrLanguage = matches.groups.language + if (matches.groups.datatype) { + datatypeOrLanguage = rdf.namedNode(matches.groups.datatype) + } + + return rdf.literal(matches.groups.value, datatypeOrLanguage) } - return rdf.literal(matches.groups.value, datatypeOrLanguage) + return rdf.namedNode(value) } - return rdf.namedNode(value) + const values = Array.isArray(value) ? value : [value] + return values.map(parseValue) } function middleware ({ dataset, term, graph }) { diff --git a/test/iriTemplate.test.js b/test/iriTemplate.test.js index fc6ba0f..a3a79bf 100644 --- a/test/iriTemplate.test.js +++ b/test/iriTemplate.test.js @@ -366,5 +366,31 @@ describe('middleware/iriTemplate', () => { const boundTerm = clownface({ dataset }).out().term deepStrictEqual(boundTerm, rdf.literal('A simple string', 'en')) }) + + it('should return individual object for comma-separated query values', async () => { + let dataset = null + const app = express() + const tagProp = rdf.namedNode('http://example.org/tag') + + app.use(middleware(iriTemplateMappingBuilder({ + template: '/{?tag}', + variables: { + tag: 'http://example.org/tag' + }, + explicitRepresentation: true + }))) + + app.use(async (req, res, next) => { + dataset = await req.dataset() + + next() + }) + + await request(app).get('/?tag=http%3A%2F%2Fexample.org%2Fdimension%2Fcolors,http%3A%2F%2Fexample.org%2Fdimension%2Fcountries') + + strictEqual(dataset.size, 2) + strictEqual(dataset.match(null, tagProp, rdf.namedNode('http://example.org/dimension/colors')).size, 1) + strictEqual(dataset.match(null, tagProp, rdf.namedNode('http://example.org/dimension/countries')).size, 1) + }) }) })