UNPKG

jsonld

Version:

A JSON-LD Processor and API implementation in JavaScript.

121 lines (111 loc) 3.3 kB
/* * Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved. */ 'use strict'; const types = require('./types'); const api = {}; module.exports = api; /** * Returns true if the given value is a subject with properties. * * @param v the value to check. * * @return true if the value is a subject with properties, false if not. */ api.isSubject = v => { // Note: A value is a subject if all of these hold true: // 1. It is an Object. // 2. It is not a @value, @set, or @list. // 3. It has more than 1 key OR any existing key is not @id. if(types.isObject(v) && !(('@value' in v) || ('@set' in v) || ('@list' in v))) { const keyCount = Object.keys(v).length; return (keyCount > 1 || !('@id' in v)); } return false; }; /** * Returns true if the given value is a subject reference. * * @param v the value to check. * * @return true if the value is a subject reference, false if not. */ api.isSubjectReference = v => // Note: A value is a subject reference if all of these hold true: // 1. It is an Object. // 2. It has a single key: @id. (types.isObject(v) && Object.keys(v).length === 1 && ('@id' in v)); /** * Returns true if the given value is a @value. * * @param v the value to check. * * @return true if the value is a @value, false if not. */ api.isValue = v => // Note: A value is a @value if all of these hold true: // 1. It is an Object. // 2. It has the @value property. types.isObject(v) && ('@value' in v); /** * Returns true if the given value is a @list. * * @param v the value to check. * * @return true if the value is a @list, false if not. */ api.isList = v => // Note: A value is a @list if all of these hold true: // 1. It is an Object. // 2. It has the @list property. types.isObject(v) && ('@list' in v); /** * Returns true if the given value is a @graph. * * @return true if the value is a @graph, false if not. */ api.isGraph = v => { // Note: A value is a graph if all of these hold true: // 1. It is an object. // 2. It has an `@graph` key. // 3. It may have '@id' or '@index' return types.isObject(v) && '@graph' in v && Object.keys(v) .filter(key => key !== '@id' && key !== '@index').length === 1; }; /** * Returns true if the given value is a simple @graph. * * @return true if the value is a simple @graph, false if not. */ api.isSimpleGraph = v => { // Note: A value is a simple graph if all of these hold true: // 1. It is an object. // 2. It has an `@graph` key. // 3. It has only 1 key or 2 keys where one of them is `@index`. return api.isGraph(v) && !('@id' in v); }; /** * Returns true if the given value is a blank node. * * @param v the value to check. * * @return true if the value is a blank node, false if not. */ api.isBlankNode = v => { // Note: A value is a blank node if all of these hold true: // 1. It is an Object. // 2. If it has an @id key that is not a string OR begins with '_:'. // 3. It has no keys OR is not a @value, @set, or @list. if(types.isObject(v)) { if('@id' in v) { const id = v['@id']; return !types.isString(id) || id.indexOf('_:') === 0; } return (Object.keys(v).length === 0 || !(('@value' in v) || ('@set' in v) || ('@list' in v))); } return false; };