Moved parser into main source folders
This commit is contained in:
121
app/imports/parser/grammar.js
Normal file
121
app/imports/parser/grammar.js
Normal file
@@ -0,0 +1,121 @@
|
||||
// Generated automatically by nearley, version 2.16.0
|
||||
// http://github.com/Hardmath123/nearley
|
||||
(function () {
|
||||
function id(x) { return x[0]; }
|
||||
|
||||
const moo = require("moo");
|
||||
|
||||
const lexer = moo.compile({
|
||||
number: /[0-9]+(?:\.[0-9]+)?/,
|
||||
string: {
|
||||
match: /'.*?'|".*?"/,
|
||||
value: s => s.slice(1, -1),
|
||||
},
|
||||
name: {
|
||||
match: /[a-zA-Z]+\w*?/,
|
||||
type: moo.keywords({
|
||||
'keywords': ['if', 'else', 'd'],
|
||||
}),
|
||||
},
|
||||
space: {
|
||||
match: /\s+/,
|
||||
lineBreaks: true,
|
||||
},
|
||||
separators: [',', '.'],
|
||||
multiplicativeOperator: ['*', '/'],
|
||||
exponentOperator: ['^'],
|
||||
additiveOperator: ['+', '-'],
|
||||
unaryOperator: ['-'],
|
||||
andOperator: ['&', '&&'],
|
||||
orOperator: ['|', '||'],
|
||||
stringDelimiters: ['\"', '\''],
|
||||
equalityOperator: ['=', '==', '===', '!=', '!=='],
|
||||
relationalOperator: ['>', '<', '>=', '<='],
|
||||
brackets: ['(', ')', '{', '}'],
|
||||
});
|
||||
|
||||
function nuller() { return null; }
|
||||
|
||||
class OperatorNode {
|
||||
constructor({left, right, operator, fn}) {
|
||||
this.left = left;
|
||||
this.right = right;
|
||||
this.fn = fn;
|
||||
this.operator = operator;
|
||||
}
|
||||
}
|
||||
function operator([left, _1, operator, _2, right], fn){
|
||||
return new OperatorNode({
|
||||
left,
|
||||
right,
|
||||
operator: operator.value,
|
||||
fn
|
||||
});
|
||||
}
|
||||
|
||||
class SymbolNode {
|
||||
constructor(name){
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
||||
class ConstantNode {
|
||||
constructor(value, type){
|
||||
this.type = type;
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
var grammar = {
|
||||
Lexer: lexer,
|
||||
ParserRules: [
|
||||
{"name": "ifStatement", "symbols": [{"literal":"if"}, "_", {"literal":"("}, "_", "expression", "_", {"literal":")"}, "_", "ifStatement", "_", {"literal":"else"}, "_", "ifStatement"], "postprocess": d => ({condition: d[4], true: d[8], false: d[12]})},
|
||||
{"name": "ifStatement", "symbols": ["expression"], "postprocess": id},
|
||||
{"name": "expression", "symbols": ["equalityExpression"], "postprocess": d => d[0]},
|
||||
{"name": "equalityExpression", "symbols": ["equalityExpression", "_", (lexer.has("equalityOperator") ? {type: "equalityOperator"} : equalityOperator), "_", "relationalExpression"], "postprocess": d => operator(d, 'equality')},
|
||||
{"name": "equalityExpression", "symbols": ["relationalExpression"], "postprocess": id},
|
||||
{"name": "relationalExpression", "symbols": ["relationalExpression", "_", (lexer.has("relationalOperator") ? {type: "relationalOperator"} : relationalOperator), "_", "orExpression"], "postprocess": d => operator(d, 'relation')},
|
||||
{"name": "relationalExpression", "symbols": ["orExpression"], "postprocess": id},
|
||||
{"name": "orExpression", "symbols": ["orExpression", "_", (lexer.has("orOperator") ? {type: "orOperator"} : orOperator), "_", "andExpression"], "postprocess": d => operator(d, 'or')},
|
||||
{"name": "orExpression", "symbols": ["andExpression"], "postprocess": id},
|
||||
{"name": "andExpression", "symbols": ["andExpression", "_", (lexer.has("andOperator") ? {type: "andOperator"} : andOperator), "_", "additiveExpression"], "postprocess": d => operator(d, 'and')},
|
||||
{"name": "andExpression", "symbols": ["additiveExpression"], "postprocess": id},
|
||||
{"name": "additiveExpression", "symbols": ["additiveExpression", "_", (lexer.has("additiveOperator") ? {type: "additiveOperator"} : additiveOperator), "_", "multiplicativeExpression"], "postprocess": d => operator(d, 'add')},
|
||||
{"name": "additiveExpression", "symbols": ["multiplicativeExpression"], "postprocess": id},
|
||||
{"name": "multiplicativeExpression", "symbols": ["multiplicativeExpression", "_", (lexer.has("multiplicativeOperator") ? {type: "multiplicativeOperator"} : multiplicativeOperator), "_", "rollExpression"], "postprocess": d => operator(d, 'multiply')},
|
||||
{"name": "multiplicativeExpression", "symbols": ["rollExpression"], "postprocess": id},
|
||||
{"name": "rollExpression", "symbols": ["rollExpression", "_", {"literal":"d"}, "_", "exponentExpression"], "postprocess": d => operator(d, 'roll')},
|
||||
{"name": "rollExpression", "symbols": ["exponentExpression"], "postprocess": id},
|
||||
{"name": "exponentExpression", "symbols": ["callExpression", "_", (lexer.has("exponentOperator") ? {type: "exponentOperator"} : exponentOperator), "_", "exponentExpression"], "postprocess": d => operator(d, 'exponent')},
|
||||
{"name": "exponentExpression", "symbols": ["callExpression"], "postprocess": id},
|
||||
{"name": "callExpression", "symbols": ["name", "_", "arguments"], "postprocess":
|
||||
d => ({type: "call", function: d[0], arguments: d[2]})
|
||||
},
|
||||
{"name": "callExpression", "symbols": ["parenthesizedExpression"], "postprocess": id},
|
||||
{"name": "arguments$ebnf$1$subexpression$1", "symbols": ["expression"], "postprocess": d => d[0]},
|
||||
{"name": "arguments$ebnf$1", "symbols": ["arguments$ebnf$1$subexpression$1"], "postprocess": id},
|
||||
{"name": "arguments$ebnf$1", "symbols": [], "postprocess": function(d) {return null;}},
|
||||
{"name": "arguments$ebnf$2", "symbols": []},
|
||||
{"name": "arguments$ebnf$2$subexpression$1", "symbols": ["_", {"literal":","}, "_", "expression"], "postprocess": d => d[3]},
|
||||
{"name": "arguments$ebnf$2", "symbols": ["arguments$ebnf$2", "arguments$ebnf$2$subexpression$1"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}},
|
||||
{"name": "arguments", "symbols": [{"literal":"("}, "_", "arguments$ebnf$1", "arguments$ebnf$2", "_", {"literal":")"}], "postprocess":
|
||||
d => [d[2], ...d[3]]
|
||||
},
|
||||
{"name": "parenthesizedExpression", "symbols": [{"literal":"("}, "_", "expression", "_", {"literal":")"}], "postprocess": d => d[2]},
|
||||
{"name": "parenthesizedExpression", "symbols": ["valueExpression"], "postprocess": id},
|
||||
{"name": "valueExpression", "symbols": ["name"], "postprocess": id},
|
||||
{"name": "valueExpression", "symbols": ["number"], "postprocess": id},
|
||||
{"name": "valueExpression", "symbols": ["string"], "postprocess": id},
|
||||
{"name": "number", "symbols": [(lexer.has("number") ? {type: "number"} : number)], "postprocess": d => new ConstantNode(d[0].value, 'number')},
|
||||
{"name": "name", "symbols": [(lexer.has("name") ? {type: "name"} : name)], "postprocess": d => new SymbolNode(d[0].value)},
|
||||
{"name": "string", "symbols": [(lexer.has("string") ? {type: "string"} : string)], "postprocess": d => new ConstantNode(d[0].value, 'string')},
|
||||
{"name": "_", "symbols": []},
|
||||
{"name": "_", "symbols": [(lexer.has("space") ? {type: "space"} : space)], "postprocess": nuller}
|
||||
]
|
||||
, ParserStart: "ifStatement"
|
||||
}
|
||||
if (typeof module !== 'undefined'&& typeof module.exports !== 'undefined') {
|
||||
module.exports = grammar;
|
||||
} else {
|
||||
window.grammar = grammar;
|
||||
}
|
||||
})();
|
||||
140
app/imports/parser/grammar.ne
Normal file
140
app/imports/parser/grammar.ne
Normal file
@@ -0,0 +1,140 @@
|
||||
@{%
|
||||
const moo = require("moo");
|
||||
|
||||
const lexer = moo.compile({
|
||||
number: /[0-9]+(?:\.[0-9]+)?/,
|
||||
string: {
|
||||
match: /'.*?'|".*?"/,
|
||||
value: s => s.slice(1, -1),
|
||||
},
|
||||
name: {
|
||||
match: /[a-zA-Z]+\w*?/,
|
||||
type: moo.keywords({
|
||||
'keywords': ['if', 'else', 'd'],
|
||||
}),
|
||||
},
|
||||
space: {
|
||||
match: /\s+/,
|
||||
lineBreaks: true,
|
||||
},
|
||||
separators: [',', '.'],
|
||||
multiplicativeOperator: ['*', '/'],
|
||||
exponentOperator: ['^'],
|
||||
additiveOperator: ['+', '-'],
|
||||
unaryOperator: ['-'],
|
||||
andOperator: ['&', '&&'],
|
||||
orOperator: ['|', '||'],
|
||||
stringDelimiters: ['\"', '\''],
|
||||
equalityOperator: ['=', '==', '===', '!=', '!=='],
|
||||
relationalOperator: ['>', '<', '>=', '<='],
|
||||
brackets: ['(', ')', '{', '}'],
|
||||
});
|
||||
|
||||
function nuller() { return null; }
|
||||
|
||||
class OperatorNode {
|
||||
constructor({left, right, operator, fn}) {
|
||||
this.left = left;
|
||||
this.right = right;
|
||||
this.fn = fn;
|
||||
this.operator = operator;
|
||||
}
|
||||
}
|
||||
function operator([left, _1, operator, _2, right], fn){
|
||||
return new OperatorNode({
|
||||
left,
|
||||
right,
|
||||
operator: operator.value,
|
||||
fn
|
||||
});
|
||||
}
|
||||
|
||||
class SymbolNode {
|
||||
constructor(name){
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
||||
class ConstantNode {
|
||||
constructor(value, type){
|
||||
this.type = type;
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
%}
|
||||
|
||||
# Use the Moo lexer
|
||||
@lexer lexer
|
||||
|
||||
ifStatement ->
|
||||
"if" _ "(" _ expression _ ")" _ ifStatement _ "else" _ ifStatement {% d => ({condition: d[4], true: d[8], false: d[12]}) %}
|
||||
| expression {% id %}
|
||||
|
||||
expression ->
|
||||
equalityExpression {% d => d[0] %}
|
||||
|
||||
equalityExpression ->
|
||||
equalityExpression _ %equalityOperator _ relationalExpression {% d => operator(d, 'equality') %}
|
||||
| relationalExpression {% id %}
|
||||
|
||||
relationalExpression ->
|
||||
relationalExpression _ %relationalOperator _ orExpression {% d => operator(d, 'relation') %}
|
||||
| orExpression {% id %}
|
||||
|
||||
orExpression ->
|
||||
orExpression _ %orOperator _ andExpression {% d => operator(d, 'or') %}
|
||||
| andExpression {% id %}
|
||||
|
||||
andExpression ->
|
||||
andExpression _ %andOperator _ additiveExpression {% d => operator(d, 'and') %}
|
||||
| additiveExpression {% id %}
|
||||
|
||||
additiveExpression ->
|
||||
additiveExpression _ %additiveOperator _ multiplicativeExpression {% d => operator(d, 'add') %}
|
||||
| multiplicativeExpression {% id %}
|
||||
|
||||
multiplicativeExpression ->
|
||||
multiplicativeExpression _ %multiplicativeOperator _ rollExpression {% d => operator(d, 'multiply') %}
|
||||
| rollExpression {% id %}
|
||||
|
||||
rollExpression ->
|
||||
rollExpression _ "d" _ exponentExpression {% d => operator(d, 'roll') %}
|
||||
| exponentExpression {% id %}
|
||||
|
||||
exponentExpression ->
|
||||
callExpression _ %exponentOperator _ exponentExpression {% d => operator(d, 'exponent') %}
|
||||
| callExpression {% id %}
|
||||
|
||||
callExpression ->
|
||||
name _ arguments {%
|
||||
d => ({type: "call", function: d[0], arguments: d[2]})
|
||||
%}
|
||||
| parenthesizedExpression {% id %}
|
||||
|
||||
arguments ->
|
||||
"(" _ (expression {% d => d[0] %}):? ( _ "," _ expression {% d => d[3] %} ):* _ ")" {%
|
||||
d => [d[2], ...d[3]]
|
||||
%}
|
||||
|
||||
parenthesizedExpression ->
|
||||
"(" _ expression _ ")" {% d => d[2] %}
|
||||
| valueExpression {% id %}
|
||||
|
||||
valueExpression ->
|
||||
name {% id %}
|
||||
| number {% id %}
|
||||
| string {% id %}
|
||||
|
||||
# A number or a function of a number
|
||||
number ->
|
||||
%number {% d => new ConstantNode(d[0].value, 'number') %}
|
||||
|
||||
name ->
|
||||
%name {% d => new SymbolNode(d[0].value) %}
|
||||
|
||||
string ->
|
||||
%string {% d => new ConstantNode(d[0].value, 'string') %}
|
||||
|
||||
_ ->
|
||||
null
|
||||
| %space {% nuller %}
|
||||
8
app/imports/parser/parser.js
Normal file
8
app/imports/parser/parser.js
Normal file
@@ -0,0 +1,8 @@
|
||||
import grammar from '/imports/parser/grammar.js';
|
||||
import nearley from 'nearley';
|
||||
|
||||
const nearleyGrammar = nearley.Grammar.fromCompiled(grammar);
|
||||
|
||||
export default function parser(){
|
||||
return new nearley.Parser(nearleyGrammar);
|
||||
}
|
||||
14
app/imports/parser/readme.md
Normal file
14
app/imports/parser/readme.md
Normal file
@@ -0,0 +1,14 @@
|
||||
The grammer.js file is built separately from the rest of the build process
|
||||
to rebuild the grammar after changing grammar.ne:
|
||||
|
||||
make sure Nearley in installed
|
||||
|
||||
`npm install -g nearley`
|
||||
|
||||
compile
|
||||
|
||||
`nearleyc grammar.ne -o grammar.js`
|
||||
|
||||
To make this happen as part of the build process, a Meteor build plugin needs to
|
||||
created that can compile `.ne` files to `.js` and include them where ever
|
||||
they need to be imported.
|
||||
115
app/package-lock.json
generated
115
app/package-lock.json
generated
@@ -199,6 +199,11 @@
|
||||
"delayed-stream": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"commander": {
|
||||
"version": "2.19.0",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
|
||||
"integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
|
||||
},
|
||||
"complex.js": {
|
||||
"version": "2.0.11",
|
||||
"resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.0.11.tgz",
|
||||
@@ -294,6 +299,11 @@
|
||||
"resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.1.tgz",
|
||||
"integrity": "sha1-082BIh4+pAdCz83lVtTpnpjdxxs="
|
||||
},
|
||||
"discontinuous-range": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz",
|
||||
"integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo="
|
||||
},
|
||||
"ecc-jsbn": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
|
||||
@@ -1446,6 +1456,37 @@
|
||||
"requires": {
|
||||
"inherits": "~2.0.1",
|
||||
"readable-stream": "^2.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"readable-stream": {
|
||||
"version": "2.3.6",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
|
||||
"requires": {
|
||||
"core-util-is": "~1.0.0",
|
||||
"inherits": "~2.0.3",
|
||||
"isarray": "~1.0.0",
|
||||
"process-nextick-args": "~2.0.0",
|
||||
"safe-buffer": "~5.1.1",
|
||||
"string_decoder": "~1.1.1",
|
||||
"util-deprecate": "~1.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"inherits": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
||||
}
|
||||
}
|
||||
},
|
||||
"string_decoder": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||
"requires": {
|
||||
"safe-buffer": "~5.1.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"stream-http": {
|
||||
@@ -1458,6 +1499,37 @@
|
||||
"readable-stream": "^2.3.3",
|
||||
"to-arraybuffer": "^1.0.0",
|
||||
"xtend": "^4.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"readable-stream": {
|
||||
"version": "2.3.6",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
|
||||
"requires": {
|
||||
"core-util-is": "~1.0.0",
|
||||
"inherits": "~2.0.3",
|
||||
"isarray": "~1.0.0",
|
||||
"process-nextick-args": "~2.0.0",
|
||||
"safe-buffer": "~5.1.1",
|
||||
"string_decoder": "~1.1.1",
|
||||
"util-deprecate": "~1.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"inherits": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
||||
}
|
||||
}
|
||||
},
|
||||
"string_decoder": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||
"requires": {
|
||||
"safe-buffer": "~5.1.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"string_decoder": {
|
||||
@@ -1585,6 +1657,11 @@
|
||||
"lodash.without": "^4.4.0"
|
||||
}
|
||||
},
|
||||
"moo": {
|
||||
"version": "0.5.0",
|
||||
"resolved": "https://registry.npmjs.org/moo/-/moo-0.5.0.tgz",
|
||||
"integrity": "sha512-AMv6iqhTEd5vT/cQlH6cammKS5ekyHhyqTRKi5zKMWl1RTyFnQ3ohPSBNSm8ySe2wlxSKwDonr9D5ZT44mdO3g=="
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
@@ -1595,6 +1672,25 @@
|
||||
"resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz",
|
||||
"integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U="
|
||||
},
|
||||
"nearley": {
|
||||
"version": "2.16.0",
|
||||
"resolved": "https://registry.npmjs.org/nearley/-/nearley-2.16.0.tgz",
|
||||
"integrity": "sha512-Tr9XD3Vt/EujXbZBv6UAHYoLUSMQAxSsTnm9K3koXzjzNWY195NqALeyrzLZBKzAkL3gl92BcSogqrHjD8QuUg==",
|
||||
"requires": {
|
||||
"commander": "^2.19.0",
|
||||
"moo": "^0.4.3",
|
||||
"railroad-diagrams": "^1.0.0",
|
||||
"randexp": "0.4.6",
|
||||
"semver": "^5.4.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"moo": {
|
||||
"version": "0.4.3",
|
||||
"resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz",
|
||||
"integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"nice-try": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
|
||||
@@ -1805,6 +1901,20 @@
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
|
||||
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
|
||||
},
|
||||
"railroad-diagrams": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz",
|
||||
"integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234="
|
||||
},
|
||||
"randexp": {
|
||||
"version": "0.4.6",
|
||||
"resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz",
|
||||
"integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==",
|
||||
"requires": {
|
||||
"discontinuous-range": "1.0.0",
|
||||
"ret": "~0.1.10"
|
||||
}
|
||||
},
|
||||
"rc": {
|
||||
"version": "1.2.8",
|
||||
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
|
||||
@@ -1879,6 +1989,11 @@
|
||||
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
|
||||
"integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
|
||||
},
|
||||
"ret": {
|
||||
"version": "0.1.15",
|
||||
"resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
|
||||
"integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
|
||||
},
|
||||
"rimraf": {
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
"lodash": "^4.17.11",
|
||||
"mathjs": "^5.5.0",
|
||||
"meteor-node-stubs": "^0.3.3",
|
||||
"moo": "^0.5.0",
|
||||
"nearley": "^2.16.0",
|
||||
"qrcode": "^1.3.3",
|
||||
"simpl-schema": "^1.5.5",
|
||||
"source-map-support": "^0.5.10",
|
||||
|
||||
Reference in New Issue
Block a user