jsonld
Version:
A JSON-LD Processor and API implementation in JavaScript.
121 lines (111 loc) • 3.3 kB
JavaScript
/*
* Copyright (c) 2017 Digital Bazaar, Inc. All rights reserved.
*/
;
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;
};