From 26afbea73129d2dbd9254fd5e452c0f8b66dc02e Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Fri, 15 Jun 2018 15:29:41 -0400 Subject: [PATCH 01/32] generate combinatorial SBOL using sboljs --- lib/constellation.js | 13 + lib/sbol.js | 174 +++++++ package-lock.json | 1150 +++++++++++++++++++++++++++++++++++++----- package.json | 1 + 4 files changed, 1205 insertions(+), 133 deletions(-) create mode 100644 lib/sbol.js diff --git a/lib/constellation.js b/lib/constellation.js index 89dac19..131efe0 100644 --- a/lib/constellation.js +++ b/lib/constellation.js @@ -3,6 +3,7 @@ if (typeof(window) === 'undefined') { graph = require('./graph'); designEnumeration = require('./designEnumeration'); + sbol = require('./sbol'); imparse = require('imparse'); } @@ -26,6 +27,8 @@ const constellation = function (langText, categories, numDesigns) { let parsed; let gra; let designs; + let sbolDoc; + try { parsed = parseGoldbar(langText); categories = parseCategories(categories); @@ -34,12 +37,22 @@ const constellation = function (langText, categories, numDesigns) { } gra = graph(parsed); + console.log(gra.stateGraph); + try { designs = designEnumeration(gra.paths, categories, numDesigns); } catch (error) { designs = String(error); } + try { + sbolDoc = sbol(gra.stateGraph, categories); + } catch (error) { + sbolDoc = String(error); + } + + console.log(sbolDoc); + return {stateGraph: gra.stateGraph, designs: designs, paths: gra.paths}; }; diff --git a/lib/sbol.js b/lib/sbol.js new file mode 100644 index 0000000..a76ca52 --- /dev/null +++ b/lib/sbol.js @@ -0,0 +1,174 @@ +if (typeof window === 'undefined') { + SBOLDocument = require('sboljs'); +} + +const prefix = 'http://sbolstandard.org/constellation_example1/'; +const operatorURIs = { + 'ZeroOrOne': 'http://sbols.org/v2#zeroOrOne', + 'ZeroOrMore': 'http://sbols.org/v2#zeroOrMore', + 'One': 'http://sbols.org/v2#one', + 'OneOrMore': 'http://sbols.org/v2#oneOrMore' +}; +const precedeURI = 'http://sbols.org/v2#precedes'; +const dnaRegionURI = 'http://www.biopax.org/release/biopax-level3.owl#DnaRegion'; + +let atomMap = {}; // {atom text: id, component, operator, variantDerivation: []} + +function getRootId(stateGraph){ + for (let id in stateGraph) { + if (stateGraph[id].text === 'root'){ + return id; + } + } +} + +function makeComponentDefinition(atomText, doc){ + const componentDefinition = doc.componentDefinition(prefix + atomText); + const role = SBOLDocument.terms[atomText]; //TODO terms need to match what's in sboljs, issue #56 + if (role){ + componentDefinition.addRole(role); + } + componentDefinition.addType(dnaRegionURI); //TODO support for non DNA? + componentDefinition.displayId = atomText; + return componentDefinition; +} + +function addAtom(atomText, templateComponentDefinition, doc){ + const atomComponent = doc.component(templateComponentDefinition.uri + '/' + atomText); + atomComponent.definition = makeComponentDefinition(atomText, doc); + return atomComponent; +} + +// there can be more than one here +function getFirstSubjectIds(stateGraph){ + let firstIds = []; + let rootId = getRootId(stateGraph); + let edges = stateGraph[rootId].edges; + for (let i in edges) { + if (stateGraph[edges[i]].type === 'atom'){ + firstIds.push(edges[i]); + } + }; + return firstIds; +} + +function getObjectTextList(id, stateGraph, objectTextList, parentId){ + let atomEdges = stateGraph[id].edges; + atomEdges.forEach(function(atomEdgeId){ + //if an edge has an edge back to its parent, skip + if (atomEdgeId !== parentId) { + if (stateGraph[atomEdgeId].type === 'epsilon') { + getObjectTextList(atomEdgeId, stateGraph, objectTextList, id); + } + if (stateGraph[atomEdgeId].type === 'atom') { + objectTextList.push(stateGraph[atomEdgeId].text); + } + } + }); +} + +function addSequenceConstraints(id, stateGraph, templateComponentDefinition, doc){ + //subject precedes object + let subjectText = stateGraph[id].text; + let objectTextList = []; + getObjectTextList(atomMap[subjectText].id, stateGraph, objectTextList); + + // if the subject atom precedes more than one object atoms + // the object atoms == OR + if (objectTextList.length > 1){ + objectTextList.forEach(function(objectText){ + let objectTextListWithoutCurrent = objectTextList.filter(function(x) { return x !== objectText; }); + atomMap[objectText].variantDerivation.push(objectTextListWithoutCurrent); + }); + } + + // sequence constraint = THEN + objectTextList.forEach(function(objectText){ + const sequenceConstraint = doc.sequenceConstraint(prefix + 'combinatorialSequenceConstraint'); + sequenceConstraint.object = atomMap[objectText]; + sequenceConstraint.subject = atomMap[subjectText]; + sequenceConstraint.restriction = precedeURI; + templateComponentDefinition.addSequenceConstraint(sequenceConstraint); + + let id = atomMap[objectText].id; + addSequenceConstraints(id, stateGraph, templateComponentDefinition, doc); + }); +} + +function generateTemplateComponentDefinition(stateGraph, doc) { + const templateComponentDefinition = doc.componentDefinition(prefix + 'combinatorialTemplate'); + templateComponentDefinition.displayId = 'combinatorialTemplate'; + templateComponentDefinition.addType(dnaRegionURI); + Object.keys(stateGraph).forEach(function(key) { + if (stateGraph[key].type === 'atom'){ + let text = stateGraph[key].text; + let atomComponent = addAtom(text, templateComponentDefinition, doc); + templateComponentDefinition.addComponent(atomComponent); + atomMap[text] = {}; + atomMap[text].id = key; + atomMap[text].variantDerivation = []; + atomMap[text].operator = 'One'; //default + atomMap[text].component = atomComponent; + let edges = stateGraph[key].edges; + // if there is only one edge and that edge is an 'o' + // and if o's edges contains this edge, it is 'zeroOrMore' + if ( edges.length === 1 && stateGraph[edges[0]].type === 'epsilon' && stateGraph[edges[0]].edges.includes(key)){ + atomMap[text].operator = 'ZeroOrMore'; + }else if (edges.length > 1){ + for (let i = 0; i < edges.length; i++) { + if (stateGraph[edges[i]].edges.includes(key)){ + atomMap[text].operator = 'OneOrMore'; + break; + } + } + } + } + }); + + let firstSubjectIds = getFirstSubjectIds(stateGraph); + firstSubjectIds.forEach(function(firstSubjectId){ + addSequenceConstraints(firstSubjectId, stateGraph, templateComponentDefinition, doc); + }); + return templateComponentDefinition; +} + + +function generateCombinatorialSBOL(stateGraph, categories){ + const doc = new SBOLDocument(); + const templateComponentDefinition = generateTemplateComponentDefinition(stateGraph, doc) + const combinatorialDerivation = doc.combinatorialDerivation(prefix + 'combinatorialDerivation'); + combinatorialDerivation.template = templateComponentDefinition; + + Object.keys(atomMap).forEach(function(atomText){ + + const variableComponent = doc.variableComponent(prefix + atomText + '_variable'); + variableComponent.variable = atomMap[atomText].component; + variableComponent.operator = operatorURIs[atomMap[atomText].operator]; + + //OR + if (atomMap[atomText].variantDerivation.length > 0){ + atomMap[atomText].variantDerivation.forEach(function(text){ + let variantDerivationComponent = atomMap[text].component; + variableComponent.addVariantDerivation(variantDerivationComponent); + }); + } + + let variants = categories[atomText]; + variants.forEach(function(variant){ + //make componentDefinition for every variant + let variantCompDef = makeComponentDefinition(variant, doc); + variableComponent.addVariant(variantCompDef); + }); + + // link VariableComponent under combinatorialDerivation + combinatorialDerivation.addVariableComponent(variableComponent); + }); + + return doc.serializeXML(); +} + +let sbol = generateCombinatorialSBOL; + +if (typeof window === 'undefined') { + module.exports = sbol; +} diff --git a/package-lock.json b/package-lock.json index e9048a6..0710c5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", "requires": { - "mime-types": "~2.1.16", + "mime-types": "2.1.17", "negotiator": "0.6.1" } }, @@ -19,10 +19,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "argparse": { @@ -31,7 +31,7 @@ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "sprintf-js": "1.0.3" } }, "array-flatten": { @@ -87,7 +87,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "body-parser": { @@ -97,15 +97,15 @@ "dev": true, "requires": { "bytes": "3.0.0", - "content-type": "~1.0.4", + "content-type": "1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "~1.6.3", + "depd": "1.1.2", + "http-errors": "1.6.3", "iconv-lite": "0.4.23", - "on-finished": "~2.3.0", + "on-finished": "2.3.0", "qs": "6.5.2", "raw-body": "2.3.3", - "type-is": "~1.6.16" + "type-is": "1.6.16" }, "dependencies": { "depd": { @@ -120,10 +120,10 @@ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "statuses": "1.5.0" } }, "mime-db": { @@ -138,7 +138,7 @@ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.33.0" } }, "qs": { @@ -160,7 +160,7 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "2.1.18" } } } @@ -170,7 +170,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -196,12 +196,12 @@ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "assertion-error": "^1.0.1", - "check-error": "^1.0.1", - "deep-eql": "^3.0.0", - "get-func-name": "^2.0.0", - "pathval": "^1.0.0", - "type-detect": "^4.0.0" + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" } }, "check-error": { @@ -222,7 +222,7 @@ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "commander": { @@ -267,11 +267,11 @@ "integrity": "sha512-ZppXR9y5PraUOrf/DzHJY6gzNUhXYE3b9D43xEXs4QYZ7/Oe0Gy0CS+IPKWFfvQFXB3RG9QduaQUFehzSpGAFw==", "dev": true, "requires": { - "js-yaml": "^3.6.1", - "lcov-parse": "^0.0.10", - "log-driver": "^1.2.5", - "minimist": "^1.2.0", - "request": "^2.79.0" + "js-yaml": "3.10.0", + "lcov-parse": "0.0.10", + "log-driver": "1.2.5", + "minimist": "1.2.0", + "request": "2.87.0" } }, "d3-collection": { @@ -289,10 +289,10 @@ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz", "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==", "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" + "d3-collection": "1.0.4", + "d3-dispatch": "1.0.3", + "d3-quadtree": "1.0.3", + "d3-timer": "1.0.7" } }, "d3-quadtree": { @@ -311,7 +311,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "debug": { @@ -328,7 +328,7 @@ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "^4.0.0" + "type-detect": "4.0.8" } }, "delayed-stream": { @@ -359,7 +359,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "0.1.1" } }, "ee-first": { @@ -398,36 +398,36 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", "requires": { - "accepts": "~1.3.4", + "accepts": "1.3.4", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "~1.0.4", + "content-type": "1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.1", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "etag": "~1.8.1", + "depd": "1.1.1", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", "finalhandler": "1.1.0", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.2", + "proxy-addr": "2.0.2", "qs": "6.5.1", - "range-parser": "~1.2.0", + "range-parser": "1.2.0", "safe-buffer": "5.1.1", "send": "0.16.1", "serve-static": "1.13.1", "setprototypeof": "1.1.0", - "statuses": "~1.3.1", - "type-is": "~1.6.15", + "statuses": "1.3.1", + "type-is": "1.6.15", "utils-merge": "1.0.1", - "vary": "~1.1.2" + "vary": "1.1.2" }, "dependencies": { "body-parser": { @@ -436,15 +436,15 @@ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "requires": { "bytes": "3.0.0", - "content-type": "~1.0.4", + "content-type": "1.0.4", "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", + "depd": "1.1.1", + "http-errors": "1.6.2", "iconv-lite": "0.4.19", - "on-finished": "~2.3.0", + "on-finished": "2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "~1.6.15" + "type-is": "1.6.15" } }, "iconv-lite": { @@ -495,12 +495,12 @@ "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" } }, "forever-agent": { @@ -515,9 +515,9 @@ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { - "asynckit": "^0.4.0", + "asynckit": "0.4.0", "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "mime-types": "2.1.17" } }, "forwarded": { @@ -547,7 +547,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "glob": { @@ -555,12 +555,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "growl": { @@ -580,8 +580,8 @@ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" + "ajv": "5.5.2", + "har-schema": "2.0.0" } }, "has-flag": { @@ -602,7 +602,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" + "statuses": "1.3.1" }, "dependencies": { "setprototypeof": { @@ -618,9 +618,9 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" } }, "iconv-lite": { @@ -629,7 +629,7 @@ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" } }, "imparse": { @@ -642,8 +642,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -674,8 +674,8 @@ "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "1.0.9", + "esprima": "4.0.0" } }, "jsbn": { @@ -757,7 +757,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", "requires": { - "mime-db": "~1.30.0" + "mime-db": "1.30.0" } }, "minimatch": { @@ -765,7 +765,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.8" } }, "minimist": { @@ -845,7 +845,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "parseurl": { @@ -880,7 +880,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.1.2", "ipaddr.js": "1.5.2" } }, @@ -924,10 +924,10 @@ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "statuses": "1.5.0" } }, "statuses": { @@ -944,26 +944,26 @@ "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "dev": true, "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" } }, "reservoir": { @@ -982,24 +982,908 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sboljs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/sboljs/-/sboljs-2.1.3.tgz", + "integrity": "sha1-OxwXkjcDxy3cgj4yeodZqR9bdlw=", + "requires": { + "extend": "3.0.0", + "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "rdf-ext": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", + "rdf-graph-array": "git+https://github.com/udp/rdf-graph-array.git#98b1a0c674ed2b07993d54ab7d2a3b84e661bc3e", + "rdf-parser-rdfxml": "0.3.1", + "request": "2.83.0", + "urijs": "https://registry.npmjs.org/urijs/-/urijs-1.18.7.tgz", + "xml": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.2.0" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "cheerio": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", + "integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=", + "dev": true, + "requires": { + "css-select": "1.0.0", + "dom-serializer": "0.1.0", + "entities": "1.1.1", + "htmlparser2": "3.8.3", + "lodash": "3.10.1" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.2.3", + "typedarray": "0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "css-select": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", + "integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=", + "dev": true, + "requires": { + "boolbase": "1.0.0", + "css-what": "1.0.0", + "domutils": "1.4.3", + "nth-check": "1.0.1" + } + }, + "css-what": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", + "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=" + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", + "integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=" + }, + "extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + } + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.1.0" + } + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.3.0", + "domutils": "1.5.1", + "entities": "1.0.0", + "readable-stream": "2.2.3" + }, + "dependencies": { + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=" + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=" + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stringify-safe": { + "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "requires": { + "inherits": "2.0.3", + "minimatch": "0.3.0" + } + } + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "1.0.0" + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "rdf-ext": { + "version": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", + "requires": { + "es6-promise": "3.3.1", + "rdf-graph-array": "git+https://github.com/udp/rdf-graph-array.git#98b1a0c674ed2b07993d54ab7d2a3b84e661bc3e", + "rdf-store-inmemory": "0.3.0" + } + }, + "rdf-graph-abstract": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-graph-abstract/-/rdf-graph-abstract-0.3.0.tgz", + "integrity": "sha1-gAZBZNzWCQflO++XLIv/DmGsFDM=", + "requires": { + "rdf-normalize": "0.3.0" + } + }, + "rdf-graph-array": { + "version": "git+https://github.com/udp/rdf-graph-array.git#98b1a0c674ed2b07993d54ab7d2a3b84e661bc3e", + "requires": { + "inherits": "2.0.3", + "rdf-graph-abstract": "0.3.0" + } + }, + "rdf-normalize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-normalize/-/rdf-normalize-0.3.0.tgz", + "integrity": "sha1-J2H1sh0kYyW4+zxOk9+Vn2L5Zqg=" + }, + "rdf-parser-rdfxml": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/rdf-parser-rdfxml/-/rdf-parser-rdfxml-0.3.1.tgz", + "integrity": "sha1-0ZPs/BqE7a93SIQPJGb7QxQ8h4o=", + "requires": { + "rdf-ext": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", + "rdf-parser-dom": "0.3.0" + }, + "dependencies": { + "rdf-parser-dom": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-parser-dom/-/rdf-parser-dom-0.3.0.tgz", + "integrity": "sha1-RkNb7/vGf6Nat2x23tdfumsEly4=", + "requires": { + "rdf-parser-abstract": "0.3.0", + "xmldom": "0.1.27" + }, + "dependencies": { + "rdf-parser-abstract": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-parser-abstract/-/rdf-parser-abstract-0.3.0.tgz", + "integrity": "sha1-6gH2zFrmhZMyXUSvwLVINTMCPi4=", + "requires": { + "concat-stream": "1.6.0", + "mocha": "2.5.3" + } + } + } + } + } + }, + "rdf-store-abstract": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-store-abstract/-/rdf-store-abstract-0.3.0.tgz", + "integrity": "sha1-s6RlB5D0E7CRlX+HrMiByYt6g6I=" + }, + "rdf-store-inmemory": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-store-inmemory/-/rdf-store-inmemory-0.3.0.tgz", + "integrity": "sha1-051xLtt7Rk4qcMwBm6O+6nFiO3A=", + "requires": { + "rdf-ext": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", + "rdf-store-abstract": "0.3.0" + } + }, + "readable-stream": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.3.tgz", + "integrity": "sha1-nPSUY5hd8BbIrogTCXqSk6mzNyk=", + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + }, + "dependencies": { + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + } + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "requires": { + "hoek": "4.2.0" + } + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=" + }, + "to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=" + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "urijs": { + "version": "https://registry.npmjs.org/urijs/-/urijs-1.18.7.tgz", + "integrity": "sha1-YT7kGURS/ma4ctYkaJRt+TqUFJI=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xml": { + "version": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + } + } + }, "send": { "version": "0.16.1", "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", "requires": { "debug": "2.6.9", - "depd": "~1.1.1", - "destroy": "~1.0.4", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "etag": "~1.8.1", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", "fresh": "0.5.2", - "http-errors": "~1.6.2", + "http-errors": "1.6.2", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.3.1" + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" } }, "serve-static": { @@ -1007,9 +1891,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", "requires": { - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", "send": "0.16.1" } }, @@ -1035,14 +1919,14 @@ "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "dev": true, "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" } }, "statuses": { @@ -1055,7 +1939,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "requires": { - "has-flag": "^2.0.0" + "has-flag": "2.0.0" } }, "tough-cookie": { @@ -1064,7 +1948,7 @@ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "punycode": "^1.4.1" + "punycode": "1.4.1" } }, "tunnel-agent": { @@ -1073,7 +1957,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.1" } }, "tweetnacl": { @@ -1095,7 +1979,7 @@ "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.15" + "mime-types": "2.1.17" } }, "unpipe": { @@ -1133,9 +2017,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "extsprintf": "1.3.0" } }, "wrappy": { diff --git a/package.json b/package.json index ac16477..f883fa8 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "imparse": "0.0.2", "mocha": "^4.0.1", "reservoir": "^0.1.2", + "sboljs": "^2.1.3", "uuidv4": "^0.5.0" }, "devDependencies": { From 753160c1d944013612d785f37c3e21a8955195f8 Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Tue, 19 Jun 2018 18:54:47 -0400 Subject: [PATCH 02/32] sbol generation enhancements --- lib/constellation.js | 4 +- lib/sbol.js | 227 ++++++--- package-lock.json | 1144 +++++++++++++++++++++++++++++++++++++----- 3 files changed, 1160 insertions(+), 215 deletions(-) diff --git a/lib/constellation.js b/lib/constellation.js index 389ca44..df9e88c 100644 --- a/lib/constellation.js +++ b/lib/constellation.js @@ -36,8 +36,6 @@ const constellation = function (langText, categories, numDesigns, maxCycles) { throw new Error('Parsing error!') } - console.log(gra.stateGraph); - try { gra = graph(parsed, maxCycles); designs = designEnumeration(gra.paths, categories, numDesigns); @@ -45,6 +43,8 @@ const constellation = function (langText, categories, numDesigns, maxCycles) { designs = String(error); } + console.log(gra.stateGraph); + try { sbolDoc = sbol(gra.stateGraph, categories); } catch (error) { diff --git a/lib/sbol.js b/lib/sbol.js index a76ca52..5b0e790 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -2,66 +2,133 @@ if (typeof window === 'undefined') { SBOLDocument = require('sboljs'); } -const prefix = 'http://sbolstandard.org/constellation_example1/'; -const operatorURIs = { +let sequenceConstraintCount = 1; +let atomTextSet = new Set(); +let atomMap = {}; // {atom id: text, type, component, operator, variantDerivation: []} + +const VERSION = '1'; +const DELIMITER = '/'; +const PREFIX = 'http://constellationcad.org/'; +const TEMPLATE = 'combinatorialTemplate'; +const TEMPLATE_PREFIX = PREFIX + TEMPLATE + DELIMITER; +const COMBINATORIAL = 'combinatorialDerivation'; +const SEQUENCE_CONSTRAINT = 'combinatorialSequenceConstraint'; +const COMPONENT = 'Component'; +const VARIABLE = 'Variable'; + +const OPERATOR_URIS = { 'ZeroOrOne': 'http://sbols.org/v2#zeroOrOne', 'ZeroOrMore': 'http://sbols.org/v2#zeroOrMore', 'One': 'http://sbols.org/v2#one', 'OneOrMore': 'http://sbols.org/v2#oneOrMore' }; -const precedeURI = 'http://sbols.org/v2#precedes'; -const dnaRegionURI = 'http://www.biopax.org/release/biopax-level3.owl#DnaRegion'; +const SEQUENCE_CONSTRAINT_URIS = { + 'PRECEDE': 'http://sbols.org/v2#precedes', + 'SAMEORIENTATION': 'http://sbols.org/v2#sameOrientationAs', + 'OPPOSITEORIENTATION': 'http://sbols.org/v2#oppositeOrientationAs', + 'DIFFERENT': 'http://sbols.org/v2#differentFrom' +}; +const STATE_GRAPH_TYPES = { + 'ROOT': 'root', + 'EPSILON': 'epsilon', + 'ATOM': 'atom' +}; -let atomMap = {}; // {atom text: id, component, operator, variantDerivation: []} function getRootId(stateGraph){ for (let id in stateGraph) { - if (stateGraph[id].text === 'root'){ + if (stateGraph[id].type === STATE_GRAPH_TYPES.ROOT){ return id; } } } -function makeComponentDefinition(atomText, doc){ - const componentDefinition = doc.componentDefinition(prefix + atomText); +function makeComponentDefinition(atomText, doc, variantName){ + let displayId = ''; + if (variantName){ + displayId = variantName; + } + else{ + displayId = atomText; + } + const componentDefinition = doc.componentDefinition(PREFIX + displayId + DELIMITER + VERSION); + componentDefinition.displayId = displayId; + componentDefinition.persistentIdentity = PREFIX + displayId; + componentDefinition.version = VERSION; const role = SBOLDocument.terms[atomText]; //TODO terms need to match what's in sboljs, issue #56 if (role){ componentDefinition.addRole(role); } - componentDefinition.addType(dnaRegionURI); //TODO support for non DNA? - componentDefinition.displayId = atomText; + componentDefinition.addType(SBOLDocument.terms.dnaRegion); //TODO support for non DNA? + return componentDefinition; } -function addAtom(atomText, templateComponentDefinition, doc){ - const atomComponent = doc.component(templateComponentDefinition.uri + '/' + atomText); - atomComponent.definition = makeComponentDefinition(atomText, doc); +function makeComponent(atomText, parentPrefix, componentDefinition, doc){ + let displayId = atomText + COMPONENT; + const atomComponent = doc.component(parentPrefix + displayId + DELIMITER + VERSION); + atomComponent.displayId = displayId; + atomComponent.persistentIdentity = parentPrefix + displayId; + atomComponent.version = VERSION; + atomComponent.definition = componentDefinition; return atomComponent; } -// there can be more than one here -function getFirstSubjectIds(stateGraph){ - let firstIds = []; - let rootId = getRootId(stateGraph); - let edges = stateGraph[rootId].edges; - for (let i in edges) { - if (stateGraph[edges[i]].type === 'atom'){ - firstIds.push(edges[i]); - } - }; - return firstIds; +function makeVariableComponent(atomId, categories, doc){ + + let atomText = atomMap[atomId].text; + let displayId = atomText + VARIABLE; + const variableComponent = doc.variableComponent(TEMPLATE_PREFIX + displayId + DELIMITER + VERSION); + variableComponent.displayId = displayId; + variableComponent.persistentIdentity = TEMPLATE_PREFIX + displayId; + variableComponent.version = VERSION; + variableComponent.variable = atomMap[atomId].component; + variableComponent.operator = OPERATOR_URIS[atomMap[atomId].operator]; + + //OR + if (atomMap[atomId].variantDerivation.length > 0){ + atomMap[atomId].variantDerivation.forEach(function(variantId){ + let variantDerivationComponent = atomMap[variantId].component; + variableComponent.addVariantDerivation(variantDerivationComponent); + }); + } + + let variants = categories[atomText]; + if (variants){ + variants.forEach(function(variant){ + //make componentDefinition for every variant + let variantCompDef = makeComponentDefinition(atomText, doc, variant); + variableComponent.addVariant(variantCompDef); + }); + } + + return variableComponent; +} + +function makeSequenceConstraint(objectId, subjectId, doc){ + let displayId = SEQUENCE_CONSTRAINT + sequenceConstraintCount; + const sequenceConstraint = doc.sequenceConstraint(TEMPLATE_PREFIX + displayId + DELIMITER + VERSION); + sequenceConstraint.displayId = displayId; + sequenceConstraint.persistentIdentity = TEMPLATE_PREFIX + displayId; + sequenceConstraint.version = VERSION; + sequenceConstraint.object = atomMap[objectId].component; + sequenceConstraint.subject = atomMap[subjectId].component; + sequenceConstraint.restriction = SEQUENCE_CONSTRAINT_URIS.PRECEDE; + sequenceConstraintCount += 1; + + return sequenceConstraint } -function getObjectTextList(id, stateGraph, objectTextList, parentId){ +function getIdList(id, stateGraph, objectIdList, parentId){ let atomEdges = stateGraph[id].edges; atomEdges.forEach(function(atomEdgeId){ //if an edge has an edge back to its parent, skip if (atomEdgeId !== parentId) { - if (stateGraph[atomEdgeId].type === 'epsilon') { - getObjectTextList(atomEdgeId, stateGraph, objectTextList, id); + if (stateGraph[atomEdgeId].type === STATE_GRAPH_TYPES.EPSILON) { + getIdList(atomEdgeId, stateGraph, objectIdList, id); } - if (stateGraph[atomEdgeId].type === 'atom') { - objectTextList.push(stateGraph[atomEdgeId].text); + if (stateGraph[atomEdgeId].type === STATE_GRAPH_TYPES.ATOM) { + objectIdList.push(atomEdgeId); } } }); @@ -69,55 +136,63 @@ function getObjectTextList(id, stateGraph, objectTextList, parentId){ function addSequenceConstraints(id, stateGraph, templateComponentDefinition, doc){ //subject precedes object - let subjectText = stateGraph[id].text; - let objectTextList = []; - getObjectTextList(atomMap[subjectText].id, stateGraph, objectTextList); + let subjectId = id; + let objectIdList = []; + getIdList(subjectId, stateGraph, objectIdList); // if the subject atom precedes more than one object atoms // the object atoms == OR - if (objectTextList.length > 1){ - objectTextList.forEach(function(objectText){ - let objectTextListWithoutCurrent = objectTextList.filter(function(x) { return x !== objectText; }); - atomMap[objectText].variantDerivation.push(objectTextListWithoutCurrent); + if (objectIdList.length > 1){ + objectIdList.forEach(function(objectId){ + atomMap[objectId].variantDerivation = objectIdList.filter(function(x) { return x !== objectId; }); }); } // sequence constraint = THEN - objectTextList.forEach(function(objectText){ - const sequenceConstraint = doc.sequenceConstraint(prefix + 'combinatorialSequenceConstraint'); - sequenceConstraint.object = atomMap[objectText]; - sequenceConstraint.subject = atomMap[subjectText]; - sequenceConstraint.restriction = precedeURI; + objectIdList.forEach(function(objectId){ + let sequenceConstraint = makeSequenceConstraint(objectId, subjectId, doc); templateComponentDefinition.addSequenceConstraint(sequenceConstraint); - - let id = atomMap[objectText].id; - addSequenceConstraints(id, stateGraph, templateComponentDefinition, doc); + addSequenceConstraints(objectId, stateGraph, templateComponentDefinition, doc); }); } function generateTemplateComponentDefinition(stateGraph, doc) { - const templateComponentDefinition = doc.componentDefinition(prefix + 'combinatorialTemplate'); - templateComponentDefinition.displayId = 'combinatorialTemplate'; - templateComponentDefinition.addType(dnaRegionURI); + const templateComponentDefinition = makeComponentDefinition(TEMPLATE, doc); Object.keys(stateGraph).forEach(function(key) { - if (stateGraph[key].type === 'atom'){ + if (stateGraph[key].type === STATE_GRAPH_TYPES.ATOM){ + + let type = stateGraph[key].text; let text = stateGraph[key].text; - let atomComponent = addAtom(text, templateComponentDefinition, doc); + + if (atomTextSet.has(text)){ + if (!Number.isNaN(text.slice(-1))){ + text = text + '1'; + }else{ + let nextNum = parseInt(text.slice(-1)) + 1; + text = text + nextNum; + } + } + atomTextSet.add(text); + + let componentDefinition = makeComponentDefinition(type, doc); + let atomComponent = makeComponent(text, TEMPLATE_PREFIX, componentDefinition, doc); templateComponentDefinition.addComponent(atomComponent); - atomMap[text] = {}; - atomMap[text].id = key; - atomMap[text].variantDerivation = []; - atomMap[text].operator = 'One'; //default - atomMap[text].component = atomComponent; + + atomMap[key] = {}; + atomMap[key].text = text; + atomMap[key].type = type; + atomMap[key].variantDerivation = []; + atomMap[key].operator = 'One'; //default + atomMap[key].component = atomComponent; let edges = stateGraph[key].edges; // if there is only one edge and that edge is an 'o' // and if o's edges contains this edge, it is 'zeroOrMore' - if ( edges.length === 1 && stateGraph[edges[0]].type === 'epsilon' && stateGraph[edges[0]].edges.includes(key)){ - atomMap[text].operator = 'ZeroOrMore'; + if ( edges.length === 1 && stateGraph[edges[0]].type === STATE_GRAPH_TYPES.EPSILON && stateGraph[edges[0]].edges.includes(key)){ + atomMap[key].operator = 'ZeroOrMore'; }else if (edges.length > 1){ for (let i = 0; i < edges.length; i++) { if (stateGraph[edges[i]].edges.includes(key)){ - atomMap[text].operator = 'OneOrMore'; + atomMap[key].operator = 'OneOrMore'; break; } } @@ -125,8 +200,10 @@ function generateTemplateComponentDefinition(stateGraph, doc) { } }); - let firstSubjectIds = getFirstSubjectIds(stateGraph); - firstSubjectIds.forEach(function(firstSubjectId){ + let firstIds = []; + let rootId = getRootId(stateGraph); + getIdList(rootId, stateGraph, firstIds); + firstIds.forEach(function(firstSubjectId){ addSequenceConstraints(firstSubjectId, stateGraph, templateComponentDefinition, doc); }); return templateComponentDefinition; @@ -135,32 +212,16 @@ function generateTemplateComponentDefinition(stateGraph, doc) { function generateCombinatorialSBOL(stateGraph, categories){ const doc = new SBOLDocument(); - const templateComponentDefinition = generateTemplateComponentDefinition(stateGraph, doc) - const combinatorialDerivation = doc.combinatorialDerivation(prefix + 'combinatorialDerivation'); + const templateComponentDefinition = generateTemplateComponentDefinition(stateGraph, doc); + const combinatorialDerivation = doc.combinatorialDerivation(TEMPLATE_PREFIX + COMBINATORIAL + DELIMITER + VERSION); combinatorialDerivation.template = templateComponentDefinition; + combinatorialDerivation.displayId = COMBINATORIAL; + combinatorialDerivation.persistentIdentity = PREFIX + combinatorialDerivation.displayId; + combinatorialDerivation.version = VERSION; - Object.keys(atomMap).forEach(function(atomText){ - - const variableComponent = doc.variableComponent(prefix + atomText + '_variable'); - variableComponent.variable = atomMap[atomText].component; - variableComponent.operator = operatorURIs[atomMap[atomText].operator]; - - //OR - if (atomMap[atomText].variantDerivation.length > 0){ - atomMap[atomText].variantDerivation.forEach(function(text){ - let variantDerivationComponent = atomMap[text].component; - variableComponent.addVariantDerivation(variantDerivationComponent); - }); - } - - let variants = categories[atomText]; - variants.forEach(function(variant){ - //make componentDefinition for every variant - let variantCompDef = makeComponentDefinition(variant, doc); - variableComponent.addVariant(variantCompDef); - }); - - // link VariableComponent under combinatorialDerivation + // VariantComponent URIs must be unique even if the atomText is the same + Object.keys(atomMap).forEach(function(atomId){ + let variableComponent = makeVariableComponent(atomId, categories, doc); combinatorialDerivation.addVariableComponent(variableComponent); }); diff --git a/package-lock.json b/package-lock.json index ac5c6f8..a4f8a05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "~2.1.18", + "mime-types": "2.1.18", "negotiator": "0.6.1" } }, @@ -19,10 +19,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "argparse": { @@ -31,7 +31,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "sprintf-js": "1.0.3" } }, "array-flatten": { @@ -87,7 +87,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "body-parser": { @@ -97,15 +97,15 @@ "dev": true, "requires": { "bytes": "3.0.0", - "content-type": "~1.0.4", + "content-type": "1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "~1.6.3", + "depd": "1.1.2", + "http-errors": "1.6.3", "iconv-lite": "0.4.23", - "on-finished": "~2.3.0", + "on-finished": "2.3.0", "qs": "6.5.2", "raw-body": "2.3.3", - "type-is": "~1.6.16" + "type-is": "1.6.16" }, "dependencies": { "depd": { @@ -120,10 +120,10 @@ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "statuses": "1.5.0" } }, "mime-db": { @@ -138,7 +138,7 @@ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.33.0" } }, "qs": { @@ -160,7 +160,7 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "2.1.18" } } } @@ -170,7 +170,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -196,12 +196,12 @@ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "assertion-error": "^1.0.1", - "check-error": "^1.0.1", - "deep-eql": "^3.0.0", - "get-func-name": "^2.0.0", - "pathval": "^1.0.0", - "type-detect": "^4.0.0" + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" } }, "check-error": { @@ -222,7 +222,7 @@ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "commander": { @@ -267,11 +267,11 @@ "integrity": "sha512-FAzXwiDOYLGDWH+zgoIA+8GbWv50hlx+kpEJyvzLKOdnIBv9uWoVl4DhqGgyUHpiRjAlF8KYZSipWXYtllWH6Q==", "dev": true, "requires": { - "js-yaml": "^3.6.1", - "lcov-parse": "^0.0.10", - "log-driver": "^1.2.5", - "minimist": "^1.2.0", - "request": "^2.79.0" + "js-yaml": "3.12.0", + "lcov-parse": "0.0.10", + "log-driver": "1.2.7", + "minimist": "1.2.0", + "request": "2.87.0" } }, "d3-collection": { @@ -289,10 +289,10 @@ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz", "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==", "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" + "d3-collection": "1.0.4", + "d3-dispatch": "1.0.3", + "d3-quadtree": "1.0.3", + "d3-timer": "1.0.7" } }, "d3-quadtree": { @@ -311,7 +311,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "debug": { @@ -328,7 +328,7 @@ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "^4.0.0" + "type-detect": "4.0.8" } }, "delayed-stream": { @@ -359,7 +359,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "0.1.1" } }, "ee-first": { @@ -398,36 +398,36 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "requires": { - "accepts": "~1.3.5", + "accepts": "1.3.5", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "~1.0.4", + "content-type": "1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.3", + "proxy-addr": "2.0.3", "qs": "6.5.1", - "range-parser": "~1.2.0", + "range-parser": "1.2.0", "safe-buffer": "5.1.1", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", + "statuses": "1.4.0", + "type-is": "1.6.16", "utils-merge": "1.0.1", - "vary": "~1.1.2" + "vary": "1.1.2" }, "dependencies": { "body-parser": { @@ -528,12 +528,12 @@ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.4.0", + "unpipe": "1.0.0" } }, "forever-agent": { @@ -548,9 +548,9 @@ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { - "asynckit": "^0.4.0", + "asynckit": "0.4.0", "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "mime-types": "2.1.18" } }, "forwarded": { @@ -580,7 +580,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "glob": { @@ -588,12 +588,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "growl": { @@ -613,8 +613,8 @@ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" + "ajv": "5.5.2", + "har-schema": "2.0.0" } }, "has-flag": { @@ -632,10 +632,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "~1.1.2", + "depd": "1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "statuses": "1.4.0" } }, "http-signature": { @@ -644,9 +644,9 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.2" } }, "iconv-lite": { @@ -655,7 +655,7 @@ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" } }, "imparse": { @@ -668,8 +668,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -700,8 +700,8 @@ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "1.0.10", + "esprima": "4.0.0" } }, "jsbn": { @@ -783,7 +783,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.33.0" } }, "minimatch": { @@ -791,7 +791,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -871,7 +871,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "parseurl": { @@ -906,7 +906,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.1.2", "ipaddr.js": "1.6.0" } }, @@ -951,10 +951,10 @@ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "statuses": "1.5.0" } }, "statuses": { @@ -971,26 +971,26 @@ "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "dev": true, "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" } }, "reservoir": { @@ -1010,24 +1010,908 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sboljs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/sboljs/-/sboljs-2.1.3.tgz", + "integrity": "sha1-OxwXkjcDxy3cgj4yeodZqR9bdlw=", + "requires": { + "extend": "3.0.0", + "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "rdf-ext": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", + "rdf-graph-array": "git+https://github.com/udp/rdf-graph-array.git#98b1a0c674ed2b07993d54ab7d2a3b84e661bc3e", + "rdf-parser-rdfxml": "0.3.1", + "request": "2.83.0", + "urijs": "https://registry.npmjs.org/urijs/-/urijs-1.18.7.tgz", + "xml": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.2.0" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "cheerio": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", + "integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=", + "dev": true, + "requires": { + "css-select": "1.0.0", + "dom-serializer": "0.1.0", + "entities": "1.1.1", + "htmlparser2": "3.8.3", + "lodash": "3.10.1" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.2.3", + "typedarray": "0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "css-select": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", + "integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=", + "dev": true, + "requires": { + "boolbase": "1.0.0", + "css-what": "1.0.0", + "domutils": "1.4.3", + "nth-check": "1.0.1" + } + }, + "css-what": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", + "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=" + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", + "integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=" + }, + "extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + } + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.1.0" + } + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.3.0", + "domutils": "1.5.1", + "entities": "1.0.0", + "readable-stream": "2.2.3" + }, + "dependencies": { + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=" + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=" + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stringify-safe": { + "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "requires": { + "inherits": "2.0.3", + "minimatch": "0.3.0" + } + } + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "1.0.0" + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "rdf-ext": { + "version": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", + "requires": { + "es6-promise": "3.3.1", + "rdf-graph-array": "git+https://github.com/udp/rdf-graph-array.git#98b1a0c674ed2b07993d54ab7d2a3b84e661bc3e", + "rdf-store-inmemory": "0.3.0" + } + }, + "rdf-graph-abstract": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-graph-abstract/-/rdf-graph-abstract-0.3.0.tgz", + "integrity": "sha1-gAZBZNzWCQflO++XLIv/DmGsFDM=", + "requires": { + "rdf-normalize": "0.3.0" + } + }, + "rdf-graph-array": { + "version": "git+https://github.com/udp/rdf-graph-array.git#98b1a0c674ed2b07993d54ab7d2a3b84e661bc3e", + "requires": { + "inherits": "2.0.3", + "rdf-graph-abstract": "0.3.0" + } + }, + "rdf-normalize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-normalize/-/rdf-normalize-0.3.0.tgz", + "integrity": "sha1-J2H1sh0kYyW4+zxOk9+Vn2L5Zqg=" + }, + "rdf-parser-rdfxml": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/rdf-parser-rdfxml/-/rdf-parser-rdfxml-0.3.1.tgz", + "integrity": "sha1-0ZPs/BqE7a93SIQPJGb7QxQ8h4o=", + "requires": { + "rdf-ext": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", + "rdf-parser-dom": "0.3.0" + }, + "dependencies": { + "rdf-parser-dom": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-parser-dom/-/rdf-parser-dom-0.3.0.tgz", + "integrity": "sha1-RkNb7/vGf6Nat2x23tdfumsEly4=", + "requires": { + "rdf-parser-abstract": "0.3.0", + "xmldom": "0.1.27" + }, + "dependencies": { + "rdf-parser-abstract": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-parser-abstract/-/rdf-parser-abstract-0.3.0.tgz", + "integrity": "sha1-6gH2zFrmhZMyXUSvwLVINTMCPi4=", + "requires": { + "concat-stream": "1.6.0", + "mocha": "2.5.3" + } + } + } + } + } + }, + "rdf-store-abstract": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-store-abstract/-/rdf-store-abstract-0.3.0.tgz", + "integrity": "sha1-s6RlB5D0E7CRlX+HrMiByYt6g6I=" + }, + "rdf-store-inmemory": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-store-inmemory/-/rdf-store-inmemory-0.3.0.tgz", + "integrity": "sha1-051xLtt7Rk4qcMwBm6O+6nFiO3A=", + "requires": { + "rdf-ext": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", + "rdf-store-abstract": "0.3.0" + } + }, + "readable-stream": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.3.tgz", + "integrity": "sha1-nPSUY5hd8BbIrogTCXqSk6mzNyk=", + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + }, + "dependencies": { + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + } + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "requires": { + "hoek": "4.2.0" + } + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=" + }, + "to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=" + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "urijs": { + "version": "https://registry.npmjs.org/urijs/-/urijs-1.18.7.tgz", + "integrity": "sha1-YT7kGURS/ma4ctYkaJRt+TqUFJI=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xml": { + "version": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + } + } + }, "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", "fresh": "0.5.2", - "http-errors": "~1.6.2", + "http-errors": "1.6.3", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" } }, "serve-static": { @@ -1035,9 +1919,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", "send": "0.16.2" } }, @@ -1063,15 +1947,15 @@ "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "dev": true, "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" } }, "statuses": { @@ -1084,7 +1968,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "requires": { - "has-flag": "^2.0.0" + "has-flag": "2.0.0" } }, "tough-cookie": { @@ -1093,7 +1977,7 @@ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "punycode": "^1.4.1" + "punycode": "1.4.1" } }, "tunnel-agent": { @@ -1102,7 +1986,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.2" } }, "tweetnacl": { @@ -1124,7 +2008,7 @@ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "2.1.18" } }, "unpipe": { @@ -1162,9 +2046,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "extsprintf": "1.3.0" } }, "wrappy": { From 9d28343093c4b8872565663429848db13e61149d Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Mon, 25 Jun 2018 10:05:05 -0400 Subject: [PATCH 03/32] refers to graph.js for constants --- lib/sbol.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/lib/sbol.js b/lib/sbol.js index 5b0e790..af264b1 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -1,5 +1,6 @@ if (typeof window === 'undefined') { SBOLDocument = require('sboljs'); + graph = require('./graph'); } let sequenceConstraintCount = 1; @@ -28,16 +29,11 @@ const SEQUENCE_CONSTRAINT_URIS = { 'OPPOSITEORIENTATION': 'http://sbols.org/v2#oppositeOrientationAs', 'DIFFERENT': 'http://sbols.org/v2#differentFrom' }; -const STATE_GRAPH_TYPES = { - 'ROOT': 'root', - 'EPSILON': 'epsilon', - 'ATOM': 'atom' -}; function getRootId(stateGraph){ for (let id in stateGraph) { - if (stateGraph[id].type === STATE_GRAPH_TYPES.ROOT){ + if (stateGraph[id].type === graph.ROOT){ return id; } } @@ -124,10 +120,10 @@ function getIdList(id, stateGraph, objectIdList, parentId){ atomEdges.forEach(function(atomEdgeId){ //if an edge has an edge back to its parent, skip if (atomEdgeId !== parentId) { - if (stateGraph[atomEdgeId].type === STATE_GRAPH_TYPES.EPSILON) { + if (stateGraph[atomEdgeId].type === graph.EPSILON) { getIdList(atomEdgeId, stateGraph, objectIdList, id); } - if (stateGraph[atomEdgeId].type === STATE_GRAPH_TYPES.ATOM) { + if (stateGraph[atomEdgeId].type === graph.ATOM) { objectIdList.push(atomEdgeId); } } @@ -159,7 +155,7 @@ function addSequenceConstraints(id, stateGraph, templateComponentDefinition, doc function generateTemplateComponentDefinition(stateGraph, doc) { const templateComponentDefinition = makeComponentDefinition(TEMPLATE, doc); Object.keys(stateGraph).forEach(function(key) { - if (stateGraph[key].type === STATE_GRAPH_TYPES.ATOM){ + if (stateGraph[key].type === graph.ATOM){ let type = stateGraph[key].text; let text = stateGraph[key].text; @@ -187,7 +183,7 @@ function generateTemplateComponentDefinition(stateGraph, doc) { let edges = stateGraph[key].edges; // if there is only one edge and that edge is an 'o' // and if o's edges contains this edge, it is 'zeroOrMore' - if ( edges.length === 1 && stateGraph[edges[0]].type === STATE_GRAPH_TYPES.EPSILON && stateGraph[edges[0]].edges.includes(key)){ + if ( edges.length === 1 && stateGraph[edges[0]].type === graph.EPSILON && stateGraph[edges[0]].edges.includes(key)){ atomMap[key].operator = 'ZeroOrMore'; }else if (edges.length > 1){ for (let i = 0; i < edges.length; i++) { From 54b332910a28f7eabb7d48090cdea10ef6c5a7e5 Mon Sep 17 00:00:00 2001 From: gxavier38 Date: Thu, 21 Jun 2018 15:38:52 -0400 Subject: [PATCH 04/32] Limit categories to SBOL.js terms. Update UI with new SBOL glyphs --- demos/static/js/client.js | 60 +- demos/static/sbol/CDS.svg | 17 +- demos/static/sbol/RNA_stability_element.svg | 1 - demos/static/sbol/aptamer.svg | 18 + demos/static/sbol/assemblyScar.svg | 16 + demos/static/sbol/bluntRestrictionSite.svg | 17 + ...t_end_restriction_enzyme_cleavage_site.svg | 1 - demos/static/sbol/dnaStabilityElement.svg | 17 + demos/static/sbol/engineeredRegion.svg | 16 + ...user_defined.svg => fivePrimeOverhang.svg} | 35 +- .../sbol/fivePrimeStickyRestrictionSite.svg | 16 + ...y_end_restriction_enzyme_cleavage_site.svg | 1 - demos/static/sbol/halfroundRectangle.svg | 16 + demos/static/sbol/insulator.svg | 18 +- demos/static/sbol/locationDna.svg | 17 + demos/static/sbol/locationProtein.svg | 17 + demos/static/sbol/locationRna.svg | 18 + demos/static/sbol/noGlyphAssigned.svg | 18 + demos/static/sbol/nonCodingRna.svg | 20 + demos/static/sbol/omittedDetail.svg | 18 + demos/static/sbol/operator.svg | 17 +- demos/static/sbol/originOfReplication.svg | 16 + demos/static/sbol/originOfTransfer.svg | 30 + demos/static/sbol/origin_of_replication.svg | 1 - demos/static/sbol/polyA.svg | 17 + demos/static/sbol/primerBindingSite.svg | 16 + demos/static/sbol/primer_binding_site.svg | 1 - demos/static/sbol/promoter.svg | 18 +- demos/static/sbol/proteaseSite.svg | 19 + demos/static/sbol/protease_site.svg | 1 - demos/static/sbol/proteinStabilityElement.svg | 18 + .../static/sbol/protein_stability_element.svg | 1 - demos/static/sbol/replacementGlyph.svg | 25 + demos/static/sbol/restrictionSite.svg | 17 + .../sbol/restriction_enzyme_assembly_scar.svg | 1 - ...zyme_five_prime_single_strand_overhang.svg | 1 - .../restriction_enzyme_recognition_site.svg | 1 - ...yme_three_prime_single_strand_overhang.svg | 1 - demos/static/sbol/ribonucleaseSite.svg | 21 + demos/static/sbol/ribonuclease_site.svg | 1 - demos/static/sbol/ribosomeBindingSite.svg | 16 + demos/static/sbol/ribosome_entry_site.svg | 1 - demos/static/sbol/ribozyme.svg | 19 +- demos/static/sbol/rnaStabilityElement.svg | 18 + demos/static/sbol/signature.svg | 20 +- .../static/sbol/specificRecombinationSite.svg | 18 + demos/static/sbol/terminator.svg | 18 +- demos/static/sbol/threePrimeOverhang.svg | 17 + .../threePrimeStickyEndRestrictionSite.svg | 16 + ...y_end_restriction_enzyme_cleavage_site.svg | 1 - demos/static/testinput.txt | 2 +- lib/constellation.js | 20 +- lib/designEnumeration.js | 4 + package-lock.json | 554 +++++++++--------- test/constellationTests.js | 75 ++- test/enumerationTests.js | 46 +- 56 files changed, 994 insertions(+), 431 deletions(-) delete mode 100644 demos/static/sbol/RNA_stability_element.svg create mode 100644 demos/static/sbol/aptamer.svg create mode 100644 demos/static/sbol/assemblyScar.svg create mode 100644 demos/static/sbol/bluntRestrictionSite.svg delete mode 100644 demos/static/sbol/blunt_end_restriction_enzyme_cleavage_site.svg create mode 100644 demos/static/sbol/dnaStabilityElement.svg create mode 100644 demos/static/sbol/engineeredRegion.svg rename demos/static/sbol/{user_defined.svg => fivePrimeOverhang.svg} (86%) create mode 100644 demos/static/sbol/fivePrimeStickyRestrictionSite.svg delete mode 100644 demos/static/sbol/five_prime_sticky_end_restriction_enzyme_cleavage_site.svg create mode 100644 demos/static/sbol/halfroundRectangle.svg create mode 100644 demos/static/sbol/locationDna.svg create mode 100644 demos/static/sbol/locationProtein.svg create mode 100644 demos/static/sbol/locationRna.svg create mode 100644 demos/static/sbol/noGlyphAssigned.svg create mode 100644 demos/static/sbol/nonCodingRna.svg create mode 100644 demos/static/sbol/omittedDetail.svg create mode 100644 demos/static/sbol/originOfReplication.svg create mode 100644 demos/static/sbol/originOfTransfer.svg delete mode 100644 demos/static/sbol/origin_of_replication.svg create mode 100644 demos/static/sbol/polyA.svg create mode 100644 demos/static/sbol/primerBindingSite.svg delete mode 100644 demos/static/sbol/primer_binding_site.svg create mode 100644 demos/static/sbol/proteaseSite.svg delete mode 100644 demos/static/sbol/protease_site.svg create mode 100644 demos/static/sbol/proteinStabilityElement.svg delete mode 100644 demos/static/sbol/protein_stability_element.svg create mode 100644 demos/static/sbol/replacementGlyph.svg create mode 100644 demos/static/sbol/restrictionSite.svg delete mode 100644 demos/static/sbol/restriction_enzyme_assembly_scar.svg delete mode 100644 demos/static/sbol/restriction_enzyme_five_prime_single_strand_overhang.svg delete mode 100644 demos/static/sbol/restriction_enzyme_recognition_site.svg delete mode 100644 demos/static/sbol/restriction_enzyme_three_prime_single_strand_overhang.svg create mode 100644 demos/static/sbol/ribonucleaseSite.svg delete mode 100644 demos/static/sbol/ribonuclease_site.svg create mode 100644 demos/static/sbol/ribosomeBindingSite.svg delete mode 100644 demos/static/sbol/ribosome_entry_site.svg create mode 100644 demos/static/sbol/rnaStabilityElement.svg create mode 100644 demos/static/sbol/specificRecombinationSite.svg create mode 100644 demos/static/sbol/threePrimeOverhang.svg create mode 100644 demos/static/sbol/threePrimeStickyEndRestrictionSite.svg delete mode 100644 demos/static/sbol/three_prime_sticky_end_restriction_enzyme_cleavage_site.svg diff --git a/demos/static/js/client.js b/demos/static/js/client.js index 9c5d606..2f3a4fe 100644 --- a/demos/static/js/client.js +++ b/demos/static/js/client.js @@ -182,30 +182,44 @@ function drawNodes(nodes) { .append('svg:image') .attr('xlink:href', function(d) { switch (d.text) { - case 'promoter': - case 'terminator': + case 'aptamer': + case 'assemblyScar': + case 'bluntRestrictionSite': case 'CDS': - case 'restriction_enzyme_assembly_scar': - case 'restriction_enzyme_recognition_site': - case 'protein_stability_element': - case 'blunt_end_restriction_enzyme_cleavage_site': - case 'ribonuclease_site': - case 'restriction_enzyme_five_prime_single_strand_overhang': - case 'ribosome_entry_site': - case 'five_prime_sticky_end_restriction_enzyme_cleavage_site': - case 'RNA_stability_element': - case 'ribozyme': + case 'dnaStabilityElement': + case 'engineeredRegion': + case 'fivePrimeOverhang': + case 'fivePrimeStickyRestrictionSite': + case 'halfroundRectangle': case 'insulator': - case 'signature': + case 'locationDna': + case 'locationProtein': + case 'locationRna': + case 'noGlyphAssigned': + case 'nonCodingRna': + case 'omittedDetail': case 'operator': - case 'origin_of_replication': - case 'restriction_enzyme_three_prime_single_strand_overhang': - case 'primer_binding_site': - case 'three_prime_sticky_end_restriction_enzyme_cleavage_site': - case 'protease_site': + case 'originOfReplication': + case 'originOfTransfer': + case 'polyA': + case 'primerBindingSite': + case 'promoter': + case 'proteaseSite': + case 'proteinStabilityElement': + case 'replacementGlyph': + case 'restrictionSite': + case 'ribonucleaseSite': + case 'ribosomeBindingSite': + case 'ribozyme': + case 'rnaStabilityElement': + case 'signature': + case 'specificRecombinationSite': + case 'terminator': + case 'threePrimeOverhang': + case 'threePrimeStickyEndRestrictionSite': return './sbol/' + d.text + '.svg'; default: - return './sbol/' + 'user_defined.svg'; + return './sbol/' + 'engineeredRegion.svg'; } }) .attr('width', IMAGESIZE); @@ -392,14 +406,8 @@ $(document).ready(function() { alert(data); return; } - displayDiagram(data.stateGraph); - // Undefined design - if (String(data.designs).includes('is not defined')) { - displayDesigns(editors, data.designs); - } else { - displayDesigns(editors, JSON.stringify(data.designs, null, "\t")); - } + displayDesigns(editors, JSON.stringify(data.designs, null, "\t")); }) }); }); diff --git a/demos/static/sbol/CDS.svg b/demos/static/sbol/CDS.svg index 8317bd5..306e154 100644 --- a/demos/static/sbol/CDS.svg +++ b/demos/static/sbol/CDS.svg @@ -1 +1,16 @@ - \ No newline at end of file + + + + + + + + diff --git a/demos/static/sbol/RNA_stability_element.svg b/demos/static/sbol/RNA_stability_element.svg deleted file mode 100644 index c7626db..0000000 --- a/demos/static/sbol/RNA_stability_element.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/demos/static/sbol/aptamer.svg b/demos/static/sbol/aptamer.svg new file mode 100644 index 0000000..972d32a --- /dev/null +++ b/demos/static/sbol/aptamer.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/demos/static/sbol/assemblyScar.svg b/demos/static/sbol/assemblyScar.svg new file mode 100644 index 0000000..dc487eb --- /dev/null +++ b/demos/static/sbol/assemblyScar.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/demos/static/sbol/bluntRestrictionSite.svg b/demos/static/sbol/bluntRestrictionSite.svg new file mode 100644 index 0000000..f9c7ad1 --- /dev/null +++ b/demos/static/sbol/bluntRestrictionSite.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/demos/static/sbol/blunt_end_restriction_enzyme_cleavage_site.svg b/demos/static/sbol/blunt_end_restriction_enzyme_cleavage_site.svg deleted file mode 100644 index 8e75d75..0000000 --- a/demos/static/sbol/blunt_end_restriction_enzyme_cleavage_site.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/demos/static/sbol/dnaStabilityElement.svg b/demos/static/sbol/dnaStabilityElement.svg new file mode 100644 index 0000000..0934c78 --- /dev/null +++ b/demos/static/sbol/dnaStabilityElement.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/demos/static/sbol/engineeredRegion.svg b/demos/static/sbol/engineeredRegion.svg new file mode 100644 index 0000000..a6a61bf --- /dev/null +++ b/demos/static/sbol/engineeredRegion.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/demos/static/sbol/user_defined.svg b/demos/static/sbol/fivePrimeOverhang.svg similarity index 86% rename from demos/static/sbol/user_defined.svg rename to demos/static/sbol/fivePrimeOverhang.svg index cdf0278..547809b 100644 --- a/demos/static/sbol/user_defined.svg +++ b/demos/static/sbol/fivePrimeOverhang.svg @@ -1,17 +1,18 @@ - - - - - - - - + + + + + + + + + diff --git a/demos/static/sbol/fivePrimeStickyRestrictionSite.svg b/demos/static/sbol/fivePrimeStickyRestrictionSite.svg new file mode 100644 index 0000000..0e593ae --- /dev/null +++ b/demos/static/sbol/fivePrimeStickyRestrictionSite.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/demos/static/sbol/five_prime_sticky_end_restriction_enzyme_cleavage_site.svg b/demos/static/sbol/five_prime_sticky_end_restriction_enzyme_cleavage_site.svg deleted file mode 100644 index 1de313e..0000000 --- a/demos/static/sbol/five_prime_sticky_end_restriction_enzyme_cleavage_site.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/demos/static/sbol/halfroundRectangle.svg b/demos/static/sbol/halfroundRectangle.svg new file mode 100644 index 0000000..3a3fef7 --- /dev/null +++ b/demos/static/sbol/halfroundRectangle.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/demos/static/sbol/insulator.svg b/demos/static/sbol/insulator.svg index f3d4669..22e940f 100644 --- a/demos/static/sbol/insulator.svg +++ b/demos/static/sbol/insulator.svg @@ -1 +1,17 @@ - \ No newline at end of file + + + + + + + + + diff --git a/demos/static/sbol/locationDna.svg b/demos/static/sbol/locationDna.svg new file mode 100644 index 0000000..951f7a0 --- /dev/null +++ b/demos/static/sbol/locationDna.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/demos/static/sbol/locationProtein.svg b/demos/static/sbol/locationProtein.svg new file mode 100644 index 0000000..30744d0 --- /dev/null +++ b/demos/static/sbol/locationProtein.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/demos/static/sbol/locationRna.svg b/demos/static/sbol/locationRna.svg new file mode 100644 index 0000000..69c4166 --- /dev/null +++ b/demos/static/sbol/locationRna.svg @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/demos/static/sbol/noGlyphAssigned.svg b/demos/static/sbol/noGlyphAssigned.svg new file mode 100644 index 0000000..dcff572 --- /dev/null +++ b/demos/static/sbol/noGlyphAssigned.svg @@ -0,0 +1,18 @@ + + + + + + + + [ ] + + diff --git a/demos/static/sbol/nonCodingRna.svg b/demos/static/sbol/nonCodingRna.svg new file mode 100644 index 0000000..e572b6a --- /dev/null +++ b/demos/static/sbol/nonCodingRna.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/demos/static/sbol/omittedDetail.svg b/demos/static/sbol/omittedDetail.svg new file mode 100644 index 0000000..af3b80c --- /dev/null +++ b/demos/static/sbol/omittedDetail.svg @@ -0,0 +1,18 @@ + + + + + + + + ... + + diff --git a/demos/static/sbol/operator.svg b/demos/static/sbol/operator.svg index c1de322..058715d 100644 --- a/demos/static/sbol/operator.svg +++ b/demos/static/sbol/operator.svg @@ -1 +1,16 @@ - \ No newline at end of file + + + + + + + + diff --git a/demos/static/sbol/originOfReplication.svg b/demos/static/sbol/originOfReplication.svg new file mode 100644 index 0000000..d494341 --- /dev/null +++ b/demos/static/sbol/originOfReplication.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/demos/static/sbol/originOfTransfer.svg b/demos/static/sbol/originOfTransfer.svg new file mode 100644 index 0000000..b25a06d --- /dev/null +++ b/demos/static/sbol/originOfTransfer.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + diff --git a/demos/static/sbol/origin_of_replication.svg b/demos/static/sbol/origin_of_replication.svg deleted file mode 100644 index cfa420f..0000000 --- a/demos/static/sbol/origin_of_replication.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/demos/static/sbol/polyA.svg b/demos/static/sbol/polyA.svg new file mode 100644 index 0000000..da0a72e --- /dev/null +++ b/demos/static/sbol/polyA.svg @@ -0,0 +1,17 @@ + + + + + + + AAA + + diff --git a/demos/static/sbol/primerBindingSite.svg b/demos/static/sbol/primerBindingSite.svg new file mode 100644 index 0000000..1d73919 --- /dev/null +++ b/demos/static/sbol/primerBindingSite.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/demos/static/sbol/primer_binding_site.svg b/demos/static/sbol/primer_binding_site.svg deleted file mode 100644 index 84f514a..0000000 --- a/demos/static/sbol/primer_binding_site.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/demos/static/sbol/promoter.svg b/demos/static/sbol/promoter.svg index f452ef5..ab70826 100644 --- a/demos/static/sbol/promoter.svg +++ b/demos/static/sbol/promoter.svg @@ -1 +1,17 @@ - \ No newline at end of file + + + + + + + + + diff --git a/demos/static/sbol/proteaseSite.svg b/demos/static/sbol/proteaseSite.svg new file mode 100644 index 0000000..cd847f8 --- /dev/null +++ b/demos/static/sbol/proteaseSite.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/demos/static/sbol/protease_site.svg b/demos/static/sbol/protease_site.svg deleted file mode 100644 index 0c1d8f2..0000000 --- a/demos/static/sbol/protease_site.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/demos/static/sbol/proteinStabilityElement.svg b/demos/static/sbol/proteinStabilityElement.svg new file mode 100644 index 0000000..4218b26 --- /dev/null +++ b/demos/static/sbol/proteinStabilityElement.svg @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/demos/static/sbol/protein_stability_element.svg b/demos/static/sbol/protein_stability_element.svg deleted file mode 100644 index a4d383a..0000000 --- a/demos/static/sbol/protein_stability_element.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/demos/static/sbol/replacementGlyph.svg b/demos/static/sbol/replacementGlyph.svg new file mode 100644 index 0000000..3b43bd7 --- /dev/null +++ b/demos/static/sbol/replacementGlyph.svg @@ -0,0 +1,25 @@ + + + + + + + ? + diff --git a/demos/static/sbol/restrictionSite.svg b/demos/static/sbol/restrictionSite.svg new file mode 100644 index 0000000..14ac422 --- /dev/null +++ b/demos/static/sbol/restrictionSite.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/demos/static/sbol/restriction_enzyme_assembly_scar.svg b/demos/static/sbol/restriction_enzyme_assembly_scar.svg deleted file mode 100644 index acd5d8d..0000000 --- a/demos/static/sbol/restriction_enzyme_assembly_scar.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/demos/static/sbol/restriction_enzyme_five_prime_single_strand_overhang.svg b/demos/static/sbol/restriction_enzyme_five_prime_single_strand_overhang.svg deleted file mode 100644 index 141b795..0000000 --- a/demos/static/sbol/restriction_enzyme_five_prime_single_strand_overhang.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/demos/static/sbol/restriction_enzyme_recognition_site.svg b/demos/static/sbol/restriction_enzyme_recognition_site.svg deleted file mode 100644 index c8b9e85..0000000 --- a/demos/static/sbol/restriction_enzyme_recognition_site.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/demos/static/sbol/restriction_enzyme_three_prime_single_strand_overhang.svg b/demos/static/sbol/restriction_enzyme_three_prime_single_strand_overhang.svg deleted file mode 100644 index 7fb7bc8..0000000 --- a/demos/static/sbol/restriction_enzyme_three_prime_single_strand_overhang.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/demos/static/sbol/ribonucleaseSite.svg b/demos/static/sbol/ribonucleaseSite.svg new file mode 100644 index 0000000..56511ac --- /dev/null +++ b/demos/static/sbol/ribonucleaseSite.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + diff --git a/demos/static/sbol/ribonuclease_site.svg b/demos/static/sbol/ribonuclease_site.svg deleted file mode 100644 index 95eb33e..0000000 --- a/demos/static/sbol/ribonuclease_site.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/demos/static/sbol/ribosomeBindingSite.svg b/demos/static/sbol/ribosomeBindingSite.svg new file mode 100644 index 0000000..c35077e --- /dev/null +++ b/demos/static/sbol/ribosomeBindingSite.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/demos/static/sbol/ribosome_entry_site.svg b/demos/static/sbol/ribosome_entry_site.svg deleted file mode 100644 index 32622c0..0000000 --- a/demos/static/sbol/ribosome_entry_site.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/demos/static/sbol/ribozyme.svg b/demos/static/sbol/ribozyme.svg index c7626db..310f165 100644 --- a/demos/static/sbol/ribozyme.svg +++ b/demos/static/sbol/ribozyme.svg @@ -1 +1,18 @@ - \ No newline at end of file + + + + + + + + + + diff --git a/demos/static/sbol/rnaStabilityElement.svg b/demos/static/sbol/rnaStabilityElement.svg new file mode 100644 index 0000000..c632b2a --- /dev/null +++ b/demos/static/sbol/rnaStabilityElement.svg @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/demos/static/sbol/signature.svg b/demos/static/sbol/signature.svg index 34727fe..c8ea30c 100644 --- a/demos/static/sbol/signature.svg +++ b/demos/static/sbol/signature.svg @@ -1 +1,19 @@ - \ No newline at end of file + + + + + + + + + + + diff --git a/demos/static/sbol/specificRecombinationSite.svg b/demos/static/sbol/specificRecombinationSite.svg new file mode 100644 index 0000000..c7f8690 --- /dev/null +++ b/demos/static/sbol/specificRecombinationSite.svg @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/demos/static/sbol/terminator.svg b/demos/static/sbol/terminator.svg index 43068cc..8f249e1 100644 --- a/demos/static/sbol/terminator.svg +++ b/demos/static/sbol/terminator.svg @@ -1 +1,17 @@ - \ No newline at end of file + + + + + + + + + diff --git a/demos/static/sbol/threePrimeOverhang.svg b/demos/static/sbol/threePrimeOverhang.svg new file mode 100644 index 0000000..e859df9 --- /dev/null +++ b/demos/static/sbol/threePrimeOverhang.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/demos/static/sbol/threePrimeStickyEndRestrictionSite.svg b/demos/static/sbol/threePrimeStickyEndRestrictionSite.svg new file mode 100644 index 0000000..c2620e5 --- /dev/null +++ b/demos/static/sbol/threePrimeStickyEndRestrictionSite.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/demos/static/sbol/three_prime_sticky_end_restriction_enzyme_cleavage_site.svg b/demos/static/sbol/three_prime_sticky_end_restriction_enzyme_cleavage_site.svg deleted file mode 100644 index 848f2da..0000000 --- a/demos/static/sbol/three_prime_sticky_end_restriction_enzyme_cleavage_site.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/demos/static/testinput.txt b/demos/static/testinput.txt index bc60cdd..bc0a52e 100644 --- a/demos/static/testinput.txt +++ b/demos/static/testinput.txt @@ -1 +1 @@ -(blunt_end_restriction_enzyme_cleavage_site then CDS then five_prime_sticky_end_restriction_enzyme_cleavage_site then insulator then operator then origin_of_replication then primer_binding_site then promoter then protease_site then protein_stability_element then restriction_enzyme_assembly_scar then restriction_enzyme_five_prime_single_strand_overhang) or (restriction_enzyme_recognition_site then restriction_enzyme_three_prime_single_strand_overhang then ribonuclease_site then ribosome_entry_site then ribozyme then zero-or-more (RNA_stability_element) then signature then terminator then three_prime_sticky_end_restriction_enzyme_cleavage_site then example) \ No newline at end of file +aptamer then assemblyScar then bluntRestrictionSite then CDS then dnaStabilityElement then engineeredRegion then fivePrimeOverhang then fivePrimeStickyRestrictionSite then halfroundRectangle then insulator then locationDna then locationProtein then locationRna then noGlyphAssigned then nonCodingRna then omittedDetail then operator then originOfReplication then originOfTransfer then polyA then primerBindingSite then promoter then proteaseSite then proteinStabilityElement then replacementGlyph then restrictionSite then ribonucleaseSite then ribosomeBindingSite then ribozyme then rnaStabilityElement then signature then specificRecombinationSite then terminator then threePrimeOverhang then threePrimeStickyEndRestrictionSite diff --git a/lib/constellation.js b/lib/constellation.js index df9e88c..a06e040 100644 --- a/lib/constellation.js +++ b/lib/constellation.js @@ -36,24 +36,12 @@ const constellation = function (langText, categories, numDesigns, maxCycles) { throw new Error('Parsing error!') } - try { - gra = graph(parsed, maxCycles); - designs = designEnumeration(gra.paths, categories, numDesigns); - } catch (error) { - designs = String(error); - } - - console.log(gra.stateGraph); - - try { - sbolDoc = sbol(gra.stateGraph, categories); - } catch (error) { - sbolDoc = String(error); - } + gra = graph(parsed, maxCycles); + designs = designEnumeration(gra.paths, categories, numDesigns); - console.log(sbolDoc); + sbolDoc = sbol(gra.stateGraph, categories); - return {stateGraph: gra.stateGraph, designs: designs, paths: gra.paths}; + return {stateGraph: gra.stateGraph, designs: designs, paths: gra.paths, sbolDoc}; }; /** diff --git a/lib/designEnumeration.js b/lib/designEnumeration.js index 67de015..574aa04 100644 --- a/lib/designEnumeration.js +++ b/lib/designEnumeration.js @@ -2,6 +2,7 @@ if (typeof window === 'undefined') { Reservoir = require('reservoir'); + SBOLDocument = require('sboljs'); } @@ -51,6 +52,9 @@ function generateDesigns(paths, categories) { for (let j = 0; j < path.length; j++) { const tempNode = path[j].text; + if (!(tempNode in SBOLDocument.terms)) { + throw new Error(`${tempNode} is not a valid SBOL part`); + } if (!(tempNode in categories)) { throw new Error(`${tempNode} is not defined in categories`); } diff --git a/package-lock.json b/package-lock.json index a4f8a05..965949a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "2.1.18", + "mime-types": "~2.1.18", "negotiator": "0.6.1" } }, @@ -19,10 +19,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "argparse": { @@ -31,7 +31,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "array-flatten": { @@ -87,7 +87,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "body-parser": { @@ -97,15 +97,15 @@ "dev": true, "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", + "depd": "~1.1.2", + "http-errors": "~1.6.3", "iconv-lite": "0.4.23", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.5.2", "raw-body": "2.3.3", - "type-is": "1.6.16" + "type-is": "~1.6.16" }, "dependencies": { "depd": { @@ -120,10 +120,10 @@ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.5.0" + "statuses": ">= 1.4.0 < 2" } }, "mime-db": { @@ -138,7 +138,7 @@ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.0" } }, "qs": { @@ -160,7 +160,7 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.18" + "mime-types": "~2.1.18" } } } @@ -170,7 +170,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -196,12 +196,12 @@ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "assertion-error": "1.1.0", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.8" + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" } }, "check-error": { @@ -222,7 +222,7 @@ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -267,11 +267,11 @@ "integrity": "sha512-FAzXwiDOYLGDWH+zgoIA+8GbWv50hlx+kpEJyvzLKOdnIBv9uWoVl4DhqGgyUHpiRjAlF8KYZSipWXYtllWH6Q==", "dev": true, "requires": { - "js-yaml": "3.12.0", - "lcov-parse": "0.0.10", - "log-driver": "1.2.7", - "minimist": "1.2.0", - "request": "2.87.0" + "js-yaml": "^3.6.1", + "lcov-parse": "^0.0.10", + "log-driver": "^1.2.5", + "minimist": "^1.2.0", + "request": "^2.79.0" } }, "d3-collection": { @@ -289,10 +289,10 @@ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz", "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==", "requires": { - "d3-collection": "1.0.4", - "d3-dispatch": "1.0.3", - "d3-quadtree": "1.0.3", - "d3-timer": "1.0.7" + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" } }, "d3-quadtree": { @@ -311,7 +311,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "debug": { @@ -328,7 +328,7 @@ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "4.0.8" + "type-detect": "^4.0.0" } }, "delayed-stream": { @@ -359,7 +359,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "ee-first": { @@ -398,36 +398,36 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.5", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "1.0.4", + "content-type": "~1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.3", + "proxy-addr": "~2.0.3", "qs": "6.5.1", - "range-parser": "1.2.0", + "range-parser": "~1.2.0", "safe-buffer": "5.1.1", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", + "statuses": "~1.4.0", + "type-is": "~1.6.16", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { "body-parser": { @@ -528,12 +528,12 @@ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.0" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" } }, "forever-agent": { @@ -548,9 +548,9 @@ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "mime-types": "^2.1.12" } }, "forwarded": { @@ -580,7 +580,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -588,12 +588,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "growl": { @@ -613,8 +613,8 @@ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "has-flag": { @@ -632,10 +632,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.4.0" + "statuses": ">= 1.4.0 < 2" } }, "http-signature": { @@ -644,9 +644,9 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "iconv-lite": { @@ -655,7 +655,7 @@ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "dev": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "imparse": { @@ -668,8 +668,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -700,8 +700,8 @@ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsbn": { @@ -783,7 +783,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.0" } }, "minimatch": { @@ -791,7 +791,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -871,7 +871,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "parseurl": { @@ -906,7 +906,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "requires": { - "forwarded": "0.1.2", + "forwarded": "~0.1.2", "ipaddr.js": "1.6.0" } }, @@ -951,10 +951,10 @@ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.5.0" + "statuses": ">= 1.4.0 < 2" } }, "statuses": { @@ -971,26 +971,26 @@ "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "dev": true, "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" } }, "reservoir": { @@ -1015,15 +1015,15 @@ "resolved": "https://registry.npmjs.org/sboljs/-/sboljs-2.1.3.tgz", "integrity": "sha1-OxwXkjcDxy3cgj4yeodZqR9bdlw=", "requires": { - "extend": "3.0.0", + "extend": "^3.0.0", "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "rdf-ext": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", "rdf-graph-array": "git+https://github.com/udp/rdf-graph-array.git#98b1a0c674ed2b07993d54ab7d2a3b84e661bc3e", - "rdf-parser-rdfxml": "0.3.1", - "request": "2.83.0", + "rdf-parser-rdfxml": "^0.3.0-rc1", + "request": "^2.83.0", "urijs": "https://registry.npmjs.org/urijs/-/urijs-1.18.7.tgz", "xml": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "xmlhttprequest": "1.8.0" + "xmlhttprequest": "^1.8.0" }, "dependencies": { "ajv": { @@ -1031,10 +1031,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "asn1": { @@ -1065,8 +1065,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "bcrypt-pbkdf": { "version": "1.0.1", @@ -1074,30 +1073,28 @@ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "boom": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1115,13 +1112,12 @@ "version": "0.19.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", "integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=", - "dev": true, "requires": { - "css-select": "1.0.0", - "dom-serializer": "0.1.0", - "entities": "1.1.1", - "htmlparser2": "3.8.3", - "lodash": "3.10.1" + "css-select": "~1.0.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "~3.8.1", + "lodash": "^3.2.0" } }, "co": { @@ -1134,7 +1130,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -1145,17 +1141,16 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "requires": { - "inherits": "2.0.3", - "readable-stream": "2.2.3", - "typedarray": "0.0.6" + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "core-util-is": { @@ -1168,7 +1163,7 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "requires": { - "boom": "5.2.0" + "boom": "5.x.x" }, "dependencies": { "boom": { @@ -1176,7 +1171,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } } } @@ -1185,26 +1180,24 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", "integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=", - "dev": true, "requires": { - "boolbase": "1.0.0", - "css-what": "1.0.0", - "domutils": "1.4.3", - "nth-check": "1.0.1" + "boolbase": "~1.0.0", + "css-what": "1.0", + "domutils": "1.4", + "nth-check": "~1.0.0" } }, "css-what": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", - "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=", - "dev": true + "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=" }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "debug": { @@ -1229,42 +1222,37 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" + "domelementtype": "~1.1.1", + "entities": "~1.1.1" }, "dependencies": { "domelementtype": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" } } }, "domelementtype": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" }, "domhandler": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "domutils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", "integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=", - "dev": true, "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "ecc-jsbn": { @@ -1273,14 +1261,13 @@ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" }, "es6-promise": { "version": "3.3.1", @@ -1322,9 +1309,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "getpass": { @@ -1332,29 +1319,27 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "dependencies": { "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } } } @@ -1374,8 +1359,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "hawk": { @@ -1383,10 +1368,10 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.1.0" + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" } }, "hoek": { @@ -1398,30 +1383,27 @@ "version": "3.8.3", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.3.0", - "domutils": "1.5.1", - "entities": "1.0.0", - "readable-stream": "2.2.3" + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" }, "dependencies": { "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "dom-serializer": "0", + "domelementtype": "1" } }, "entities": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" } } }, @@ -1430,19 +1412,18 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -1520,8 +1501,7 @@ "lodash": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" }, "lru-cache": { "version": "2.7.3", @@ -1538,7 +1518,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", "requires": { - "mime-db": "1.30.0" + "mime-db": "~1.30.0" } }, "minimatch": { @@ -1546,8 +1526,8 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" + "lru-cache": "2", + "sigmund": "~1.0.0" } }, "minimist": { @@ -1585,8 +1565,8 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", "requires": { - "inherits": "2.0.3", - "minimatch": "0.3.0" + "inherits": "2", + "minimatch": "0.3" } } } @@ -1600,9 +1580,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, "requires": { - "boolbase": "1.0.0" + "boolbase": "~1.0.0" } }, "oauth-sign": { @@ -1614,16 +1593,14 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "performance-now": { "version": "2.1.0", @@ -1647,10 +1624,11 @@ }, "rdf-ext": { "version": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", + "from": "rdf-ext@git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", "requires": { - "es6-promise": "3.3.1", - "rdf-graph-array": "git+https://github.com/udp/rdf-graph-array.git#98b1a0c674ed2b07993d54ab7d2a3b84e661bc3e", - "rdf-store-inmemory": "0.3.0" + "es6-promise": "^3.0.2", + "rdf-graph-array": "^0.3.0", + "rdf-store-inmemory": "^0.3.0" } }, "rdf-graph-abstract": { @@ -1658,14 +1636,15 @@ "resolved": "https://registry.npmjs.org/rdf-graph-abstract/-/rdf-graph-abstract-0.3.0.tgz", "integrity": "sha1-gAZBZNzWCQflO++XLIv/DmGsFDM=", "requires": { - "rdf-normalize": "0.3.0" + "rdf-normalize": "^0.3.0" } }, "rdf-graph-array": { "version": "git+https://github.com/udp/rdf-graph-array.git#98b1a0c674ed2b07993d54ab7d2a3b84e661bc3e", + "from": "rdf-graph-array@git+https://github.com/udp/rdf-graph-array.git#98b1a0c674ed2b07993d54ab7d2a3b84e661bc3e", "requires": { - "inherits": "2.0.3", - "rdf-graph-abstract": "0.3.0" + "inherits": "^2.0.1", + "rdf-graph-abstract": "^0.3.0" } }, "rdf-normalize": { @@ -1678,8 +1657,8 @@ "resolved": "https://registry.npmjs.org/rdf-parser-rdfxml/-/rdf-parser-rdfxml-0.3.1.tgz", "integrity": "sha1-0ZPs/BqE7a93SIQPJGb7QxQ8h4o=", "requires": { - "rdf-ext": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", - "rdf-parser-dom": "0.3.0" + "rdf-ext": "^0.3.0", + "rdf-parser-dom": "^0.3.0" }, "dependencies": { "rdf-parser-dom": { @@ -1687,8 +1666,8 @@ "resolved": "https://registry.npmjs.org/rdf-parser-dom/-/rdf-parser-dom-0.3.0.tgz", "integrity": "sha1-RkNb7/vGf6Nat2x23tdfumsEly4=", "requires": { - "rdf-parser-abstract": "0.3.0", - "xmldom": "0.1.27" + "rdf-parser-abstract": "^0.3.0", + "xmldom": "^0.1.19" }, "dependencies": { "rdf-parser-abstract": { @@ -1696,8 +1675,8 @@ "resolved": "https://registry.npmjs.org/rdf-parser-abstract/-/rdf-parser-abstract-0.3.0.tgz", "integrity": "sha1-6gH2zFrmhZMyXUSvwLVINTMCPi4=", "requires": { - "concat-stream": "1.6.0", - "mocha": "2.5.3" + "concat-stream": "^1.5.0", + "mocha": "^2.3.3" } } } @@ -1714,8 +1693,8 @@ "resolved": "https://registry.npmjs.org/rdf-store-inmemory/-/rdf-store-inmemory-0.3.0.tgz", "integrity": "sha1-051xLtt7Rk4qcMwBm6O+6nFiO3A=", "requires": { - "rdf-ext": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", - "rdf-store-abstract": "0.3.0" + "rdf-ext": "^0.3.0", + "rdf-store-abstract": "^0.3.0" } }, "readable-stream": { @@ -1723,13 +1702,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.3.tgz", "integrity": "sha1-nPSUY5hd8BbIrogTCXqSk6mzNyk=", "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" } }, "request": { @@ -1737,28 +1716,28 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "stringstream": "~0.0.5", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" }, "dependencies": { "extend": { @@ -1783,7 +1762,7 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } }, "sshpk": { @@ -1791,14 +1770,14 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" } }, "string_decoder": { @@ -1826,7 +1805,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tunnel-agent": { @@ -1834,7 +1813,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -1867,16 +1846,15 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "xml": { "version": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", @@ -1900,18 +1878,18 @@ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "requires": { "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.3", + "http-errors": "~1.6.2", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" } }, "serve-static": { @@ -1919,9 +1897,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", "send": "0.16.2" } }, @@ -1947,15 +1925,15 @@ "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "dev": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" } }, "statuses": { @@ -1968,7 +1946,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } }, "tough-cookie": { @@ -1977,7 +1955,7 @@ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tunnel-agent": { @@ -1986,7 +1964,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -2008,7 +1986,7 @@ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.18" + "mime-types": "~2.1.18" } }, "unpipe": { @@ -2046,9 +2024,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "wrappy": { diff --git a/test/constellationTests.js b/test/constellationTests.js index 7c7a631..2cec4c3 100644 --- a/test/constellationTests.js +++ b/test/constellationTests.js @@ -2,7 +2,7 @@ const expect = require('chai').expect; const constellation = require('../lib/constellation'); const ATOM = 'atom'; -const CATEGORIES = '{"a":["a1","a2"],"b":["b1","b2","b3"],"c":["c1"]}'; +const CATEGORIES = '{"promoter":["a1","a2"],"cds":["b1","b2","b3"],"assemblyScar":["c1"]}'; const ACATS = 2; const BCATS = 3; const CCATS = 1; @@ -11,13 +11,13 @@ module.exports = function() { describe('Basic operators', function() { it('atom', function() { - let result = constellation('c', CATEGORIES, 10, 0); + let result = constellation('assemblyScar', CATEGORIES, 10, 0); expect(result.designs.length).to.equal(CCATS); expect(result.designs).to.contain('c1'); }); it('or', function() { - const result = constellation('a or b', CATEGORIES, 10, 0); + const result = constellation('promoter or cds', CATEGORIES, 10, 0); expect(result.designs.length).to.equal(ACATS + BCATS); expect(result.designs).to.contain('a1'); expect(result.designs).to.contain('a2'); @@ -27,28 +27,28 @@ module.exports = function() { }); it('then', function() { - const result = constellation('a then c', CATEGORIES, 10); + const result = constellation('promoter then assemblyScar', CATEGORIES, 10); expect(result.designs.length).to.equal(ACATS * CCATS); expect(result.designs).to.contain('a1,c1'); expect(result.designs).to.contain('a2,c1'); }); it('then as dot', function() { - const result = constellation('a . c', CATEGORIES, 10); + const result = constellation('promoter . assemblyScar', CATEGORIES, 10); expect(result.designs.length).to.equal(ACATS * CCATS); expect(result.designs).to.contain('a1,c1'); expect(result.designs).to.contain('a2,c1'); }); // it('and', function() { - // const result = constellation('(a or c) and a', categories, 10); + // const result = constellation('(promoter or assemblyScar) and promoter', categories, 10); // expect(result.designs.length).to.equal(1); // expect(result.designs).to.contain('a1'); // expect(result.designs).to.contain('a2'); // }); it('one-or-more', function() { - let result = constellation('one-or-more a', CATEGORIES, 10, 0); + let result = constellation('one-or-more promoter', CATEGORIES, 10, 0); expect(result.designs.length).to.equal(ACATS); expect(result.designs).to.contain('a1'); expect(result.designs).to.contain('a2'); @@ -57,7 +57,7 @@ module.exports = function() { }); it('zero-or-more', function() { - const result = constellation('zero-or-more a', CATEGORIES, 10, 0); + const result = constellation('zero-or-more promoter', CATEGORIES, 10, 0); expect(result.designs.length).to.equal(ACATS); expect(result.designs).to.contain('a1'); expect(result.designs).to.contain('a2'); @@ -69,22 +69,22 @@ module.exports = function() { describe ('Chained expressions', function() { it('Multiple then', function() { - const result = constellation('a then b then c', CATEGORIES, 10); + const result = constellation('promoter then cds then assemblyScar', CATEGORIES, 10); expect(result.designs.length).to.equal(ACATS * BCATS * CCATS); }); it('Multiple or', function() { - const result = constellation('a or b or c', CATEGORIES, 10); + const result = constellation('promoter or cds or assemblyScar', CATEGORIES, 10); expect(result.designs.length).to.equal(ACATS + BCATS + CCATS); }); // it('Multiple and', function() { - // const result = constellation('a and b and c', categories, 10); + // const result = constellation('promoter and cds and assemblyScar', categories, 10); // expect(result.designs.length).to.equal(0); // }); it('Multiple one-or-more', function() { - const result = constellation('one-or-more (one-or-more a)', CATEGORIES, 10, 0); + const result = constellation('one-or-more (one-or-more promoter)', CATEGORIES, 10, 0); expect(result.designs.length).to.equal(ACATS); expect(result.designs).to.contain('a1'); expect(result.designs).to.contain('a2'); @@ -93,19 +93,19 @@ module.exports = function() { }); it('Multiple zero-or-more', function() { - const result = constellation('zero-or-more (zero-or-more a)', CATEGORIES, 10, 0); + const result = constellation('zero-or-more (zero-or-more promoter)', CATEGORIES, 10, 0); expect(result.designs.length).to.equal(ACATS); expect(result.designs).to.contain('a1'); expect(result.designs).to.contain('a2'); }); it('Mixing functions', function() { - const result = constellation('a then (one-or-more b or zero-or-more c)', CATEGORIES, 50, 0); // TODO add and + const result = constellation('promoter then (one-or-more cds or zero-or-more assemblyScar)', CATEGORIES, 50, 0); // TODO add and expect(result.designs.length).to.equal(ACATS * (BCATS + CCATS + 1)); }); it('Then downstream from cycle', function() { - const result = constellation('zero-or-more a then b', CATEGORIES, 50, 0); + const result = constellation('zero-or-more promoter then cds', CATEGORIES, 50, 0); expect(result.designs.length).to.equal((ACATS + 1) * BCATS); }); @@ -113,26 +113,26 @@ module.exports = function() { describe('Cycles', function () { it('Atom', function() { - let result = constellation('c', CATEGORIES, 10, 2); + let result = constellation('assemblyScar', CATEGORIES, 10, 2); expect(result.designs.length).to.equal(CCATS); }); it('Linear operators', function() { - let result = constellation('a or b', CATEGORIES, 10, 2); + let result = constellation('promoter or cds', CATEGORIES, 10, 2); expect(result.designs.length).to.equal(ACATS + BCATS); expect(result.designs).to.contain('a1'); expect(result.designs).to.contain('a2'); expect(result.designs).to.contain('b1'); expect(result.designs).to.contain('b2'); expect(result.designs).to.contain('b3'); - result = constellation('a then c', CATEGORIES, 10, 2); + result = constellation('promoter then assemblyScar', CATEGORIES, 10, 2); expect(result.designs.length).to.equal(ACATS * CCATS); expect(result.designs).to.contain('a1,c1'); expect(result.designs).to.contain('a2,c1'); }); it('one-or-more', function() { - let result = constellation('one-or-more a', CATEGORIES, 10, 1); + let result = constellation('one-or-more promoter', CATEGORIES, 10, 1); expect(result.designs.length).to.equal(ACATS + ACATS * ACATS); expect(result.designs).to.contain('a1'); expect(result.designs).to.contain('a2'); @@ -144,7 +144,7 @@ module.exports = function() { }); it('zero-or-more', function() { - const result = constellation('zero-or-more a', CATEGORIES, 10, 1); + const result = constellation('zero-or-more promoter', CATEGORIES, 10, 1); expect(result.designs.length).to.equal(ACATS + ACATS * ACATS); expect(result.designs).to.contain('a1'); expect(result.designs).to.contain('a2'); @@ -156,7 +156,7 @@ module.exports = function() { }); it('Multiple one-or-more', function() { - const result = constellation('one-or-more (one-or-more a)', CATEGORIES, 10, 1); + const result = constellation('one-or-more (one-or-more promoter)', CATEGORIES, 10, 1); expect(result.designs.length).to.equal(ACATS + ACATS * ACATS); expect(result.designs).to.contain('a1'); expect(result.designs).to.contain('a2'); @@ -168,7 +168,7 @@ module.exports = function() { }); it('Multiple zero-or-more', function() { - const result = constellation('zero-or-more (zero-or-more a)', CATEGORIES, 10, 1); + const result = constellation('zero-or-more (zero-or-more promoter)', CATEGORIES, 10, 1); expect(result.designs.length).to.equal(ACATS + ACATS * ACATS); expect(result.designs).to.contain('a1'); expect(result.designs).to.contain('a2'); @@ -180,7 +180,7 @@ module.exports = function() { }); it('Then downstream from cycle', function() { - const result = constellation('zero-or-more a then b', CATEGORIES, 50, 1); + const result = constellation('zero-or-more promoter then cds', CATEGORIES, 50, 1); expect(result.designs.length).to.equal(BCATS + ACATS * BCATS + ACATS * ACATS * BCATS); }); @@ -188,12 +188,11 @@ module.exports = function() { describe('Sanitise specification input', function () { it('Atom not in categories', function () { - const result = constellation('d', CATEGORIES, 10, 0); - expect(result.designs).to.contain('d is not defined in categories'); + expect(() => constellation('d', CATEGORIES, 10, 0)).to.throw('d is not a valid SBOL part'); }); it('Mismatched brackets', function () { - expect(() => constellation('(a}', CATEGORIES, 10, 0)).to.throw('Parsing error!'); + expect(() => constellation('(promoter}', CATEGORIES, 10, 0)).to.throw('Parsing error!'); }); @@ -203,19 +202,18 @@ module.exports = function() { describe('Invalid characters', function () { it('Tabs used should not throw errors', function () { - const result = constellation('\ta', CATEGORIES, 10, 0); + const result = constellation('\tpromoter', CATEGORIES, 10, 0); expect(result.designs).to.contain('a1'); expect(result.designs).to.contain('a2'); }); // it('$', function () { - // expect(() => constellation('a then $a', CATEGORIES, 10)).to.throw('Parsing error!'); + // expect(() => constellation('promoter then $a', CATEGORIES, 10)).to.throw('Parsing error!'); // }); // TODO turn back on when imparse starts throwing errors it('_', function () { - const result = constellation('_a', CATEGORIES, 10, 0); - expect(result.designs).to.contain('_a is not defined in categories'); + expect(() => constellation('_d', CATEGORIES, 10, 0)).to.throw('_d is not a valid SBOL part'); }); }); @@ -224,31 +222,30 @@ module.exports = function() { describe('Sanitise category input', function () { it('Empty categories', function () { const categories = '{}'; - const result = constellation('a', categories, 10, 0); - expect(result.designs).to.contain('a is not defined in categories'); + expect(() => constellation('promoter', categories, 10, 0)).to.throw('promoter is not defined in categories'); }); it('Handle defined but empty category', function () { - let categories = '{"a": []}'; - const result = constellation('a', categories, 10, 0); + let categories = '{"promoter": []}'; + const result = constellation('promoter', categories, 10, 0); expect(JSON.stringify(result.designs)).to.equal('[]'); }); it('Mismatched brackets', function () { - expect(() => constellation('(a}', CATEGORIES, 10, 0)).to.throw('Parsing error!'); + expect(() => constellation('(promoter}', CATEGORIES, 10, 0)).to.throw('Parsing error!'); }); describe('Invalid characters', function () { it('Whitespace should not be included in designs', function () { - let categories = '{"a":["\ta1", " a2"]}'; - const result = constellation('a', categories, 10, 0); + let categories = '{"promoter":["\ta1", " a2"]}'; + const result = constellation('promoter', categories, 10, 0); expect(JSON.stringify(result.designs)).to.contain('a1'); expect(JSON.stringify(result.designs)).to.contain('a2'); }); it('Other symbols should be parsed into category', function () { - let categories = '{"a":["$a1", "a2"]}'; - const result = constellation('a', categories, 10, 0); + let categories = '{"promoter":["$a1", "a2"]}'; + const result = constellation('promoter', categories, 10, 0); expect(JSON.stringify(result.designs)).to.contain('a1'); expect(JSON.stringify(result.designs)).to.contain('a2'); }); diff --git a/test/enumerationTests.js b/test/enumerationTests.js index 569950f..4a0eab6 100644 --- a/test/enumerationTests.js +++ b/test/enumerationTests.js @@ -13,42 +13,42 @@ function generateAtom(text) { module.exports = function() { describe('Design enumeration', function() { it('Enumerate designs for one atom', function() { - const categories = {'a': ['a']}; - const paths = [[generateAtom('a')]]; + const categories = {'promoter': ['a1']}; + const paths = [[generateAtom('promoter')]]; const designs = enumeration(paths, categories, 1); - expect(JSON.stringify(designs)).to.contain('a'); + expect(JSON.stringify(designs)).to.contain('a1'); }); it('Handle defined but empty category', function() { - const categories = {'a': []}; - const paths = [[generateAtom('a')]]; + const categories = {'promoter': []}; + const paths = [[generateAtom('promoter')]]; const designs = enumeration(paths, categories, 1); expect(JSON.stringify(designs)).to.equal('[]'); }); it('Handle empty categories', function() { const categories = {}; - const paths = [[generateAtom('a')]]; - expect(() => enumeration(paths, categories, 1)).to.throw('a is not defined in categories'); + const paths = [[generateAtom('promoter')]]; + expect(() => enumeration(paths, categories, 1)).to.throw('promoter is not defined in categories'); }); it('Handle undefined atom', function() { const categories = {'b': ['b']}; - const paths = [[generateAtom('a')]]; - expect(() => enumeration(paths, categories, 1)).to.throw('a is not defined in categories'); + const paths = [[generateAtom('promoter')]]; + expect(() => enumeration(paths, categories, 1)).to.throw('promoter is not defined in categories'); }); it('Enumerate all duplicates in category', function() { - const categories = {'a': ['a1', 'a2']}; - const path = [generateAtom('a')]; + const categories = {'promoter': ['a1', 'a2']}; + const path = [generateAtom('promoter')]; const paths = [path, path]; const designs = enumeration(paths, categories, 4); - expect(JSON.stringify(designs)).to.equal(JSON.stringify(categories['a'])); + expect(JSON.stringify(designs)).to.equal(JSON.stringify(categories['promoter'])); }); // it('Multi-level graphs', function() { - // const collection = {'a': ['a1', 'a2'], 'b': ['b1']}; - // const path = [generateRoot(), generateAtom('a')]; + // const collection = {'promoter': ['a1', 'a2'], 'b': ['b1']}; + // const path = [generateRoot(), generateAtom('promoter')]; // const paths = [path, path]; // const designs = enumeration(paths, collection, 4); // // TODO finish @@ -56,15 +56,15 @@ module.exports = function() { describe ('Number of designs chosen', function() { it('Select 1 of 2 designs', function () { - const categories = {'a': ['a1', 'a2']}; - const paths = [[generateAtom('a')]]; + const categories = {'promoter': ['a1', 'a2']}; + const paths = [[generateAtom('promoter')]]; const designs = enumeration(paths, categories, 1); expect(designs.length).to.equal(1); }); it('Select 0 designs', function () { - const categories = {'a': ['a1', 'a2']}; - const paths = [[generateAtom('a')]]; + const categories = {'promoter': ['a1', 'a2']}; + const paths = [[generateAtom('promoter')]]; const designs = enumeration(paths, categories, 0); expect(designs.length).to.equal(0); }); @@ -74,20 +74,20 @@ module.exports = function() { describe('Cartesian product tests', function() { it('Empty setA', function() { let setA = []; - let setB = ['a', 'b']; + let setB = ['promoter', 'b']; expect(enumeration.getCartesianProduct(setA, setB)).to.equal(setB); }); it('Empty setB', function() { - let setA = ['a', 'b']; + let setA = ['promoter', 'b']; let setB = []; expect(enumeration.getCartesianProduct(setA, setB)).to.equal(setA); }); it('Product test', function() { - let setA = ['a', 'b']; + let setA = ['promoter', 'b']; let setB = ['c', 'd']; let result = enumeration.getCartesianProduct(setA, setB); - expect(result).to.contain('a,c'); - expect(result).to.contain('a,d'); + expect(result).to.contain('promoter,c'); + expect(result).to.contain('promoter,d'); expect(result).to.contain('b,c'); expect(result).to.contain('b,d'); }) From 0d27fce6a2bc6bb76f1bd4533048555d2528124c Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Sun, 26 Aug 2018 14:05:56 -0400 Subject: [PATCH 05/32] fixed missing icons bug, need sboljs to publish latest for demo to run --- demos/static/js/client.js | 7 ++++--- demos/static/sbol/{CDS.svg => cds.svg} | 0 2 files changed, 4 insertions(+), 3 deletions(-) rename demos/static/sbol/{CDS.svg => cds.svg} (100%) diff --git a/demos/static/js/client.js b/demos/static/js/client.js index d42ba10..1b7263d 100644 --- a/demos/static/js/client.js +++ b/demos/static/js/client.js @@ -176,9 +176,10 @@ function drawNodes(nodes) { .append('svg:image') .attr('xlink:href', function(d) { switch (d.text) { + case 'ribosomeBindingSite': case 'promoter': case 'terminator': - case 'CDS': + case 'cds': case 'restriction_enzyme_assembly_scar': case 'restriction_enzyme_recognition_site': case 'protein_stability_element': @@ -367,11 +368,11 @@ $(document).ready(function() { editors.specEditor.setOption("theme", THEME); editors.catEditor.setOption("theme", THEME); - editors.catEditor.setValue('{"promoter": ["BBa_R0040", "BBa_J23100"],\n "rbs": ["BBa_B0032", "BBa_B0034"], \n"cds": ["BBa_E0040", "BBa_E1010"],\n"spacer": ["BBa_F0010"],\n"terminator": ["BBa_B0010"]}'); + editors.catEditor.setValue('{"promoter": ["BBa_R0040", "BBa_J23100"],\n "ribosomeBindingSite": ["BBa_B0032", "BBa_B0034"], \n"cds": ["BBa_E0040", "BBa_E1010"],\n"nonCodingRna": ["BBa_F0010"],\n"terminator": ["BBa_B0010"]}'); editors.designsEditor.setOption("theme", THEME); $('#demo-option').on('click', function() { - editors.specEditor.setValue('one-or-more(one-or-more(promoter then spacer)then cds then \n (zero-or-more \n (spacer or (one-or-more \n (spacer then promoter then spacer) then cds)) then \n (terminator or (terminator then spacer) or (spacer then terminator)))))') + editors.specEditor.setValue('one-or-more(one-or-more(promoter then nonCodingRna)then cds then \n (zero-or-more \n (nonCodingRna or (one-or-more \n (nonCodingRna then promoter then nonCodingRna) then cds)) then \n (terminator or (terminator then nonCodingRna) or (nonCodingRna then terminator)))))') }); diff --git a/demos/static/sbol/CDS.svg b/demos/static/sbol/cds.svg similarity index 100% rename from demos/static/sbol/CDS.svg rename to demos/static/sbol/cds.svg From d9f3cee329eac17c1ca213631aad997859db7948 Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Mon, 8 Oct 2018 17:10:56 -0400 Subject: [PATCH 06/32] updated sbol generation, in progress --- lib/constellation.js | 7 +- lib/sbol.js | 443 ++++++++++++++++++++++++++++++------------- 2 files changed, 314 insertions(+), 136 deletions(-) diff --git a/lib/constellation.js b/lib/constellation.js index 9f6e077..912aeed 100644 --- a/lib/constellation.js +++ b/lib/constellation.js @@ -4,6 +4,7 @@ if (typeof(window) === 'undefined') { graph = require('./graph'); designEnumeration = require('./designEnumeration'); imparse = require('imparse'); + sbol = require('./sbol'); } const GRAMMAR_DEF = [{'Seq':[{'Then':[['Exp'],'.',['Seq']]},{'Then':[['Exp'],'then',['Seq']]},{'':[['Exp']]}]},{'Exp':[{'Or':[['Term'],'or',['Exp']]},{'And':[['Term'],'and',['Exp']]},{'':[['Term']]}]},{'Term':[{'OneOrMore':['one-or-more',['Term']]},{'ZeroOrMore':['zero-or-more',['Term']]},{'':['{',['Seq'],'}']},{'':['(',['Seq'],')']},{'Atom':[{'RegExp':'([A-Za-z0-9]|-|_)+'}]}]}]; @@ -36,7 +37,7 @@ const constellation = function (langText, categories, numDesigns, maxCycles = 1) throw new Error('No input received'); } - let parsed, gra, designs; + let parsed, gra, designs, sbolDoc; try { parsed = parseGoldbar(langText); @@ -48,6 +49,10 @@ const constellation = function (langText, categories, numDesigns, maxCycles = 1) gra = graph(parsed, maxCycles); designs = designEnumeration(gra.paths, categories, numDesigns); + console.log(gra.stateGraph); + sbolDoc = sbol(gra.stateGraph, categories); + console.log(sbolDoc); + return {stateGraph: gra.stateGraph, designs: designs, paths: gra.paths}; }; diff --git a/lib/sbol.js b/lib/sbol.js index af264b1..1c89022 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -4,24 +4,29 @@ if (typeof window === 'undefined') { } let sequenceConstraintCount = 1; -let atomTextSet = new Set(); -let atomMap = {}; // {atom id: text, type, component, operator, variantDerivation: []} +let orRegionCount = 1; +let cycleRegionCount = 1; +let atomMap = {}; // {atomText: componentDefinition, variants[]} const VERSION = '1'; const DELIMITER = '/'; -const PREFIX = 'http://constellationcad.org/'; -const TEMPLATE = 'combinatorialTemplate'; +const PREFIX = 'http://constellationcad.org/design_name/'; +const ROOT_PREFIX = PREFIX + 'root_template' + DELIMITER; +const TEMPLATE = 'combinatorial_template'; const TEMPLATE_PREFIX = PREFIX + TEMPLATE + DELIMITER; -const COMBINATORIAL = 'combinatorialDerivation'; -const SEQUENCE_CONSTRAINT = 'combinatorialSequenceConstraint'; -const COMPONENT = 'Component'; -const VARIABLE = 'Variable'; +const COMBINATORIAL = 'combinatorial_derivation'; +const SEQUENCE_CONSTRAINT = 'sequence_constraint'; +const COMPONENT = '_component'; +const VARIABLE = '_variable'; +const ORREGION = 'ORunit'; +const ORSUBREGION = 'ORsubunit'; +const CYCLEREGION = 'CYCLICALunit'; const OPERATOR_URIS = { - 'ZeroOrOne': 'http://sbols.org/v2#zeroOrOne', - 'ZeroOrMore': 'http://sbols.org/v2#zeroOrMore', - 'One': 'http://sbols.org/v2#one', - 'OneOrMore': 'http://sbols.org/v2#oneOrMore' + 'zero-or-one': 'http://sbols.org/v2#zeroOrOne', + 'zero-or-more': 'http://sbols.org/v2#zeroOrMore', + 'one': 'http://sbols.org/v2#one', + 'one-or-more': 'http://sbols.org/v2#oneOrMore' }; const SEQUENCE_CONSTRAINT_URIS = { 'PRECEDE': 'http://sbols.org/v2#precedes', @@ -39,188 +44,356 @@ function getRootId(stateGraph){ } } -function makeComponentDefinition(atomText, doc, variantName){ - let displayId = ''; - if (variantName){ - displayId = variantName; - } - else{ - displayId = atomText; +function makeCombinatorialDerivation(doc, templateComponentDefinition){ + const displayId = templateComponentDefinition.displayId + COMBINATORIAL; + const persistentId = templateComponentDefinition.persistentIdentity + DELIMITER + displayId; + const combinatorialDerivation = doc.combinatorialDerivation(persistentId + DELIMITER + VERSION); + combinatorialDerivation.template = templateComponentDefinition; + combinatorialDerivation.displayId = displayId; + combinatorialDerivation.persistentIdentity = persistentId; + combinatorialDerivation.version = VERSION; + + return combinatorialDerivation; +} + +function makeComponentDefinition(doc, name, makeTemplate, makeRoot){ + if(name in atomMap && !makeTemplate && !makeRoot){ + return atomMap[name].componentDefinition; } - const componentDefinition = doc.componentDefinition(PREFIX + displayId + DELIMITER + VERSION); + + let displayId = name; + const prefix = makeRoot? ROOT_PREFIX: makeTemplate? TEMPLATE_PREFIX : PREFIX; + const persistentId = prefix + displayId; + const componentDefinition = doc.componentDefinition(persistentId + DELIMITER + VERSION); componentDefinition.displayId = displayId; - componentDefinition.persistentIdentity = PREFIX + displayId; + componentDefinition.persistentIdentity = persistentId; componentDefinition.version = VERSION; - const role = SBOLDocument.terms[atomText]; //TODO terms need to match what's in sboljs, issue #56 + const role = SBOLDocument.terms[name]; if (role){ componentDefinition.addRole(role); } - componentDefinition.addType(SBOLDocument.terms.dnaRegion); //TODO support for non DNA? + componentDefinition.addType(SBOLDocument.terms.dnaRegion); + //add to atomMap + if(!makeTemplate && !makeRoot){ + atomMap[name] = {}; + atomMap[name].componentDefinition = componentDefinition; + } return componentDefinition; } -function makeComponent(atomText, parentPrefix, componentDefinition, doc){ - let displayId = atomText + COMPONENT; - const atomComponent = doc.component(parentPrefix + displayId + DELIMITER + VERSION); +function makeComponent(doc, componentDefinition, templateId, name){ + const displayId = name + COMPONENT; + const persistentId = templateId + DELIMITER + displayId; + const atomComponent = doc.component(persistentId + DELIMITER + VERSION); atomComponent.displayId = displayId; - atomComponent.persistentIdentity = parentPrefix + displayId; + atomComponent.persistentIdentity = persistentId; atomComponent.version = VERSION; atomComponent.definition = componentDefinition; return atomComponent; } -function makeVariableComponent(atomId, categories, doc){ - - let atomText = atomMap[atomId].text; - let displayId = atomText + VARIABLE; +function makeVariableComponent(doc, component, operator, variantDerivations){ + let displayId = component.displayId + VARIABLE; const variableComponent = doc.variableComponent(TEMPLATE_PREFIX + displayId + DELIMITER + VERSION); variableComponent.displayId = displayId; variableComponent.persistentIdentity = TEMPLATE_PREFIX + displayId; variableComponent.version = VERSION; - variableComponent.variable = atomMap[atomId].component; - variableComponent.operator = OPERATOR_URIS[atomMap[atomId].operator]; - - //OR - if (atomMap[atomId].variantDerivation.length > 0){ - atomMap[atomId].variantDerivation.forEach(function(variantId){ - let variantDerivationComponent = atomMap[variantId].component; - variableComponent.addVariantDerivation(variantDerivationComponent); - }); - } + variableComponent.variable = component; + variableComponent.operator = OPERATOR_URIS[operator]; - let variants = categories[atomText]; + let variants = atomMap[component.displayId.split('_')[0]].variants; if (variants){ variants.forEach(function(variant){ - //make componentDefinition for every variant - let variantCompDef = makeComponentDefinition(atomText, doc, variant); - variableComponent.addVariant(variantCompDef); + variableComponent.addVariant(atomMap[variant].componentDefinition); + }); + } + + if(variantDerivations){ + variantDerivations.forEach(function(vd) { + variableComponent.addVariantDerivation(vd); }); } return variableComponent; } -function makeSequenceConstraint(objectId, subjectId, doc){ +function makeSequenceConstraint(doc, templateId, subject, object){ + //subject precedes object let displayId = SEQUENCE_CONSTRAINT + sequenceConstraintCount; - const sequenceConstraint = doc.sequenceConstraint(TEMPLATE_PREFIX + displayId + DELIMITER + VERSION); + const persistentId = templateId + DELIMITER + displayId; + const sequenceConstraint = doc.sequenceConstraint(persistentId + DELIMITER + VERSION); sequenceConstraint.displayId = displayId; - sequenceConstraint.persistentIdentity = TEMPLATE_PREFIX + displayId; + sequenceConstraint.persistentIdentity = persistentId; sequenceConstraint.version = VERSION; - sequenceConstraint.object = atomMap[objectId].component; - sequenceConstraint.subject = atomMap[subjectId].component; + sequenceConstraint.subject = subject; + sequenceConstraint.object = object; sequenceConstraint.restriction = SEQUENCE_CONSTRAINT_URIS.PRECEDE; sequenceConstraintCount += 1; return sequenceConstraint } -function getIdList(id, stateGraph, objectIdList, parentId){ - let atomEdges = stateGraph[id].edges; - atomEdges.forEach(function(atomEdgeId){ - //if an edge has an edge back to its parent, skip - if (atomEdgeId !== parentId) { - if (stateGraph[atomEdgeId].type === graph.EPSILON) { - getIdList(atomEdgeId, stateGraph, objectIdList, id); +// function getNextAtom(stateGraph, id, operator){ +// let atomEdges = stateGraph[id].edges; +// if (!operator){ operator = 'one'; } +// for(let atomEdgeId of atomEdges){ +// if (stateGraph[atomEdgeId].visited){ +// continue; +// } +// +// if (stateGraph[atomEdgeId].type === graph.EPSILON +// && stateGraph[atomEdgeId].operator.length > 0 +// && stateGraph[atomEdgeId].operator.includes('or')){ +// return ORFLAG; +// } +// +// stateGraph[atomEdgeId].visited = true; +// +// if (stateGraph[atomEdgeId].type === graph.EPSILON +// && stateGraph[atomEdgeId].operator.length > 0 +// && (stateGraph[atomEdgeId].operator[0] === 'one-or-more' +// || stateGraph[atomEdgeId].operator[0] === 'zero-or-more')){ +// operator = stateGraph[atomEdgeId].operator[0]; +// getNextAtom(stateGraph, id, operator) +// } +// if (stateGraph[atomEdgeId].type === graph.ATOM){ +// return {nextAtomId: atomEdgeId, operator: operator}; +// } +// } +// return null; +// } + +/* +Every OR region is composed of +1) Template ComponentDefinition + a) Components - references every part's component definition +2) CombinatorialDerivation - references #1 + a) VariableComponent - references #1a + */ +function handleOr(doc, stateGraph, id){ + let orSubRegionCount = 1; + let combDerivations = []; + stateGraph[id].edges.forEach(function(edge){ + let templateComponents = []; + + // 1) Template ComponentDefinition + let identity = ORSUBREGION + orSubRegionCount; + orSubRegionCount++; + const templateComponentDefinition = makeComponentDefinition(doc, identity, false); + //2) CombinatorialDerivation + const combinatorialDerivation = makeCombinatorialDerivation(doc, templateComponentDefinition); + combDerivations.push(combinatorialDerivation); + + let nextEdge = edge; + let operator = 'one'; + do { + if (stateGraph[nextEdge].type === graph.ATOM){ + stateGraph[nextEdge].visited = true; + // 1a) Components + let atomText = stateGraph[nextEdge].text; + const componentDefinition = atomMap[atomText].componentDefinition; + const atomComponent = makeComponent(doc, componentDefinition, templateComponentDefinition.persistentIdentity, atomText); + templateComponentDefinition.addComponent(atomComponent); + + // 2a) VariableComponent + const variableComponent = makeVariableComponent(doc, atomComponent, operator); + combinatorialDerivation.addVariableComponent(variableComponent); } - if (stateGraph[atomEdgeId].type === graph.ATOM) { - objectIdList.push(atomEdgeId); + + if (stateGraph[nextEdge].operator > 0){ + stateGraph[nextEdge].visited = true; + templateComponents.push(handleOperations(doc, stateGraph, templateComponentDefinition, id, stateGraph[nextEdge].operator)); + }else{ + nextEdge = null; } - } + addComponentsToTemplate(doc, stateGraph, templateComponentDefinition, templateComponents); + }while(nextEdge); }); + + return combDerivations; } -function addSequenceConstraints(id, stateGraph, templateComponentDefinition, doc){ - //subject precedes object - let subjectId = id; - let objectIdList = []; - getIdList(subjectId, stateGraph, objectIdList); - - // if the subject atom precedes more than one object atoms - // the object atoms == OR - if (objectIdList.length > 1){ - objectIdList.forEach(function(objectId){ - atomMap[objectId].variantDerivation = objectIdList.filter(function(x) { return x !== objectId; }); - }); +function handleCycle(doc, stateGraph, cycleComponents, templateComponentDefinition, id, startEdge){ + if (stateGraph[id].edges.includes(startEdge)){return;} + for (let edge of stateGraph[id].edges){ + if (stateGraph[edge].visited){ + return; + } + if (stateGraph[edge].operator.length > 0){ + stateGraph[edge].visited = true; + cycleComponents.push(handleOperations(doc, stateGraph, templateComponentDefinition, edge, stateGraph[edge].operator)); + } + if (stateGraph[edge].operator.length === 0 + && stateGraph[edge].type === graph.ATOM){ + stateGraph[edge].visited = true; + // 1a) Components + let atomText = stateGraph[edge].text; + const componentDefinition = atomMap[atomText].componentDefinition; + let templateComponent = {op: 'none', component: makeComponent(doc, componentDefinition, templateComponentDefinition.persistentIdentity, atomText), lastId: edge}; + cycleComponents.push(templateComponent); + } + handleCycle(doc, stateGraph, cycleComponents, templateComponentDefinition, edge, startEdge); } - - // sequence constraint = THEN - objectIdList.forEach(function(objectId){ - let sequenceConstraint = makeSequenceConstraint(objectId, subjectId, doc); - templateComponentDefinition.addSequenceConstraint(sequenceConstraint); - addSequenceConstraints(objectId, stateGraph, templateComponentDefinition, doc); - }); } -function generateTemplateComponentDefinition(stateGraph, doc) { - const templateComponentDefinition = makeComponentDefinition(TEMPLATE, doc); - Object.keys(stateGraph).forEach(function(key) { - if (stateGraph[key].type === graph.ATOM){ +function handleOp(doc, stateGraph, templateComponentDefinition, id, op, operator){ + if (op === 'or'){ + let combinatorialDerivations = handleOr(doc, stateGraph, id); // this handles the individual OR regions - let type = stateGraph[key].text; - let text = stateGraph[key].text; + let identity = ORREGION + orRegionCount; + orRegionCount++; + // 1) ComponentDefinition + // 2) Template ComponentDefinition + // a) Component - references #1 + const componentDefinition = makeComponentDefinition(doc, identity, false); + const orTemplateComponentDefinition = makeComponentDefinition(doc, identity, true); + const orComponent = makeComponent(doc, componentDefinition, orTemplateComponentDefinition.persistentIdentity, identity); + orTemplateComponentDefinition.addComponent(orComponent); - if (atomTextSet.has(text)){ - if (!Number.isNaN(text.slice(-1))){ - text = text + '1'; - }else{ - let nextNum = parseInt(text.slice(-1)) + 1; - text = text + nextNum; - } - } - atomTextSet.add(text); - - let componentDefinition = makeComponentDefinition(type, doc); - let atomComponent = makeComponent(text, TEMPLATE_PREFIX, componentDefinition, doc); - templateComponentDefinition.addComponent(atomComponent); - - atomMap[key] = {}; - atomMap[key].text = text; - atomMap[key].type = type; - atomMap[key].variantDerivation = []; - atomMap[key].operator = 'One'; //default - atomMap[key].component = atomComponent; - let edges = stateGraph[key].edges; - // if there is only one edge and that edge is an 'o' - // and if o's edges contains this edge, it is 'zeroOrMore' - if ( edges.length === 1 && stateGraph[edges[0]].type === graph.EPSILON && stateGraph[edges[0]].edges.includes(key)){ - atomMap[key].operator = 'ZeroOrMore'; - }else if (edges.length > 1){ - for (let i = 0; i < edges.length; i++) { - if (stateGraph[edges[i]].edges.includes(key)){ - atomMap[key].operator = 'OneOrMore'; - break; - } - } + // 3) CombinatorialDerivation - references #2 + // a) VariableComponent - references #2a + // ai) VariantDerivation - one for every item in combinatorialDerivations array + const combinatorialDerivation = makeCombinatorialDerivation(doc, orTemplateComponentDefinition); + const variableComponent = makeVariableComponent(doc, orComponent, operator, combinatorialDerivations); + combinatorialDerivation.addVariableComponent(variableComponent); + + //return this component + return {op: op, component: makeComponent(doc, componentDefinition, templateComponentDefinition.persistentIdentity, identity)}; + } + if (op === 'then'){ + // assume that the 'then' is always on an atom + let atomText = stateGraph[id].text; + const componentDefinition = atomMap[atomText].componentDefinition; + const subjectComponent = makeComponent(doc, componentDefinition, templateComponentDefinition.persistentIdentity, atomText); + return {op: op, component: subjectComponent, lastId: id}; + } + if (op === 'zero-or-more' || op === 'one-or-more'){ + let identity = CYCLEREGION + cycleRegionCount; + cycleRegionCount++; + // 1) ComponentDefinition + // 2) Template ComponentDefinition + // a) Component - references #1 + const componentDefinition = makeComponentDefinition(doc, identity, false); + const cycleTemplateComponentDefinition = makeComponentDefinition(doc, identity, true); + const cycleComponent = makeComponent(doc, componentDefinition, cycleTemplateComponentDefinition.persistentIdentity, identity); + cycleTemplateComponentDefinition.addComponent(cycleComponent); + + let cycleComponents = []; + handleCycle(doc, stateGraph, cycleComponents, componentDefinition, id, id); + let lastId = cycleComponents[cycleComponents.length-1].lastId; + let thenFlag = addComponentsToTemplate(doc, stateGraph, componentDefinition, cycleComponents); + + // 3) CombinatorialDerivation - references #2 + // a) VariableComponent - references #2a + const combinatorialDerivation = makeCombinatorialDerivation(doc, cycleTemplateComponentDefinition); + const variableComponent = makeVariableComponent(doc, cycleComponent, op); + combinatorialDerivation.addVariableComponent(variableComponent); + + //return this component + if (thenFlag){ op = 'then'} + return {op: op, component: makeComponent(doc, componentDefinition, templateComponentDefinition.persistentIdentity, identity), lastId: lastId}; + } +} +function handleOperations(doc, stateGraph, templateComponentDefinition, id, operations){ + let operator = 'one'; + if (operations.length === 1){ + return handleOp(doc, stateGraph, templateComponentDefinition, id, operations[0], operator); + } + for(let op of operations){ + if (op === 'one-or-more' || op === 'zero-or-more'){ + operator = op; + continue; + } + return handleOp(doc, stateGraph, templateComponentDefinition, id, op, operator); + } +} + +function addComponentsToTemplate(doc, stateGraph, templateComponentDefinition, templateComponents){ + //{op: 'or', component: orComponent}; + //{op: 'then', subject: subject}; + let thenFlag = false; + for (let i=0; i Date: Fri, 19 Oct 2018 14:55:31 -0400 Subject: [PATCH 07/32] in progress --- lib/graph.js | 4 +- lib/sbol.js | 182 +++++++++++++++++++++++++++++++++------------------ 2 files changed, 122 insertions(+), 64 deletions(-) diff --git a/lib/graph.js b/lib/graph.js index 8b2ec47..5ee80a7 100644 --- a/lib/graph.js +++ b/lib/graph.js @@ -430,13 +430,13 @@ function collapseEpsilons(stateGraph, epsilonMap) { epsilonMap[child].add(parentIds[0]); } } - parent.edges.push(child); + parent.edges.push(child); if (epsilon.operator !== undefined ) { const last = parent.operator.length - 1; // Do not add duplicate ORs for (var i = 0; i < epsilon.operator.length; i++) { if (parent.operator[last] !== OR || (epsilon.operator[0] !== OR)) { - parent.operator.push(epsilon.operator[i]); + parent.operator.push(epsilon.operator[i]); } } } diff --git a/lib/sbol.js b/lib/sbol.js index 1c89022..a08547b 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -45,7 +45,7 @@ function getRootId(stateGraph){ } function makeCombinatorialDerivation(doc, templateComponentDefinition){ - const displayId = templateComponentDefinition.displayId + COMBINATORIAL; + const displayId = templateComponentDefinition.displayId + DELIMITER + COMBINATORIAL; const persistentId = templateComponentDefinition.persistentIdentity + DELIMITER + displayId; const combinatorialDerivation = doc.combinatorialDerivation(persistentId + DELIMITER + VERSION); combinatorialDerivation.template = templateComponentDefinition; @@ -56,6 +56,29 @@ function makeCombinatorialDerivation(doc, templateComponentDefinition){ return combinatorialDerivation; } +/* +temporary function so that atoms/variants are consistent +TODO fetch from SBH +*/ +function makeAtomComponentDefinition(doc, name){ + const prefix = 'http://constellationcad.org/generic_definition/'; + const persistentId = prefix + name; + const componentDefinition = doc.componentDefinition(persistentId + DELIMITER + VERSION); + componentDefinition.displayId = name; + componentDefinition.persistentIdentity = persistentId; + componentDefinition.version = VERSION; + const role = SBOLDocument.terms[name]; + if (role){ + componentDefinition.addRole(role); + } + componentDefinition.addType(SBOLDocument.terms.engineeredRegion); + + //add to atomMap + atomMap[name] = {}; + atomMap[name].componentDefinition = componentDefinition; + return componentDefinition; +} + function makeComponentDefinition(doc, name, makeTemplate, makeRoot){ if(name in atomMap && !makeTemplate && !makeRoot){ return atomMap[name].componentDefinition; @@ -72,7 +95,7 @@ function makeComponentDefinition(doc, name, makeTemplate, makeRoot){ if (role){ componentDefinition.addRole(role); } - componentDefinition.addType(SBOLDocument.terms.dnaRegion); + componentDefinition.addType(SBOLDocument.terms.engineeredRegion); //add to atomMap if(!makeTemplate && !makeRoot){ @@ -214,29 +237,6 @@ function handleOr(doc, stateGraph, id){ return combDerivations; } -function handleCycle(doc, stateGraph, cycleComponents, templateComponentDefinition, id, startEdge){ - if (stateGraph[id].edges.includes(startEdge)){return;} - for (let edge of stateGraph[id].edges){ - if (stateGraph[edge].visited){ - return; - } - if (stateGraph[edge].operator.length > 0){ - stateGraph[edge].visited = true; - cycleComponents.push(handleOperations(doc, stateGraph, templateComponentDefinition, edge, stateGraph[edge].operator)); - } - if (stateGraph[edge].operator.length === 0 - && stateGraph[edge].type === graph.ATOM){ - stateGraph[edge].visited = true; - // 1a) Components - let atomText = stateGraph[edge].text; - const componentDefinition = atomMap[atomText].componentDefinition; - let templateComponent = {op: 'none', component: makeComponent(doc, componentDefinition, templateComponentDefinition.persistentIdentity, atomText), lastId: edge}; - cycleComponents.push(templateComponent); - } - handleCycle(doc, stateGraph, cycleComponents, templateComponentDefinition, edge, startEdge); - } -} - function handleOp(doc, stateGraph, templateComponentDefinition, id, op, operator){ if (op === 'or'){ let combinatorialDerivations = handleOr(doc, stateGraph, id); // this handles the individual OR regions @@ -258,7 +258,7 @@ function handleOp(doc, stateGraph, templateComponentDefinition, id, op, operator const variableComponent = makeVariableComponent(doc, orComponent, operator, combinatorialDerivations); combinatorialDerivation.addVariableComponent(variableComponent); - //return this component + //return a new component for the template return {op: op, component: makeComponent(doc, componentDefinition, templateComponentDefinition.persistentIdentity, identity)}; } if (op === 'then'){ @@ -271,42 +271,41 @@ function handleOp(doc, stateGraph, templateComponentDefinition, id, op, operator if (op === 'zero-or-more' || op === 'one-or-more'){ let identity = CYCLEREGION + cycleRegionCount; cycleRegionCount++; - // 1) ComponentDefinition - // 2) Template ComponentDefinition - // a) Component - references #1 - const componentDefinition = makeComponentDefinition(doc, identity, false); - const cycleTemplateComponentDefinition = makeComponentDefinition(doc, identity, true); - const cycleComponent = makeComponent(doc, componentDefinition, cycleTemplateComponentDefinition.persistentIdentity, identity); - cycleTemplateComponentDefinition.addComponent(cycleComponent); + const cycleTemplateComponentDefinition = makeComponentDefinition(doc, identity, true); let cycleComponents = []; - handleCycle(doc, stateGraph, cycleComponents, componentDefinition, id, id); - let lastId = cycleComponents[cycleComponents.length-1].lastId; - let thenFlag = addComponentsToTemplate(doc, stateGraph, componentDefinition, cycleComponents); + // returns the id of that last node in the cycle + let lastId = handleCycle(doc, stateGraph, cycleTemplateComponentDefinition, cycleComponents, id, id); + let thenFlag = addComponentsToTemplate(doc, stateGraph, cycleTemplateComponentDefinition, cycleComponents); // 3) CombinatorialDerivation - references #2 // a) VariableComponent - references #2a - const combinatorialDerivation = makeCombinatorialDerivation(doc, cycleTemplateComponentDefinition); - const variableComponent = makeVariableComponent(doc, cycleComponent, op); - combinatorialDerivation.addVariableComponent(variableComponent); + addVariableComponentsToCV(doc, cycleTemplateComponentDefinition, cycleComponents); - //return this component - if (thenFlag){ op = 'then'} - return {op: op, component: makeComponent(doc, componentDefinition, templateComponentDefinition.persistentIdentity, identity), lastId: lastId}; + //return a new component for the template + const componentDefinition = makeComponentDefinition(doc, identity, false); + const component = makeComponent(doc, componentDefinition, templateComponentDefinition.persistentIdentity, identity); + if (thenFlag){ + return {op: 'then', component: component, lastId: lastId, operator: op}; + } + return {op: op, component: component, lastId: lastId}; } } function handleOperations(doc, stateGraph, templateComponentDefinition, id, operations){ let operator = 'one'; if (operations.length === 1){ - return handleOp(doc, stateGraph, templateComponentDefinition, id, operations[0], operator); + return [handleOp(doc, stateGraph, templateComponentDefinition, id, operations[0], operator)]; } + + let templateComponents = []; for(let op of operations){ if (op === 'one-or-more' || op === 'zero-or-more'){ operator = op; continue; } - return handleOp(doc, stateGraph, templateComponentDefinition, id, op, operator); + templateComponents.push(handleOp(doc, stateGraph, templateComponentDefinition, id, op, operator)); } + return templateComponents; } function addComponentsToTemplate(doc, stateGraph, templateComponentDefinition, templateComponents){ @@ -322,7 +321,6 @@ function addComponentsToTemplate(doc, stateGraph, templateComponentDefinition, t thenFlag = true; }else{ let subject = componentObj.component; - //console.log(subject); let object = templateComponents[i+1].component; let sequenceConstraint = makeSequenceConstraint(doc, templateComponentDefinition.persistentIdentity, subject, object); templateComponentDefinition.addSequenceConstraint(sequenceConstraint); @@ -333,26 +331,83 @@ function addComponentsToTemplate(doc, stateGraph, templateComponentDefinition, t return thenFlag; //if this is true, it means there is a "then" on the last atom of the cycle region } -function traverseGraph(doc, stateGraph, rootComponentDefinition, templateComponents, id){ - if (stateGraph[id].type === graph.ACCEPT) {return;} - if (stateGraph[id].visited) { return;} - else if (stateGraph[id].operator.length !== 0){ +function addVariableComponentsToCV(doc, templateComponentDefinition, templateComponents){ + const combinatorialDerivation = makeCombinatorialDerivation(doc, templateComponentDefinition); + templateComponents.forEach(function (rootComponent){ + let operator = 'one'; + if (rootComponent.op === 'one-or-more' || rootComponent.op === 'zero-or-more'){ + operator = rootComponent.op; + } + if (rootComponent.op === 'then' && rootComponent.operator){ + operator = rootComponent.operator; + } + const variableComponent = makeVariableComponent(doc, rootComponent.component, operator); + combinatorialDerivation.addVariableComponent(variableComponent); + }); +} + +/* +Helper function for "one-or-more" or "zero-or-more" +Visit edges starting from where the node the operator is on (call this startEdge) +Return is of the node that points back to the startEdge, for this is the last ID of the cycle + */ +function handleCycle(doc, stateGraph, templateComponentDefinition, cycleComponents, id, startEdge){ + if (stateGraph[id].edges.includes(startEdge)){ + if (!stateGraph[id].visited){ + handleTraverse(doc, stateGraph, templateComponentDefinition, cycleComponents, id); + } + return id; + } + for (let edge of stateGraph[id].edges){ + if (stateGraph[id].visited){ + continue + } + let nextId = handleTraverse(doc, stateGraph, templateComponentDefinition, cycleComponents, edge); + return handleCycle(doc, stateGraph, templateComponentDefinition, cycleComponents, nextId, startEdge); + } +} + +/* +Helper function for how to handle every node +If visited, return +If it has operations, handle all operations on that node, add whole component to array and return the id of the last node visited +If no operations and it is an atom, return the atom as a component to array and return its id + */ +function handleTraverse(doc, stateGraph, templateComponentDefinition, templateComponents, id){ + console.log(id); + if (stateGraph[id].operator.length !== 0){ stateGraph[id].visited = true; - let componentObj = handleOperations(doc, stateGraph, rootComponentDefinition, id, stateGraph[id].operator); - templateComponents.push(componentObj); - if(componentObj.lastId){id = componentObj.lastId;} + let componentObjs = handleOperations(doc, stateGraph, templateComponentDefinition, id, stateGraph[id].operator); + componentObjs.forEach(function (componentObj){ + templateComponents.push(componentObj); + }); + return componentObjs[componentObjs.length-1].lastId; } else if (stateGraph[id].operator.length === 0 - && stateGraph[id].type === graph.ATOM){ + && stateGraph[id].type === graph.ATOM){ stateGraph[id].visited = true; let atomText = stateGraph[id].text; - let templateComponent = {op: 'none', component: makeComponent(doc, atomMap[atomText].componentDefinition, rootComponentDefinition.persistentIdentity, atomText)}; - templateComponents.push(templateComponent); + let atomComponentDefinition = atomMap[atomText].componentDefinition; + let componentObj = {op: 'none', component: makeComponent(doc, atomComponentDefinition, templateComponentDefinition.persistentIdentity, atomText), lastId:id}; + templateComponents.push(componentObj); + return id; } + return id; +} + +/* +Traverse graph starting from the root + */ +function traverseGraph(doc, stateGraph, rootComponentDefinition, templateComponents, id){ + if (stateGraph[id].type === graph.ACCEPT) { + return; + } + handleTraverse(doc, stateGraph, rootComponentDefinition, templateComponents, id); stateGraph[id].edges.forEach(function(edge){ - traverseGraph(doc, stateGraph, rootComponentDefinition, templateComponents, edge); + if (!stateGraph[id].visited) { + traverseGraph(doc, stateGraph, rootComponentDefinition, templateComponents, edge); + } }); - } function generateCombinatorialSBOL(stateGraph, categories){ @@ -365,12 +420,12 @@ function generateCombinatorialSBOL(stateGraph, categories){ let atomType = stateGraph[id].type; let atomText = stateGraph[id].text; if (atomType === graph.ATOM && !(atomText in atomMap)){ - makeComponentDefinition(doc, atomText); + makeAtomComponentDefinition(doc, atomText); //create ComponentDefinition for every variant and add to atomMap // TODO fetch definitions from SBH categories[atomText].forEach(function(variant){ - makeComponentDefinition(doc, variant); + makeAtomComponentDefinition(doc, variant); if (!atomMap[atomText].variants){ atomMap[atomText].variants = []; } @@ -384,9 +439,12 @@ function generateCombinatorialSBOL(stateGraph, categories){ const identity = 'design_name'; const rootComponentDefinition = makeComponentDefinition(doc, identity, false, true); const firstId = getRootId(stateGraph); - let templateComponents = []; - traverseGraph(doc, stateGraph, rootComponentDefinition, templateComponents, firstId); - addComponentsToTemplate(doc, stateGraph, rootComponentDefinition, templateComponents); + let rootComponents = []; + traverseGraph(doc, stateGraph, rootComponentDefinition, rootComponents, firstId); + addComponentsToTemplate(doc, stateGraph, rootComponentDefinition, rootComponents); + + //Create combinatorial derivation for the root template + addVariableComponentsToCV(doc, rootComponentDefinition, rootComponents); //clean up sequenceConstraintCount = 1; From aa9c405433cd67444b2f396fbb8ca765756cd791 Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Thu, 25 Oct 2018 15:50:39 -0400 Subject: [PATCH 08/32] try 3 of SBOL generation --- lib/constellation.js | 2 +- lib/sbol.js | 272 +++++++++++++++++-------------------------- 2 files changed, 111 insertions(+), 163 deletions(-) diff --git a/lib/constellation.js b/lib/constellation.js index 912aeed..f472b71 100644 --- a/lib/constellation.js +++ b/lib/constellation.js @@ -51,7 +51,7 @@ const constellation = function (langText, categories, numDesigns, maxCycles = 1) console.log(gra.stateGraph); sbolDoc = sbol(gra.stateGraph, categories); - console.log(sbolDoc); + //console.log(sbolDoc); return {stateGraph: gra.stateGraph, designs: designs, paths: gra.paths}; }; diff --git a/lib/sbol.js b/lib/sbol.js index a08547b..9399ea3 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -157,35 +157,6 @@ function makeSequenceConstraint(doc, templateId, subject, object){ return sequenceConstraint } -// function getNextAtom(stateGraph, id, operator){ -// let atomEdges = stateGraph[id].edges; -// if (!operator){ operator = 'one'; } -// for(let atomEdgeId of atomEdges){ -// if (stateGraph[atomEdgeId].visited){ -// continue; -// } -// -// if (stateGraph[atomEdgeId].type === graph.EPSILON -// && stateGraph[atomEdgeId].operator.length > 0 -// && stateGraph[atomEdgeId].operator.includes('or')){ -// return ORFLAG; -// } -// -// stateGraph[atomEdgeId].visited = true; -// -// if (stateGraph[atomEdgeId].type === graph.EPSILON -// && stateGraph[atomEdgeId].operator.length > 0 -// && (stateGraph[atomEdgeId].operator[0] === 'one-or-more' -// || stateGraph[atomEdgeId].operator[0] === 'zero-or-more')){ -// operator = stateGraph[atomEdgeId].operator[0]; -// getNextAtom(stateGraph, id, operator) -// } -// if (stateGraph[atomEdgeId].type === graph.ATOM){ -// return {nextAtomId: atomEdgeId, operator: operator}; -// } -// } -// return null; -// } /* Every OR region is composed of @@ -237,76 +208,6 @@ function handleOr(doc, stateGraph, id){ return combDerivations; } -function handleOp(doc, stateGraph, templateComponentDefinition, id, op, operator){ - if (op === 'or'){ - let combinatorialDerivations = handleOr(doc, stateGraph, id); // this handles the individual OR regions - - let identity = ORREGION + orRegionCount; - orRegionCount++; - // 1) ComponentDefinition - // 2) Template ComponentDefinition - // a) Component - references #1 - const componentDefinition = makeComponentDefinition(doc, identity, false); - const orTemplateComponentDefinition = makeComponentDefinition(doc, identity, true); - const orComponent = makeComponent(doc, componentDefinition, orTemplateComponentDefinition.persistentIdentity, identity); - orTemplateComponentDefinition.addComponent(orComponent); - - // 3) CombinatorialDerivation - references #2 - // a) VariableComponent - references #2a - // ai) VariantDerivation - one for every item in combinatorialDerivations array - const combinatorialDerivation = makeCombinatorialDerivation(doc, orTemplateComponentDefinition); - const variableComponent = makeVariableComponent(doc, orComponent, operator, combinatorialDerivations); - combinatorialDerivation.addVariableComponent(variableComponent); - - //return a new component for the template - return {op: op, component: makeComponent(doc, componentDefinition, templateComponentDefinition.persistentIdentity, identity)}; - } - if (op === 'then'){ - // assume that the 'then' is always on an atom - let atomText = stateGraph[id].text; - const componentDefinition = atomMap[atomText].componentDefinition; - const subjectComponent = makeComponent(doc, componentDefinition, templateComponentDefinition.persistentIdentity, atomText); - return {op: op, component: subjectComponent, lastId: id}; - } - if (op === 'zero-or-more' || op === 'one-or-more'){ - let identity = CYCLEREGION + cycleRegionCount; - cycleRegionCount++; - - const cycleTemplateComponentDefinition = makeComponentDefinition(doc, identity, true); - let cycleComponents = []; - // returns the id of that last node in the cycle - let lastId = handleCycle(doc, stateGraph, cycleTemplateComponentDefinition, cycleComponents, id, id); - let thenFlag = addComponentsToTemplate(doc, stateGraph, cycleTemplateComponentDefinition, cycleComponents); - - // 3) CombinatorialDerivation - references #2 - // a) VariableComponent - references #2a - addVariableComponentsToCV(doc, cycleTemplateComponentDefinition, cycleComponents); - - //return a new component for the template - const componentDefinition = makeComponentDefinition(doc, identity, false); - const component = makeComponent(doc, componentDefinition, templateComponentDefinition.persistentIdentity, identity); - if (thenFlag){ - return {op: 'then', component: component, lastId: lastId, operator: op}; - } - return {op: op, component: component, lastId: lastId}; - } -} -function handleOperations(doc, stateGraph, templateComponentDefinition, id, operations){ - let operator = 'one'; - if (operations.length === 1){ - return [handleOp(doc, stateGraph, templateComponentDefinition, id, operations[0], operator)]; - } - - let templateComponents = []; - for(let op of operations){ - if (op === 'one-or-more' || op === 'zero-or-more'){ - operator = op; - continue; - } - templateComponents.push(handleOp(doc, stateGraph, templateComponentDefinition, id, op, operator)); - } - return templateComponents; -} function addComponentsToTemplate(doc, stateGraph, templateComponentDefinition, templateComponents){ //{op: 'or', component: orComponent}; @@ -346,70 +247,116 @@ function addVariableComponentsToCV(doc, templateComponentDefinition, templateCom }); } -/* -Helper function for "one-or-more" or "zero-or-more" -Visit edges starting from where the node the operator is on (call this startEdge) -Return is of the node that points back to the startEdge, for this is the last ID of the cycle - */ -function handleCycle(doc, stateGraph, templateComponentDefinition, cycleComponents, id, startEdge){ - if (stateGraph[id].edges.includes(startEdge)){ - if (!stateGraph[id].visited){ - handleTraverse(doc, stateGraph, templateComponentDefinition, cycleComponents, id); - } - return id; - } - for (let edge of stateGraph[id].edges){ - if (stateGraph[id].visited){ - continue +// breadth width search +function populateStack(stateGraph, stack, id){ + let queue = []; + queue.push(id); + stateGraph[id].visited = true; + + while (queue.length !== 0){ + let id = queue.shift(); + //let value = stateGraph[id].text; //replace with id + let value = id; + let lastEdge = ''; + stateGraph[id].operator.forEach(function (operation){ + if (operation === 'or'){ + let orStack = []; + stack.push({[operation]: orStack}); + + // get all edges of the OR first + stateGraph[id].edges.forEach(function (edge){ + let tempStack = []; + stateGraph[edge].visited = true; + if (stateGraph[edge].type === graph.ATOM){ + tempStack.push({atom: stateGraph[edge].text}); + } + stateGraph[edge].operator.forEach(function (operation){ + tempStack.push({[operation]: edge}); + }); + + // then do a depth first search + lastEdge = traverseOr(stack, tempStack, stateGraph, edge); + orStack.push(tempStack); + }); + } else{ + stack.push({[operation]: value}); + } + }); + + if (lastEdge){ //from OR + //stack.push({end: value}); + stateGraph[lastEdge].operator.forEach(function (operation){ + stack.push({[operation]: lastEdge}); + }); + id = lastEdge; } - let nextId = handleTraverse(doc, stateGraph, templateComponentDefinition, cycleComponents, edge); - return handleCycle(doc, stateGraph, templateComponentDefinition, cycleComponents, nextId, startEdge); + stateGraph[id].edges.forEach(function (edge){ + // the 'then' needs to be after the the previous operator ends + let thenObj; + if (stateGraph[edge].visited){ + if (stateGraph[edge].type !== graph.ATOM){ + if (Object.keys(stack[stack.length-1])[0] === 'then'){ + thenObj = stack.pop(); + } + stack.push({end: edge}); + if (thenObj){ + stack.push(thenObj); + thenObj = null; + } + } + } + else{ + queue.push(edge); + stateGraph[edge].visited = true; + if (stateGraph[edge].type === graph.ATOM){ + stack.push({atom: stateGraph[edge].text}); + } + } + }); } } -/* -Helper function for how to handle every node -If visited, return -If it has operations, handle all operations on that node, add whole component to array and return the id of the last node visited -If no operations and it is an atom, return the atom as a component to array and return its id - */ -function handleTraverse(doc, stateGraph, templateComponentDefinition, templateComponents, id){ - console.log(id); - if (stateGraph[id].operator.length !== 0){ - stateGraph[id].visited = true; - let componentObjs = handleOperations(doc, stateGraph, templateComponentDefinition, id, stateGraph[id].operator); - componentObjs.forEach(function (componentObj){ - templateComponents.push(componentObj); - }); - return componentObjs[componentObjs.length-1].lastId; - } - else if (stateGraph[id].operator.length === 0 - && stateGraph[id].type === graph.ATOM){ - stateGraph[id].visited = true; - let atomText = stateGraph[id].text; - let atomComponentDefinition = atomMap[atomText].componentDefinition; - let componentObj = {op: 'none', component: makeComponent(doc, atomComponentDefinition, templateComponentDefinition.persistentIdentity, atomText), lastId:id}; - templateComponents.push(componentObj); - return id; + +//depth first search for OR +function traverseOr(stack, orStack, stateGraph, id){ + let lastEdge; + stateGraph[id].visited = true; + for (let edge of stateGraph[id].edges){ + if (stateGraph[edge].visited){ + if (stateGraph[edge].operator.includes('one-or-more') + || stateGraph[edge].operator.includes('zero-or-more')){ + stack.push({end: edge}); //end the 'mores' + } + continue; + } + + if (stateGraph[edge].type === graph.ATOM){ + orStack.push({atom: stateGraph[edge].text}); + stateGraph[edge].operator.forEach(function (operation){ + orStack.push({[operation]: edge}); + }); + } + else{ + for (let operation of stateGraph[edge].operator){ + if (operation === 'then'){ + stateGraph[edge].visited = false; //reset + return edge; //a 'then' that's not on the atom is not part of the OR + } + orStack.push({[operation]: edge}); + } + } + + lastEdge = traverseOr(stack, orStack, stateGraph, edge); } - return id; + return lastEdge; //the last node of the OR chain } -/* -Traverse graph starting from the root - */ -function traverseGraph(doc, stateGraph, rootComponentDefinition, templateComponents, id){ - if (stateGraph[id].type === graph.ACCEPT) { - return; - } - handleTraverse(doc, stateGraph, rootComponentDefinition, templateComponents, id); - stateGraph[id].edges.forEach(function(edge){ - if (!stateGraph[id].visited) { - traverseGraph(doc, stateGraph, rootComponentDefinition, templateComponents, edge); - } - }); +function createSBOL(doc, stack){ + } + + function generateCombinatorialSBOL(stateGraph, categories){ const doc = new SBOLDocument(); @@ -436,15 +383,16 @@ function generateCombinatorialSBOL(stateGraph, categories){ //Create root template for the whole graph //Components under this Definition should come from traverseGraph - const identity = 'design_name'; - const rootComponentDefinition = makeComponentDefinition(doc, identity, false, true); - const firstId = getRootId(stateGraph); - let rootComponents = []; - traverseGraph(doc, stateGraph, rootComponentDefinition, rootComponents, firstId); - addComponentsToTemplate(doc, stateGraph, rootComponentDefinition, rootComponents); - + const rootId = getRootId(stateGraph); + let stack = []; + populateStack(stateGraph, stack, rootId); //create a new stack that's ideal for SBOL structure + console.log(JSON.stringify(stack, null, 2)); + // let rootComponents = createSBOL(doc, stack); + // + // const identity = 'design_name'; + // const rootComponentDefinition = makeComponentDefinition(doc, identity, false, true); + //addComponentsToTemplate(doc, stateGraph, rootComponentDefinition, rootComponents); //Create combinatorial derivation for the root template - addVariableComponentsToCV(doc, rootComponentDefinition, rootComponents); //clean up sequenceConstraintCount = 1; From fc45f344723a515e7f84410be333d881fe72e5e9 Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Sat, 27 Oct 2018 13:16:48 -0400 Subject: [PATCH 09/32] fix nested ORs --- lib/sbol.js | 117 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 77 insertions(+), 40 deletions(-) diff --git a/lib/sbol.js b/lib/sbol.js index 9399ea3..ae8a193 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -249,6 +249,7 @@ function addVariableComponentsToCV(doc, templateComponentDefinition, templateCom // breadth width search function populateStack(stateGraph, stack, id){ + let endIds = []; //prevent redundant ends let queue = []; queue.push(id); stateGraph[id].visited = true; @@ -262,29 +263,18 @@ function populateStack(stateGraph, stack, id){ if (operation === 'or'){ let orStack = []; stack.push({[operation]: orStack}); - // get all edges of the OR first stateGraph[id].edges.forEach(function (edge){ let tempStack = []; - stateGraph[edge].visited = true; - if (stateGraph[edge].type === graph.ATOM){ - tempStack.push({atom: stateGraph[edge].text}); - } - stateGraph[edge].operator.forEach(function (operation){ - tempStack.push({[operation]: edge}); - }); - - // then do a depth first search - lastEdge = traverseOr(stack, tempStack, stateGraph, edge); + lastEdge = traverseOr(stack, tempStack, stateGraph, edge, endIds); orStack.push(tempStack); }); - } else{ + } else { stack.push({[operation]: value}); } }); if (lastEdge){ //from OR - //stack.push({end: value}); stateGraph[lastEdge].operator.forEach(function (operation){ stack.push({[operation]: lastEdge}); }); @@ -298,7 +288,10 @@ function populateStack(stateGraph, stack, id){ if (Object.keys(stack[stack.length-1])[0] === 'then'){ thenObj = stack.pop(); } - stack.push({end: edge}); + if (!endIds.includes(edge)){ + stack.push({end: edge}); + endIds.push(edge); + } if (thenObj){ stack.push(thenObj); thenObj = null; @@ -306,10 +299,12 @@ function populateStack(stateGraph, stack, id){ } } else{ - queue.push(edge); - stateGraph[edge].visited = true; - if (stateGraph[edge].type === graph.ATOM){ - stack.push({atom: stateGraph[edge].text}); + if (stateGraph[edge].type !== graph.ACCEPT){ + queue.push(edge); + stateGraph[edge].visited = true; + if (stateGraph[edge].type === graph.ATOM){ + stack.push({atom: stateGraph[edge].text}); + } } } }); @@ -318,35 +313,77 @@ function populateStack(stateGraph, stack, id){ //depth first search for OR -function traverseOr(stack, orStack, stateGraph, id){ +function traverseOr(stack, tempStack, stateGraph, id, endIds){ let lastEdge; stateGraph[id].visited = true; - for (let edge of stateGraph[id].edges){ - if (stateGraph[edge].visited){ - if (stateGraph[edge].operator.includes('one-or-more') - || stateGraph[edge].operator.includes('zero-or-more')){ - stack.push({end: edge}); //end the 'mores' - } - continue; - } - if (stateGraph[edge].type === graph.ATOM){ - orStack.push({atom: stateGraph[edge].text}); - stateGraph[edge].operator.forEach(function (operation){ - orStack.push({[operation]: edge}); + if (stateGraph[id].type === graph.ATOM){ + tempStack.push({atom: stateGraph[id].text}); + for (let operation of stateGraph[id].operator){ + if (operation === 'or'){ + let orStack = []; + tempStack.push({[operation]: orStack}); + // get all edges of the OR first + stateGraph[id].edges.forEach(function (edge){ + let tempStackX = []; + lastEdge = traverseOr(tempStack, tempStackX, stateGraph, edge, endIds); + orStack.push(tempStackX); }); + } else{ + tempStack.push({[operation]: id}); } - else{ - for (let operation of stateGraph[edge].operator){ - if (operation === 'then'){ - stateGraph[edge].visited = false; //reset - return edge; //a 'then' that's not on the atom is not part of the OR - } - orStack.push({[operation]: edge}); - } + } + } + else{ + for (let operation of stateGraph[id].operator){ + if (operation === 'then'){ + stateGraph[id].visited = false; //reset + return id; //a 'then' that's not on the atom is not part of the OR + } + if (operation === 'or'){ + let orStack = []; + tempStack.push({[operation]: orStack}); + // get all edges of the OR first + stateGraph[id].edges.forEach(function (edge){ + let tempStackX = []; + lastEdge = traverseOr(tempStack, tempStackX, stateGraph, edge, endIds); + orStack.push(tempStackX); + }); + } else{ + tempStack.push({[operation]: id}); + } + } + } + + if (lastEdge){ //from OR + stateGraph[lastEdge].operator.forEach(function (operation){ + tempStack.push({[operation]: lastEdge}); + }); + id = lastEdge; + } + for (let edge of stateGraph[id].edges){ + if (stateGraph[edge].type === graph.ACCEPT){ + continue; + } + if (stateGraph[edge].visited && stateGraph[edge].edges.includes(id)){ + if (!endIds.includes(edge)){ + tempStack.push({end: edge}); + endIds.push(edge); } + continue; + } + if (stateGraph[edge].visited){ + if (stateGraph[edge].operator.includes('one-or-more') + || stateGraph[edge].operator.includes('zero-or-more')){ + if (!endIds.includes(edge)){ + stack.push({end: edge}); + endIds.push(edge); + } //end the 'mores' on the original stack + } + continue; + } - lastEdge = traverseOr(stack, orStack, stateGraph, edge); + lastEdge = traverseOr(stack, tempStack, stateGraph, edge, endIds); } return lastEdge; //the last node of the OR chain } From dfbbec22027a6a6df01150fe3929000f3edc2ba6 Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Sat, 27 Oct 2018 19:36:29 -0400 Subject: [PATCH 10/32] generating validated sbol --- lib/constellation.js | 2 +- lib/sbol.js | 165 ++++++++++++++++++++++++++++++------------- 2 files changed, 116 insertions(+), 51 deletions(-) diff --git a/lib/constellation.js b/lib/constellation.js index f472b71..912aeed 100644 --- a/lib/constellation.js +++ b/lib/constellation.js @@ -51,7 +51,7 @@ const constellation = function (langText, categories, numDesigns, maxCycles = 1) console.log(gra.stateGraph); sbolDoc = sbol(gra.stateGraph, categories); - //console.log(sbolDoc); + console.log(sbolDoc); return {stateGraph: gra.stateGraph, designs: designs, paths: gra.paths}; }; diff --git a/lib/sbol.js b/lib/sbol.js index ae8a193..6a9d053 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -14,7 +14,7 @@ const PREFIX = 'http://constellationcad.org/design_name/'; const ROOT_PREFIX = PREFIX + 'root_template' + DELIMITER; const TEMPLATE = 'combinatorial_template'; const TEMPLATE_PREFIX = PREFIX + TEMPLATE + DELIMITER; -const COMBINATORIAL = 'combinatorial_derivation'; +const COMBINATORIAL = '_combinatorial_derivation'; const SEQUENCE_CONSTRAINT = 'sequence_constraint'; const COMPONENT = '_component'; const VARIABLE = '_variable'; @@ -45,7 +45,7 @@ function getRootId(stateGraph){ } function makeCombinatorialDerivation(doc, templateComponentDefinition){ - const displayId = templateComponentDefinition.displayId + DELIMITER + COMBINATORIAL; + const displayId = templateComponentDefinition.displayId + COMBINATORIAL; const persistentId = templateComponentDefinition.persistentIdentity + DELIMITER + displayId; const combinatorialDerivation = doc.combinatorialDerivation(persistentId + DELIMITER + VERSION); combinatorialDerivation.template = templateComponentDefinition; @@ -105,8 +105,8 @@ function makeComponentDefinition(doc, name, makeTemplate, makeRoot){ return componentDefinition; } -function makeComponent(doc, componentDefinition, templateId, name){ - const displayId = name + COMPONENT; +function makeComponent(doc, componentDefinition, templateId){ + const displayId = componentDefinition.displayId + COMPONENT; const persistentId = templateId + DELIMITER + displayId; const atomComponent = doc.component(persistentId + DELIMITER + VERSION); atomComponent.displayId = displayId; @@ -116,11 +116,12 @@ function makeComponent(doc, componentDefinition, templateId, name){ return atomComponent; } -function makeVariableComponent(doc, component, operator, variantDerivations){ +function makeVariableComponent(doc, templateId, component, operator, variantDerivations){ let displayId = component.displayId + VARIABLE; - const variableComponent = doc.variableComponent(TEMPLATE_PREFIX + displayId + DELIMITER + VERSION); + const persistentId = templateId + DELIMITER + displayId; + const variableComponent = doc.variableComponent(persistentId + DELIMITER + VERSION); variableComponent.displayId = displayId; - variableComponent.persistentIdentity = TEMPLATE_PREFIX + displayId; + variableComponent.persistentIdentity = persistentId; variableComponent.version = VERSION; variableComponent.variable = component; variableComponent.operator = OPERATOR_URIS[operator]; @@ -209,44 +210,6 @@ function handleOr(doc, stateGraph, id){ } -function addComponentsToTemplate(doc, stateGraph, templateComponentDefinition, templateComponents){ - //{op: 'or', component: orComponent}; - //{op: 'then', subject: subject}; - let thenFlag = false; - for (let i=0; i 0){ + // if there's already a template on the stack, then add component to the template + const lastTemplate = templateStack[templateStack.length-1].template; + const component = makeComponent(doc, componentDefinition, lastTemplate.persistentIdentity); + lastTemplate.addComponent(component); + + tempVCStack.push({operator: [key], component: component}); + }else{ + // else, this is a new componentDef for the root + componentDefStack.push({operator: [key], componentDef: componentDefinition}); + } + + // add template for the one-or-more to the temp stack + const templateComponentDefinition = makeComponentDefinition(doc, identity, true); + templateStack.push({id: stackObj[key], operator: [key], template: templateComponentDefinition}); + } + + if (key === 'atom'){ + let name = stackObj[key]; + const componentDefinition = makeComponentDefinition(doc, name); + if (templateStack.length > 0){ + // add component to the template + const lastTemplate = templateStack[templateStack.length-1].template; + const component = makeComponent(doc, componentDefinition, lastTemplate.persistentIdentity); + lastTemplate.addComponent(component); + + tempVCStack.push({operator: 'one', component: component}); + }else{ + componentDefStack.push({operator: 'one', componentDef: componentDefinition}); + } + } + + if (key === 'end'){ + // remove the last template + const index = templateStack.indexOf(template => template.id === stackObj[key]); + const templateObj = templateStack.splice(index, 1)[0]; + console.log(templateObj); + let lengthOfComponents = templateObj.template._components.length; + + const cv = makeCombinatorialDerivation(doc, templateObj.template); + for (let i=0; i< lengthOfComponents; i++){ + let componentObj = tempVCStack.pop(); + const vc = makeVariableComponent(doc, cv.persistentIdentity, componentObj.component, componentObj.operator); + cv.addVariableComponent(vc); + } + } + + if (key === 'or'){ + //todo + } + } + }); + + return {componentDefs: componentDefStack} } +function addComponentsToTemplate(doc, templateComponentDefinition, componentObjs){ + if (componentObjs.length === 1){ + templateComponentDefinition.addComponent(componentObjs[0].component); + }else{ + for (let i=0; i 0){ + addComponentsToTemplate(doc, rootComponentDefinition, componentObjs); + addVariableComponentsToCV(doc, rootCV, componentObjs); + } //clean up sequenceConstraintCount = 1; From 14790f5618696d3a22e2bba240973e2da40adb07 Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Sat, 27 Oct 2018 22:04:41 -0400 Subject: [PATCH 11/32] added SBOL support for OR --- lib/sbol.js | 163 +++++++++++++++++++++++++--------------------------- 1 file changed, 79 insertions(+), 84 deletions(-) diff --git a/lib/sbol.js b/lib/sbol.js index 6a9d053..5513ebf 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -18,9 +18,9 @@ const COMBINATORIAL = '_combinatorial_derivation'; const SEQUENCE_CONSTRAINT = 'sequence_constraint'; const COMPONENT = '_component'; const VARIABLE = '_variable'; -const ORREGION = 'ORunit'; -const ORSUBREGION = 'ORsubunit'; -const CYCLEREGION = 'CYCLICALunit'; +const ORREGION = 'or_unit'; +const ORSUBREGION = '_or_subunit'; +const CYCLEREGION = 'cyclical_unit'; const OPERATOR_URIS = { 'zero-or-one': 'http://sbols.org/v2#zeroOrOne', @@ -126,11 +126,14 @@ function makeVariableComponent(doc, templateId, component, operator, variantDeri variableComponent.variable = component; variableComponent.operator = OPERATOR_URIS[operator]; - let variants = atomMap[component.displayId.split('_')[0]].variants; - if (variants){ - variants.forEach(function(variant){ - variableComponent.addVariant(atomMap[variant].componentDefinition); - }); + let compStr = component.displayId.split('_')[0]; + if (atomMap[compStr]){ + let variants = atomMap[compStr].variants; + if (variants){ + variants.forEach(function(variant){ + variableComponent.addVariant(atomMap[variant].componentDefinition); + }); + } } if(variantDerivations){ @@ -159,57 +162,6 @@ function makeSequenceConstraint(doc, templateId, subject, object){ } -/* -Every OR region is composed of -1) Template ComponentDefinition - a) Components - references every part's component definition -2) CombinatorialDerivation - references #1 - a) VariableComponent - references #1a - */ -function handleOr(doc, stateGraph, id){ - let orSubRegionCount = 1; - let combDerivations = []; - stateGraph[id].edges.forEach(function(edge){ - let templateComponents = []; - - // 1) Template ComponentDefinition - let identity = ORSUBREGION + orSubRegionCount; - orSubRegionCount++; - const templateComponentDefinition = makeComponentDefinition(doc, identity, false); - //2) CombinatorialDerivation - const combinatorialDerivation = makeCombinatorialDerivation(doc, templateComponentDefinition); - combDerivations.push(combinatorialDerivation); - - let nextEdge = edge; - let operator = 'one'; - do { - if (stateGraph[nextEdge].type === graph.ATOM){ - stateGraph[nextEdge].visited = true; - // 1a) Components - let atomText = stateGraph[nextEdge].text; - const componentDefinition = atomMap[atomText].componentDefinition; - const atomComponent = makeComponent(doc, componentDefinition, templateComponentDefinition.persistentIdentity, atomText); - templateComponentDefinition.addComponent(atomComponent); - - // 2a) VariableComponent - const variableComponent = makeVariableComponent(doc, atomComponent, operator); - combinatorialDerivation.addVariableComponent(variableComponent); - } - - if (stateGraph[nextEdge].operator > 0){ - stateGraph[nextEdge].visited = true; - templateComponents.push(handleOperations(doc, stateGraph, templateComponentDefinition, id, stateGraph[nextEdge].operator)); - }else{ - nextEdge = null; - } - addComponentsToTemplate(doc, stateGraph, templateComponentDefinition, templateComponents); - }while(nextEdge); - }); - - return combDerivations; -} - - // breadth width search function populateStack(stateGraph, stack, id){ let endIds = []; //prevent redundant ends @@ -351,10 +303,8 @@ function traverseOr(stack, tempStack, stateGraph, id, endIds){ return lastEdge; //the last node of the OR chain } -function createSBOL(doc, stack){ - let componentDefStack = []; // for root to make components +function traverseStack(doc, stack, componentDefStack){ - //temp stacks let templateStack = []; let tempVCStack = []; @@ -375,7 +325,7 @@ function createSBOL(doc, stack){ tempVCStack.push({operator: [key], component: component}); }else{ // else, this is a new componentDef for the root - componentDefStack.push({operator: [key], componentDef: componentDefinition}); + componentDefStack.push({operator: [key], componentDef: componentDefinition, variantDV: []}); } // add template for the one-or-more to the temp stack @@ -394,7 +344,7 @@ function createSBOL(doc, stack){ tempVCStack.push({operator: 'one', component: component}); }else{ - componentDefStack.push({operator: 'one', componentDef: componentDefinition}); + componentDefStack.push({operator: 'one', componentDef: componentDefinition, variantDV: []}); } } @@ -402,20 +352,64 @@ function createSBOL(doc, stack){ // remove the last template const index = templateStack.indexOf(template => template.id === stackObj[key]); const templateObj = templateStack.splice(index, 1)[0]; - console.log(templateObj); - - let lengthOfComponents = templateObj.template._components.length; - const cv = makeCombinatorialDerivation(doc, templateObj.template); + + const lengthOfComponents = templateObj.template._components.length; for (let i=0; i< lengthOfComponents; i++){ let componentObj = tempVCStack.pop(); - const vc = makeVariableComponent(doc, cv.persistentIdentity, componentObj.component, componentObj.operator); + const vc = makeVariableComponent(doc, cv.persistentIdentity, componentObj.component, componentObj.operator, componentObj.variantDV); cv.addVariableComponent(vc); } } if (key === 'or'){ - //todo + let orIdentity = ORREGION + orRegionCount; + orRegionCount += 1; + + let variantDerivations = []; + const componentDefinition = makeComponentDefinition(doc, orIdentity); + const templateComponentDefinition = makeComponentDefinition(doc, orIdentity, true); + + if (templateStack.length > 0){ + // if there's already a template on the stack, then add component to the template + const lastTemplate = templateStack[templateStack.length-1].template; + const component = makeComponent(doc, componentDefinition, lastTemplate.persistentIdentity); + lastTemplate.addComponent(component); + + tempVCStack.push({operator: 'one', component: component, variantDV: variantDerivations}); // keep track of components within another template + }else{ + // else this is a new componentDef for the root + componentDefStack.push({operator: 'one', componentDef: componentDefinition, variantDV: variantDerivations}); + } + + // add template for the OR to the temp stack + //templateStack.push({id: [key], operator: 'one', template: templateComponentDefinition}); + + let orSubRegionCount = 1; + stackObj[key].forEach(function (orRegion){ + let orSubIdentity = orIdentity + ORSUBREGION + orSubRegionCount; + orSubRegionCount += 1; + + let cdStack = []; + let orStack = traverseStack(doc, orRegion, cdStack); + const templateComponentDefinition = makeComponentDefinition(doc, orSubIdentity, true); + let componentObjs = []; + orStack.componentDefs.forEach(function(componentDefObj){ + const component = makeComponent(doc, componentDefObj.componentDef, templateComponentDefinition.persistentIdentity); + componentObjs.push({operator: componentDefObj.operator, component: component}); + }); + + //Create combinatorial derivation for the or subunit + const cv = makeCombinatorialDerivation(doc, templateComponentDefinition); + variantDerivations.push(cv); + + if (componentObjs.length > 0){ + addComponentsToTemplate(doc, templateComponentDefinition, componentObjs); + addVariableComponentsToCV(doc, cv, componentObjs); + } + }); + + } } }); @@ -425,23 +419,22 @@ function createSBOL(doc, stack){ function addComponentsToTemplate(doc, templateComponentDefinition, componentObjs){ - if (componentObjs.length === 1){ - templateComponentDefinition.addComponent(componentObjs[0].component); - }else{ - for (let i=0; i Date: Mon, 29 Oct 2018 11:47:45 -0400 Subject: [PATCH 12/32] fixes following Nic's feedback --- lib/sbol.js | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/lib/sbol.js b/lib/sbol.js index 5513ebf..1e1471d 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -15,7 +15,7 @@ const ROOT_PREFIX = PREFIX + 'root_template' + DELIMITER; const TEMPLATE = 'combinatorial_template'; const TEMPLATE_PREFIX = PREFIX + TEMPLATE + DELIMITER; const COMBINATORIAL = '_combinatorial_derivation'; -const SEQUENCE_CONSTRAINT = 'sequence_constraint'; +const SEQUENCE_CONSTRAINT = '_sequence_constraint'; const COMPONENT = '_component'; const VARIABLE = '_variable'; const ORREGION = 'or_unit'; @@ -145,10 +145,10 @@ function makeVariableComponent(doc, templateId, component, operator, variantDeri return variableComponent; } -function makeSequenceConstraint(doc, templateId, subject, object){ +function makeSequenceConstraint(doc, templateCD, subject, object){ //subject precedes object - let displayId = SEQUENCE_CONSTRAINT + sequenceConstraintCount; - const persistentId = templateId + DELIMITER + displayId; + let displayId = templateCD.displayId + SEQUENCE_CONSTRAINT + sequenceConstraintCount; + const persistentId = templateCD.persistentIdentity + DELIMITER + displayId; const sequenceConstraint = doc.sequenceConstraint(persistentId + DELIMITER + VERSION); sequenceConstraint.displayId = displayId; sequenceConstraint.persistentIdentity = persistentId; @@ -306,7 +306,7 @@ function traverseOr(stack, tempStack, stateGraph, id, endIds){ function traverseStack(doc, stack, componentDefStack){ let templateStack = []; - let tempVCStack = []; + let tempVCStack = []; //variant components stack.forEach(function(stackObj){ for (let key in stackObj){ @@ -315,6 +315,8 @@ function traverseStack(doc, stack, componentDefStack){ let identity = CYCLEREGION + cycleRegionCount; cycleRegionCount += 1; const componentDefinition = makeComponentDefinition(doc, identity); + const templateCD = makeComponentDefinition(doc, identity, true); + const cv = makeCombinatorialDerivation(doc, templateCD); if (templateStack.length > 0){ // if there's already a template on the stack, then add component to the template @@ -322,15 +324,14 @@ function traverseStack(doc, stack, componentDefStack){ const component = makeComponent(doc, componentDefinition, lastTemplate.persistentIdentity); lastTemplate.addComponent(component); - tempVCStack.push({operator: [key], component: component}); + tempVCStack.push({operator: [key], component: component, variantDV:[cv]}); }else{ // else, this is a new componentDef for the root - componentDefStack.push({operator: [key], componentDef: componentDefinition, variantDV: []}); + componentDefStack.push({operator: [key], componentDef: componentDefinition, variantDV: [cv]}); } // add template for the one-or-more to the temp stack - const templateComponentDefinition = makeComponentDefinition(doc, identity, true); - templateStack.push({id: stackObj[key], operator: [key], template: templateComponentDefinition}); + templateStack.push({id: stackObj[key], operator: [key], template: templateCD, combDV: cv}); } if (key === 'atom'){ @@ -352,8 +353,10 @@ function traverseStack(doc, stack, componentDefStack){ // remove the last template const index = templateStack.indexOf(template => template.id === stackObj[key]); const templateObj = templateStack.splice(index, 1)[0]; - const cv = makeCombinatorialDerivation(doc, templateObj.template); + const cv = templateObj.combDV; + // get length of components under the component and pop + // the same number from the temp VariantComponent stack const lengthOfComponents = templateObj.template._components.length; for (let i=0; i< lengthOfComponents; i++){ let componentObj = tempVCStack.pop(); @@ -368,7 +371,6 @@ function traverseStack(doc, stack, componentDefStack){ let variantDerivations = []; const componentDefinition = makeComponentDefinition(doc, orIdentity); - const templateComponentDefinition = makeComponentDefinition(doc, orIdentity, true); if (templateStack.length > 0){ // if there's already a template on the stack, then add component to the template @@ -376,13 +378,14 @@ function traverseStack(doc, stack, componentDefStack){ const component = makeComponent(doc, componentDefinition, lastTemplate.persistentIdentity); lastTemplate.addComponent(component); - tempVCStack.push({operator: 'one', component: component, variantDV: variantDerivations}); // keep track of components within another template + // keep track of components within another template + tempVCStack.push({operator: 'one', component: component, variantDV: variantDerivations}); }else{ // else this is a new componentDef for the root componentDefStack.push({operator: 'one', componentDef: componentDefinition, variantDV: variantDerivations}); } - // add template for the OR to the temp stack + //const templateComponentDefinition = makeComponentDefinition(doc, orIdentity, true); //templateStack.push({id: [key], operator: 'one', template: templateComponentDefinition}); let orSubRegionCount = 1; @@ -425,7 +428,7 @@ function addComponentsToTemplate(doc, templateComponentDefinition, componentObjs // add sequence constraints let subject = componentObjs[i-1].component; let object = componentObjs[i].component; - let sequenceConstraint = makeSequenceConstraint(doc, templateComponentDefinition.persistentIdentity, subject, object); + let sequenceConstraint = makeSequenceConstraint(doc, templateComponentDefinition, subject, object); templateComponentDefinition.addSequenceConstraint(sequenceConstraint); } } @@ -468,7 +471,7 @@ function generateCombinatorialSBOL(stateGraph, categories){ //Components under this Definition should come from traverseGraph const rootId = getRootId(stateGraph); let stack = []; - populateStack(stateGraph, stack, rootId); //create a new stack that's ideal for SBOL structure + populateStack(stateGraph, stack, rootId); //create a new stack from the graph that's better for SBOL structure console.log(JSON.stringify(stack, null, 2)); let componentDefStack = []; // for root to make components @@ -487,7 +490,7 @@ function generateCombinatorialSBOL(stateGraph, categories){ const rootCV = makeCombinatorialDerivation(doc, rootComponentDefinition); if (componentObjs.length > 0){ - addComponentsToTemplate(doc, rootComponentDefinition, componentObjs); + addComponentsToTemplate(doc, rootComponentDefinition, componentObjs); //including sequence constraints addVariableComponentsToCV(doc, rootCV, componentObjs); } From 0f978c6850752e87480ed3f613176119f7c31a40 Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Mon, 29 Oct 2018 13:41:54 -0400 Subject: [PATCH 13/32] added zero-or-more to SBOL --- lib/constellation.js | 10 +++++----- lib/graph.js | 6 ++++++ lib/sbol.js | 38 +++++++++++++++++--------------------- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/lib/constellation.js b/lib/constellation.js index 9f2c275..1e429af 100644 --- a/lib/constellation.js +++ b/lib/constellation.js @@ -37,7 +37,7 @@ const constellation = function (langText, categories, numDesigns, maxCycles = 1) throw new Error('No input received'); } - let parsed, gra, designs, sbolDoc; + let parsed, parsedSBOL, gra, graSBOL, designs, sbolDoc; try { parsed = parseGoldbar(langText); @@ -48,14 +48,14 @@ const constellation = function (langText, categories, numDesigns, maxCycles = 1) } gra = graph(parsed, maxCycles); - graSBOL = graph(parsed, maxCycles).stateGraph; + graSBOL = graph(parsedSBOL, maxCycles).stateGraph; designs = designEnumeration(gra.paths, categories, numDesigns); - console.log(gra.stateGraph); - sbolDoc = sbol(gra.stateGraph, categories); + console.log(graSBOL); + sbolDoc = sbol(graSBOL, categories); console.log(sbolDoc); - return {stateGraph: gra.stateGraph, sbolStateGraph: graSBOL, designs: designs, paths: gra.paths}; + return {stateGraph: gra.stateGraph, designs: designs, paths: gra.paths}; }; /** diff --git a/lib/graph.js b/lib/graph.js index 74547df..69318a0 100644 --- a/lib/graph.js +++ b/lib/graph.js @@ -515,6 +515,12 @@ graph.ATOM = ATOM; graph.ACCEPT = ACCEPT; graph.ROOT = ROOT; +graph.OR = OR; +graph.THEN = THEN; +graph.ONE_MORE = ONE_MORE; +graph.ZERO_MORE = ZERO_MORE; +graph.ZERO_SBOL = ZERO_SBOL; + if (typeof window === 'undefined') { module.exports = graph; } diff --git a/lib/sbol.js b/lib/sbol.js index 1e1471d..c96bb2c 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -23,11 +23,11 @@ const ORSUBREGION = '_or_subunit'; const CYCLEREGION = 'cyclical_unit'; const OPERATOR_URIS = { - 'zero-or-one': 'http://sbols.org/v2#zeroOrOne', - 'zero-or-more': 'http://sbols.org/v2#zeroOrMore', + [graph.ZERO_SBOL]: 'http://sbols.org/v2#zeroOrMore', 'one': 'http://sbols.org/v2#one', - 'one-or-more': 'http://sbols.org/v2#oneOrMore' + [graph.ONE_MORE]: 'http://sbols.org/v2#oneOrMore' }; + const SEQUENCE_CONSTRAINT_URIS = { 'PRECEDE': 'http://sbols.org/v2#precedes', 'SAMEORIENTATION': 'http://sbols.org/v2#sameOrientationAs', @@ -171,11 +171,9 @@ function populateStack(stateGraph, stack, id){ while (queue.length !== 0){ let id = queue.shift(); - //let value = stateGraph[id].text; //replace with id - let value = id; let lastEdge = ''; stateGraph[id].operator.forEach(function (operation){ - if (operation === 'or'){ + if (operation === graph.OR){ let orStack = []; stack.push({[operation]: orStack}); // get all edges of the OR first @@ -185,7 +183,7 @@ function populateStack(stateGraph, stack, id){ orStack.push(tempStack); }); } else { - stack.push({[operation]: value}); + stack.push({[operation]: id}); } }); @@ -200,7 +198,7 @@ function populateStack(stateGraph, stack, id){ let thenObj; if (stateGraph[edge].visited){ if (stateGraph[edge].type !== graph.ATOM){ - if (Object.keys(stack[stack.length-1])[0] === 'then'){ + if (Object.keys(stack[stack.length-1])[0] === graph.THEN){ thenObj = stack.pop(); } if (!endIds.includes(edge)){ @@ -235,7 +233,7 @@ function traverseOr(stack, tempStack, stateGraph, id, endIds){ if (stateGraph[id].type === graph.ATOM){ tempStack.push({atom: stateGraph[id].text}); for (let operation of stateGraph[id].operator){ - if (operation === 'or'){ + if (operation === graph.OR){ let orStack = []; tempStack.push({[operation]: orStack}); // get all edges of the OR first @@ -251,11 +249,11 @@ function traverseOr(stack, tempStack, stateGraph, id, endIds){ } else{ for (let operation of stateGraph[id].operator){ - if (operation === 'then'){ + if (operation === graph.THEN){ stateGraph[id].visited = false; //reset return id; //a 'then' that's not on the atom is not part of the OR } - if (operation === 'or'){ + if (operation === graph.OR){ let orStack = []; tempStack.push({[operation]: orStack}); // get all edges of the OR first @@ -288,8 +286,8 @@ function traverseOr(stack, tempStack, stateGraph, id, endIds){ continue; } if (stateGraph[edge].visited){ - if (stateGraph[edge].operator.includes('one-or-more') - || stateGraph[edge].operator.includes('zero-or-more')){ + if (stateGraph[edge].operator.includes(graph.ONE_MORE) + || stateGraph[edge].operator.includes(graph.ZERO_SBOL)){ if (!endIds.includes(edge)){ stack.push({end: edge}); endIds.push(edge); @@ -311,7 +309,7 @@ function traverseStack(doc, stack, componentDefStack){ stack.forEach(function(stackObj){ for (let key in stackObj){ - if (key === 'one-or-more'){ + if (key === graph.ONE_MORE || key === graph.ZERO_SBOL){ let identity = CYCLEREGION + cycleRegionCount; cycleRegionCount += 1; const componentDefinition = makeComponentDefinition(doc, identity); @@ -324,17 +322,17 @@ function traverseStack(doc, stack, componentDefStack){ const component = makeComponent(doc, componentDefinition, lastTemplate.persistentIdentity); lastTemplate.addComponent(component); - tempVCStack.push({operator: [key], component: component, variantDV:[cv]}); + tempVCStack.push({operator: key, component: component, variantDV:[cv]}); }else{ // else, this is a new componentDef for the root - componentDefStack.push({operator: [key], componentDef: componentDefinition, variantDV: [cv]}); + componentDefStack.push({operator: key, componentDef: componentDefinition, variantDV: [cv]}); } // add template for the one-or-more to the temp stack - templateStack.push({id: stackObj[key], operator: [key], template: templateCD, combDV: cv}); + templateStack.push({id: stackObj[key], operator: key, template: templateCD, combDV: cv}); } - if (key === 'atom'){ + if (key === graph.ATOM){ let name = stackObj[key]; const componentDefinition = makeComponentDefinition(doc, name); if (templateStack.length > 0){ @@ -365,7 +363,7 @@ function traverseStack(doc, stack, componentDefStack){ } } - if (key === 'or'){ + if (key === graph.OR){ let orIdentity = ORREGION + orRegionCount; orRegionCount += 1; @@ -411,8 +409,6 @@ function traverseStack(doc, stack, componentDefStack){ addVariableComponentsToCV(doc, cv, componentObjs); } }); - - } } }); From 2afc54b3beaa57afd154c672eaf41c15d5832887 Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Mon, 29 Oct 2018 14:48:41 -0400 Subject: [PATCH 14/32] fixed variant derivation bug --- lib/sbol.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/sbol.js b/lib/sbol.js index c96bb2c..6cdb03b 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -301,11 +301,7 @@ function traverseOr(stack, tempStack, stateGraph, id, endIds){ return lastEdge; //the last node of the OR chain } -function traverseStack(doc, stack, componentDefStack){ - - let templateStack = []; - let tempVCStack = []; //variant components - +function traverseStack(doc, stack, componentDefStack, templateStack, tempVCStack){ stack.forEach(function(stackObj){ for (let key in stackObj){ @@ -392,12 +388,12 @@ function traverseStack(doc, stack, componentDefStack){ orSubRegionCount += 1; let cdStack = []; - let orStack = traverseStack(doc, orRegion, cdStack); + let orStack = traverseStack(doc, orRegion, cdStack, templateStack, tempVCStack); const templateComponentDefinition = makeComponentDefinition(doc, orSubIdentity, true); let componentObjs = []; orStack.componentDefs.forEach(function(componentDefObj){ const component = makeComponent(doc, componentDefObj.componentDef, templateComponentDefinition.persistentIdentity); - componentObjs.push({operator: componentDefObj.operator, component: component}); + componentObjs.push({operator: componentDefObj.operator, component: component, variantDV: componentDefObj.variantDV}); }); //Create combinatorial derivation for the or subunit @@ -471,7 +467,9 @@ function generateCombinatorialSBOL(stateGraph, categories){ console.log(JSON.stringify(stack, null, 2)); let componentDefStack = []; // for root to make components - let sbolStack = traverseStack(doc, stack, componentDefStack); + let templateStack = []; + let tempVCStack = []; //variant components + let sbolStack = traverseStack(doc, stack, componentDefStack, templateStack, tempVCStack); console.log(sbolStack); const identity = 'design_name'; From 60149125619bd25d3a19239ce247b8560b155dc3 Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Mon, 29 Oct 2018 15:09:48 -0400 Subject: [PATCH 15/32] added design name to SBOL --- lib/constellation.js | 14 +++++++++++--- lib/sbol.js | 14 ++++++++------ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/lib/constellation.js b/lib/constellation.js index 12db1ea..e564629 100644 --- a/lib/constellation.js +++ b/lib/constellation.js @@ -14,6 +14,7 @@ const GRAMMAR_DEF = [{'Seq':[{'Then':[['Exp'],'.',['Seq']]},{'Then':[['Exp'],'th /* * * * * * */ /** * Runs constellation + * @param designName Name of combinatorial design * @param langText Text with GOLDBAR specification input * @param categories Text with categories * @param numDesigns Maximum number of designs to output @@ -36,6 +37,9 @@ const constellation = function (designName, langText, categories, numDesigns, ma if (!langText) { throw new Error('No input received'); } + if (!designName) { + throw new Error('No design name is specified'); + } let parsed, parsedSBOL, gra, graSBOL, designs, sbolDoc; @@ -51,9 +55,13 @@ const constellation = function (designName, langText, categories, numDesigns, ma graSBOL = graph(parsedSBOL, maxCycles).stateGraph; designs = designEnumeration(gra.paths, categories, numDesigns); - console.log(graSBOL); - sbolDoc = sbol(graSBOL, categories); - console.log(sbolDoc); + try { + designName = String(designName).replace(/ /g, '_'); + sbolDoc = sbol(graSBOL, categories, designName); + console.log(sbolDoc); + } catch (error) { + throw new Error('SBOL generation error!') + } return {stateGraph: gra.stateGraph, designs: designs, paths: gra.paths, sbol: sbolDoc}; }; diff --git a/lib/sbol.js b/lib/sbol.js index 6cdb03b..c238819 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -7,13 +7,11 @@ let sequenceConstraintCount = 1; let orRegionCount = 1; let cycleRegionCount = 1; let atomMap = {}; // {atomText: componentDefinition, variants[]} +let DESIGN_NAME = ''; const VERSION = '1'; const DELIMITER = '/'; -const PREFIX = 'http://constellationcad.org/design_name/'; -const ROOT_PREFIX = PREFIX + 'root_template' + DELIMITER; const TEMPLATE = 'combinatorial_template'; -const TEMPLATE_PREFIX = PREFIX + TEMPLATE + DELIMITER; const COMBINATORIAL = '_combinatorial_derivation'; const SEQUENCE_CONSTRAINT = '_sequence_constraint'; const COMPONENT = '_component'; @@ -84,6 +82,10 @@ function makeComponentDefinition(doc, name, makeTemplate, makeRoot){ return atomMap[name].componentDefinition; } + const PREFIX = 'http://constellationcad.org' + DELIMITER + DESIGN_NAME + DELIMITER; + const ROOT_PREFIX = PREFIX + 'root_template' + DELIMITER; + const TEMPLATE_PREFIX = PREFIX + TEMPLATE + DELIMITER; + let displayId = name; const prefix = makeRoot? ROOT_PREFIX: makeTemplate? TEMPLATE_PREFIX : PREFIX; const persistentId = prefix + displayId; @@ -435,8 +437,9 @@ function addVariableComponentsToCV(doc, templateCV, componentObjs){ } -function generateCombinatorialSBOL(stateGraph, categories){ +function generateCombinatorialSBOL(stateGraph, categories, designName){ const doc = new SBOLDocument(); + DESIGN_NAME = designName; // traverse whole graph, mark all as not visited //create ComponentDefinition for every atom and add to atomMap @@ -472,8 +475,7 @@ function generateCombinatorialSBOL(stateGraph, categories){ let sbolStack = traverseStack(doc, stack, componentDefStack, templateStack, tempVCStack); console.log(sbolStack); - const identity = 'design_name'; - const rootComponentDefinition = makeComponentDefinition(doc, identity, false, true); + const rootComponentDefinition = makeComponentDefinition(doc, designName, false, true); let componentObjs = []; sbolStack.componentDefs.forEach(function(componentDefObj){ const component = makeComponent(doc, componentDefObj.componentDef, rootComponentDefinition.persistentIdentity); From f6c06ec0082167cc57a9b7adf2e49547e9ed8140 Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Fri, 2 Nov 2018 12:11:00 -0400 Subject: [PATCH 16/32] fixed wrong nesting bug caused by a previous fix --- lib/sbol.js | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/lib/sbol.js b/lib/sbol.js index c238819..9c5fc7f 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -303,9 +303,12 @@ function traverseOr(stack, tempStack, stateGraph, id, endIds){ return lastEdge; //the last node of the OR chain } -function traverseStack(doc, stack, componentDefStack, templateStack, tempVCStack){ +function traverseStack(doc, stack, componentDefStack){ + let templateStack = []; + let tempVCStack = []; //variant components + stack.forEach(function(stackObj){ - for (let key in stackObj){ + for (let key in stackObj){ //only one key per object if (key === graph.ONE_MORE || key === graph.ZERO_SBOL){ let identity = CYCLEREGION + cycleRegionCount; @@ -388,22 +391,20 @@ function traverseStack(doc, stack, componentDefStack, templateStack, tempVCStack stackObj[key].forEach(function (orRegion){ let orSubIdentity = orIdentity + ORSUBREGION + orSubRegionCount; orSubRegionCount += 1; + const orSubunitTemplateCD = makeComponentDefinition(doc, orSubIdentity, true); + const cv = makeCombinatorialDerivation(doc, orSubunitTemplateCD); + variantDerivations.push(cv); let cdStack = []; - let orStack = traverseStack(doc, orRegion, cdStack, templateStack, tempVCStack); - const templateComponentDefinition = makeComponentDefinition(doc, orSubIdentity, true); + let orStack = traverseStack(doc, orRegion, cdStack); let componentObjs = []; orStack.componentDefs.forEach(function(componentDefObj){ - const component = makeComponent(doc, componentDefObj.componentDef, templateComponentDefinition.persistentIdentity); + const component = makeComponent(doc, componentDefObj.componentDef, orSubunitTemplateCD.persistentIdentity); componentObjs.push({operator: componentDefObj.operator, component: component, variantDV: componentDefObj.variantDV}); }); - //Create combinatorial derivation for the or subunit - const cv = makeCombinatorialDerivation(doc, templateComponentDefinition); - variantDerivations.push(cv); - if (componentObjs.length > 0){ - addComponentsToTemplate(doc, templateComponentDefinition, componentObjs); + addComponentsToTemplate(doc, orSubunitTemplateCD, componentObjs); addVariableComponentsToCV(doc, cv, componentObjs); } }); @@ -470,9 +471,7 @@ function generateCombinatorialSBOL(stateGraph, categories, designName){ console.log(JSON.stringify(stack, null, 2)); let componentDefStack = []; // for root to make components - let templateStack = []; - let tempVCStack = []; //variant components - let sbolStack = traverseStack(doc, stack, componentDefStack, templateStack, tempVCStack); + let sbolStack = traverseStack(doc, stack, componentDefStack); console.log(sbolStack); const rootComponentDefinition = makeComponentDefinition(doc, designName, false, true); From df0eb9cee7466f77fc9f48178b5dec425bc05fab Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Fri, 2 Nov 2018 14:27:15 -0400 Subject: [PATCH 17/32] collapse SBOL or --- lib/sbol.js | 101 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 59 insertions(+), 42 deletions(-) diff --git a/lib/sbol.js b/lib/sbol.js index 9c5fc7f..48c3cca 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -118,7 +118,7 @@ function makeComponent(doc, componentDefinition, templateId){ return atomComponent; } -function makeVariableComponent(doc, templateId, component, operator, variantDerivations){ +function makeVariableComponent(doc, templateId, component, operator, variantDerivations, variants){ let displayId = component.displayId + VARIABLE; const persistentId = templateId + DELIMITER + displayId; const variableComponent = doc.variableComponent(persistentId + DELIMITER + VERSION); @@ -130,14 +130,20 @@ function makeVariableComponent(doc, templateId, component, operator, variantDeri let compStr = component.displayId.split('_')[0]; if (atomMap[compStr]){ - let variants = atomMap[compStr].variants; - if (variants){ - variants.forEach(function(variant){ + let atomVariants = atomMap[compStr].variants; + if (atomVariants){ + atomVariants.forEach(function(variant){ variableComponent.addVariant(atomMap[variant].componentDefinition); }); } } + if(variants){ + variants.forEach(function(vt) { + variableComponent.addVariant(atomMap[vt].componentDefinition); + }); + } + if(variantDerivations){ variantDerivations.forEach(function(vd) { variableComponent.addVariantDerivation(vd); @@ -326,7 +332,7 @@ function traverseStack(doc, stack, componentDefStack){ tempVCStack.push({operator: key, component: component, variantDV:[cv]}); }else{ // else, this is a new componentDef for the root - componentDefStack.push({operator: key, componentDef: componentDefinition, variantDV: [cv]}); + componentDefStack.push({operator: key, componentDef: componentDefinition, variantDV: [cv], variants: []}); } // add template for the one-or-more to the temp stack @@ -335,16 +341,20 @@ function traverseStack(doc, stack, componentDefStack){ if (key === graph.ATOM){ let name = stackObj[key]; - const componentDefinition = makeComponentDefinition(doc, name); + let variants = []; + if (atomMap[name]){ + variants = atomMap[name].variants; + } + const componentDefinition = makeComponentDefinition(doc, name); //retrieve if (templateStack.length > 0){ // add component to the template const lastTemplate = templateStack[templateStack.length-1].template; const component = makeComponent(doc, componentDefinition, lastTemplate.persistentIdentity); lastTemplate.addComponent(component); - tempVCStack.push({operator: 'one', component: component}); + tempVCStack.push({operator: 'one', component: component, variants: variants}); }else{ - componentDefStack.push({operator: 'one', componentDef: componentDefinition, variantDV: []}); + componentDefStack.push({operator: 'one', componentDef: componentDefinition, variantDV: [], variants: variants}); } } @@ -359,7 +369,8 @@ function traverseStack(doc, stack, componentDefStack){ const lengthOfComponents = templateObj.template._components.length; for (let i=0; i< lengthOfComponents; i++){ let componentObj = tempVCStack.pop(); - const vc = makeVariableComponent(doc, cv.persistentIdentity, componentObj.component, componentObj.operator, componentObj.variantDV); + const vc = makeVariableComponent(doc, cv.persistentIdentity, componentObj.component, componentObj.operator, + componentObj.variantDV); cv.addVariableComponent(vc); } } @@ -369,6 +380,7 @@ function traverseStack(doc, stack, componentDefStack){ orRegionCount += 1; let variantDerivations = []; + let orVariants = []; const componentDefinition = makeComponentDefinition(doc, orIdentity); if (templateStack.length > 0){ @@ -378,41 +390,47 @@ function traverseStack(doc, stack, componentDefStack){ lastTemplate.addComponent(component); // keep track of components within another template - tempVCStack.push({operator: 'one', component: component, variantDV: variantDerivations}); + tempVCStack.push({operator: 'one', component: component, variantDV: variantDerivations, variants: orVariants}); }else{ // else this is a new componentDef for the root - componentDefStack.push({operator: 'one', componentDef: componentDefinition, variantDV: variantDerivations}); + componentDefStack.push({operator: 'one', componentDef: componentDefinition, variantDV: variantDerivations, variants: orVariants}); } - //const templateComponentDefinition = makeComponentDefinition(doc, orIdentity, true); - //templateStack.push({id: [key], operator: 'one', template: templateComponentDefinition}); - let orSubRegionCount = 1; - stackObj[key].forEach(function (orRegion){ - let orSubIdentity = orIdentity + ORSUBREGION + orSubRegionCount; - orSubRegionCount += 1; - const orSubunitTemplateCD = makeComponentDefinition(doc, orSubIdentity, true); - const cv = makeCombinatorialDerivation(doc, orSubunitTemplateCD); - variantDerivations.push(cv); - - let cdStack = []; - let orStack = traverseStack(doc, orRegion, cdStack); - let componentObjs = []; - orStack.componentDefs.forEach(function(componentDefObj){ - const component = makeComponent(doc, componentDefObj.componentDef, orSubunitTemplateCD.persistentIdentity); - componentObjs.push({operator: componentDefObj.operator, component: component, variantDV: componentDefObj.variantDV}); - }); - - if (componentObjs.length > 0){ - addComponentsToTemplate(doc, orSubunitTemplateCD, componentObjs); - addVariableComponentsToCV(doc, cv, componentObjs); + for (let orRegion of stackObj[key]){ + let orStack = []; + traverseStack(doc, orRegion, orStack); + + if (orStack.length === 1 && orStack[0].operator === 'one'){ + orVariants.push(...orStack[0].variants); } - }); + + else { + console.log(orStack); + let orSubIdentity = orIdentity + ORSUBREGION + orSubRegionCount; + orSubRegionCount += 1; + const orSubunitTemplateCD = makeComponentDefinition(doc, orSubIdentity, true); + let componentObjs = []; + for(let componentDefObj of orStack){ + const component = makeComponent(doc, componentDefObj.componentDef, orSubunitTemplateCD.persistentIdentity); + componentObjs.push({operator: componentDefObj.operator, component: component, + variantDV: componentDefObj.variantDV, variants: componentDefObj.variants}); + } + + const cv = makeCombinatorialDerivation(doc, orSubunitTemplateCD); + variantDerivations.push(cv); + + if(componentObjs.length > 0){ + addComponentsToTemplate(doc, orSubunitTemplateCD, componentObjs); + addVariableComponentsToCV(doc, cv, componentObjs); + } + } + } } } }); - return {componentDefs: componentDefStack} + return componentDefStack } @@ -432,7 +450,7 @@ function addVariableComponentsToCV(doc, templateCV, componentObjs){ componentObjs.forEach(function (componentObj){ const variableComponent = makeVariableComponent(doc, templateCV.persistentIdentity, componentObj.component, componentObj.operator, - componentObj.variantDV); + componentObj.variantDV, componentObj.variants); templateCV.addVariableComponent(variableComponent); }); } @@ -470,16 +488,15 @@ function generateCombinatorialSBOL(stateGraph, categories, designName){ populateStack(stateGraph, stack, rootId); //create a new stack from the graph that's better for SBOL structure console.log(JSON.stringify(stack, null, 2)); - let componentDefStack = []; // for root to make components - let sbolStack = traverseStack(doc, stack, componentDefStack); - console.log(sbolStack); - + let sbolStack = []; + traverseStack(doc, stack, sbolStack); const rootComponentDefinition = makeComponentDefinition(doc, designName, false, true); let componentObjs = []; - sbolStack.componentDefs.forEach(function(componentDefObj){ + for(let componentDefObj of sbolStack){ const component = makeComponent(doc, componentDefObj.componentDef, rootComponentDefinition.persistentIdentity); - componentObjs.push({operator: componentDefObj.operator, component: component, variantDV: componentDefObj.variantDV}); - }); + componentObjs.push({operator: componentDefObj.operator, component: component, + variantDV: componentDefObj.variantDV, variants: componentDefObj.variants}); + } //Create combinatorial derivation for the root template const rootCV = makeCombinatorialDerivation(doc, rootComponentDefinition); From 3076903072cb9ab9ad6362f72e0dc7aeabebbffe Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Fri, 2 Nov 2018 15:50:59 -0400 Subject: [PATCH 18/32] collapse SBOL-MORE if there is only one component under it --- lib/constellation.js | 1 + lib/sbol.js | 90 +++++++++++++++++++++++++++++--------------- 2 files changed, 61 insertions(+), 30 deletions(-) diff --git a/lib/constellation.js b/lib/constellation.js index e564629..b8fa1f6 100644 --- a/lib/constellation.js +++ b/lib/constellation.js @@ -60,6 +60,7 @@ const constellation = function (designName, langText, categories, numDesigns, ma sbolDoc = sbol(graSBOL, categories, designName); console.log(sbolDoc); } catch (error) { + console.log(error); throw new Error('SBOL generation error!') } diff --git a/lib/sbol.js b/lib/sbol.js index 48c3cca..9905a25 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -128,16 +128,6 @@ function makeVariableComponent(doc, templateId, component, operator, variantDeri variableComponent.variable = component; variableComponent.operator = OPERATOR_URIS[operator]; - let compStr = component.displayId.split('_')[0]; - if (atomMap[compStr]){ - let atomVariants = atomMap[compStr].variants; - if (atomVariants){ - atomVariants.forEach(function(variant){ - variableComponent.addVariant(atomMap[variant].componentDefinition); - }); - } - } - if(variants){ variants.forEach(function(vt) { variableComponent.addVariant(atomMap[vt].componentDefinition); @@ -309,34 +299,73 @@ function traverseOr(stack, tempStack, stateGraph, id, endIds){ return lastEdge; //the last node of the OR chain } +function collapseStack(stack){ + + if(stack.length > 2){ + for(let i=0; i 0){ + // add component to the template + const lastTemplate = templateStack[templateStack.length-1].template; + const component = makeComponent(doc, componentDefinition, lastTemplate.persistentIdentity); + lastTemplate.addComponent(component); + + tempVCStack.push({operator: key, component: component, variants: variants}); + }else{ + componentDefStack.push({operator: key, componentDef: componentDefinition, variantDV: [], variants: variants}); + } + } - if (templateStack.length > 0){ - // if there's already a template on the stack, then add component to the template - const lastTemplate = templateStack[templateStack.length-1].template; - const component = makeComponent(doc, componentDefinition, lastTemplate.persistentIdentity); - lastTemplate.addComponent(component); + else{ + let identity = CYCLEREGION + cycleRegionCount; + cycleRegionCount += 1; + const componentDefinition = makeComponentDefinition(doc, identity); + const templateCD = makeComponentDefinition(doc, identity, true); + const cv = makeCombinatorialDerivation(doc, templateCD); + + if (templateStack.length > 0){ + // if there's already a template on the stack, then add component to the template + const lastTemplate = templateStack[templateStack.length-1].template; + const component = makeComponent(doc, componentDefinition, lastTemplate.persistentIdentity); + lastTemplate.addComponent(component); + + tempVCStack.push({operator: key, component: component, variantDV:[cv]}); + }else{ + // else, this is a new componentDef for the root + componentDefStack.push({operator: key, componentDef: componentDefinition, variantDV: [cv], variants: []}); + } - tempVCStack.push({operator: key, component: component, variantDV:[cv]}); - }else{ - // else, this is a new componentDef for the root - componentDefStack.push({operator: key, componentDef: componentDefinition, variantDV: [cv], variants: []}); + // add template for the one-or-more to the temp stack + templateStack.push({id: stackObj[key], operator: key, template: templateCD, combDV: cv}); } - - // add template for the one-or-more to the temp stack - templateStack.push({id: stackObj[key], operator: key, template: templateCD, combDV: cv}); } if (key === graph.ATOM){ @@ -370,7 +399,7 @@ function traverseStack(doc, stack, componentDefStack){ for (let i=0; i< lengthOfComponents; i++){ let componentObj = tempVCStack.pop(); const vc = makeVariableComponent(doc, cv.persistentIdentity, componentObj.component, componentObj.operator, - componentObj.variantDV); + componentObj.variantDV, componentObj.variants); cv.addVariableComponent(vc); } } @@ -402,11 +431,11 @@ function traverseStack(doc, stack, componentDefStack){ traverseStack(doc, orRegion, orStack); if (orStack.length === 1 && orStack[0].operator === 'one'){ + console.log(orStack); orVariants.push(...orStack[0].variants); } else { - console.log(orStack); let orSubIdentity = orIdentity + ORSUBREGION + orSubRegionCount; orSubRegionCount += 1; const orSubunitTemplateCD = makeComponentDefinition(doc, orSubIdentity, true); @@ -486,10 +515,11 @@ function generateCombinatorialSBOL(stateGraph, categories, designName){ const rootId = getRootId(stateGraph); let stack = []; populateStack(stateGraph, stack, rootId); //create a new stack from the graph that's better for SBOL structure - console.log(JSON.stringify(stack, null, 2)); let sbolStack = []; traverseStack(doc, stack, sbolStack); + console.log(JSON.stringify(stack, null, 2)); + const rootComponentDefinition = makeComponentDefinition(doc, designName, false, true); let componentObjs = []; for(let componentDefObj of sbolStack){ From da31fa35e983a4e5c90b7e085c7339b6a40d59da Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Sat, 3 Nov 2018 11:52:12 -0400 Subject: [PATCH 19/32] fixed bug for detecting MORE nested inside OR --- lib/sbol.js | 85 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 28 deletions(-) diff --git a/lib/sbol.js b/lib/sbol.js index 9905a25..41fefd8 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -159,8 +159,13 @@ function makeSequenceConstraint(doc, templateCD, subject, object){ return sequenceConstraint } - -// breadth width search +/** + * breadth width search of the state graph + * to create a structure that is better for SBOL generation + * @param stateGraph constellation graph for visualization + * @param stack structure that SBOL is generated from + * @param id the id to start the traverse from + */ function populateStack(stateGraph, stack, id){ let endIds = []; //prevent redundant ends let queue = []; @@ -222,12 +227,26 @@ function populateStack(stateGraph, stack, id){ } } - -//depth first search for OR -function traverseOr(stack, tempStack, stateGraph, id, endIds){ +/** + * The OR operator must be done depth first + * @param stack the original stack + * @param tempStack the stack within the or + * @param stateGraph + * @param id the edge that the traverse starts from + * @param endIds cycles create redundant ends for the stack, this prevents that + * @param moreStartId for MORE operators within the OR + * @returns {*} + */ +function traverseOr(stack, tempStack, stateGraph, id, endIds, moreStartId){ let lastEdge; stateGraph[id].visited = true; + if (stateGraph[id].operator.length === 1 && + (stateGraph[id].operator[0] === graph.ONE_MORE || + stateGraph[id].operator[0] === graph.ZERO_SBOL)){ + moreStartId = id; + } + if (stateGraph[id].type === graph.ATOM){ tempStack.push({atom: stateGraph[id].text}); for (let operation of stateGraph[id].operator){ @@ -240,7 +259,7 @@ function traverseOr(stack, tempStack, stateGraph, id, endIds){ lastEdge = traverseOr(tempStack, tempStackX, stateGraph, edge, endIds); orStack.push(tempStackX); }); - } else{ + } else { tempStack.push({[operation]: id}); } } @@ -260,7 +279,8 @@ function traverseOr(stack, tempStack, stateGraph, id, endIds){ lastEdge = traverseOr(tempStack, tempStackX, stateGraph, edge, endIds); orStack.push(tempStackX); }); - } else{ + } + else { tempStack.push({[operation]: id}); } } @@ -276,31 +296,36 @@ function traverseOr(stack, tempStack, stateGraph, id, endIds){ if (stateGraph[edge].type === graph.ACCEPT){ continue; } - if (stateGraph[edge].visited && stateGraph[edge].edges.includes(id)){ - if (!endIds.includes(edge)){ - tempStack.push({end: edge}); - endIds.push(edge); - } - continue; - } + if (stateGraph[edge].visited){ - if (stateGraph[edge].operator.includes(graph.ONE_MORE) - || stateGraph[edge].operator.includes(graph.ZERO_SBOL)){ + // if the MORE started within the OR, then end it on the tempStack + // else end it on the original stack + + if (edge === moreStartId){ + if (!endIds.includes(edge)){ + tempStack.push({end: edge}); + endIds.push(edge); + } + } + else if (stateGraph[edge].operator.includes(graph.ONE_MORE) + || stateGraph[edge].operator.includes(graph.ZERO_SBOL)){ if (!endIds.includes(edge)){ stack.push({end: edge}); endIds.push(edge); - } //end the 'mores' on the original stack + } } continue; } - - lastEdge = traverseOr(stack, tempStack, stateGraph, edge, endIds); + lastEdge = traverseOr(stack, tempStack, stateGraph, edge, endIds, moreStartId); } return lastEdge; //the last node of the OR chain } +/** + * Collapses the stack when there is only one atom inside a MORE + * @param stack + */ function collapseStack(stack){ - if(stack.length > 2){ for(let i=0; i 0){ + addVariableComponentsToCV(doc, cv, componentObjs); } } @@ -431,7 +462,6 @@ function traverseStack(doc, stack, componentDefStack){ traverseStack(doc, orRegion, orStack); if (orStack.length === 1 && orStack[0].operator === 'one'){ - console.log(orStack); orVariants.push(...orStack[0].variants); } @@ -458,8 +488,6 @@ function traverseStack(doc, stack, componentDefStack){ } } }); - - return componentDefStack } @@ -515,6 +543,7 @@ function generateCombinatorialSBOL(stateGraph, categories, designName){ const rootId = getRootId(stateGraph); let stack = []; populateStack(stateGraph, stack, rootId); //create a new stack from the graph that's better for SBOL structure + console.log(JSON.stringify(stack, null, 2)); let sbolStack = []; traverseStack(doc, stack, sbolStack); From 497d2b3410c3bdd8dc55ff73e4396a39ad41d638 Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Sat, 3 Nov 2018 13:39:20 -0400 Subject: [PATCH 20/32] fixed zero-or-more pattern match bug --- lib/constellation.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/constellation.js b/lib/constellation.js index b8fa1f6..379e55f 100644 --- a/lib/constellation.js +++ b/lib/constellation.js @@ -45,7 +45,8 @@ const constellation = function (designName, langText, categories, numDesigns, ma try { parsed = parseGoldbar(langText); - parsedSBOL = parseGoldbar(langText.replace('zero-or-more', 'zero-or-more-sbol')); + //must use regex for pattern! If pattern is a string, only the first occurrence will be replaced + parsedSBOL = parseGoldbar(langText.replace(/zero-or-more/gi, 'zero-or-more-sbol')); categories = parseCategories(categories); } catch (error) { throw new Error('Parsing error!') @@ -56,12 +57,12 @@ const constellation = function (designName, langText, categories, numDesigns, ma designs = designEnumeration(gra.paths, categories, numDesigns); try { + console.log(graSBOL); designName = String(designName).replace(/ /g, '_'); sbolDoc = sbol(graSBOL, categories, designName); console.log(sbolDoc); } catch (error) { console.log(error); - throw new Error('SBOL generation error!') } return {stateGraph: gra.stateGraph, designs: designs, paths: gra.paths, sbol: sbolDoc}; From 76b0180c2443ea7d49a27215c1713e623f240d5f Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Fri, 9 Nov 2018 13:20:12 -0500 Subject: [PATCH 21/32] remove check on valid SBOL terms --- lib/designEnumeration.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/designEnumeration.js b/lib/designEnumeration.js index 84c7bc0..6de7d37 100644 --- a/lib/designEnumeration.js +++ b/lib/designEnumeration.js @@ -50,9 +50,9 @@ function generateDesigns(paths, categories) { for (let j = 0; j < path.length; j++) { const tempNode = path[j].text; - if (!(tempNode in SBOLDocument.terms)) { - throw new Error(`${tempNode} is not a valid SBOL part`); - } + // if (!(tempNode in SBOLDocument.terms)) { + // throw new Error(`${tempNode} is not a valid SBOL part`); + // } if (!(tempNode in categories)) { throw new Error(`${tempNode} is not defined in categories`); } From bfb9f057933441922da69455449b9eb552e1be05 Mon Sep 17 00:00:00 2001 From: lucyq Date: Fri, 16 Nov 2018 16:50:05 -0500 Subject: [PATCH 22/32] created new file for sbol tests --- lib/constellation.js | 2 -- lib/sbol.js | 2 -- test/sbolTests.js | 4 ++++ test/test.js | 2 ++ 4 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 test/sbolTests.js diff --git a/lib/constellation.js b/lib/constellation.js index 379e55f..18807ea 100644 --- a/lib/constellation.js +++ b/lib/constellation.js @@ -57,10 +57,8 @@ const constellation = function (designName, langText, categories, numDesigns, ma designs = designEnumeration(gra.paths, categories, numDesigns); try { - console.log(graSBOL); designName = String(designName).replace(/ /g, '_'); sbolDoc = sbol(graSBOL, categories, designName); - console.log(sbolDoc); } catch (error) { console.log(error); } diff --git a/lib/sbol.js b/lib/sbol.js index 41fefd8..50129ad 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -543,11 +543,9 @@ function generateCombinatorialSBOL(stateGraph, categories, designName){ const rootId = getRootId(stateGraph); let stack = []; populateStack(stateGraph, stack, rootId); //create a new stack from the graph that's better for SBOL structure - console.log(JSON.stringify(stack, null, 2)); let sbolStack = []; traverseStack(doc, stack, sbolStack); - console.log(JSON.stringify(stack, null, 2)); const rootComponentDefinition = makeComponentDefinition(doc, designName, false, true); let componentObjs = []; diff --git a/test/sbolTests.js b/test/sbolTests.js new file mode 100644 index 0000000..8edfcec --- /dev/null +++ b/test/sbolTests.js @@ -0,0 +1,4 @@ + +module.exports = function() { + +}; \ No newline at end of file diff --git a/test/test.js b/test/test.js index 7ee0a36..f91faf6 100644 --- a/test/test.js +++ b/test/test.js @@ -3,7 +3,9 @@ // const graphTests = require('./graphTests'); const enumerationTests = require('./enumerationTests'); const constellationTests = require('./constellationTests'); +const sbolTests = require('./sbolTests'); constellationTests(); enumerationTests(); // graphTests(); +sbolTests(); \ No newline at end of file From 4858814b3a1bc0f87804d2d948a03052817ec005 Mon Sep 17 00:00:00 2001 From: lucyq Date: Fri, 16 Nov 2018 17:31:25 -0500 Subject: [PATCH 23/32] added basic tests and favicon --- demos/static/client.html | 3 +- demos/static/favicon.png | Bin 0 -> 948 bytes output.txt | 130 +++++++++++++++++++++++++++++++++++++++ test/sbolTests.js | 32 +++++++++- 4 files changed, 163 insertions(+), 2 deletions(-) create mode 100644 demos/static/favicon.png create mode 100644 output.txt diff --git a/demos/static/client.html b/demos/static/client.html index 873ca90..0e0089a 100644 --- a/demos/static/client.html +++ b/demos/static/client.html @@ -7,7 +7,8 @@ - + + diff --git a/demos/static/favicon.png b/demos/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..0fb33a51a96f7536594737b01aa235884bbbbe90 GIT binary patch literal 948 zcmV;l155mgP)bd;~p(9gZw-nesrt;vi87wiD`~V~( z{{b>uMT#>rpkymsg2Y}jd4*rlWGw^Lb+3`}2fSzBi>e+83B~659iRL0?#bD9yM_M& zh7O0#Y~0$+#+`qW_d!KAv+)%GB%hC&%kKd20sv2@?S_67kGi1W>CTo_({U|mt^)+GU?+)q++ z2SYcOHE~ryB2gmSmvnJYFC+#MX$cb9I|cZG^@)_IOCmw&2UZ-uhEP}~$ZmMZNCIdr zTocZI|M)I_YHXXfwx zq>w&Va3*;U2Gw*aoa|U{Pz+0i*ZP$6Ns{b+fwi+$YF%<43t}Rq$_?YXcc$%SkKK~F zINz0D)AmL*;nl^1X?sNqONQA~(Wr|dabI!4ThsQ2Wf%RxdK0K#Xo56y4Urs?wq^mq zd%K575RP51f_Tt6W(PH>5ERWUbBg;g)xD3x4=m0h?sd>x#ErI=)7YF$6VIztFsiPp zA%>Cb>=Hk9l&>;WrGX*U8uS*c%0!63NYnSaP6#oO$&I_(hsNe)iaGSCK?3OB=jLRJ z+H|5#JAy>+G5(O?bl+TQ7BdX#F_l5o;ly)-2vbV{u<1eM{2yCUiiRva_Q z-eAQAt%gV&sH4n{1PQ3p*(2A%*zQ*Fz1orMNX#`c>e@kAbrL%$>xk@pFYyxs0Q><1 WX*k~S constellation-js@1.0.0 test /Users/lucyqin/Documents/hicsail/constellation-js +> nyc mocha + + + + Basic operators + ✓ atom + ✓ or + ✓ then + ✓ then as dot + ✓ one-or-more + ✓ zero-or-more + + Chained expressions + ✓ Multiple then + ✓ Multiple or + ✓ Multiple one-or-more + ✓ Multiple zero-or-more + ✓ Mixing functions + ✓ Then downstream from cycle + + Cycles + ✓ Atom + ✓ Linear operators + ✓ one-or-more + ✓ zero-or-more + ✓ Multiple one-or-more + ✓ Multiple zero-or-more + ✓ Then downstream from cycle + + Sanitise specification input + ✓ Atom not in categories + ✓ Mismatched brackets + ✓ Empty specification + Invalid characters + ✓ Tabs used should not throw errors + ✓ _ + + Sanitise category input + ✓ Empty categories + ✓ Handle defined but empty category + ✓ Mismatched brackets + Invalid characters + ✓ Whitespace should not be included in designs + ✓ Other symbols should be parsed into category + + Design enumeration + ✓ Enumerate designs for one atom + ✓ Handle defined but empty category + ✓ Handle empty categories + ✓ Handle undefined atom + ✓ Enumerate all duplicates in category + Number of designs chosen + ✓ Select 1 of 2 designs + ✓ Select 0 designs + + Cartesian product tests + ✓ Empty setA + ✓ Empty setB + ✓ Product test + + SBOL Generation: basic operators + + + + +rbs +1 + + + + +a1 +1 + + + + +a2 +1 + + + + +design +1 + + + + +rbs_component +1 + + + + + + + +design_combinatorial_derivation +1 + + + + +rbs_component_variable +1 + + + + + + + + + ✓ atom + + + 40 passing (111ms) + +----------------------|----------|----------|----------|----------|-------------------| +File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s | +----------------------|----------|----------|----------|----------|-------------------| +All files | 90.69 | 80.08 | 88.14 | 90.82 | | + constellation.js | 84.62 | 52.94 | 100 | 84.62 | 26,29,32,35,41,63 | + designEnumeration.js | 94.44 | 82.14 | 100 | 94.44 | 19,25,45 | + graph.js | 96.26 | 87.5 | 90 | 96.26 |... 38,539,540,542 | + sbol.js | 87.03 | 79.03 | 82.14 | 87.26 |... 48,449,450,453 | +----------------------|----------|----------|----------|----------|-------------------| diff --git a/test/sbolTests.js b/test/sbolTests.js index 8edfcec..3c94cf8 100644 --- a/test/sbolTests.js +++ b/test/sbolTests.js @@ -1,4 +1,34 @@ +const constellation = require('../lib/constellation'); +const expect = require('chai').expect; + +var DESIGN_NAME = 'design'; +const CATEGORIES = '{"rbs":["a1","a2"],"cds":["b1","b2","b3"],"promoter":["c1"], "terminator": ["t"]}'; + +function trim(str) { + return str.replace(/\s/g, "X"); + +} + + module.exports = function() { +// +describe('SBOL Generation: basic operators', function() { + it('atom', function() { + let result = constellation(DESIGN_NAME, 'rbs', CATEGORIES, 10, 0); + expect(trim(result.sbol)).to.equal('XXXXXXXXXXXXXXrbsXXXXX1XXXXXXXXXXXXXXXXXXXXXa1XXXXX1XXXXXXXXXXXXXXXXXXXXXa2XXXXX1XXXXXXXXXXXXXXXXXXXXXdesignXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXrbs_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXrbs_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); + }); +}); + +describe('SBOL Generation: combination specs', function() { + it('one-or-more (promoter or rbs) then (zero-or-more cds) then terminator', function() { + let result = constellation(DESIGN_NAME, 'one-or-more (promoter or rbs) then (zero-or-more cds) then terminator', CATEGORIES, 10, 0); + expect(trim(result.sbol)).to.equal('XXXXXXXXXXXXXXpromoterXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXc1XXXXX1XXXXXXXXXXXXXXXXXXXXXrbsXXXXX1XXXXXXXXXXXXXXXXXXXXXa1XXXXX1XXXXXXXXXXXXXXXXXXXXXa2XXXXX1XXXXXXXXXXXXXXXXXXXXXcdsXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXb1XXXXX1XXXXXXXXXXXXXXXXXXXXXb2XXXXX1XXXXXXXXXXXXXXXXXXXXXb3XXXXX1XXXXXXXXXXXXXXXXXXXXXterminatorXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXtXXXXX1XXXXXXXXXXXXXXXXXXXXXcyclical_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXcyclical_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXdesignXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcds_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXterminator_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_sequence_constraint1XXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_sequence_constraint2XXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcds_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXterminator_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') + }); + + it('', function() { + + }); +}); -}; \ No newline at end of file +} \ No newline at end of file From a371fc304809346dab1c4e7fff124dfbeddb7e71 Mon Sep 17 00:00:00 2001 From: lucyq Date: Fri, 16 Nov 2018 17:38:49 -0500 Subject: [PATCH 24/32] added additional test --- demos/static/js/client.js | 1 + package.json | 2 +- test/sbolTests.js | 5 ++++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/demos/static/js/client.js b/demos/static/js/client.js index 29b2556..defd605 100644 --- a/demos/static/js/client.js +++ b/demos/static/js/client.js @@ -406,6 +406,7 @@ $(document).ready(function() { "name": "specificationname", "clientid": "userid" }, function (data) { + console.log(data) displayDiagram(data.stateGraph); // Undefined design if (String(data.designs).includes('is not defined')) { diff --git a/package.json b/package.json index ec95abf..e441c72 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Constellation is a tool for parsing a language specifying genetic parts and their relationships", "main": "constellation.js", "scripts": { - "test": "nyc mocha", + "test": "nyc mocha --timeout 200000", "coverage": "nyc report --reporter=text-lcov | coveralls" }, "repository": { diff --git a/test/sbolTests.js b/test/sbolTests.js index 3c94cf8..85dd053 100644 --- a/test/sbolTests.js +++ b/test/sbolTests.js @@ -26,7 +26,10 @@ describe('SBOL Generation: combination specs', function() { expect(trim(result.sbol)).to.equal('XXXXXXXXXXXXXXpromoterXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXc1XXXXX1XXXXXXXXXXXXXXXXXXXXXrbsXXXXX1XXXXXXXXXXXXXXXXXXXXXa1XXXXX1XXXXXXXXXXXXXXXXXXXXXa2XXXXX1XXXXXXXXXXXXXXXXXXXXXcdsXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXb1XXXXX1XXXXXXXXXXXXXXXXXXXXXb2XXXXX1XXXXXXXXXXXXXXXXXXXXXb3XXXXX1XXXXXXXXXXXXXXXXXXXXXterminatorXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXtXXXXX1XXXXXXXXXXXXXXXXXXXXXcyclical_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXcyclical_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXdesignXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcds_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXterminator_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_sequence_constraint1XXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_sequence_constraint2XXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcds_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXterminator_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') }); - it('', function() { + it('Spec for paper', function() { + let result = constellation(DESIGN_NAME, 'one-or-more(one-or-more(promoter then cds)then cds then (zero-or-more (cds or (one-or-more (cds then promoter then cds) then cds)) then (terminator or (terminator then cds) or (cds then terminator)))))', CATEGORIES, 10, 0); + + // currently result.sbol is undefined }); }); From 5188c7cb6062c174b99ba223156e36d76473723e Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Fri, 23 Nov 2018 16:07:47 -0500 Subject: [PATCH 25/32] refactoring --- lib/sbol.js | 366 +++++++++++++++++++++------------------------- test/sbolTests.js | 6 +- 2 files changed, 169 insertions(+), 203 deletions(-) diff --git a/lib/sbol.js b/lib/sbol.js index 50129ad..6786544 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -22,18 +22,21 @@ const CYCLEREGION = 'cyclical_unit'; const OPERATOR_URIS = { [graph.ZERO_SBOL]: 'http://sbols.org/v2#zeroOrMore', - 'one': 'http://sbols.org/v2#one', + one: 'http://sbols.org/v2#one', [graph.ONE_MORE]: 'http://sbols.org/v2#oneOrMore' }; const SEQUENCE_CONSTRAINT_URIS = { - 'PRECEDE': 'http://sbols.org/v2#precedes', - 'SAMEORIENTATION': 'http://sbols.org/v2#sameOrientationAs', - 'OPPOSITEORIENTATION': 'http://sbols.org/v2#oppositeOrientationAs', - 'DIFFERENT': 'http://sbols.org/v2#differentFrom' + PRECEDE: 'http://sbols.org/v2#precedes', + SAMEORIENTATION: 'http://sbols.org/v2#sameOrientationAs', + OPPOSITEORIENTATION: 'http://sbols.org/v2#oppositeOrientationAs', + DIFFERENT: 'http://sbols.org/v2#differentFrom' }; +/**************** + * HELPERS + ****************/ function getRootId(stateGraph){ for (let id in stateGraph) { if (stateGraph[id].type === graph.ROOT){ @@ -42,6 +45,98 @@ function getRootId(stateGraph){ } } +/** + * Collapses the stack when there is only one atom inside a MORE + * @param stack + */ +function collapseStack(stack){ + if(stack.length > 2){ + for(let i=0; i 0){ + // if there's already a template on the stack, then add component to the template + const lastTemplate = stacks.templates[stacks.templates.length-1].template; + const component = makeComponent(doc, componentDefinition, lastTemplate.persistentIdentity); + lastTemplate.addComponent(component); + stacks.variantComponents.push(createVariantComponentObj(operator, component, variantDerivations, variants)); + }else{ + // else, this is a new componentDef for the root + stacks.componentDefs.push(createComponentDefObj(operator, componentDefinition, variantDerivations, variants)); + } +} + +function addComponentsAndRestraintsToTemplate(doc, templateCD, componentDefStack){ + const cv = makeCombinatorialDerivation(doc, templateCD); + let subject; + let object; + + for(let componentDefObj of componentDefStack){ + const component = makeComponent(doc, componentDefObj.componentDef, templateCD.persistentIdentity); + const variableComponent = makeVariableComponent(doc, cv.persistentIdentity, component, componentDefObj.operator, + componentDefObj.variantDVs, componentDefObj.variants); + templateCD.addComponent(component); + cv.addVariableComponent(variableComponent); + + object = component; + if (subject && object){ + const sequenceConstraint = makeSequenceConstraint(doc, templateCD, subject, object); + templateCD.addSequenceConstraint(sequenceConstraint); + } + subject = object; + } + return cv; +} + +function createVariantComponentObj(operator, component, variantDVs, variants){ + return { + operator: operator, + component: component, + variantDVs: variantDVs, + variants: variants + } +} + +function createComponentDefObj(operator, componentDef, variantDVs, variants){ + return { + operator: operator, + componentDef: componentDef, + variantDVs: variantDVs, + variants: variants + } +} + +function createTemplateObj(operator, template, combDV, id){ + return { + operator: operator, + template: template, //component definition + combDV: combDV, //combinatorial derivation + id: id + } +} + +/**************** + * SBOL HELPERS + ****************/ function makeCombinatorialDerivation(doc, templateComponentDefinition){ const displayId = templateComponentDefinition.displayId + COMBINATORIAL; const persistentId = templateComponentDefinition.persistentIdentity + DELIMITER + displayId; @@ -56,7 +151,7 @@ function makeCombinatorialDerivation(doc, templateComponentDefinition){ /* temporary function so that atoms/variants are consistent -TODO fetch from SBH +TODO remove after we can fetch from SBH */ function makeAtomComponentDefinition(doc, name){ const prefix = 'http://constellationcad.org/generic_definition/'; @@ -159,6 +254,9 @@ function makeSequenceConstraint(doc, templateCD, subject, object){ return sequenceConstraint } + + + /** * breadth width search of the state graph * to create a structure that is better for SBOL generation @@ -166,7 +264,7 @@ function makeSequenceConstraint(doc, templateCD, subject, object){ * @param stack structure that SBOL is generated from * @param id the id to start the traverse from */ -function populateStack(stateGraph, stack, id){ +function makeStackFromStateGraph(stateGraph, stack, id){ let endIds = []; //prevent redundant ends let queue = []; queue.push(id); @@ -321,203 +419,87 @@ function traverseOr(stack, tempStack, stateGraph, id, endIds, moreStartId){ return lastEdge; //the last node of the OR chain } -/** - * Collapses the stack when there is only one atom inside a MORE - * @param stack - */ -function collapseStack(stack){ - if(stack.length > 2){ - for(let i=0; i 0){ - // add component to the template - const lastTemplate = templateStack[templateStack.length-1].template; - const component = makeComponent(doc, componentDefinition, lastTemplate.persistentIdentity); - lastTemplate.addComponent(component); - - tempVCStack.push({operator: key, component: component, variants: variants}); - }else{ - componentDefStack.push({operator: key, componentDef: componentDefinition, variantDV: [], variants: variants}); + let orSubRegionCount = 1; + for (let orRegion of stackObj[key]){ + let orStack = []; + makeSBOLFromStack(doc, orRegion, orStack); + if (orStack.length === 1 && orStack[0].operator === 'one'){ + orVariants.push(...orStack[0].variants); + } else { + let orSubIdentity = orIdentity + ORSUBREGION + orSubRegionCount; + orSubRegionCount += 1; + const orTemplate = makeComponentDefinition(doc, orSubIdentity, true); + const cv = addComponentsAndRestraintsToTemplate(doc, orTemplate, orStack); + variantDerivations.push(cv); } } - - else{ + break; + case graph.ONE_MORE: //fall through + case graph.ZERO_SBOL: + // only one atom within the -or-more operator + if (Array.isArray(stackObj[key])){ + addToStacks(doc, stacks, stackObj[key][0], key, null, null); + } else{ let identity = CYCLEREGION + cycleRegionCount; cycleRegionCount += 1; - const componentDefinition = makeComponentDefinition(doc, identity); const templateCD = makeComponentDefinition(doc, identity, true); const cv = makeCombinatorialDerivation(doc, templateCD); - - if (templateStack.length > 0){ - // if there's already a template on the stack, then add component to the template - const lastTemplate = templateStack[templateStack.length-1].template; - const component = makeComponent(doc, componentDefinition, lastTemplate.persistentIdentity); - lastTemplate.addComponent(component); - - tempVCStack.push({operator: key, component: component, variantDV:[cv]}); - }else{ - // else, this is a new componentDef for the root - componentDefStack.push({operator: key, componentDef: componentDefinition, variantDV: [cv], variants: []}); - } - - // add template for the one-or-more to the temp stack - templateStack.push({id: stackObj[key], operator: key, template: templateCD, combDV: cv}); - } - } - - if (key === graph.ATOM){ - let name = stackObj[key]; - let variants = []; - if (atomMap[name]){ - variants = atomMap[name].variants; + addToStacks(doc, stacks, identity, key, [cv], null); + stacks.templates.push(createTemplateObj(key, templateCD, cv, stackObj[key])); } - const componentDefinition = makeComponentDefinition(doc, name); //retrieve - if (templateStack.length > 0){ - // add component to the template - const lastTemplate = templateStack[templateStack.length-1].template; - const component = makeComponent(doc, componentDefinition, lastTemplate.persistentIdentity); - lastTemplate.addComponent(component); - - tempVCStack.push({operator: 'one', component: component, variants: variants}); - }else{ - componentDefStack.push({operator: 'one', componentDef: componentDefinition, variantDV: [], variants: variants}); - } - } - - if (key === 'end'){ + break; + case 'end': // remove the last template - const index = templateStack.indexOf(template => template.id === stackObj[key]); - const templateObj = templateStack.splice(index, 1)[0]; + const index = stacks.templates.indexOf(template => template.id === stackObj[key]); + const templateObj = stacks.templates.splice(index, 1)[0]; const cv = templateObj.combDV; // get length of components under the component and pop // the same number from the temp VariantComponent stack - let componentObjs = []; const lengthOfComponents = templateObj.template._components.length; for (let i=0; i< lengthOfComponents; i++){ - componentObjs.push(tempVCStack.pop()); - } - if(componentObjs.length > 0){ - addVariableComponentsToCV(doc, cv, componentObjs); - } - } - - if (key === graph.OR){ - let orIdentity = ORREGION + orRegionCount; - orRegionCount += 1; - - let variantDerivations = []; - let orVariants = []; - const componentDefinition = makeComponentDefinition(doc, orIdentity); - - if (templateStack.length > 0){ - // if there's already a template on the stack, then add component to the template - const lastTemplate = templateStack[templateStack.length-1].template; - const component = makeComponent(doc, componentDefinition, lastTemplate.persistentIdentity); - lastTemplate.addComponent(component); - - // keep track of components within another template - tempVCStack.push({operator: 'one', component: component, variantDV: variantDerivations, variants: orVariants}); - }else{ - // else this is a new componentDef for the root - componentDefStack.push({operator: 'one', componentDef: componentDefinition, variantDV: variantDerivations, variants: orVariants}); + const vc = stacks.variantComponents.pop(); + const variableComponent = makeVariableComponent(doc, cv.persistentIdentity, vc.component, vc.operator, vc.variantDVs, vc.variants); + cv.addVariableComponent(variableComponent); } - - let orSubRegionCount = 1; - for (let orRegion of stackObj[key]){ - let orStack = []; - traverseStack(doc, orRegion, orStack); - - if (orStack.length === 1 && orStack[0].operator === 'one'){ - orVariants.push(...orStack[0].variants); - } - - else { - let orSubIdentity = orIdentity + ORSUBREGION + orSubRegionCount; - orSubRegionCount += 1; - const orSubunitTemplateCD = makeComponentDefinition(doc, orSubIdentity, true); - let componentObjs = []; - for(let componentDefObj of orStack){ - const component = makeComponent(doc, componentDefObj.componentDef, orSubunitTemplateCD.persistentIdentity); - componentObjs.push({operator: componentDefObj.operator, component: component, - variantDV: componentDefObj.variantDV, variants: componentDefObj.variants}); - } - - const cv = makeCombinatorialDerivation(doc, orSubunitTemplateCD); - variantDerivations.push(cv); - - if(componentObjs.length > 0){ - addComponentsToTemplate(doc, orSubunitTemplateCD, componentObjs); - addVariableComponentsToCV(doc, cv, componentObjs); - } - } - } - } + break; } }); } -function addComponentsToTemplate(doc, templateComponentDefinition, componentObjs){ - templateComponentDefinition.addComponent(componentObjs[0].component); - for (let i=1; i 0){ - addComponentsToTemplate(doc, rootComponentDefinition, componentObjs); //including sequence constraints - addVariableComponentsToCV(doc, rootCV, componentObjs); - } + let stateStack = []; + makeStackFromStateGraph(stateGraph, stateStack, rootId); + console.log(JSON.stringify(stateStack, null, 2)); + + //use stateStack to generate SBOL + let componentDefStack = []; + makeSBOLFromStack(doc, stateStack, componentDefStack); + const rootTemplate = makeComponentDefinition(doc, designName, false, true); + addComponentsAndRestraintsToTemplate(doc, rootTemplate, componentDefStack); //clean up sequenceConstraintCount = 1; diff --git a/test/sbolTests.js b/test/sbolTests.js index 85dd053..9fbcd76 100644 --- a/test/sbolTests.js +++ b/test/sbolTests.js @@ -17,13 +17,13 @@ describe('SBOL Generation: basic operators', function() { it('atom', function() { let result = constellation(DESIGN_NAME, 'rbs', CATEGORIES, 10, 0); expect(trim(result.sbol)).to.equal('XXXXXXXXXXXXXXrbsXXXXX1XXXXXXXXXXXXXXXXXXXXXa1XXXXX1XXXXXXXXXXXXXXXXXXXXXa2XXXXX1XXXXXXXXXXXXXXXXXXXXXdesignXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXrbs_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXrbs_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); - }); + }); }); describe('SBOL Generation: combination specs', function() { it('one-or-more (promoter or rbs) then (zero-or-more cds) then terminator', function() { let result = constellation(DESIGN_NAME, 'one-or-more (promoter or rbs) then (zero-or-more cds) then terminator', CATEGORIES, 10, 0); - expect(trim(result.sbol)).to.equal('XXXXXXXXXXXXXXpromoterXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXc1XXXXX1XXXXXXXXXXXXXXXXXXXXXrbsXXXXX1XXXXXXXXXXXXXXXXXXXXXa1XXXXX1XXXXXXXXXXXXXXXXXXXXXa2XXXXX1XXXXXXXXXXXXXXXXXXXXXcdsXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXb1XXXXX1XXXXXXXXXXXXXXXXXXXXXb2XXXXX1XXXXXXXXXXXXXXXXXXXXXb3XXXXX1XXXXXXXXXXXXXXXXXXXXXterminatorXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXtXXXXX1XXXXXXXXXXXXXXXXXXXXXcyclical_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXcyclical_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXdesignXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcds_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXterminator_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_sequence_constraint1XXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_sequence_constraint2XXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcds_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXterminator_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') + expect(trim(result.sbol)).to.equal('XXXXXXXXXXXXXXpromoterXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXc1XXXXX1XXXXXXXXXXXXXXXXXXXXXrbsXXXXX1XXXXXXXXXXXXXXXXXXXXXa1XXXXX1XXXXXXXXXXXXXXXXXXXXXa2XXXXX1XXXXXXXXXXXXXXXXXXXXXcdsXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXb1XXXXX1XXXXXXXXXXXXXXXXXXXXXb2XXXXX1XXXXXXXXXXXXXXXXXXXXXb3XXXXX1XXXXXXXXXXXXXXXXXXXXXterminatorXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXtXXXXX1XXXXXXXXXXXXXXXXXXXXXcyclical_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXor_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXdesignXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcds_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXterminator_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_sequence_constraint1XXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_sequence_constraint2XXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcds_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXterminator_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); }); it('Spec for paper', function() { @@ -34,4 +34,4 @@ describe('SBOL Generation: combination specs', function() { }); }); -} \ No newline at end of file +} From 8a438d8fdcb91d05c0e550f532d480598a5d5143 Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Sat, 24 Nov 2018 15:31:37 -0500 Subject: [PATCH 26/32] fixed SBOL generation for example from paper --- lib/sbol.js | 205 ++++++++++++++++++++++------------------------------ 1 file changed, 85 insertions(+), 120 deletions(-) diff --git a/lib/sbol.js b/lib/sbol.js index 6786544..c26cfc1 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -71,7 +71,6 @@ function addToStacks(doc, stacks, name, operator, variantDerivations, variants){ variants = atomMap[name].variants; } } - const componentDefinition = makeComponentDefinition(doc, name); if (stacks.templates.length > 0){ // if there's already a template on the stack, then add component to the template @@ -261,83 +260,97 @@ function makeSequenceConstraint(doc, templateCD, subject, object){ * breadth width search of the state graph * to create a structure that is better for SBOL generation * @param stateGraph constellation graph for visualization - * @param stack structure that SBOL is generated from + * @param stateStack structure that SBOL is generated from * @param id the id to start the traverse from */ -function makeStackFromStateGraph(stateGraph, stack, id){ +function makeStackFromStateGraph(stateGraph, stateStack, id){ let endIds = []; //prevent redundant ends let queue = []; queue.push(id); - stateGraph[id].visited = true; while (queue.length !== 0){ let id = queue.shift(); - let lastEdge = ''; - stateGraph[id].operator.forEach(function (operation){ - if (operation === graph.OR){ - let orStack = []; - stack.push({[operation]: orStack}); - // get all edges of the OR first - stateGraph[id].edges.forEach(function (edge){ - let tempStack = []; - lastEdge = traverseOr(stack, tempStack, stateGraph, edge, endIds); - orStack.push(tempStack); - }); - } else { - stack.push({[operation]: id}); + + if (stateGraph[id].visited){ + if (stateGraph[id].type !== graph.ATOM + && !endIds.includes(id)){ + stateStack.push({end: id}); + endIds.push(id); } - }); + continue; + } + if (stateGraph[id].type === graph.ACCEPT){ + continue; + } + if (stateGraph[id].type === graph.ATOM){ + stateStack.push({atom: stateGraph[id].text}); + } + + let lastEdge = handleOperations(stateGraph, stateStack, id, endIds); + stateGraph[id].visited = true; if (lastEdge){ //from OR - stateGraph[lastEdge].operator.forEach(function (operation){ - stack.push({[operation]: lastEdge}); - }); id = lastEdge; + handleOperations(stateGraph, stateStack, id, endIds); + } + queue.push(...stateGraph[id].edges); + } +} + +function handleOperations(stateGraph, stack, id, endIds){ + let lastEdge; + for (let operation of stateGraph[id].operator){ + if (operation === graph.OR){ + lastEdge = traverseOr(stateGraph, stack, id, endIds); + } else { + stack.push({[operation]: id}); } - stateGraph[id].edges.forEach(function (edge){ - // the 'then' needs to be after the the previous operator ends - let thenObj; - if (stateGraph[edge].visited){ - if (stateGraph[edge].type !== graph.ATOM){ - if (Object.keys(stack[stack.length-1])[0] === graph.THEN){ - thenObj = stack.pop(); - } - if (!endIds.includes(edge)){ - stack.push({end: edge}); - endIds.push(edge); - } - if (thenObj){ - stack.push(thenObj); - thenObj = null; - } - } - } - else{ - if (stateGraph[edge].type !== graph.ACCEPT){ - queue.push(edge); - stateGraph[edge].visited = true; - if (stateGraph[edge].type === graph.ATOM){ - stack.push({atom: stateGraph[edge].text}); - } - } - } - }); } + return lastEdge; } /** * The OR operator must be done depth first - * @param stack the original stack - * @param tempStack the stack within the or - * @param stateGraph - * @param id the edge that the traverse starts from - * @param endIds cycles create redundant ends for the stack, this prevents that - * @param moreStartId for MORE operators within the OR - * @returns {*} - */ -function traverseOr(stack, tempStack, stateGraph, id, endIds, moreStartId){ + **/ +function traverseOr(stateGraph, stateStack, id, endIds){ + let orStack = []; let lastEdge; + stateStack.push({[graph.OR]: orStack}); stateGraph[id].visited = true; + stateGraph[id].edges.forEach(function (edge){ + let orSubStack = []; + lastEdge = traverseOrEdges(stateGraph, stateStack, orSubStack, edge, endIds); + orStack.push(orSubStack); + }); + return lastEdge; +} + +function traverseOrEdges(stateGraph, stack, subStack, id, endIds, moreStartId){ + + if (stateGraph[id].visited && endIds.includes(id)){ + return null; + } + + if (stateGraph[id].visited){ + // if the MORE started within the OR, then end it on this stack + if (id === moreStartId){ + subStack.push({end: id}); + endIds.push(id); + } // else end it on the original stack + else if (stateGraph[id].operator.includes(graph.ONE_MORE) + || stateGraph[id].operator.includes(graph.ZERO_SBOL)){ + stack.push({end: id}); + endIds.push(id); + } + return null; + } + + if (stateGraph[id].type === graph.ACCEPT){ + return null; + } + if (stateGraph[id].type === graph.ATOM){ + subStack.push({atom: stateGraph[id].text}); + } if (stateGraph[id].operator.length === 1 && (stateGraph[id].operator[0] === graph.ONE_MORE || @@ -345,76 +358,27 @@ function traverseOr(stack, tempStack, stateGraph, id, endIds, moreStartId){ moreStartId = id; } - if (stateGraph[id].type === graph.ATOM){ - tempStack.push({atom: stateGraph[id].text}); - for (let operation of stateGraph[id].operator){ - if (operation === graph.OR){ - let orStack = []; - tempStack.push({[operation]: orStack}); - // get all edges of the OR first - stateGraph[id].edges.forEach(function (edge){ - let tempStackX = []; - lastEdge = traverseOr(tempStack, tempStackX, stateGraph, edge, endIds); - orStack.push(tempStackX); - }); - } else { - tempStack.push({[operation]: id}); - } + let lastEdge; + for (let operation of stateGraph[id].operator){ + if (stateGraph[id].type === graph.EPSILON + && operation === graph.THEN){ + stateGraph[id].visited = false; //reset + return id; //a 'then' that's not on the atom is not part of the OR } - } - else{ - for (let operation of stateGraph[id].operator){ - if (operation === graph.THEN){ - stateGraph[id].visited = false; //reset - return id; //a 'then' that's not on the atom is not part of the OR - } - if (operation === graph.OR){ - let orStack = []; - tempStack.push({[operation]: orStack}); - // get all edges of the OR first - stateGraph[id].edges.forEach(function (edge){ - let tempStackX = []; - lastEdge = traverseOr(tempStack, tempStackX, stateGraph, edge, endIds); - orStack.push(tempStackX); - }); - } - else { - tempStack.push({[operation]: id}); - } + if (operation === graph.OR){ + lastEdge = traverseOr(stateGraph, subStack, id, endIds); + } else { + subStack.push({[operation]: id}); } } + stateGraph[id].visited = true; if (lastEdge){ //from OR - stateGraph[lastEdge].operator.forEach(function (operation){ - tempStack.push({[operation]: lastEdge}); - }); id = lastEdge; + handleOperations(stateGraph, subStack, id, endIds); } for (let edge of stateGraph[id].edges){ - if (stateGraph[edge].type === graph.ACCEPT){ - continue; - } - - if (stateGraph[edge].visited){ - // if the MORE started within the OR, then end it on the tempStack - // else end it on the original stack - - if (edge === moreStartId){ - if (!endIds.includes(edge)){ - tempStack.push({end: edge}); - endIds.push(edge); - } - } - else if (stateGraph[edge].operator.includes(graph.ONE_MORE) - || stateGraph[edge].operator.includes(graph.ZERO_SBOL)){ - if (!endIds.includes(edge)){ - stack.push({end: edge}); - endIds.push(edge); - } - } - continue; - } - lastEdge = traverseOr(stack, tempStack, stateGraph, edge, endIds, moreStartId); + lastEdge = traverseOrEdges(stateGraph, stack, subStack, edge, endIds, moreStartId); } return lastEdge; //the last node of the OR chain } @@ -431,6 +395,7 @@ function makeSBOLFromStack(doc, stateStack, componentDefStack){ stacks.variantComponents = []; stacks.componentDefs = componentDefStack; collapseStack(stateStack); + console.log('collapsed:'); console.log(JSON.stringify(stateStack, null, 2)); stateStack.forEach(function(stackObj){ From fc306c369bd202b210ce3b7e110d17a14afd269c Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Sat, 24 Nov 2018 17:35:52 -0500 Subject: [PATCH 27/32] fix sbol bugs --- lib/sbol.js | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/lib/sbol.js b/lib/sbol.js index c26cfc1..8785dea 100644 --- a/lib/sbol.js +++ b/lib/sbol.js @@ -50,12 +50,18 @@ function getRootId(stateGraph){ * @param stack */ function collapseStack(stack){ + for(let i=0; i 2){ for(let i=0; i Date: Wed, 16 Jan 2019 13:09:15 -0500 Subject: [PATCH 28/32] added button and functionality to send sbol to knox --- demos/server.js | 29 + demos/static/client.html | 6 +- demos/static/css/style.css | 9 +- demos/static/js/client.js | 22 +- lib/constellation.js | 2 +- package-lock.json | 2101 +++++++++++++++++++++++++----------- package.json | 3 +- 7 files changed, 1562 insertions(+), 610 deletions(-) diff --git a/demos/server.js b/demos/server.js index 9dd8c05..0daa974 100644 --- a/demos/server.js +++ b/demos/server.js @@ -2,6 +2,8 @@ let express = require('express'); let app = express(); let path = require('path'); let bodyParser = require('body-parser'); +let FormData = require('form-data'); +const Readable = require('stream').Readable; let constellation = require('../lib/constellation'); app.use(bodyParser.json()); @@ -50,3 +52,30 @@ app.post('/postSpecs', function(req,res) { res.status(405).send(String(error)); } }); + +app.post('/sendToKnox', function(req,res) { + + let form = new FormData(); + let sbolDocs = JSON.parse(req.body['sbolDocs[]']); + + for(let sbol of sbolDocs){ + let stream = new Readable(); + stream.push(sbol); + stream.push(null); + form.append('inputSBOLFiles[]', stream, { + filename : 'test.xml', + contentType: 'application/xml', + knownLength: sbol.length + }); //extra fields necessary + } + form.append('outputSpaceID', req.body.designName); + + form.submit('http://localhost:8080/sbol/importCombinatorial', function(error, result) { + if (error) { + console.log('Error!'); + res.status(405).send(String(error)); + } else{ + res.status(200).send(String(result)); + } + }); +}); diff --git a/demos/static/client.html b/demos/static/client.html index 0e0089a..63ae7e9 100644 --- a/demos/static/client.html +++ b/demos/static/client.html @@ -47,7 +47,7 @@

Constellation


- +
@@ -95,6 +95,10 @@

Constellation




+
+


+ +

diff --git a/demos/static/css/style.css b/demos/static/css/style.css index 1efd0d2..2c0f1ea 100644 --- a/demos/static/css/style.css +++ b/demos/static/css/style.css @@ -31,6 +31,13 @@ textarea { font-size: 20px; } +#knoxBtn { + margin: auto; + background-color: white; + display: block; + font-size: 20px; +} + h5 { color: rgb(120, 120, 120); font-family: 'Montserrat', 'monospace'; @@ -122,4 +129,4 @@ input[type="button"]{ /* .dropdown:hover .dropdown-content {display: block;} */ /* Change the background color of the dropdown button when the dropdown content is shown */ -/* .dropdown:hover .dropbtn {background-color: #30729f;} */ \ No newline at end of file +/* .dropdown:hover .dropbtn {background-color: #30729f;} */ diff --git a/demos/static/js/client.js b/demos/static/js/client.js index defd605..6ddc447 100644 --- a/demos/static/js/client.js +++ b/demos/static/js/client.js @@ -5,7 +5,8 @@ const IMAGESIZE = 30; const RADIUS = 7; const INTERMEDIATE = 'intermediate'; -let nodePointer, linkPointer, simulationPointer, svgPointer, circlePointer, imagePointer, textPointer, width, height; +let nodePointer, linkPointer, simulationPointer, svgPointer, circlePointer, imagePointer, textPointer, width, height, sbolDocs; +let designName = 'Constellation'; /* * * * * * */ /* DESIGNS */ @@ -380,12 +381,22 @@ $(document).ready(function() { editors.specEditor.setValue('one-or-more (promoter or ribosomeBindingSite) then (zero-or-more cds) then terminator'); }); + $("#knoxBtn").prop("disabled",true); + + $('#knoxBtn').on('click', function() { + $.post('http://localhost:8082/sendToKnox', { + 'designName': designName, + 'sbolDocs[]': JSON.stringify(sbolDocs)}) + .fail((response) => { + alert(response.responseText); + }); + }); + $("#submitBtn").click(function(){ // Reset UI resetDiagram(); displayDesigns(editors, ''); - let designName = 'Constellation'; let maxCycles = 0; let numDesigns = 10; @@ -406,7 +417,6 @@ $(document).ready(function() { "name": "specificationname", "clientid": "userid" }, function (data) { - console.log(data) displayDiagram(data.stateGraph); // Undefined design if (String(data.designs).includes('is not defined')) { @@ -414,8 +424,14 @@ $(document).ready(function() { } else { displayDesigns(editors, JSON.stringify(data.designs, null, "\t")); } + sbolDocs = data.sbols; + $("#knoxBtn").prop("disabled",false); }).fail((response) => { alert(response.responseText); }); }); + + }); + + diff --git a/lib/constellation.js b/lib/constellation.js index 18807ea..90e73dd 100644 --- a/lib/constellation.js +++ b/lib/constellation.js @@ -63,7 +63,7 @@ const constellation = function (designName, langText, categories, numDesigns, ma console.log(error); } - return {stateGraph: gra.stateGraph, designs: designs, paths: gra.paths, sbol: sbolDoc}; + return {stateGraph: gra.stateGraph, designs: designs, paths: gra.paths, sbols: [sbolDoc]}; //todo }; /** diff --git a/package-lock.json b/package-lock.json index 7867897..8e973be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "constellation-js", - "version": "0.1.0", + "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -20,10 +20,10 @@ "dev": true, "requires": { "@babel/types": "7.0.0-beta.51", - "jsesc": "^2.5.1", - "lodash": "^4.17.5", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "jsesc": "2.5.1", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" } }, "@babel/helper-function-name": { @@ -61,9 +61,9 @@ "integrity": "sha1-6IRK4loVlcz9QriWI7Q3bKBtIl0=", "dev": true, "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.0" + "chalk": "2.4.1", + "esutils": "2.0.2", + "js-tokens": "3.0.2" } }, "@babel/parser": { @@ -81,7 +81,7 @@ "@babel/code-frame": "7.0.0-beta.51", "@babel/parser": "7.0.0-beta.51", "@babel/types": "7.0.0-beta.51", - "lodash": "^4.17.5" + "lodash": "4.17.10" } }, "@babel/traverse": { @@ -96,10 +96,10 @@ "@babel/helper-split-export-declaration": "7.0.0-beta.51", "@babel/parser": "7.0.0-beta.51", "@babel/types": "7.0.0-beta.51", - "debug": "^3.1.0", - "globals": "^11.1.0", - "invariant": "^2.2.0", - "lodash": "^4.17.5" + "debug": "3.1.0", + "globals": "11.7.0", + "invariant": "2.2.4", + "lodash": "4.17.10" }, "dependencies": { "debug": { @@ -119,9 +119,9 @@ "integrity": "sha1-2AK3tUO1g2x3iqaReXq/APPZfqk=", "dev": true, "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.5", - "to-fast-properties": "^2.0.0" + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "2.0.0" } }, "accepts": { @@ -129,20 +129,20 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "~2.1.18", + "mime-types": "2.1.18", "negotiator": "0.6.1" } }, "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" } }, "ansi-styles": { @@ -151,7 +151,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.2" } }, "argparse": { @@ -160,7 +160,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "sprintf-js": "1.0.3" } }, "array-flatten": { @@ -169,10 +169,13 @@ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } }, "assert-plus": { "version": "1.0.0", @@ -189,8 +192,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "aws-sign2": { "version": "0.7.0", @@ -199,9 +201,9 @@ "dev": true }, "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, "balanced-match": { @@ -210,13 +212,12 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, - "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "body-parser": { @@ -226,15 +227,15 @@ "dev": true, "requires": { "bytes": "3.0.0", - "content-type": "~1.0.4", + "content-type": "1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "~1.6.3", + "depd": "1.1.2", + "http-errors": "1.6.3", "iconv-lite": "0.4.23", - "on-finished": "~2.3.0", + "on-finished": "2.3.0", "qs": "6.5.2", "raw-body": "2.3.3", - "type-is": "~1.6.16" + "type-is": "1.6.16" }, "dependencies": { "depd": { @@ -249,10 +250,10 @@ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "statuses": "1.5.0" } }, "mime-db": { @@ -267,7 +268,7 @@ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.33.0" } }, "qs": { @@ -289,7 +290,7 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "2.1.18" } } } @@ -299,7 +300,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -325,12 +326,12 @@ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "assertion-error": "^1.0.1", - "check-error": "^1.0.1", - "deep-eql": "^3.0.0", - "get-func-name": "^2.0.0", - "pathval": "^1.0.0", - "type-detect": "^4.0.0" + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" } }, "chalk": { @@ -339,9 +340,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" }, "dependencies": { "has-flag": { @@ -356,7 +357,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -367,12 +368,6 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, "color-convert": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", @@ -389,12 +384,11 @@ "dev": true }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "commander": { @@ -439,11 +433,11 @@ "integrity": "sha512-FAzXwiDOYLGDWH+zgoIA+8GbWv50hlx+kpEJyvzLKOdnIBv9uWoVl4DhqGgyUHpiRjAlF8KYZSipWXYtllWH6Q==", "dev": true, "requires": { - "js-yaml": "^3.6.1", - "lcov-parse": "^0.0.10", - "log-driver": "^1.2.5", - "minimist": "^1.2.0", - "request": "^2.79.0" + "js-yaml": "3.12.0", + "lcov-parse": "0.0.10", + "log-driver": "1.2.7", + "minimist": "1.2.0", + "request": "2.88.0" } }, "d3-collection": { @@ -461,10 +455,10 @@ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz", "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==", "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" + "d3-collection": "1.0.4", + "d3-dispatch": "1.0.3", + "d3-quadtree": "1.0.3", + "d3-timer": "1.0.7" } }, "d3-quadtree": { @@ -483,7 +477,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "debug": { @@ -500,14 +494,13 @@ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "^4.0.0" + "type-detect": "4.0.8" } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { "version": "1.1.2", @@ -525,13 +518,13 @@ "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" }, "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, - "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" } }, "ee-first": { @@ -576,36 +569,36 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "requires": { - "accepts": "~1.3.5", + "accepts": "1.3.5", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "~1.0.4", + "content-type": "1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.3", + "proxy-addr": "2.0.3", "qs": "6.5.1", - "range-parser": "~1.2.0", + "range-parser": "1.2.0", "safe-buffer": "5.1.1", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", + "statuses": "1.4.0", + "type-is": "1.6.16", "utils-merge": "1.0.1", - "vary": "~1.1.2" + "vary": "1.1.2" }, "dependencies": { "body-parser": { @@ -614,15 +607,15 @@ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "requires": { "bytes": "3.0.0", - "content-type": "~1.0.4", + "content-type": "1.0.4", "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", + "depd": "1.1.2", + "http-errors": "1.6.3", "iconv-lite": "0.4.19", - "on-finished": "~2.3.0", + "on-finished": "2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "~1.6.15" + "type-is": "1.6.16" } }, "iconv-lite": { @@ -659,7 +652,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" + "statuses": "1.4.0" } }, "setprototypeof": { @@ -677,9 +670,9 @@ } }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "extsprintf": { @@ -689,9 +682,9 @@ "dev": true }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, "fast-json-stable-stringify": { @@ -706,12 +699,12 @@ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.4.0", + "unpipe": "1.0.0" } }, "forever-agent": { @@ -721,14 +714,13 @@ "dev": true }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "asynckit": "0.4.0", + "combined-stream": "1.0.7", + "mime-types": "2.1.18" } }, "forwarded": { @@ -758,7 +750,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "glob": { @@ -766,12 +758,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "globals": { @@ -792,13 +784,13 @@ "dev": true }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" + "ajv": "6.7.0", + "har-schema": "2.0.0" } }, "has-flag": { @@ -816,10 +808,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "~1.1.2", + "depd": "1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "statuses": "1.4.0" } }, "http-signature": { @@ -828,9 +820,9 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.16.0" } }, "iconv-lite": { @@ -839,7 +831,7 @@ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" } }, "imparse": { @@ -852,8 +844,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -867,7 +859,7 @@ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.3.1" } }, "ipaddr.js": { @@ -904,8 +896,8 @@ "@babel/template": "7.0.0-beta.51", "@babel/traverse": "7.0.0-beta.51", "@babel/types": "7.0.0-beta.51", - "istanbul-lib-coverage": "^2.0.0", - "semver": "^5.5.0" + "istanbul-lib-coverage": "2.0.0", + "semver": "5.5.0" } }, "js-tokens": { @@ -920,16 +912,15 @@ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "1.0.10", + "esprima": "4.0.0" } }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "dev": true }, "jsesc": { "version": "2.5.1", @@ -944,9 +935,9 @@ "dev": true }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stringify-safe": { @@ -991,7 +982,7 @@ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "3.0.2" } }, "media-typer": { @@ -1024,7 +1015,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.33.0" } }, "minimatch": { @@ -1032,7 +1023,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -1105,33 +1096,33 @@ "integrity": "sha1-ikpO1pCWbBHsWH/4fuoMEsl0upk=", "dev": true, "requires": { - "archy": "^1.0.0", - "arrify": "^1.0.1", - "caching-transform": "^1.0.0", - "convert-source-map": "^1.5.1", - "debug-log": "^1.0.1", - "default-require-extensions": "^1.0.0", - "find-cache-dir": "^0.1.1", - "find-up": "^2.1.0", - "foreground-child": "^1.5.3", - "glob": "^7.0.6", - "istanbul-lib-coverage": "^1.2.0", - "istanbul-lib-hook": "^1.1.0", - "istanbul-lib-instrument": "^2.1.0", - "istanbul-lib-report": "^1.1.3", - "istanbul-lib-source-maps": "^1.2.5", - "istanbul-reports": "^1.4.1", - "md5-hex": "^1.2.0", - "merge-source-map": "^1.1.0", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.0", - "resolve-from": "^2.0.0", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.1", - "spawn-wrap": "^1.4.2", - "test-exclude": "^4.2.0", + "archy": "1.0.0", + "arrify": "1.0.1", + "caching-transform": "1.0.1", + "convert-source-map": "1.5.1", + "debug-log": "1.0.1", + "default-require-extensions": "1.0.0", + "find-cache-dir": "0.1.1", + "find-up": "2.1.0", + "foreground-child": "1.5.6", + "glob": "7.1.2", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-hook": "1.1.0", + "istanbul-lib-instrument": "2.3.0", + "istanbul-lib-report": "1.1.3", + "istanbul-lib-source-maps": "1.2.5", + "istanbul-reports": "1.4.1", + "md5-hex": "1.3.0", + "merge-source-map": "1.1.0", + "micromatch": "3.1.10", + "mkdirp": "0.5.1", + "resolve-from": "2.0.0", + "rimraf": "2.6.2", + "signal-exit": "3.0.2", + "spawn-wrap": "1.4.2", + "test-exclude": "4.2.1", "yargs": "11.1.0", - "yargs-parser": "^8.0.0" + "yargs-parser": "8.1.0" }, "dependencies": { "align-text": { @@ -1139,9 +1130,9 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" } }, "amdefine": { @@ -1159,7 +1150,7 @@ "bundled": true, "dev": true, "requires": { - "default-require-extensions": "^1.0.0" + "default-require-extensions": "1.0.0" } }, "archy": { @@ -1217,13 +1208,13 @@ "bundled": true, "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" }, "dependencies": { "define-property": { @@ -1231,7 +1222,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -1239,7 +1230,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1247,7 +1238,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1255,9 +1246,9 @@ "bundled": true, "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "kind-of": { @@ -1272,7 +1263,7 @@ "bundled": true, "dev": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -1281,16 +1272,16 @@ "bundled": true, "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" }, "dependencies": { "extend-shallow": { @@ -1298,7 +1289,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -1313,15 +1304,15 @@ "bundled": true, "dev": true, "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" } }, "caching-transform": { @@ -1329,9 +1320,9 @@ "bundled": true, "dev": true, "requires": { - "md5-hex": "^1.2.0", - "mkdirp": "^0.5.1", - "write-file-atomic": "^1.1.4" + "md5-hex": "1.3.0", + "mkdirp": "0.5.1", + "write-file-atomic": "1.3.4" } }, "camelcase": { @@ -1346,8 +1337,8 @@ "dev": true, "optional": true, "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" + "align-text": "0.1.4", + "lazy-cache": "1.0.4" } }, "class-utils": { @@ -1355,10 +1346,10 @@ "bundled": true, "dev": true, "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" }, "dependencies": { "define-property": { @@ -1366,7 +1357,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -1377,8 +1368,8 @@ "dev": true, "optional": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", + "center-align": "0.1.3", + "right-align": "0.1.3", "wordwrap": "0.0.2" }, "dependencies": { @@ -1400,8 +1391,8 @@ "bundled": true, "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "map-visit": "1.0.0", + "object-visit": "1.0.1" } }, "commondir": { @@ -1434,8 +1425,8 @@ "bundled": true, "dev": true, "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" + "lru-cache": "4.1.3", + "which": "1.3.1" } }, "debug": { @@ -1466,7 +1457,7 @@ "bundled": true, "dev": true, "requires": { - "strip-bom": "^2.0.0" + "strip-bom": "2.0.0" } }, "define-property": { @@ -1474,8 +1465,8 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "is-descriptor": "1.0.2", + "isobject": "3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -1483,7 +1474,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1491,7 +1482,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1499,9 +1490,9 @@ "bundled": true, "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "kind-of": { @@ -1516,7 +1507,7 @@ "bundled": true, "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "is-arrayish": "0.2.1" } }, "execa": { @@ -1524,13 +1515,13 @@ "bundled": true, "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" }, "dependencies": { "cross-spawn": { @@ -1538,9 +1529,9 @@ "bundled": true, "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.1" } } } @@ -1550,13 +1541,13 @@ "bundled": true, "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "debug": { @@ -1572,7 +1563,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -1580,7 +1571,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -1590,8 +1581,8 @@ "bundled": true, "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -1599,7 +1590,7 @@ "bundled": true, "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -1609,14 +1600,14 @@ "bundled": true, "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -1624,7 +1615,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -1632,7 +1623,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -1640,7 +1631,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1648,7 +1639,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1656,9 +1647,9 @@ "bundled": true, "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "kind-of": { @@ -1673,10 +1664,10 @@ "bundled": true, "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { "extend-shallow": { @@ -1684,7 +1675,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -1694,9 +1685,9 @@ "bundled": true, "dev": true, "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" } }, "find-up": { @@ -1704,7 +1695,7 @@ "bundled": true, "dev": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "2.0.0" } }, "for-in": { @@ -1717,8 +1708,8 @@ "bundled": true, "dev": true, "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" + "cross-spawn": "4.0.2", + "signal-exit": "3.0.2" } }, "fragment-cache": { @@ -1726,7 +1717,7 @@ "bundled": true, "dev": true, "requires": { - "map-cache": "^0.2.2" + "map-cache": "0.2.2" } }, "fs.realpath": { @@ -1754,12 +1745,12 @@ "bundled": true, "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "graceful-fs": { @@ -1772,10 +1763,10 @@ "bundled": true, "dev": true, "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" }, "dependencies": { "source-map": { @@ -1783,7 +1774,7 @@ "bundled": true, "dev": true, "requires": { - "amdefine": ">=0.0.4" + "amdefine": "1.0.1" } } } @@ -1793,9 +1784,9 @@ "bundled": true, "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" } }, "has-values": { @@ -1803,8 +1794,8 @@ "bundled": true, "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { "kind-of": { @@ -1812,7 +1803,7 @@ "bundled": true, "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -1832,8 +1823,8 @@ "bundled": true, "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -1851,7 +1842,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-arrayish": { @@ -1869,7 +1860,7 @@ "bundled": true, "dev": true, "requires": { - "builtin-modules": "^1.0.0" + "builtin-modules": "1.1.1" } }, "is-data-descriptor": { @@ -1877,7 +1868,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-descriptor": { @@ -1885,9 +1876,9 @@ "bundled": true, "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { @@ -1912,7 +1903,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-odd": { @@ -1920,7 +1911,7 @@ "bundled": true, "dev": true, "requires": { - "is-number": "^4.0.0" + "is-number": "4.0.0" }, "dependencies": { "is-number": { @@ -1935,7 +1926,7 @@ "bundled": true, "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, "is-stream": { @@ -1978,7 +1969,7 @@ "bundled": true, "dev": true, "requires": { - "append-transform": "^0.4.0" + "append-transform": "0.4.0" } }, "istanbul-lib-report": { @@ -1986,10 +1977,10 @@ "bundled": true, "dev": true, "requires": { - "istanbul-lib-coverage": "^1.1.2", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" }, "dependencies": { "has-flag": { @@ -2002,7 +1993,7 @@ "bundled": true, "dev": true, "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -2012,11 +2003,11 @@ "bundled": true, "dev": true, "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.0", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" } }, "istanbul-reports": { @@ -2024,7 +2015,7 @@ "bundled": true, "dev": true, "requires": { - "handlebars": "^4.0.3" + "handlebars": "4.0.11" } }, "kind-of": { @@ -2032,7 +2023,7 @@ "bundled": true, "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "lazy-cache": { @@ -2046,7 +2037,7 @@ "bundled": true, "dev": true, "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "1.0.0" } }, "load-json-file": { @@ -2054,11 +2045,11 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" } }, "locate-path": { @@ -2066,8 +2057,8 @@ "bundled": true, "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "2.0.0", + "path-exists": "3.0.0" }, "dependencies": { "path-exists": { @@ -2087,8 +2078,8 @@ "bundled": true, "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } }, "map-cache": { @@ -2101,7 +2092,7 @@ "bundled": true, "dev": true, "requires": { - "object-visit": "^1.0.0" + "object-visit": "1.0.1" } }, "md5-hex": { @@ -2109,7 +2100,7 @@ "bundled": true, "dev": true, "requires": { - "md5-o-matic": "^0.1.1" + "md5-o-matic": "0.1.1" } }, "md5-o-matic": { @@ -2122,7 +2113,7 @@ "bundled": true, "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "1.2.0" } }, "merge-source-map": { @@ -2130,7 +2121,7 @@ "bundled": true, "dev": true, "requires": { - "source-map": "^0.6.1" + "source-map": "0.6.1" }, "dependencies": { "source-map": { @@ -2145,19 +2136,19 @@ "bundled": true, "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "kind-of": { @@ -2177,7 +2168,7 @@ "bundled": true, "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -2190,8 +2181,8 @@ "bundled": true, "dev": true, "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "for-in": "1.0.2", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -2199,7 +2190,7 @@ "bundled": true, "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -2222,18 +2213,18 @@ "bundled": true, "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-odd": "^2.0.0", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "kind-of": { @@ -2248,10 +2239,10 @@ "bundled": true, "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" } }, "npm-run-path": { @@ -2259,7 +2250,7 @@ "bundled": true, "dev": true, "requires": { - "path-key": "^2.0.0" + "path-key": "2.0.1" } }, "number-is-nan": { @@ -2277,9 +2268,9 @@ "bundled": true, "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" }, "dependencies": { "define-property": { @@ -2287,7 +2278,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -2297,7 +2288,7 @@ "bundled": true, "dev": true, "requires": { - "isobject": "^3.0.0" + "isobject": "3.0.1" } }, "object.pick": { @@ -2305,7 +2296,7 @@ "bundled": true, "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, "once": { @@ -2313,7 +2304,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "optimist": { @@ -2321,8 +2312,8 @@ "bundled": true, "dev": true, "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" + "minimist": "0.0.8", + "wordwrap": "0.0.3" } }, "os-homedir": { @@ -2335,9 +2326,9 @@ "bundled": true, "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, "p-finally": { @@ -2350,7 +2341,7 @@ "bundled": true, "dev": true, "requires": { - "p-try": "^1.0.0" + "p-try": "1.0.0" } }, "p-locate": { @@ -2358,7 +2349,7 @@ "bundled": true, "dev": true, "requires": { - "p-limit": "^1.1.0" + "p-limit": "1.2.0" } }, "p-try": { @@ -2371,7 +2362,7 @@ "bundled": true, "dev": true, "requires": { - "error-ex": "^1.2.0" + "error-ex": "1.3.1" } }, "pascalcase": { @@ -2384,7 +2375,7 @@ "bundled": true, "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } }, "path-is-absolute": { @@ -2407,9 +2398,9 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "pify": { @@ -2427,7 +2418,7 @@ "bundled": true, "dev": true, "requires": { - "pinkie": "^2.0.0" + "pinkie": "2.0.4" } }, "pkg-dir": { @@ -2435,7 +2426,7 @@ "bundled": true, "dev": true, "requires": { - "find-up": "^1.0.0" + "find-up": "1.1.2" }, "dependencies": { "find-up": { @@ -2443,8 +2434,8 @@ "bundled": true, "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } } } @@ -2464,9 +2455,9 @@ "bundled": true, "dev": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" } }, "read-pkg-up": { @@ -2474,8 +2465,8 @@ "bundled": true, "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "1.1.2", + "read-pkg": "1.1.0" }, "dependencies": { "find-up": { @@ -2483,8 +2474,8 @@ "bundled": true, "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } } } @@ -2494,8 +2485,8 @@ "bundled": true, "dev": true, "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" } }, "repeat-element": { @@ -2539,7 +2530,7 @@ "dev": true, "optional": true, "requires": { - "align-text": "^0.1.1" + "align-text": "0.1.4" } }, "rimraf": { @@ -2547,7 +2538,7 @@ "bundled": true, "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "safe-regex": { @@ -2555,7 +2546,7 @@ "bundled": true, "dev": true, "requires": { - "ret": "~0.1.10" + "ret": "0.1.15" } }, "semver": { @@ -2573,10 +2564,10 @@ "bundled": true, "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" }, "dependencies": { "extend-shallow": { @@ -2584,7 +2575,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -2594,7 +2585,7 @@ "bundled": true, "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "1.0.0" } }, "shebang-regex": { @@ -2617,14 +2608,14 @@ "bundled": true, "dev": true, "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.0" }, "dependencies": { "debug": { @@ -2640,7 +2631,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -2648,7 +2639,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -2658,9 +2649,9 @@ "bundled": true, "dev": true, "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" }, "dependencies": { "define-property": { @@ -2668,7 +2659,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -2676,7 +2667,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -2684,7 +2675,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -2692,9 +2683,9 @@ "bundled": true, "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "kind-of": { @@ -2709,7 +2700,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.2.0" + "kind-of": "3.2.2" } }, "source-map": { @@ -2722,11 +2713,11 @@ "bundled": true, "dev": true, "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "atob": "2.1.1", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" } }, "source-map-url": { @@ -2739,12 +2730,12 @@ "bundled": true, "dev": true, "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" + "foreground-child": "1.5.6", + "mkdirp": "0.5.1", + "os-homedir": "1.0.2", + "rimraf": "2.6.2", + "signal-exit": "3.0.2", + "which": "1.3.1" } }, "spdx-correct": { @@ -2752,8 +2743,8 @@ "bundled": true, "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" } }, "spdx-exceptions": { @@ -2766,8 +2757,8 @@ "bundled": true, "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" } }, "spdx-license-ids": { @@ -2780,7 +2771,7 @@ "bundled": true, "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "extend-shallow": "3.0.2" } }, "static-extend": { @@ -2788,8 +2779,8 @@ "bundled": true, "dev": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "define-property": "0.2.5", + "object-copy": "0.1.0" }, "dependencies": { "define-property": { @@ -2797,7 +2788,7 @@ "bundled": true, "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -2807,8 +2798,8 @@ "bundled": true, "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, "strip-ansi": { @@ -2816,7 +2807,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } }, "strip-bom": { @@ -2824,7 +2815,7 @@ "bundled": true, "dev": true, "requires": { - "is-utf8": "^0.2.0" + "is-utf8": "0.2.1" } }, "strip-eof": { @@ -2837,11 +2828,11 @@ "bundled": true, "dev": true, "requires": { - "arrify": "^1.0.1", - "micromatch": "^3.1.8", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" + "arrify": "1.0.1", + "micromatch": "3.1.10", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" } }, "to-object-path": { @@ -2849,7 +2840,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "to-regex": { @@ -2857,10 +2848,10 @@ "bundled": true, "dev": true, "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" } }, "to-regex-range": { @@ -2868,8 +2859,8 @@ "bundled": true, "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "3.0.0", + "repeat-string": "1.6.1" } }, "uglify-js": { @@ -2878,9 +2869,9 @@ "dev": true, "optional": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" }, "dependencies": { "yargs": { @@ -2889,9 +2880,9 @@ "dev": true, "optional": true, "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", "window-size": "0.1.0" } } @@ -2908,10 +2899,10 @@ "bundled": true, "dev": true, "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" }, "dependencies": { "extend-shallow": { @@ -2919,7 +2910,7 @@ "bundled": true, "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "set-value": { @@ -2927,10 +2918,10 @@ "bundled": true, "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" } } } @@ -2940,8 +2931,8 @@ "bundled": true, "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "has-value": "0.3.1", + "isobject": "3.0.1" }, "dependencies": { "has-value": { @@ -2949,9 +2940,9 @@ "bundled": true, "dev": true, "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" }, "dependencies": { "isobject": { @@ -2981,7 +2972,7 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "^6.0.2" + "kind-of": "6.0.2" }, "dependencies": { "kind-of": { @@ -2996,8 +2987,8 @@ "bundled": true, "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" } }, "which": { @@ -3005,7 +2996,7 @@ "bundled": true, "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "which-module": { @@ -3029,8 +3020,8 @@ "bundled": true, "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" }, "dependencies": { "ansi-regex": { @@ -3043,7 +3034,7 @@ "bundled": true, "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "string-width": { @@ -3051,9 +3042,9 @@ "bundled": true, "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "strip-ansi": { @@ -3061,7 +3052,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } } } @@ -3076,9 +3067,9 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" } }, "y18n": { @@ -3096,18 +3087,18 @@ "bundled": true, "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" }, "dependencies": { "camelcase": { @@ -3120,9 +3111,9 @@ "bundled": true, "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" } }, "yargs-parser": { @@ -3130,7 +3121,7 @@ "bundled": true, "dev": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" } } } @@ -3140,7 +3131,7 @@ "bundled": true, "dev": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" }, "dependencies": { "camelcase": { @@ -3153,9 +3144,9 @@ } }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, "on-finished": { @@ -3171,7 +3162,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "parseurl": { @@ -3206,14 +3197,20 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.1.2", "ipaddr.js": "1.6.0" } }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "dev": true + }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "qs": { @@ -3251,10 +3248,10 @@ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "statuses": "1.5.0" } }, "statuses": { @@ -3266,31 +3263,48 @@ } }, "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "aws-sign2": "0.7.0", + "aws4": "1.8.0", + "caseless": "0.12.0", + "combined-stream": "1.0.7", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.3", + "har-validator": "5.1.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.21", + "oauth-sign": "0.9.0", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.4.3", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" + }, + "dependencies": { + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "dev": true + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "dev": true, + "requires": { + "mime-db": "1.37.0" + } + } } }, "reservoir": { @@ -3310,6 +3324,870 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sboljs": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/sboljs/-/sboljs-2.1.13.tgz", + "integrity": "sha512-5wd2ft7KTxGZ3ifuGAaF3HBtO5ZPRjQS8Jewmntdlax96VPCECRqDy01WgYAMZVXci59L3h8R13603L4MUnQiw==", + "requires": { + "extend": "3.0.0", + "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "rdf-ext": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", + "rdf-graph-array": "git+https://github.com/udp/rdf-graph-array.git#98b1a0c674ed2b07993d54ab7d2a3b84e661bc3e", + "rdf-parser-rdfxml": "0.3.1", + "request": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "urijs": "https://registry.npmjs.org/urijs/-/urijs-1.18.7.tgz", + "xml": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.2.0" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "cheerio": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", + "integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=", + "requires": { + "css-select": "1.0.0", + "dom-serializer": "0.1.0", + "entities": "1.1.1", + "htmlparser2": "3.8.3", + "lodash": "3.10.1" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.2.3", + "typedarray": "0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "css-select": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", + "integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=", + "requires": { + "boolbase": "1.0.0", + "css-what": "1.0.0", + "domutils": "1.4.3", + "nth-check": "1.0.1" + } + }, + "css-what": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", + "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=" + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", + "integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=", + "requires": { + "domelementtype": "1.3.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=" + }, + "extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + } + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.1.0" + } + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.3.0", + "domutils": "1.5.1", + "entities": "1.0.0", + "readable-stream": "2.2.3" + }, + "dependencies": { + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=" + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=" + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stringify-safe": { + "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "requires": { + "inherits": "2.0.3", + "minimatch": "0.3.0" + } + } + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "requires": { + "boolbase": "1.0.0" + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "rdf-ext": { + "version": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", + "requires": { + "es6-promise": "3.3.1", + "rdf-graph-array": "git+https://github.com/udp/rdf-graph-array.git#98b1a0c674ed2b07993d54ab7d2a3b84e661bc3e", + "rdf-store-inmemory": "0.3.0" + } + }, + "rdf-graph-abstract": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-graph-abstract/-/rdf-graph-abstract-0.3.0.tgz", + "integrity": "sha1-gAZBZNzWCQflO++XLIv/DmGsFDM=", + "requires": { + "rdf-normalize": "0.3.0" + } + }, + "rdf-graph-array": { + "version": "git+https://github.com/udp/rdf-graph-array.git#98b1a0c674ed2b07993d54ab7d2a3b84e661bc3e", + "requires": { + "inherits": "2.0.3", + "rdf-graph-abstract": "0.3.0" + } + }, + "rdf-normalize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-normalize/-/rdf-normalize-0.3.0.tgz", + "integrity": "sha1-J2H1sh0kYyW4+zxOk9+Vn2L5Zqg=" + }, + "rdf-parser-rdfxml": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/rdf-parser-rdfxml/-/rdf-parser-rdfxml-0.3.1.tgz", + "integrity": "sha1-0ZPs/BqE7a93SIQPJGb7QxQ8h4o=", + "requires": { + "rdf-ext": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", + "rdf-parser-dom": "0.3.0" + }, + "dependencies": { + "rdf-parser-dom": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-parser-dom/-/rdf-parser-dom-0.3.0.tgz", + "integrity": "sha1-RkNb7/vGf6Nat2x23tdfumsEly4=", + "requires": { + "rdf-parser-abstract": "0.3.0", + "xmldom": "0.1.27" + }, + "dependencies": { + "rdf-parser-abstract": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-parser-abstract/-/rdf-parser-abstract-0.3.0.tgz", + "integrity": "sha1-6gH2zFrmhZMyXUSvwLVINTMCPi4=", + "requires": { + "concat-stream": "1.6.0", + "mocha": "2.5.3" + } + } + } + } + } + }, + "rdf-store-abstract": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-store-abstract/-/rdf-store-abstract-0.3.0.tgz", + "integrity": "sha1-s6RlB5D0E7CRlX+HrMiByYt6g6I=" + }, + "rdf-store-inmemory": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/rdf-store-inmemory/-/rdf-store-inmemory-0.3.0.tgz", + "integrity": "sha1-051xLtt7Rk4qcMwBm6O+6nFiO3A=", + "requires": { + "rdf-ext": "git://github.com/rdf-ext/rdf-ext.git#a01be12f62a55182edfffc3c81ff37befcbc85b8", + "rdf-store-abstract": "0.3.0" + } + }, + "readable-stream": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.3.tgz", + "integrity": "sha1-nPSUY5hd8BbIrogTCXqSk6mzNyk=", + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + }, + "dependencies": { + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + } + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "requires": { + "hoek": "4.2.0" + } + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=" + }, + "to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=" + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "urijs": { + "version": "https://registry.npmjs.org/urijs/-/urijs-1.18.7.tgz", + "integrity": "sha1-YT7kGURS/ma4ctYkaJRt+TqUFJI=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xml": { + "version": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + } + } + }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", @@ -3322,18 +4200,18 @@ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", "fresh": "0.5.2", - "http-errors": "~1.6.2", + "http-errors": "1.6.3", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" } }, "serve-static": { @@ -3341,9 +4219,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", "send": "0.16.2" } }, @@ -3370,20 +4248,20 @@ "dev": true }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz", + "integrity": "sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ==", "dev": true, "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "asn1": "0.2.4", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.2", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" } }, "statuses": { @@ -3396,7 +4274,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "requires": { - "has-flag": "^2.0.0" + "has-flag": "2.0.0" } }, "to-fast-properties": { @@ -3406,12 +4284,21 @@ "dev": true }, "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, "requires": { - "punycode": "^1.4.1" + "psl": "1.1.31", + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } } }, "trim-right": { @@ -3426,15 +4313,14 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.2" } }, "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "dev": true }, "type-detect": { "version": "4.0.8", @@ -3448,7 +4334,7 @@ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "2.1.18" } }, "unpipe": { @@ -3456,6 +4342,15 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "2.1.1" + } + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -3486,9 +4381,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "extsprintf": "1.3.0" } }, "wrappy": { diff --git a/package.json b/package.json index e441c72..51b512f 100644 --- a/package.json +++ b/package.json @@ -30,10 +30,11 @@ "dependencies": { "d3-force": "^1.1.0", "express": "^4.16.3", + "form-data": "^2.3.3", "imparse": "0.0.2", "mocha": "^4.1.0", "reservoir": "^0.1.2", - "sboljs": "^2.1.3", + "sboljs": "^2.1.13", "uuidv4": "^0.5.0" }, "devDependencies": { From 18cb122f7fe0795aba67c97e8531be91c9ac595f Mon Sep 17 00:00:00 2001 From: Dany Fu Date: Wed, 16 Jan 2019 14:44:52 -0500 Subject: [PATCH 29/32] fix sbol unit tests --- test/sbolTests.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/sbolTests.js b/test/sbolTests.js index 9fbcd76..a21f638 100644 --- a/test/sbolTests.js +++ b/test/sbolTests.js @@ -16,14 +16,14 @@ module.exports = function() { describe('SBOL Generation: basic operators', function() { it('atom', function() { let result = constellation(DESIGN_NAME, 'rbs', CATEGORIES, 10, 0); - expect(trim(result.sbol)).to.equal('XXXXXXXXXXXXXXrbsXXXXX1XXXXXXXXXXXXXXXXXXXXXa1XXXXX1XXXXXXXXXXXXXXXXXXXXXa2XXXXX1XXXXXXXXXXXXXXXXXXXXXdesignXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXrbs_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXrbs_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); + expect(trim(result.sbols[0])).to.equal('XXXXXXXXXXXXXXrbsXXXXX1XXXXXXXXXXXXXXXXXXXXXa1XXXXX1XXXXXXXXXXXXXXXXXXXXXa2XXXXX1XXXXXXXXXXXXXXXXXXXXXdesignXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXrbs_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXrbs_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); }); }); describe('SBOL Generation: combination specs', function() { it('one-or-more (promoter or rbs) then (zero-or-more cds) then terminator', function() { let result = constellation(DESIGN_NAME, 'one-or-more (promoter or rbs) then (zero-or-more cds) then terminator', CATEGORIES, 10, 0); - expect(trim(result.sbol)).to.equal('XXXXXXXXXXXXXXpromoterXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXc1XXXXX1XXXXXXXXXXXXXXXXXXXXXrbsXXXXX1XXXXXXXXXXXXXXXXXXXXXa1XXXXX1XXXXXXXXXXXXXXXXXXXXXa2XXXXX1XXXXXXXXXXXXXXXXXXXXXcdsXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXb1XXXXX1XXXXXXXXXXXXXXXXXXXXXb2XXXXX1XXXXXXXXXXXXXXXXXXXXXb3XXXXX1XXXXXXXXXXXXXXXXXXXXXterminatorXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXtXXXXX1XXXXXXXXXXXXXXXXXXXXXcyclical_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXor_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXdesignXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcds_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXterminator_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_sequence_constraint1XXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_sequence_constraint2XXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcds_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXterminator_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); + expect(trim(result.sbols[0])).to.equal('XXXXXXXXXXXXXXpromoterXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXc1XXXXX1XXXXXXXXXXXXXXXXXXXXXrbsXXXXX1XXXXXXXXXXXXXXXXXXXXXa1XXXXX1XXXXXXXXXXXXXXXXXXXXXa2XXXXX1XXXXXXXXXXXXXXXXXXXXXcdsXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXb1XXXXX1XXXXXXXXXXXXXXXXXXXXXb2XXXXX1XXXXXXXXXXXXXXXXXXXXXb3XXXXX1XXXXXXXXXXXXXXXXXXXXXterminatorXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXtXXXXX1XXXXXXXXXXXXXXXXXXXXXcyclical_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXor_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXdesignXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcds_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXterminator_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_sequence_constraint1XXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_sequence_constraint2XXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcds_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXterminator_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); }); it('Spec for paper', function() { From 05f6d387cc8dad9ef32e155a2cea1844ec2f2cf2 Mon Sep 17 00:00:00 2001 From: lucyq Date: Thu, 17 Jan 2019 15:21:42 -0500 Subject: [PATCH 30/32] moved sbol result text into new folder --- spec.txt | 1 + test/constellationTests.js | 7 ------- test/sbolResults/atom.txt | 1 + test/sbolTests.js | 29 +++++++++++++++++------------ 4 files changed, 19 insertions(+), 19 deletions(-) create mode 100644 spec.txt create mode 100644 test/sbolResults/atom.txt diff --git a/spec.txt b/spec.txt new file mode 100644 index 0000000..f081f3f --- /dev/null +++ b/spec.txt @@ -0,0 +1 @@ +LUCYLUCYLUCY \ No newline at end of file diff --git a/test/constellationTests.js b/test/constellationTests.js index 42663ee..cfa0e39 100644 --- a/test/constellationTests.js +++ b/test/constellationTests.js @@ -42,13 +42,6 @@ module.exports = function() { expect(result.designs).to.contain('a2,c1'); }); - // it('and', function() { - // const result = constellation(DESIGN_NAME, '(a or c) and a', categories, 10); - // expect(result.designs.length).to.equal(1); - // expect(result.designs).to.contain('a1'); - // expect(result.designs).to.contain('a2'); - // }); - it('one-or-more', function() { let result = constellation(DESIGN_NAME, 'one-or-more a', CATEGORIES, 10, 0); expect(result.designs.length).to.equal(ACATS); diff --git a/test/sbolResults/atom.txt b/test/sbolResults/atom.txt new file mode 100644 index 0000000..c902c9b --- /dev/null +++ b/test/sbolResults/atom.txt @@ -0,0 +1 @@ +XXXXXXXXXXXXXXrbsXXXXX1XXXXXXXXXXXXXXXXXXXXXa1XXXXX1XXXXXXXXXXXXXXXXXXXXXa2XXXXX1XXXXXXXXXXXXXXXXXXXXXdesignXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXrbs_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXrbs_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \ No newline at end of file diff --git a/test/sbolTests.js b/test/sbolTests.js index a21f638..9afef42 100644 --- a/test/sbolTests.js +++ b/test/sbolTests.js @@ -1,6 +1,7 @@ const constellation = require('../lib/constellation'); const expect = require('chai').expect; +const fs = require('fs'); var DESIGN_NAME = 'design'; const CATEGORIES = '{"rbs":["a1","a2"],"cds":["b1","b2","b3"],"promoter":["c1"], "terminator": ["t"]}'; @@ -13,25 +14,29 @@ function trim(str) { module.exports = function() { // -describe('SBOL Generation: basic operators', function() { +describe('SBOL Generation', function() { it('atom', function() { let result = constellation(DESIGN_NAME, 'rbs', CATEGORIES, 10, 0); - expect(trim(result.sbols[0])).to.equal('XXXXXXXXXXXXXXrbsXXXXX1XXXXXXXXXXXXXXXXXXXXXa1XXXXX1XXXXXXXXXXXXXXXXXXXXXa2XXXXX1XXXXXXXXXXXXXXXXXXXXXdesignXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXrbs_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXrbs_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); - }); -}); + + fs.readFile('spec.txt', (err, data) => { + if (err) throw err; + + expect(trim(result.sbols[0])).to.equal(data.toString()); -describe('SBOL Generation: combination specs', function() { - it('one-or-more (promoter or rbs) then (zero-or-more cds) then terminator', function() { - let result = constellation(DESIGN_NAME, 'one-or-more (promoter or rbs) then (zero-or-more cds) then terminator', CATEGORIES, 10, 0); - expect(trim(result.sbols[0])).to.equal('XXXXXXXXXXXXXXpromoterXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXc1XXXXX1XXXXXXXXXXXXXXXXXXXXXrbsXXXXX1XXXXXXXXXXXXXXXXXXXXXa1XXXXX1XXXXXXXXXXXXXXXXXXXXXa2XXXXX1XXXXXXXXXXXXXXXXXXXXXcdsXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXb1XXXXX1XXXXXXXXXXXXXXXXXXXXXb2XXXXX1XXXXXXXXXXXXXXXXXXXXXb3XXXXX1XXXXXXXXXXXXXXXXXXXXXterminatorXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXtXXXXX1XXXXXXXXXXXXXXXXXXXXXcyclical_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXor_unit1XXXXX1XXXXXXXXXXXXXXXXXXXXXdesignXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcds_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXterminator_componentXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_sequence_constraint1XXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_sequence_constraint2XXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXor_unit1_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdesign_combinatorial_derivationXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcyclical_unit1_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcds_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXterminator_component_variableXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); + }); }); - it('Spec for paper', function() { - let result = constellation(DESIGN_NAME, 'one-or-more(one-or-more(promoter then cds)then cds then (zero-or-more (cds or (one-or-more (cds then promoter then cds) then cds)) then (terminator or (terminator then cds) or (cds then terminator)))))', CATEGORIES, 10, 0); + // it('Spec for paper', function() { + // let result = constellation(DESIGN_NAME, 'one-or-more(one-or-more(promoter then cds)then cds then (zero-or-more (cds or (one-or-more (cds then promoter then cds) then cds)) then (terminator or (terminator then cds) or (cds then terminator)))))', CATEGORIES, 10, 0); - // currently result.sbol is undefined + - }); + // fs.readFile('spec.txt', (err, data) => { + // if (err) throw err; + // console.log(data.toString()); + // }); + + // }); }); } From 78ca5576491d85944109ffe83f909e79adfa9ddb Mon Sep 17 00:00:00 2001 From: lucyq Date: Fri, 18 Jan 2019 10:37:35 -0500 Subject: [PATCH 31/32] comparing SBOL examples to text files instead of blocks of text --- spec.txt | 1 - test/sbolResults/error.txt | 1 + test/sbolResults/paperEx.txt | 632 +++++++++++++++++++++++++++++++++++ test/sbolTests.js | 55 +-- 4 files changed, 664 insertions(+), 25 deletions(-) delete mode 100644 spec.txt create mode 100644 test/sbolResults/error.txt create mode 100644 test/sbolResults/paperEx.txt diff --git a/spec.txt b/spec.txt deleted file mode 100644 index f081f3f..0000000 --- a/spec.txt +++ /dev/null @@ -1 +0,0 @@ -LUCYLUCYLUCY \ No newline at end of file diff --git a/test/sbolResults/error.txt b/test/sbolResults/error.txt new file mode 100644 index 0000000..5e40c08 --- /dev/null +++ b/test/sbolResults/error.txt @@ -0,0 +1 @@ +asdf \ No newline at end of file diff --git a/test/sbolResults/paperEx.txt b/test/sbolResults/paperEx.txt new file mode 100644 index 0000000..e9118d9 --- /dev/null +++ b/test/sbolResults/paperEx.txt @@ -0,0 +1,632 @@ + + + + + promoter + 1 + + + + + + c1 + 1 + + + + + cds + 1 + + + + + + b1 + 1 + + + + + b2 + 1 + + + + + b3 + 1 + + + + + terminator + 1 + + + + + + t + 1 + + + + + cyclical_unit1 + 1 + + + + + cyclical_unit2_component + 1 + + + + + + + + cds_component + 1 + + + + + + + + cyclical_unit3_component + 1 + + + + + + + + or_unit2_component + 1 + + + + + + + + cyclical_unit1_sequence_constraint7 + 1 + + + + + + + + + cyclical_unit1_sequence_constraint8 + 1 + + + + + + + + + cyclical_unit1_sequence_constraint9 + 1 + + + + + + + + + cyclical_unit1 + 1 + + + + + cyclical_unit2 + 1 + + + + + promoter_component + 1 + + + + + + + + cds_component + 1 + + + + + + + + cyclical_unit2_sequence_constraint1 + 1 + + + + + + + + + cyclical_unit2 + 1 + + + + + cyclical_unit3 + 1 + + + + + or_unit1_component + 1 + + + + + + + + cyclical_unit3 + 1 + + + + + or_unit1 + 1 + + + + + cyclical_unit4 + 1 + + + + + cds_component + 1 + + + + + + + + promoter_component + 1 + + + + + + + + cds_component + 1 + + + + + + + + cyclical_unit4_sequence_constraint2 + 1 + + + + + + + + + cyclical_unit4_sequence_constraint3 + 1 + + + + + + + + + cyclical_unit4 + 1 + + + + + or_unit1_or_subunit1 + 1 + + + + + cyclical_unit4_component + 1 + + + + + + + + cds_component + 1 + + + + + + + + or_unit1_or_subunit1_sequence_constraint4 + 1 + + + + + + + + + or_unit2 + 1 + + + + + or_unit2_or_subunit1 + 1 + + + + + cds_component + 1 + + + + + + + + terminator_component + 1 + + + + + + + + or_unit2_or_subunit1_sequence_constraint5 + 1 + + + + + + + + + or_unit2_or_subunit2 + 1 + + + + + terminator_component + 1 + + + + + + + + cds_component + 1 + + + + + + + + or_unit2_or_subunit2_sequence_constraint6 + 1 + + + + + + + + + design + 1 + + + + + cyclical_unit1_component + 1 + + + + + + + + cyclical_unit1_combinatorial_derivation + 1 + + + + + cyclical_unit2_component_variable + 1 + + + + + + + + + cds_component_variable + 1 + + + + + + + + + + + cyclical_unit3_component_variable + 1 + + + + + + + + + or_unit2_component_variable + 1 + + + + + + + + + + + cyclical_unit2_combinatorial_derivation + 1 + + + + + promoter_component_variable + 1 + + + + + + + + + cds_component_variable + 1 + + + + + + + + + + + cyclical_unit3_combinatorial_derivation + 1 + + + + + or_unit1_component_variable + 1 + + + + + + + + + + + + cyclical_unit4_combinatorial_derivation + 1 + + + + + cds_component_variable + 1 + + + + + + + + + + + promoter_component_variable + 1 + + + + + + + + + cds_component_variable + 1 + + + + + + + + + + + or_unit1_or_subunit1_combinatorial_derivation + 1 + + + + + cyclical_unit4_component_variable + 1 + + + + + + + + + cds_component_variable + 1 + + + + + + + + + + + or_unit2_or_subunit1_combinatorial_derivation + 1 + + + + + cds_component_variable + 1 + + + + + + + + + + + terminator_component_variable + 1 + + + + + + + + + or_unit2_or_subunit2_combinatorial_derivation + 1 + + + + + terminator_component_variable + 1 + + + + + + + + + cds_component_variable + 1 + + + + + + + + + + + design_combinatorial_derivation + 1 + + + + + cyclical_unit1_component_variable + 1 + + + + + + + + ✓ Spec for paper (1765ms) + + + 41 passing (2s) + +----------------------|----------|----------|----------|----------|-------------------| +File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s | +----------------------|----------|----------|----------|----------|-------------------| +All files | 96.05 | 87.83 | 94.74 | 96.21 | | + constellation.js | 84.62 | 52.94 | 100 | 84.62 | 26,29,32,35,41,63 | + designEnumeration.js | 94.44 | 82.14 | 100 | 94.44 | 19,25,45 | + graph.js | 96.26 | 87.5 | 90 | 96.26 |... 38,539,540,542 | + sbol.js | 97.82 | 94.69 | 96.15 | 98.17 |... 43,381,389,390 | +----------------------|----------|----------|----------|----------|-------------------| diff --git a/test/sbolTests.js b/test/sbolTests.js index 9afef42..88217d2 100644 --- a/test/sbolTests.js +++ b/test/sbolTests.js @@ -1,7 +1,8 @@ const constellation = require('../lib/constellation'); const expect = require('chai').expect; -const fs = require('fs'); +var fs = require('fs'); + var DESIGN_NAME = 'design'; const CATEGORIES = '{"rbs":["a1","a2"],"cds":["b1","b2","b3"],"promoter":["c1"], "terminator": ["t"]}'; @@ -12,31 +13,37 @@ function trim(str) { } -module.exports = function() { -// -describe('SBOL Generation', function() { - it('atom', function() { - let result = constellation(DESIGN_NAME, 'rbs', CATEGORIES, 10, 0); - - fs.readFile('spec.txt', (err, data) => { - if (err) throw err; +function readModuleFile(path, callback) { + try { + var filename = require.resolve(path); + fs.readFile(filename, 'utf8', callback); + } catch (e) { + console.log('error?', e); + callback(e); + } +} - expect(trim(result.sbols[0])).to.equal(data.toString()); +module.exports = function() { + // + describe('SBOL Generation', function() { + it('atom', function(done) { + let result = constellation(DESIGN_NAME, 'rbs', CATEGORIES, 10, 0); + + readModuleFile('./sbolResults/atom.txt', function (err, words) { + expect(err).to.be.a('null'); + expect(trim(result.sbols[0])).to.eql(trim(words)); + done(); + }); + }); + it('Spec for paper', function() { + let result = constellation(DESIGN_NAME, 'one-or-more(one-or-more(promoter then cds)then cds then (zero-or-more (cds or (one-or-more (cds then promoter then cds) then cds)) then (terminator or (terminator then cds) or (cds then terminator)))))', CATEGORIES, 10, 0); + + readModuleFile('./sbolResults/paperEx.txt', function (err, words) { + expect(err).to.be.a('null'); + expect(trim(result.sbols[0])).to.eql(trim(words)); + done(); + }); }); }); - - // it('Spec for paper', function() { - // let result = constellation(DESIGN_NAME, 'one-or-more(one-or-more(promoter then cds)then cds then (zero-or-more (cds or (one-or-more (cds then promoter then cds) then cds)) then (terminator or (terminator then cds) or (cds then terminator)))))', CATEGORIES, 10, 0); - - - - // fs.readFile('spec.txt', (err, data) => { - // if (err) throw err; - // console.log(data.toString()); - // }); - - // }); -}); - } From 4aca2906e942755b34cf46ac20ea218357d8448f Mon Sep 17 00:00:00 2001 From: lucyq Date: Fri, 18 Jan 2019 10:39:31 -0500 Subject: [PATCH 32/32] minor change --- test/sbolTests.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/sbolTests.js b/test/sbolTests.js index 88217d2..35d65c2 100644 --- a/test/sbolTests.js +++ b/test/sbolTests.js @@ -18,7 +18,6 @@ function readModuleFile(path, callback) { var filename = require.resolve(path); fs.readFile(filename, 'utf8', callback); } catch (e) { - console.log('error?', e); callback(e); } }