diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 6c34ee4f..00000000 --- a/.babelrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "presets": [ - "env" - ], - "plugins": [ - ["transform-runtime", { - "helpers": false, - "polyfill": true, - "regenerator": true, - "moduleName": "babel-runtime" - }] - ] -} diff --git a/.gitignore b/.gitignore index 5349e805..e5ff4b7d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ jsonata-es5.min.js node_modules/ npm-debug.log .idea/ +es2015/ +es5/ +dist/ \ No newline at end of file diff --git a/test/async-function.js b/__tests__/async-function.ts similarity index 59% rename from test/async-function.js rename to __tests__/async-function.ts index 55b7216e..60518661 100644 --- a/test/async-function.js +++ b/__tests__/async-function.ts @@ -1,14 +1,9 @@ "use strict"; -var jsonata = require('../jsonata'); +var jsonata = require('../src').jsonata; var request = require('request'); -//var assert = require('assert'); -var chai = require("chai"); -var expect = chai.expect; -var chaiAsPromised = require("chai-as-promised"); -chai.use(chaiAsPromised); -var jsonataPromise = function(expr, data, bindings) { +var jsonataPromise = function(expr, data?, bindings?) { return new Promise(function(resolve, reject) { expr.evaluate(data, bindings, function(error, response) { if(error) reject(error); @@ -31,10 +26,12 @@ var httpget = function(url) { describe('Invoke JSONata with callback', function() { describe('Make HTTP request', function() { - it('should return promise to results', function() { + it('should return promise to results', async () => { var expr = jsonata('$httpget("https://api.npmjs.org/downloads/range/2016-09-01:2017-03-31/jsonata").downloads{ $substring(day, 0, 7): $sum(downloads) }'); expr.assign('httpget', httpget); - return expect(jsonataPromise(expr)).to.eventually.deep.equal({ + let result = await jsonataPromise(expr); + + expect(result).toEqual({ '2016-09': 205, '2016-10': 1266, '2016-11': 2783, @@ -49,45 +46,57 @@ describe('Invoke JSONata with callback', function() { describe('Invoke JSONata with callback - errors', function() { describe('type error', function() { - it('should throw', function() { + it('should throw', async () => { var expr = jsonata('5 + $httpget("htttttps://api.npmjs.org/downloads/range/2016-09-01:2017-03-31/jsonata")'); expr.assign('httpget', httpget); - return expect(jsonataPromise(expr)).to.be.rejected; - // .to.deep.contain({position: 7, code: 'T0410', token: 'count', index: 2});; + + try { + await jsonataPromise(expr); + expect(undefined).toBeDefined(); + } catch(e) { + // Expected outcome + } }); - }); describe('Make HTTP request with dodgy url', function() { - it('should throw', function() { + it('should throw', async () => { var expr = jsonata('$httpget("htttttps://api.npmjs.org/downloads/range/2016-09-01:2017-03-31/jsonata").downloads{ $substring(day, 0, 7): $sum(downloads) }'); expr.assign('httpget', httpget); - return expect(jsonataPromise(expr)).to.be.rejected; - // .to.deep.contain({position: 7, code: 'T0410', token: 'count', index: 2});; + try { + await jsonataPromise(expr); + expect(undefined).toBeDefined(); + } catch(e) { + // Expected outcome + } }); }); }); describe('Invoke JSONata with callback - return values', function() { - it('should handle an undefined value', function() { + it('should handle an undefined value', async () => { var data = { value: undefined }; var expr = jsonata('value'); - return expect(jsonataPromise(expr, data)).to.eventually.equal(undefined); + let result = await jsonataPromise(expr, data); + expect(result).toEqual(undefined); }); - it('should handle a null value', function() { + it('should handle a null value', async() => { var data = { value: null }; var expr = jsonata('value'); - return expect(jsonataPromise(expr, data)).to.eventually.equal(null); + let result = await jsonataPromise(expr, data); + return expect(result).toEqual(null); }); - it('should handle a value', function() { + it('should handle a value', async() => { var data = { value: 'hello' }; var expr = jsonata('value'); - return expect(jsonataPromise(expr, data)).to.eventually.equal('hello'); + let result = await jsonataPromise(expr, data); + return expect(result).toEqual('hello'); }); - it('should handle a promise', function() { + it('should handle a promise', async() => { var data = { value: Promise.resolve('hello') }; var expr = jsonata('value'); - return expect(jsonataPromise(expr, data)).to.eventually.equal('hello'); + let result = await jsonataPromise(expr, data); + return expect(result).toEqual('hello'); }); }); @@ -111,52 +120,65 @@ describe('Handle chained functions that end in promises', function() { counter: counter }; - it('basic function that returns a thenable', function() { + it('basic function that returns a thenable', async() => { var data = {}; var expr = jsonata('$counter(5)'); - return expect(jsonataPromise(expr, data, bindings)).to.eventually.equal(5); + let result = await jsonataPromise(expr, data, bindings); + expect(result).toEqual(5); }); - it('basic function that returns a thenable, but invokes another function', function() { + it('basic function that returns a thenable, but invokes another function', async() => { var data = {}; var expr = jsonata('$counter(0).inc()'); - return expect(jsonataPromise(expr, data, bindings)).to.eventually.equal(1); + let result = await jsonataPromise(expr, data, bindings); + return expect(result).toEqual(1); }); - it('basic function that returns a thenable, but invokes another function several times', function() { + it('basic function that returns a thenable, but invokes another function several times', async() => { var data = {}; var expr = jsonata('$counter(0).inc().inc().inc().inc()'); - return expect(jsonataPromise(expr, data, bindings)).to.eventually.equal(4); + let result = await jsonataPromise(expr, data, bindings); + return expect(result).toEqual(4); }); - it('basic function that returns a thenable and part of a numeric expression', function() { + it('basic function that returns a thenable and part of a numeric expression', async() => { var data = {}; var expr = jsonata('$counter(3) + 5'); - return expect(jsonataPromise(expr, data, bindings)).to.eventually.equal(8); + let result = await jsonataPromise(expr, data, bindings); + return expect(result).toEqual(8); }); - it('basic function that returns a thenable, but invokes another function several times and part of a numeric expression', function() { + it('basic function that returns a thenable, but invokes another function several times and part of a numeric expression', async() => { var data = {}; var expr = jsonata('$counter(0).inc().inc().inc().inc() + 3'); - return expect(jsonataPromise(expr, data, bindings)).to.eventually.equal(7); + let result = await jsonataPromise(expr, data, bindings); + + return expect(result).toEqual(7); }); - it('basic function that returns a thenable, but invokes another function - nested', function() { + it('basic function that returns a thenable, but invokes another function - nested', async() => { var data = {}; var expr = jsonata('$counter($counter(3).inc().inc()).inc()'); - return expect(jsonataPromise(expr, data, bindings)).to.eventually.equal(6); + let result = await jsonataPromise(expr, data, bindings); + return expect(result).toEqual(6); }); - it('basic function that returns a thenable, then invokes a built-in function', function() { + it('basic function that returns a thenable, then invokes a built-in function', async() => { var data = {}; var expr = jsonata('$counter(3).inc().$string()'); - return expect(jsonataPromise(expr, data, bindings)).to.eventually.equal('4'); + let result = await jsonataPromise(expr, data, bindings); + return expect(result).toEqual('4'); }); - it('basic function that returns a thenable, but invokes a non-existent function', function() { + it('basic function that returns a thenable, but invokes a non-existent function', async() => { var data = {}; var expr = jsonata('$counter(2).inc().foo()'); - return expect(jsonataPromise(expr, data, bindings)).to.be.rejected; - }); + try { + await jsonataPromise(expr, data, bindings); + expect(undefined).toBeDefined(); + } catch(e) { + // Expected outcome + } + }); }); \ No newline at end of file diff --git a/test/implementation-tests.js b/__tests__/implementation-tests.ts similarity index 76% rename from test/implementation-tests.js rename to __tests__/implementation-tests.ts index 88fed1bc..74bb7c79 100644 --- a/test/implementation-tests.js +++ b/__tests__/implementation-tests.ts @@ -10,9 +10,8 @@ "use strict"; -var jsonata = require("../jsonata"); -var chai = require("chai"); -var expect = chai.expect; +var jsonata = require('../src').jsonata; +import { timeboxExpression } from '../src/utils'; var testdata2 = { Account: { @@ -96,7 +95,7 @@ describe("Functions with side-effects", () => { var result = expr.evaluate(testdata2); // number between 1502264152715 and 2000000000000 (18 May 2033) var expected = result > 1502264152715 && result < 2000000000000; - expect(expected).to.deep.equal(true); + expect(expected).toEqual(true); }); }); @@ -105,7 +104,7 @@ describe("Functions with side-effects", () => { var expr = jsonata('{"now": $millis(), "delay": $sum([1..10000]), "later": $millis()}.(now = later)'); var result = expr.evaluate(testdata2); var expected = true; - expect(result).to.deep.equal(expected); + expect(result).toEqual(expected); }); }); @@ -114,7 +113,7 @@ describe("Functions with side-effects", () => { var expr = jsonata("($sum([1..10000]); $millis())"); var result = expr.evaluate(testdata2); var result2 = expr.evaluate(testdata2); - expect(result).to.not.equal(result2); + expect(result).not.toEqual(result2); }); }); }); @@ -124,9 +123,9 @@ describe("Functions with side-effects", () => { var expr = jsonata("$now()"); var result = expr.evaluate(testdata2); // follows this pattern - "2017-05-09T10:10:16.918Z" - expect(result).to.match(/^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ$/); + expect(result).toMatch(/^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ$/); // var match = /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ$/.test(result); - // expect(match).to.deep.equal(true); + // expect(match).toEqual(true); }); }); @@ -135,7 +134,7 @@ describe("Functions with side-effects", () => { var expr = jsonata('{"now": $now(), "delay": $sum([1..10000]), "later": $now()}.(now = later)'); var result = expr.evaluate(testdata2); var expected = true; - expect(result).to.deep.equal(expected); + expect(result).toEqual(expected); }); }); @@ -144,7 +143,7 @@ describe("Functions with side-effects", () => { var expr = jsonata("($sum([1..10000]); $now())"); var result = expr.evaluate(testdata2); var result2 = expr.evaluate(testdata2); - expect(result).to.not.equal(result2); + expect(result).not.toEqual(result2); }); }); @@ -154,7 +153,7 @@ describe("Functions with side-effects", () => { var result = expr.evaluate(testdata2); // number between 1502264152715 and 2000000000000 (18 May 2033) var expected = result > 1502264152715 && result < 2000000000000; - expect(expected).to.deep.equal(true); + expect(expected).toEqual(true); }); }); @@ -164,7 +163,7 @@ describe("Functions with side-effects", () => { var expr = jsonata("$random()"); var result = expr.evaluate(); var expected = result >= 0 && result < 1; - expect(true).to.deep.equal(expected); + expect(true).toEqual(expected); }); }); @@ -173,7 +172,7 @@ describe("Functions with side-effects", () => { var expr = jsonata("$random() = $random()"); var result = expr.evaluate(); var expected = false; - expect(result).to.deep.equal(expected); + expect(result).toEqual(expected); }); }); }); @@ -202,8 +201,8 @@ describe("Tests that bind Javascript functions", () => { } ] }; - expect(result).to.deep.equal(expected); - expect(count).to.equal(1); + expect(result).toEqual(expected); + expect(count).toEqual(1); }); }); @@ -215,7 +214,7 @@ describe("Tests that bind Javascript functions", () => { return "time for tea"; }); var result = expr.evaluate(testdata2); - expect(result).to.equal("time for tea"); + expect(result).toEqual("time for tea"); }); }); @@ -231,7 +230,7 @@ describe("Tests that bind Javascript functions", () => { ); var result = expr.evaluate(testdata2); var expected = [1, 2, 3, 4]; - expect(result).to.deep.equal(expected); + expect(result).toEqual(expected); }); }); describe("map a user-defined Javascript function with undefined signature", function() { @@ -242,7 +241,7 @@ describe("Tests that bind Javascript functions", () => { }); var result = expr.evaluate(testdata2); var expected = [1, 2, 3, 4]; - expect(result).to.deep.equal(expected); + expect(result).toEqual(expected); }); }); @@ -254,7 +253,7 @@ describe("Tests that bind Javascript functions", () => { }); var result = expr.evaluate(testdata2); var expected = [1, 2, 3, 4]; - expect(result).to.deep.equal(expected); + expect(result).toEqual(expected); }); }); describe("Partially apply user-defined Javascript function", function() { @@ -271,7 +270,7 @@ describe("Tests that bind Javascript functions", () => { }); var result = expr.evaluate(testdata2); var expected = "Hello"; - expect(result).to.deep.equal(expected); + expect(result).toEqual(expected); }); }); }); @@ -283,7 +282,7 @@ describe("Tests that are specific to a Javascript runtime", () => { var expr = jsonata('/ab/ ("ab")'); var result = expr.evaluate(); var expected = { match: "ab", start: 0, end: 2, groups: [] }; - expect(JSON.stringify(result)).to.equal(JSON.stringify(expected)); + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); }); }); @@ -292,7 +291,7 @@ describe("Tests that are specific to a Javascript runtime", () => { var expr = jsonata("/ab/ ()"); var result = expr.evaluate(); var expected = undefined; - expect(JSON.stringify(result)).to.equal(JSON.stringify(expected)); + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); }); }); @@ -301,7 +300,7 @@ describe("Tests that are specific to a Javascript runtime", () => { var expr = jsonata('/ab+/ ("ababbabbcc")'); var result = expr.evaluate(); var expected = { match: "ab", start: 0, end: 2, groups: [] }; - expect(JSON.stringify(result)).to.equal(JSON.stringify(expected)); + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); }); }); @@ -310,7 +309,7 @@ describe("Tests that are specific to a Javascript runtime", () => { var expr = jsonata('/a(b+)/ ("ababbabbcc")'); var result = expr.evaluate(); var expected = { match: "ab", start: 0, end: 2, groups: ["b"] }; - expect(JSON.stringify(result)).to.equal(JSON.stringify(expected)); + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); }); }); @@ -319,7 +318,7 @@ describe("Tests that are specific to a Javascript runtime", () => { var expr = jsonata('/a(b+)/ ("ababbabbcc").next()'); var result = expr.evaluate(); var expected = { match: "abb", start: 2, end: 5, groups: ["bb"] }; - expect(JSON.stringify(result)).to.equal(JSON.stringify(expected)); + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); }); }); @@ -328,7 +327,7 @@ describe("Tests that are specific to a Javascript runtime", () => { var expr = jsonata('/a(b+)/ ("ababbabbcc").next().next()'); var result = expr.evaluate(); var expected = { match: "abb", start: 5, end: 8, groups: ["bb"] }; - expect(JSON.stringify(result)).to.equal(JSON.stringify(expected)); + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); }); }); @@ -337,7 +336,7 @@ describe("Tests that are specific to a Javascript runtime", () => { var expr = jsonata('/a(b+)/ ("ababbabbcc").next().next().next()'); var result = expr.evaluate(); var expected = undefined; - expect(JSON.stringify(result)).to.equal(JSON.stringify(expected)); + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); }); }); @@ -346,29 +345,25 @@ describe("Tests that are specific to a Javascript runtime", () => { var expr = jsonata('/a(b+)/i ("Ababbabbcc")'); var result = expr.evaluate(); var expected = { match: "Ab", start: 0, end: 2, groups: ["b"] }; - expect(JSON.stringify(result)).to.equal(JSON.stringify(expected)); + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); }); }); describe("empty regex", function() { it("should throw error", function() { - expect(function() { + expectError(() => { var expr = jsonata("//"); - expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ position: 1, code: "S0301" }); + expr.evaluate(); + }, {position: 1, code: "S0301"}); }); }); - describe("empty regex", function() { + describe("incomplete regex", function() { it("should throw error", function() { - expect(function() { + expectError(() => { var expr = jsonata("/"); expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ position: 1, code: "S0302" }); + }, {position: 1, code: "S0302"}); }); }); @@ -386,7 +381,7 @@ describe("Tests that are specific to a Javascript runtime", () => { }, { match: "ab", index: 5, groups: [] } ]; - expect(result).to.deep.equal(expected); + expect(result).toEqual(expected); }); }); @@ -403,7 +398,7 @@ describe("Tests that are specific to a Javascript runtime", () => { }, { match: "abb", index: 5, groups: ["bb"] } ]; - expect(result).to.deep.equal(expected); + expect(result).toEqual(expected); }); }); @@ -412,7 +407,7 @@ describe("Tests that are specific to a Javascript runtime", () => { var expr = jsonata('$match("ababbabbcc",/a(b+)/, 1)'); var result = expr.evaluate(); var expected = { match: "ab", index: 0, groups: ["b"] }; - expect(result).to.deep.equal(expected); + expect(result).toEqual(expected); }); }); @@ -421,7 +416,7 @@ describe("Tests that are specific to a Javascript runtime", () => { var expr = jsonata('$match("ababbabbcc",/a(b+)/, 0)'); var result = expr.evaluate(); var expected = undefined; - expect(result).to.deep.equal(expected); + expect(result).toEqual(expected); }); }); @@ -430,7 +425,7 @@ describe("Tests that are specific to a Javascript runtime", () => { var expr = jsonata("$match(nothing,/a(xb+)/)"); var result = expr.evaluate(); var expected = undefined; - expect(result).to.deep.equal(expected); + expect(result).toEqual(expected); }); }); @@ -439,84 +434,70 @@ describe("Tests that are specific to a Javascript runtime", () => { var expr = jsonata('$match("ababbabbcc",/a(xb+)/)'); var result = expr.evaluate(); var expected = undefined; - expect(result).to.deep.equal(expected); + expect(result).toEqual(expected); }); }); describe('$match("a, b, c, d", /ab/, -3)', function() { it("should throw error", function() { var expr = jsonata('$match("a, b, c, d", /ab/, -3)'); - expect(function() { + expectError(() => { expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ position: 7, code: "D3040", token: "match", index: 3, value: -3 }); + }, { position: 7, code: "D3040", token: "match", index: 3, value: -3 }); }); }); describe('$match("a, b, c, d", /ab/, null)', function() { it("should throw error", function() { var expr = jsonata('$match("a, b, c, d", /ab/, null)'); - expect(function() { + expectError(() => { expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ position: 7, code: "T0410", token: "match", index: 3, value: null }); + }, { position: 7, code: "T0410", token: "match", index: 3, value: null }); }); }); describe('$match("a, b, c, d", /ab/, "2")', function() { it("should throw error", function() { var expr = jsonata('$match("a, b, c, d", /ab/, "2")'); - expect(function() { + expectError(() => { expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ position: 7, code: "T0410", token: "match", index: 3, value: "2" }); + }, { position: 7, code: "T0410", token: "match", index: 3, value: "2" }); }); }); describe('$match("a, b, c, d", "ab")', function() { it("should throw error", function() { var expr = jsonata('$match("a, b, c, d", "ab")'); - expect(function() { + expectError(() => { expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ position: 7, code: "T0410", token: "match", index: 2, value: "ab" }); + }, { position: 7, code: "T0410", token: "match", index: 2, value: "ab" }); }); }); describe('$match("a, b, c, d", true)', function() { it("should throw error", function() { var expr = jsonata('$match("a, b, c, d", true)'); - expect(function() { + expectError(() => { expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ position: 7, code: "T0410", token: "match", index: 2, value: true }); + }, { position: 7, code: "T0410", token: "match", index: 2, value: true }); }); }); describe("$match(12345, 3)", function() { it("should throw error", function() { var expr = jsonata("$match(12345, 3)"); - expect(function() { + expectError(() => { expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ position: 7, code: "T0410", token: "match", index: 1, value: 12345 }); + }, { position: 7, code: "T0410", token: "match", index: 1, value: 12345 }); }); }); describe("$match(12345)", function() { it("should throw error", function() { var expr = jsonata("$match(12345)"); - expect(function() { + expectError(() => { expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ position: 7, code: "T0410", token: "match", index: 1 }); + }, { position: 7, code: "T0410", token: "match", index: 1 }); }); }); }); @@ -529,7 +510,7 @@ describe("Test that yield platform specific results", () => { var expr = jsonata("$sqrt(10) * $sqrt(10)"); var result = expr.evaluate(); var expected = 10; - expect(result).to.be.closeTo(expected, 1e-13); + expect(result).toBeCloseTo(expected); }); }); }); @@ -537,69 +518,36 @@ describe("Test that yield platform specific results", () => { describe("Tests that include infinite recursion", () => { describe("stack overflow - infinite recursive function - non-tail call", function() { it("should throw error", function() { - expect(function() { + expectError(() => { var expr = jsonata("(" + " $inf := function($n){$n+$inf($n-1)};" + " $inf(5)" + ")"); timeboxExpression(expr, 1000, 300); expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ position: 46, code: "U1001" }); + }, { position: 46, code: "U1001" }); }); }); describe("stack overflow - infinite recursive function - tail call", function() { - this.timeout(5000); + jest.setTimeout(5000); it("should throw error", function() { - expect(function() { + expectError(() => { var expr = jsonata("(" + " $inf := function(){$inf()};" + " $inf()" + ")"); timeboxExpression(expr, 1000, 500); expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ position: 37, code: "U1001" }); + }, { position: 37, code: "U1001" }); }); }); }); -/** - * Protect the process/browser from a runnaway expression - * i.e. Infinite loop (tail recursion), or excessive stack growth - * - * @param {Object} expr - expression to protect - * @param {Number} timeout - max time in ms - * @param {Number} maxDepth - max stack depth - */ -function timeboxExpression(expr, timeout, maxDepth) { - var depth = 0; - var time = Date.now(); - - var checkRunnaway = function() { - if (depth > maxDepth) { - // stack too deep - throw { - message: - "Stack overflow error: Check for non-terminating recursive function. Consider rewriting as tail-recursive.", - stack: new Error().stack, - code: "U1001" - }; - } - if (Date.now() - time > timeout) { - // expression has run for too long - throw { - message: "Expression evaluation timeout: Check for infinite loop", - stack: new Error().stack, - code: "U1001" - }; - } - }; - // register callbacks - expr.assign("__evaluate_entry", function() { - depth++; - checkRunnaway(); - }); - expr.assign("__evaluate_exit", function() { - depth--; - checkRunnaway(); - }); +function expectError(f: () => any, fields) { + let error = false; + try { + f(); + } catch(e) { + Object.keys(fields).forEach((key) => { + expect(e[key]).toEqual(fields[key]); + }); + error = true; + } + expect(error).toBeTruthy(); } diff --git a/__tests__/parser-recovery.ts b/__tests__/parser-recovery.ts new file mode 100644 index 00000000..da662c89 --- /dev/null +++ b/__tests__/parser-recovery.ts @@ -0,0 +1,502 @@ +"use strict"; + +var jsonata = require("../src").jsonata; +var assert = require("assert"); + +describe("Invoke parser with valid expression", function() { + describe("Account.Order[0]", function() { + it("should return ast", function() { + var expr = jsonata("Account.Order[0]", { recover: true }); + var ast = expr.ast(); + var expected_ast = { + type: "path", + keepSingletonArray: false, + position: 8, + value: ".", + steps: [ + { + value: "Account", + type: "name", + position: 7, + }, + { + value: "Order", + type: "name", + position: 13, + predicate: [ + { + value: 0, + type: "literal", + position: 15, + }, + ], + }, + ], + }; + var errors = expr.errors(); + var expected_errors = []; + assert.deepEqual(ast, expected_ast); + assert.deepEqual(errors, expected_errors); + }); + }); +}); + +describe("Invoke parser with incomplete expression", function() { + describe("Account.", function() { + it("should return ast", function() { + var expr = jsonata("Account.", { recover: true }); + var ast = expr.ast(); + var expected_ast = { + type: "path", + keepSingletonArray: false, + position: 8, + value: ".", + steps: [ + { + value: "Account", + type: "name", + position: 7, + }, + { + type: "error", + error: { + code: "S0207", + position: 8, + token: "(end)", + }, + lhs: { + position: 8, + type: "end", + value: "(end)", + }, + position: 8, + remaining: [], + value: "(end)", + }, + ], + }; + var errors = expr.errors(); + var expected_errors = [ + { + code: "S0207", + position: 8, + token: "(end)", + }, + ]; + assert.deepEqual(ast, expected_ast); + assert.deepEqual(errors, expected_errors); + }); + }); + + describe("Account[", function() { + it("should return ast", function() { + var expr = jsonata("Account[", { recover: true }); + var ast = expr.ast(); + var expected_ast = { + type: "path", + keepSingletonArray: false, + position: 7, + value: "Account", + steps: [ + { + value: "Account", + type: "name", + position: 7, + predicate: [ + { + type: "error", + error: { + code: "S0207", + position: 8, + token: "(end)", + }, + lhs: { + position: 8, + type: "end", + value: "(end)", + }, + position: 8, + remaining: [], + value: "(end)", + }, + ], + }, + ], + }; + var errors = expr.errors(); + var expected_errors = [ + { + code: "S0203", + position: 8, + token: "(end)", + value: "]", + remaining: [], + }, + { + code: "S0207", + position: 8, + token: "(end)", + }, + ]; + assert.deepEqual(ast, expected_ast); + assert.deepEqual(errors, expected_errors); + }); + }); + + describe("Account.Order[;0].Product", function() { + it("should return ast", function() { + var expr = jsonata("Account.Order[;0].Product", { recover: true }); + var ast = expr.ast(); + var expected_ast = { + type: "path", + keepSingletonArray: false, + position: 8, + value: ".", + steps: [ + { + value: "Account", + type: "name", + position: 7, + }, + { + value: "Order", + type: "name", + position: 13, + predicate: [ + { + code: "S0211", + token: ";", + position: 15, + remaining: [ + { value: 0, type: "literal", position: 16 }, + { type: "operator", value: "]", position: 17 }, + { type: "operator", value: ".", position: 18 }, + { type: "name", value: "Product", position: 25 }, + ], + type: "error", + }, + ], + }, + ], + }; + var errors = expr.errors(); + var expected_errors = [ + { + code: "S0211", + token: ";", + position: 15, + remaining: [ + { value: 0, type: "literal", position: 16 }, + { type: "operator", value: "]", position: 17 }, + { type: "operator", value: ".", position: 18 }, + { type: "name", value: "Product", position: 25 }, + ], + type: "error", + }, + { + code: "S0202", + position: 16, + token: "0", + value: "]", + remaining: [ + { + value: 0, + type: "literal", + position: 16, + }, + ], + }, + ]; + assert.deepEqual(ast, expected_ast); + assert.deepEqual(errors, expected_errors); + }); + }); + + describe("Account.Order[0;].Product", function() { + it("should return ast", function() { + var expr = jsonata("Account.Order[0;].Product", { recover: true }); + var ast = expr.ast(); + var expected_ast = { + type: "path", + keepSingletonArray: false, + position: 8, + value: ".", + steps: [ + { + value: "Account", + type: "name", + position: 7, + }, + { + value: "Order", + type: "name", + position: 13, + predicate: [ + { + value: 0, + type: "literal", + position: 15, + }, + ], + }, + ], + }; + var errors = expr.errors(); + var expected_errors = [ + { + code: "S0202", + position: 16, + token: ";", + value: "]", + remaining: [ + { value: ";", type: "operator", position: 16 }, + { type: "operator", value: "]", position: 17 }, + { type: "operator", value: ".", position: 18 }, + { type: "name", value: "Product", position: 25 }, + ], + }, + ]; + assert.deepEqual(ast, expected_ast); + assert.deepEqual(errors, expected_errors); + }); + }); + + describe("Account.Order[0].Product;", function() { + it("should return ast", function() { + var expr = jsonata("Account.Order[0].Product;", { recover: true }); + var ast = expr.ast(); + var expected_ast = { + type: "path", + keepSingletonArray: false, + position: 17, + value: ".", + steps: [ + { + value: "Account", + type: "name", + position: 7, + }, + { + value: "Order", + type: "name", + position: 13, + predicate: [ + { + value: 0, + type: "literal", + position: 15, + }, + ], + }, + { + value: "Product", + type: "name", + position: 24, + }, + ], + }; + var errors = expr.errors(); + var expected_errors = [ + { + code: "S0201", + position: 25, + remaining: [ + { + position: 25, + type: "operator", + value: ";", + }, + ], + token: ";", + }, + ]; + assert.deepEqual(ast, expected_ast); + assert.deepEqual(errors, expected_errors); + }); + }); + + describe("$equals3lucy[0].UnstructuredAnswers^()[0].Text", function() { + it("should return ast", function() { + var expr = jsonata("$equals3lucy[0].UnstructuredAnswers^()[0].Text", { recover: true }); + var ast = expr.ast(); + var expected_ast = { + type: "sort", + value: "^", + position: 36, + lhs: { + type: "path", + keepSingletonArray: false, + position: 16, + value: ".", + steps: [ + { + value: "equals3lucy", + type: "variable", + position: 12, + predicate: [ + { + value: 0, + type: "literal", + position: 14, + }, + ], + }, + { + value: "UnstructuredAnswers", + type: "name", + position: 35, + }, + ], + }, + rhs: [ + { + descending: false, + expression: { + code: "S0211", + token: ")", + position: 38, + remaining: [ + { + type: "operator", + value: "[", + position: 39, + }, + { + type: "number", + value: 0, + position: 40, + }, + { + type: "operator", + value: "]", + position: 41, + }, + { + type: "operator", + value: ".", + position: 42, + }, + { + type: "name", + value: "Text", + position: 46, + }, + ], + type: "error", + predicate: [ + { + type: "error", + error: { + code: "S0207", + position: 46, + token: "(end)", + }, + lhs: { + position: 46, + type: "end", + value: "(end)", + }, + position: 46, + remaining: [], + value: "(end)", + }, + ], + }, + }, + ], + }; + var errors = expr.errors(); + var expected_errors = [ + { + code: "S0211", + position: 38, + predicate: [ + { + error: { + code: "S0207", + position: 46, + token: "(end)", + }, + type: "error", + lhs: { + position: 46, + type: "end", + value: "(end)", + }, + position: 46, + remaining: [], + value: "(end)", + }, + ], + remaining: [ + { + position: 39, + type: "operator", + value: "[", + }, + { + position: 40, + type: "number", + value: 0, + }, + { + position: 41, + type: "operator", + value: "]", + }, + { + position: 42, + type: "operator", + value: ".", + }, + { + position: 46, + type: "name", + value: "Text", + }, + ], + token: ")", + type: "error", + }, + { + code: "S0203", + position: 46, + remaining: [], + token: "(end)", + value: "]", + }, + { + code: "S0203", + position: 46, + remaining: [], + token: "(end)", + value: ")", + }, + { + code: "S0207", + position: 46, + token: "(end)", + }, + ]; + assert.deepEqual(ast, expected_ast); + assert.deepEqual(errors, expected_errors); + }); + }); + + describe("An expression with syntax error should not be executable", function() { + describe("Account.", function() { + it("should return ast", function() { + var expr = jsonata("Account.", { recover: true }); + let error = false; + try { + expr.evaluate({}); + } catch (e) { + expect(e.position).toEqual(0); + expect(e.code).toEqual("S0500"); + error = true; + } + expect(error).toBeTruthy(); + }); + }); + }); +}); diff --git a/test/run-test-suite.js b/__tests__/run-test-suite.ts similarity index 76% rename from test/run-test-suite.js rename to __tests__/run-test-suite.ts index ddf6ff52..d17e82f1 100644 --- a/test/run-test-suite.js +++ b/__tests__/run-test-suite.ts @@ -8,9 +8,8 @@ var fs = require("fs"); var path = require("path"); -var jsonata = require("../jsonata"); -var chai = require("chai"); -var expect = chai.expect; +var jsonata = require('../src').jsonata; +import { timeboxExpression } from '../src/utils'; let groups = fs.readdirSync(path.join(__dirname, "test-suite", "groups")).filter((name) => !name.endsWith(".json")); @@ -58,7 +57,7 @@ describe("JSONata Test Suite", () => { // If there is a timelimit and depth limit for this case, use the // `timeboxExpression` function to limit evaluation if ("timelimit" in testcase && "depth" in testcase) { - this.timeout(testcase.timelimit * 2); + jest.setTimeout(testcase.timelimit*2); timeboxExpression(expr, testcase.timelimit, testcase.depth); } } catch (e) { @@ -67,10 +66,10 @@ describe("JSONata Test Suite", () => { // `code` field in the testcase) if (testcase.code) { // See if we go the code we expected - expect(e.code).to.equal(testcase.code); + expect(e.code).toEqual(testcase.code); // If a token was specified, check for that too if (testcase.hasOwnProperty("token")) { - expect(e.token).to.equal(testcase.token); + expect(e.code).toEqual(testcase.token); } } else { // If we get here, something went wrong because an exception @@ -91,21 +90,26 @@ describe("JSONata Test Suite", () => { // First is that we have an undefined result. So, check // to see if the result we get from evaluation is undefined let result = expr.evaluate(dataset, testcase.bindings); - expect(result).to.deep.equal(undefined); + expect(result).toBeUndefined(); } else if ("result" in testcase) { // Second is that a (defined) result was provided. In this case, // we do a deep equality check against the expected result. let result = expr.evaluate(dataset, testcase.bindings); - expect(result).to.deep.equal(testcase.result); + expect(result).toEqual(testcase.result); } else if ("code" in testcase) { // Finally, if a `code` field was specified, we expected the // evaluation to fail and include the specified code in the // thrown exception. - expect(function() { - expr.evaluate(dataset, testcase.bindings); - }) - .to.throw() - .to.deep.contain({ code: testcase.code }); + let error = false; + try { + expr.evaluate(dataset, testcase.bindings); + } catch(e) { + expect(e.code).toEqual(testcase.code); + error = true; + } + // If this is thrown, it is because we expected an error to be + // thrown but it wasn't. + expect(error).toBeTruthy(); } else { // If we get here, it means there is something wrong with // the test case data because there was nothing to check. @@ -118,49 +122,6 @@ describe("JSONata Test Suite", () => { }); }); -/** - * Protect the process/browser from a runnaway expression - * i.e. Infinite loop (tail recursion), or excessive stack growth - * - * @param {Object} expr - expression to protect - * @param {Number} timeout - max time in ms - * @param {Number} maxDepth - max stack depth - */ -function timeboxExpression(expr, timeout, maxDepth) { - var depth = 0; - var time = Date.now(); - - var checkRunnaway = function() { - if (depth > maxDepth) { - // stack too deep - throw { - message: - "Stack overflow error: Check for non-terminating recursive function. Consider rewriting as tail-recursive.", - stack: new Error().stack, - code: "U1001" - }; - } - if (Date.now() - time > timeout) { - // expression has run for too long - throw { - message: "Expression evaluation timeout: Check for infinite loop", - stack: new Error().stack, - code: "U1001" - }; - } - }; - - // register callbacks - expr.assign("__evaluate_entry", function() { - depth++; - checkRunnaway(); - }); - expr.assign("__evaluate_exit", function() { - depth--; - checkRunnaway(); - }); -} - /** * Based on the collection of datasets and the information provided as part of the testcase, * determine what input data to use in the case (may return undefined). @@ -180,4 +141,10 @@ function resolveDataset(datasets, testcase) { return datasets[testcase.dataset]; } throw new Error("Unable to find dataset "+testcase.dataset+" among known datasets, are you sure the datasets directory has a file named "+testcase.dataset+".json?"); -} \ No newline at end of file +} + +describe("This is a jest test", () => { + test("An actual test", async () => { + return 5; + }) +}) \ No newline at end of file diff --git a/test/test-suite/TESTSUITE.md b/__tests__/test-suite/TESTSUITE.md similarity index 100% rename from test/test-suite/TESTSUITE.md rename to __tests__/test-suite/TESTSUITE.md diff --git a/test/test-suite/datasets/dataset0.json b/__tests__/test-suite/datasets/dataset0.json similarity index 100% rename from test/test-suite/datasets/dataset0.json rename to __tests__/test-suite/datasets/dataset0.json diff --git a/test/test-suite/datasets/dataset1.json b/__tests__/test-suite/datasets/dataset1.json similarity index 100% rename from test/test-suite/datasets/dataset1.json rename to __tests__/test-suite/datasets/dataset1.json diff --git a/test/test-suite/datasets/dataset10.json b/__tests__/test-suite/datasets/dataset10.json similarity index 100% rename from test/test-suite/datasets/dataset10.json rename to __tests__/test-suite/datasets/dataset10.json diff --git a/test/test-suite/datasets/dataset11.json b/__tests__/test-suite/datasets/dataset11.json similarity index 100% rename from test/test-suite/datasets/dataset11.json rename to __tests__/test-suite/datasets/dataset11.json diff --git a/test/test-suite/datasets/dataset12.json b/__tests__/test-suite/datasets/dataset12.json similarity index 100% rename from test/test-suite/datasets/dataset12.json rename to __tests__/test-suite/datasets/dataset12.json diff --git a/test/test-suite/datasets/dataset13.json b/__tests__/test-suite/datasets/dataset13.json similarity index 100% rename from test/test-suite/datasets/dataset13.json rename to __tests__/test-suite/datasets/dataset13.json diff --git a/test/test-suite/datasets/dataset14.json b/__tests__/test-suite/datasets/dataset14.json similarity index 100% rename from test/test-suite/datasets/dataset14.json rename to __tests__/test-suite/datasets/dataset14.json diff --git a/test/test-suite/datasets/dataset15.json b/__tests__/test-suite/datasets/dataset15.json similarity index 100% rename from test/test-suite/datasets/dataset15.json rename to __tests__/test-suite/datasets/dataset15.json diff --git a/test/test-suite/datasets/dataset16.json b/__tests__/test-suite/datasets/dataset16.json similarity index 100% rename from test/test-suite/datasets/dataset16.json rename to __tests__/test-suite/datasets/dataset16.json diff --git a/test/test-suite/datasets/dataset17.json b/__tests__/test-suite/datasets/dataset17.json similarity index 100% rename from test/test-suite/datasets/dataset17.json rename to __tests__/test-suite/datasets/dataset17.json diff --git a/test/test-suite/datasets/dataset18.json b/__tests__/test-suite/datasets/dataset18.json similarity index 100% rename from test/test-suite/datasets/dataset18.json rename to __tests__/test-suite/datasets/dataset18.json diff --git a/test/test-suite/datasets/dataset19.json b/__tests__/test-suite/datasets/dataset19.json similarity index 100% rename from test/test-suite/datasets/dataset19.json rename to __tests__/test-suite/datasets/dataset19.json diff --git a/test/test-suite/datasets/dataset2.json b/__tests__/test-suite/datasets/dataset2.json similarity index 100% rename from test/test-suite/datasets/dataset2.json rename to __tests__/test-suite/datasets/dataset2.json diff --git a/test/test-suite/datasets/dataset20.json b/__tests__/test-suite/datasets/dataset20.json similarity index 100% rename from test/test-suite/datasets/dataset20.json rename to __tests__/test-suite/datasets/dataset20.json diff --git a/test/test-suite/datasets/dataset21.json b/__tests__/test-suite/datasets/dataset21.json similarity index 100% rename from test/test-suite/datasets/dataset21.json rename to __tests__/test-suite/datasets/dataset21.json diff --git a/test/test-suite/datasets/dataset22.json b/__tests__/test-suite/datasets/dataset22.json similarity index 100% rename from test/test-suite/datasets/dataset22.json rename to __tests__/test-suite/datasets/dataset22.json diff --git a/test/test-suite/datasets/dataset23.json b/__tests__/test-suite/datasets/dataset23.json similarity index 100% rename from test/test-suite/datasets/dataset23.json rename to __tests__/test-suite/datasets/dataset23.json diff --git a/test/test-suite/datasets/dataset24.json b/__tests__/test-suite/datasets/dataset24.json similarity index 100% rename from test/test-suite/datasets/dataset24.json rename to __tests__/test-suite/datasets/dataset24.json diff --git a/test/test-suite/datasets/dataset3.json b/__tests__/test-suite/datasets/dataset3.json similarity index 100% rename from test/test-suite/datasets/dataset3.json rename to __tests__/test-suite/datasets/dataset3.json diff --git a/test/test-suite/datasets/dataset4.json b/__tests__/test-suite/datasets/dataset4.json similarity index 100% rename from test/test-suite/datasets/dataset4.json rename to __tests__/test-suite/datasets/dataset4.json diff --git a/test/test-suite/datasets/dataset5.json b/__tests__/test-suite/datasets/dataset5.json similarity index 100% rename from test/test-suite/datasets/dataset5.json rename to __tests__/test-suite/datasets/dataset5.json diff --git a/test/test-suite/datasets/dataset6.json b/__tests__/test-suite/datasets/dataset6.json similarity index 100% rename from test/test-suite/datasets/dataset6.json rename to __tests__/test-suite/datasets/dataset6.json diff --git a/test/test-suite/datasets/dataset7.json b/__tests__/test-suite/datasets/dataset7.json similarity index 100% rename from test/test-suite/datasets/dataset7.json rename to __tests__/test-suite/datasets/dataset7.json diff --git a/test/test-suite/datasets/dataset8.json b/__tests__/test-suite/datasets/dataset8.json similarity index 100% rename from test/test-suite/datasets/dataset8.json rename to __tests__/test-suite/datasets/dataset8.json diff --git a/test/test-suite/datasets/dataset9.json b/__tests__/test-suite/datasets/dataset9.json similarity index 100% rename from test/test-suite/datasets/dataset9.json rename to __tests__/test-suite/datasets/dataset9.json diff --git a/test/test-suite/groups/array-constructor/case000.json b/__tests__/test-suite/groups/array-constructor/case000.json similarity index 100% rename from test/test-suite/groups/array-constructor/case000.json rename to __tests__/test-suite/groups/array-constructor/case000.json diff --git a/test/test-suite/groups/array-constructor/case001.json b/__tests__/test-suite/groups/array-constructor/case001.json similarity index 100% rename from test/test-suite/groups/array-constructor/case001.json rename to __tests__/test-suite/groups/array-constructor/case001.json diff --git a/test/test-suite/groups/array-constructor/case002.json b/__tests__/test-suite/groups/array-constructor/case002.json similarity index 100% rename from test/test-suite/groups/array-constructor/case002.json rename to __tests__/test-suite/groups/array-constructor/case002.json diff --git a/test/test-suite/groups/array-constructor/case003.json b/__tests__/test-suite/groups/array-constructor/case003.json similarity index 100% rename from test/test-suite/groups/array-constructor/case003.json rename to __tests__/test-suite/groups/array-constructor/case003.json diff --git a/test/test-suite/groups/array-constructor/case004.json b/__tests__/test-suite/groups/array-constructor/case004.json similarity index 100% rename from test/test-suite/groups/array-constructor/case004.json rename to __tests__/test-suite/groups/array-constructor/case004.json diff --git a/test/test-suite/groups/array-constructor/case005.json b/__tests__/test-suite/groups/array-constructor/case005.json similarity index 100% rename from test/test-suite/groups/array-constructor/case005.json rename to __tests__/test-suite/groups/array-constructor/case005.json diff --git a/test/test-suite/groups/array-constructor/case006.json b/__tests__/test-suite/groups/array-constructor/case006.json similarity index 100% rename from test/test-suite/groups/array-constructor/case006.json rename to __tests__/test-suite/groups/array-constructor/case006.json diff --git a/test/test-suite/groups/array-constructor/case007.json b/__tests__/test-suite/groups/array-constructor/case007.json similarity index 100% rename from test/test-suite/groups/array-constructor/case007.json rename to __tests__/test-suite/groups/array-constructor/case007.json diff --git a/test/test-suite/groups/array-constructor/case008.json b/__tests__/test-suite/groups/array-constructor/case008.json similarity index 100% rename from test/test-suite/groups/array-constructor/case008.json rename to __tests__/test-suite/groups/array-constructor/case008.json diff --git a/test/test-suite/groups/array-constructor/case009.json b/__tests__/test-suite/groups/array-constructor/case009.json similarity index 100% rename from test/test-suite/groups/array-constructor/case009.json rename to __tests__/test-suite/groups/array-constructor/case009.json diff --git a/test/test-suite/groups/array-constructor/case010.json b/__tests__/test-suite/groups/array-constructor/case010.json similarity index 100% rename from test/test-suite/groups/array-constructor/case010.json rename to __tests__/test-suite/groups/array-constructor/case010.json diff --git a/test/test-suite/groups/array-constructor/case011.json b/__tests__/test-suite/groups/array-constructor/case011.json similarity index 100% rename from test/test-suite/groups/array-constructor/case011.json rename to __tests__/test-suite/groups/array-constructor/case011.json diff --git a/test/test-suite/groups/array-constructor/case012.json b/__tests__/test-suite/groups/array-constructor/case012.json similarity index 100% rename from test/test-suite/groups/array-constructor/case012.json rename to __tests__/test-suite/groups/array-constructor/case012.json diff --git a/test/test-suite/groups/array-constructor/case013.json b/__tests__/test-suite/groups/array-constructor/case013.json similarity index 100% rename from test/test-suite/groups/array-constructor/case013.json rename to __tests__/test-suite/groups/array-constructor/case013.json diff --git a/test/test-suite/groups/array-constructor/case014.json b/__tests__/test-suite/groups/array-constructor/case014.json similarity index 100% rename from test/test-suite/groups/array-constructor/case014.json rename to __tests__/test-suite/groups/array-constructor/case014.json diff --git a/test/test-suite/groups/array-constructor/case015.json b/__tests__/test-suite/groups/array-constructor/case015.json similarity index 100% rename from test/test-suite/groups/array-constructor/case015.json rename to __tests__/test-suite/groups/array-constructor/case015.json diff --git a/test/test-suite/groups/array-constructor/case016.json b/__tests__/test-suite/groups/array-constructor/case016.json similarity index 100% rename from test/test-suite/groups/array-constructor/case016.json rename to __tests__/test-suite/groups/array-constructor/case016.json diff --git a/test/test-suite/groups/array-constructor/case017.json b/__tests__/test-suite/groups/array-constructor/case017.json similarity index 100% rename from test/test-suite/groups/array-constructor/case017.json rename to __tests__/test-suite/groups/array-constructor/case017.json diff --git a/test/test-suite/groups/array-constructor/case018.json b/__tests__/test-suite/groups/array-constructor/case018.json similarity index 100% rename from test/test-suite/groups/array-constructor/case018.json rename to __tests__/test-suite/groups/array-constructor/case018.json diff --git a/test/test-suite/groups/array-constructor/case019.json b/__tests__/test-suite/groups/array-constructor/case019.json similarity index 100% rename from test/test-suite/groups/array-constructor/case019.json rename to __tests__/test-suite/groups/array-constructor/case019.json diff --git a/test/test-suite/groups/array-constructor/case020.json b/__tests__/test-suite/groups/array-constructor/case020.json similarity index 100% rename from test/test-suite/groups/array-constructor/case020.json rename to __tests__/test-suite/groups/array-constructor/case020.json diff --git a/test/test-suite/groups/blocks/case000.json b/__tests__/test-suite/groups/blocks/case000.json similarity index 100% rename from test/test-suite/groups/blocks/case000.json rename to __tests__/test-suite/groups/blocks/case000.json diff --git a/test/test-suite/groups/blocks/case001.json b/__tests__/test-suite/groups/blocks/case001.json similarity index 100% rename from test/test-suite/groups/blocks/case001.json rename to __tests__/test-suite/groups/blocks/case001.json diff --git a/test/test-suite/groups/blocks/case002.json b/__tests__/test-suite/groups/blocks/case002.json similarity index 100% rename from test/test-suite/groups/blocks/case002.json rename to __tests__/test-suite/groups/blocks/case002.json diff --git a/test/test-suite/groups/blocks/case003.json b/__tests__/test-suite/groups/blocks/case003.json similarity index 100% rename from test/test-suite/groups/blocks/case003.json rename to __tests__/test-suite/groups/blocks/case003.json diff --git a/test/test-suite/groups/blocks/case004.json b/__tests__/test-suite/groups/blocks/case004.json similarity index 100% rename from test/test-suite/groups/blocks/case004.json rename to __tests__/test-suite/groups/blocks/case004.json diff --git a/test/test-suite/groups/blocks/case005.json b/__tests__/test-suite/groups/blocks/case005.json similarity index 100% rename from test/test-suite/groups/blocks/case005.json rename to __tests__/test-suite/groups/blocks/case005.json diff --git a/test/test-suite/groups/blocks/case006.json b/__tests__/test-suite/groups/blocks/case006.json similarity index 100% rename from test/test-suite/groups/blocks/case006.json rename to __tests__/test-suite/groups/blocks/case006.json diff --git a/test/test-suite/groups/boolean-expresssions/case000.json b/__tests__/test-suite/groups/boolean-expresssions/case000.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case000.json rename to __tests__/test-suite/groups/boolean-expresssions/case000.json diff --git a/test/test-suite/groups/boolean-expresssions/case001.json b/__tests__/test-suite/groups/boolean-expresssions/case001.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case001.json rename to __tests__/test-suite/groups/boolean-expresssions/case001.json diff --git a/test/test-suite/groups/boolean-expresssions/case002.json b/__tests__/test-suite/groups/boolean-expresssions/case002.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case002.json rename to __tests__/test-suite/groups/boolean-expresssions/case002.json diff --git a/test/test-suite/groups/boolean-expresssions/case003.json b/__tests__/test-suite/groups/boolean-expresssions/case003.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case003.json rename to __tests__/test-suite/groups/boolean-expresssions/case003.json diff --git a/test/test-suite/groups/boolean-expresssions/case004.json b/__tests__/test-suite/groups/boolean-expresssions/case004.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case004.json rename to __tests__/test-suite/groups/boolean-expresssions/case004.json diff --git a/test/test-suite/groups/boolean-expresssions/case005.json b/__tests__/test-suite/groups/boolean-expresssions/case005.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case005.json rename to __tests__/test-suite/groups/boolean-expresssions/case005.json diff --git a/test/test-suite/groups/boolean-expresssions/case006.json b/__tests__/test-suite/groups/boolean-expresssions/case006.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case006.json rename to __tests__/test-suite/groups/boolean-expresssions/case006.json diff --git a/test/test-suite/groups/boolean-expresssions/case007.json b/__tests__/test-suite/groups/boolean-expresssions/case007.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case007.json rename to __tests__/test-suite/groups/boolean-expresssions/case007.json diff --git a/test/test-suite/groups/boolean-expresssions/case008.json b/__tests__/test-suite/groups/boolean-expresssions/case008.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case008.json rename to __tests__/test-suite/groups/boolean-expresssions/case008.json diff --git a/test/test-suite/groups/boolean-expresssions/case009.json b/__tests__/test-suite/groups/boolean-expresssions/case009.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case009.json rename to __tests__/test-suite/groups/boolean-expresssions/case009.json diff --git a/test/test-suite/groups/boolean-expresssions/case010.json b/__tests__/test-suite/groups/boolean-expresssions/case010.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case010.json rename to __tests__/test-suite/groups/boolean-expresssions/case010.json diff --git a/test/test-suite/groups/boolean-expresssions/case011.json b/__tests__/test-suite/groups/boolean-expresssions/case011.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case011.json rename to __tests__/test-suite/groups/boolean-expresssions/case011.json diff --git a/test/test-suite/groups/boolean-expresssions/case012.json b/__tests__/test-suite/groups/boolean-expresssions/case012.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case012.json rename to __tests__/test-suite/groups/boolean-expresssions/case012.json diff --git a/test/test-suite/groups/boolean-expresssions/case013.json b/__tests__/test-suite/groups/boolean-expresssions/case013.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case013.json rename to __tests__/test-suite/groups/boolean-expresssions/case013.json diff --git a/test/test-suite/groups/boolean-expresssions/case014.json b/__tests__/test-suite/groups/boolean-expresssions/case014.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case014.json rename to __tests__/test-suite/groups/boolean-expresssions/case014.json diff --git a/test/test-suite/groups/boolean-expresssions/case015.json b/__tests__/test-suite/groups/boolean-expresssions/case015.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case015.json rename to __tests__/test-suite/groups/boolean-expresssions/case015.json diff --git a/test/test-suite/groups/boolean-expresssions/case016.json b/__tests__/test-suite/groups/boolean-expresssions/case016.json similarity index 100% rename from test/test-suite/groups/boolean-expresssions/case016.json rename to __tests__/test-suite/groups/boolean-expresssions/case016.json diff --git a/test/test-suite/groups/closures/case000.json b/__tests__/test-suite/groups/closures/case000.json similarity index 100% rename from test/test-suite/groups/closures/case000.json rename to __tests__/test-suite/groups/closures/case000.json diff --git a/test/test-suite/groups/closures/case001.json b/__tests__/test-suite/groups/closures/case001.json similarity index 100% rename from test/test-suite/groups/closures/case001.json rename to __tests__/test-suite/groups/closures/case001.json diff --git a/test/test-suite/groups/comparison-operators/case000.json b/__tests__/test-suite/groups/comparison-operators/case000.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case000.json rename to __tests__/test-suite/groups/comparison-operators/case000.json diff --git a/test/test-suite/groups/comparison-operators/case001.json b/__tests__/test-suite/groups/comparison-operators/case001.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case001.json rename to __tests__/test-suite/groups/comparison-operators/case001.json diff --git a/test/test-suite/groups/comparison-operators/case002.json b/__tests__/test-suite/groups/comparison-operators/case002.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case002.json rename to __tests__/test-suite/groups/comparison-operators/case002.json diff --git a/test/test-suite/groups/comparison-operators/case003.json b/__tests__/test-suite/groups/comparison-operators/case003.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case003.json rename to __tests__/test-suite/groups/comparison-operators/case003.json diff --git a/test/test-suite/groups/comparison-operators/case004.json b/__tests__/test-suite/groups/comparison-operators/case004.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case004.json rename to __tests__/test-suite/groups/comparison-operators/case004.json diff --git a/test/test-suite/groups/comparison-operators/case005.json b/__tests__/test-suite/groups/comparison-operators/case005.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case005.json rename to __tests__/test-suite/groups/comparison-operators/case005.json diff --git a/test/test-suite/groups/comparison-operators/case006.json b/__tests__/test-suite/groups/comparison-operators/case006.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case006.json rename to __tests__/test-suite/groups/comparison-operators/case006.json diff --git a/test/test-suite/groups/comparison-operators/case007.json b/__tests__/test-suite/groups/comparison-operators/case007.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case007.json rename to __tests__/test-suite/groups/comparison-operators/case007.json diff --git a/test/test-suite/groups/comparison-operators/case008.json b/__tests__/test-suite/groups/comparison-operators/case008.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case008.json rename to __tests__/test-suite/groups/comparison-operators/case008.json diff --git a/test/test-suite/groups/comparison-operators/case009.json b/__tests__/test-suite/groups/comparison-operators/case009.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case009.json rename to __tests__/test-suite/groups/comparison-operators/case009.json diff --git a/test/test-suite/groups/comparison-operators/case010.json b/__tests__/test-suite/groups/comparison-operators/case010.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case010.json rename to __tests__/test-suite/groups/comparison-operators/case010.json diff --git a/test/test-suite/groups/comparison-operators/case011.json b/__tests__/test-suite/groups/comparison-operators/case011.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case011.json rename to __tests__/test-suite/groups/comparison-operators/case011.json diff --git a/test/test-suite/groups/comparison-operators/case012.json b/__tests__/test-suite/groups/comparison-operators/case012.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case012.json rename to __tests__/test-suite/groups/comparison-operators/case012.json diff --git a/test/test-suite/groups/comparison-operators/case013.json b/__tests__/test-suite/groups/comparison-operators/case013.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case013.json rename to __tests__/test-suite/groups/comparison-operators/case013.json diff --git a/test/test-suite/groups/comparison-operators/case014.json b/__tests__/test-suite/groups/comparison-operators/case014.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case014.json rename to __tests__/test-suite/groups/comparison-operators/case014.json diff --git a/test/test-suite/groups/comparison-operators/case015.json b/__tests__/test-suite/groups/comparison-operators/case015.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case015.json rename to __tests__/test-suite/groups/comparison-operators/case015.json diff --git a/test/test-suite/groups/comparison-operators/case016.json b/__tests__/test-suite/groups/comparison-operators/case016.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case016.json rename to __tests__/test-suite/groups/comparison-operators/case016.json diff --git a/test/test-suite/groups/comparison-operators/case017.json b/__tests__/test-suite/groups/comparison-operators/case017.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case017.json rename to __tests__/test-suite/groups/comparison-operators/case017.json diff --git a/test/test-suite/groups/comparison-operators/case018.json b/__tests__/test-suite/groups/comparison-operators/case018.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case018.json rename to __tests__/test-suite/groups/comparison-operators/case018.json diff --git a/test/test-suite/groups/comparison-operators/case019.json b/__tests__/test-suite/groups/comparison-operators/case019.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case019.json rename to __tests__/test-suite/groups/comparison-operators/case019.json diff --git a/test/test-suite/groups/comparison-operators/case020.json b/__tests__/test-suite/groups/comparison-operators/case020.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case020.json rename to __tests__/test-suite/groups/comparison-operators/case020.json diff --git a/test/test-suite/groups/comparison-operators/case021.json b/__tests__/test-suite/groups/comparison-operators/case021.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case021.json rename to __tests__/test-suite/groups/comparison-operators/case021.json diff --git a/test/test-suite/groups/comparison-operators/case022.json b/__tests__/test-suite/groups/comparison-operators/case022.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case022.json rename to __tests__/test-suite/groups/comparison-operators/case022.json diff --git a/test/test-suite/groups/comparison-operators/case023.json b/__tests__/test-suite/groups/comparison-operators/case023.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case023.json rename to __tests__/test-suite/groups/comparison-operators/case023.json diff --git a/test/test-suite/groups/comparison-operators/case024.json b/__tests__/test-suite/groups/comparison-operators/case024.json similarity index 100% rename from test/test-suite/groups/comparison-operators/case024.json rename to __tests__/test-suite/groups/comparison-operators/case024.json diff --git a/test/test-suite/groups/conditionals/case000.json b/__tests__/test-suite/groups/conditionals/case000.json similarity index 100% rename from test/test-suite/groups/conditionals/case000.json rename to __tests__/test-suite/groups/conditionals/case000.json diff --git a/test/test-suite/groups/conditionals/case001.json b/__tests__/test-suite/groups/conditionals/case001.json similarity index 100% rename from test/test-suite/groups/conditionals/case001.json rename to __tests__/test-suite/groups/conditionals/case001.json diff --git a/test/test-suite/groups/conditionals/case002.json b/__tests__/test-suite/groups/conditionals/case002.json similarity index 100% rename from test/test-suite/groups/conditionals/case002.json rename to __tests__/test-suite/groups/conditionals/case002.json diff --git a/test/test-suite/groups/conditionals/case003.json b/__tests__/test-suite/groups/conditionals/case003.json similarity index 100% rename from test/test-suite/groups/conditionals/case003.json rename to __tests__/test-suite/groups/conditionals/case003.json diff --git a/test/test-suite/groups/conditionals/case004.json b/__tests__/test-suite/groups/conditionals/case004.json similarity index 100% rename from test/test-suite/groups/conditionals/case004.json rename to __tests__/test-suite/groups/conditionals/case004.json diff --git a/test/test-suite/groups/conditionals/case005.json b/__tests__/test-suite/groups/conditionals/case005.json similarity index 100% rename from test/test-suite/groups/conditionals/case005.json rename to __tests__/test-suite/groups/conditionals/case005.json diff --git a/test/test-suite/groups/conditionals/case006.json b/__tests__/test-suite/groups/conditionals/case006.json similarity index 100% rename from test/test-suite/groups/conditionals/case006.json rename to __tests__/test-suite/groups/conditionals/case006.json diff --git a/test/test-suite/groups/conditionals/case007.json b/__tests__/test-suite/groups/conditionals/case007.json similarity index 100% rename from test/test-suite/groups/conditionals/case007.json rename to __tests__/test-suite/groups/conditionals/case007.json diff --git a/test/test-suite/groups/conditionals/case008.json b/__tests__/test-suite/groups/conditionals/case008.json similarity index 100% rename from test/test-suite/groups/conditionals/case008.json rename to __tests__/test-suite/groups/conditionals/case008.json diff --git a/test/test-suite/groups/context/case000.json b/__tests__/test-suite/groups/context/case000.json similarity index 100% rename from test/test-suite/groups/context/case000.json rename to __tests__/test-suite/groups/context/case000.json diff --git a/test/test-suite/groups/context/case001.json b/__tests__/test-suite/groups/context/case001.json similarity index 100% rename from test/test-suite/groups/context/case001.json rename to __tests__/test-suite/groups/context/case001.json diff --git a/test/test-suite/groups/context/case002.json b/__tests__/test-suite/groups/context/case002.json similarity index 100% rename from test/test-suite/groups/context/case002.json rename to __tests__/test-suite/groups/context/case002.json diff --git a/test/test-suite/groups/context/case003.json b/__tests__/test-suite/groups/context/case003.json similarity index 100% rename from test/test-suite/groups/context/case003.json rename to __tests__/test-suite/groups/context/case003.json diff --git a/test/test-suite/groups/descendent-operator/case000.json b/__tests__/test-suite/groups/descendent-operator/case000.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case000.json rename to __tests__/test-suite/groups/descendent-operator/case000.json diff --git a/test/test-suite/groups/descendent-operator/case001.json b/__tests__/test-suite/groups/descendent-operator/case001.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case001.json rename to __tests__/test-suite/groups/descendent-operator/case001.json diff --git a/test/test-suite/groups/descendent-operator/case002.json b/__tests__/test-suite/groups/descendent-operator/case002.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case002.json rename to __tests__/test-suite/groups/descendent-operator/case002.json diff --git a/test/test-suite/groups/descendent-operator/case003.json b/__tests__/test-suite/groups/descendent-operator/case003.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case003.json rename to __tests__/test-suite/groups/descendent-operator/case003.json diff --git a/test/test-suite/groups/descendent-operator/case004.json b/__tests__/test-suite/groups/descendent-operator/case004.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case004.json rename to __tests__/test-suite/groups/descendent-operator/case004.json diff --git a/test/test-suite/groups/descendent-operator/case005.json b/__tests__/test-suite/groups/descendent-operator/case005.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case005.json rename to __tests__/test-suite/groups/descendent-operator/case005.json diff --git a/test/test-suite/groups/descendent-operator/case006.json b/__tests__/test-suite/groups/descendent-operator/case006.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case006.json rename to __tests__/test-suite/groups/descendent-operator/case006.json diff --git a/test/test-suite/groups/descendent-operator/case007.json b/__tests__/test-suite/groups/descendent-operator/case007.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case007.json rename to __tests__/test-suite/groups/descendent-operator/case007.json diff --git a/test/test-suite/groups/descendent-operator/case008.json b/__tests__/test-suite/groups/descendent-operator/case008.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case008.json rename to __tests__/test-suite/groups/descendent-operator/case008.json diff --git a/test/test-suite/groups/descendent-operator/case009.json b/__tests__/test-suite/groups/descendent-operator/case009.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case009.json rename to __tests__/test-suite/groups/descendent-operator/case009.json diff --git a/test/test-suite/groups/descendent-operator/case010.json b/__tests__/test-suite/groups/descendent-operator/case010.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case010.json rename to __tests__/test-suite/groups/descendent-operator/case010.json diff --git a/test/test-suite/groups/descendent-operator/case011.json b/__tests__/test-suite/groups/descendent-operator/case011.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case011.json rename to __tests__/test-suite/groups/descendent-operator/case011.json diff --git a/test/test-suite/groups/descendent-operator/case012.json b/__tests__/test-suite/groups/descendent-operator/case012.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case012.json rename to __tests__/test-suite/groups/descendent-operator/case012.json diff --git a/test/test-suite/groups/descendent-operator/case013.json b/__tests__/test-suite/groups/descendent-operator/case013.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case013.json rename to __tests__/test-suite/groups/descendent-operator/case013.json diff --git a/test/test-suite/groups/descendent-operator/case014.json b/__tests__/test-suite/groups/descendent-operator/case014.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case014.json rename to __tests__/test-suite/groups/descendent-operator/case014.json diff --git a/test/test-suite/groups/descendent-operator/case015.json b/__tests__/test-suite/groups/descendent-operator/case015.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case015.json rename to __tests__/test-suite/groups/descendent-operator/case015.json diff --git a/test/test-suite/groups/descendent-operator/case016.json b/__tests__/test-suite/groups/descendent-operator/case016.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case016.json rename to __tests__/test-suite/groups/descendent-operator/case016.json diff --git a/test/test-suite/groups/descendent-operator/case017.json b/__tests__/test-suite/groups/descendent-operator/case017.json similarity index 100% rename from test/test-suite/groups/descendent-operator/case017.json rename to __tests__/test-suite/groups/descendent-operator/case017.json diff --git a/test/test-suite/groups/encoding/case000.json b/__tests__/test-suite/groups/encoding/case000.json similarity index 100% rename from test/test-suite/groups/encoding/case000.json rename to __tests__/test-suite/groups/encoding/case000.json diff --git a/test/test-suite/groups/encoding/case001.json b/__tests__/test-suite/groups/encoding/case001.json similarity index 100% rename from test/test-suite/groups/encoding/case001.json rename to __tests__/test-suite/groups/encoding/case001.json diff --git a/test/test-suite/groups/encoding/case002.json b/__tests__/test-suite/groups/encoding/case002.json similarity index 100% rename from test/test-suite/groups/encoding/case002.json rename to __tests__/test-suite/groups/encoding/case002.json diff --git a/test/test-suite/groups/encoding/case003.json b/__tests__/test-suite/groups/encoding/case003.json similarity index 100% rename from test/test-suite/groups/encoding/case003.json rename to __tests__/test-suite/groups/encoding/case003.json diff --git a/test/test-suite/groups/errors/case000.json b/__tests__/test-suite/groups/errors/case000.json similarity index 100% rename from test/test-suite/groups/errors/case000.json rename to __tests__/test-suite/groups/errors/case000.json diff --git a/test/test-suite/groups/errors/case001.json b/__tests__/test-suite/groups/errors/case001.json similarity index 100% rename from test/test-suite/groups/errors/case001.json rename to __tests__/test-suite/groups/errors/case001.json diff --git a/test/test-suite/groups/errors/case002.json b/__tests__/test-suite/groups/errors/case002.json similarity index 100% rename from test/test-suite/groups/errors/case002.json rename to __tests__/test-suite/groups/errors/case002.json diff --git a/test/test-suite/groups/errors/case003.json b/__tests__/test-suite/groups/errors/case003.json similarity index 100% rename from test/test-suite/groups/errors/case003.json rename to __tests__/test-suite/groups/errors/case003.json diff --git a/test/test-suite/groups/errors/case004.json b/__tests__/test-suite/groups/errors/case004.json similarity index 100% rename from test/test-suite/groups/errors/case004.json rename to __tests__/test-suite/groups/errors/case004.json diff --git a/test/test-suite/groups/errors/case005.json b/__tests__/test-suite/groups/errors/case005.json similarity index 100% rename from test/test-suite/groups/errors/case005.json rename to __tests__/test-suite/groups/errors/case005.json diff --git a/test/test-suite/groups/errors/case006.json b/__tests__/test-suite/groups/errors/case006.json similarity index 100% rename from test/test-suite/groups/errors/case006.json rename to __tests__/test-suite/groups/errors/case006.json diff --git a/test/test-suite/groups/errors/case007.json b/__tests__/test-suite/groups/errors/case007.json similarity index 100% rename from test/test-suite/groups/errors/case007.json rename to __tests__/test-suite/groups/errors/case007.json diff --git a/test/test-suite/groups/errors/case008.json b/__tests__/test-suite/groups/errors/case008.json similarity index 100% rename from test/test-suite/groups/errors/case008.json rename to __tests__/test-suite/groups/errors/case008.json diff --git a/test/test-suite/groups/errors/case009.json b/__tests__/test-suite/groups/errors/case009.json similarity index 100% rename from test/test-suite/groups/errors/case009.json rename to __tests__/test-suite/groups/errors/case009.json diff --git a/test/test-suite/groups/errors/case010.json b/__tests__/test-suite/groups/errors/case010.json similarity index 100% rename from test/test-suite/groups/errors/case010.json rename to __tests__/test-suite/groups/errors/case010.json diff --git a/test/test-suite/groups/errors/case011.json b/__tests__/test-suite/groups/errors/case011.json similarity index 100% rename from test/test-suite/groups/errors/case011.json rename to __tests__/test-suite/groups/errors/case011.json diff --git a/test/test-suite/groups/errors/case012.json b/__tests__/test-suite/groups/errors/case012.json similarity index 100% rename from test/test-suite/groups/errors/case012.json rename to __tests__/test-suite/groups/errors/case012.json diff --git a/test/test-suite/groups/errors/case013.json b/__tests__/test-suite/groups/errors/case013.json similarity index 100% rename from test/test-suite/groups/errors/case013.json rename to __tests__/test-suite/groups/errors/case013.json diff --git a/test/test-suite/groups/errors/case014.json b/__tests__/test-suite/groups/errors/case014.json similarity index 100% rename from test/test-suite/groups/errors/case014.json rename to __tests__/test-suite/groups/errors/case014.json diff --git a/test/test-suite/groups/errors/case015.json b/__tests__/test-suite/groups/errors/case015.json similarity index 100% rename from test/test-suite/groups/errors/case015.json rename to __tests__/test-suite/groups/errors/case015.json diff --git a/test/test-suite/groups/errors/case016.json b/__tests__/test-suite/groups/errors/case016.json similarity index 100% rename from test/test-suite/groups/errors/case016.json rename to __tests__/test-suite/groups/errors/case016.json diff --git a/test/test-suite/groups/errors/case017.json b/__tests__/test-suite/groups/errors/case017.json similarity index 100% rename from test/test-suite/groups/errors/case017.json rename to __tests__/test-suite/groups/errors/case017.json diff --git a/test/test-suite/groups/errors/case018.json b/__tests__/test-suite/groups/errors/case018.json similarity index 100% rename from test/test-suite/groups/errors/case018.json rename to __tests__/test-suite/groups/errors/case018.json diff --git a/test/test-suite/groups/errors/case019.json b/__tests__/test-suite/groups/errors/case019.json similarity index 100% rename from test/test-suite/groups/errors/case019.json rename to __tests__/test-suite/groups/errors/case019.json diff --git a/test/test-suite/groups/errors/case020.json b/__tests__/test-suite/groups/errors/case020.json similarity index 100% rename from test/test-suite/groups/errors/case020.json rename to __tests__/test-suite/groups/errors/case020.json diff --git a/test/test-suite/groups/errors/case021.json b/__tests__/test-suite/groups/errors/case021.json similarity index 100% rename from test/test-suite/groups/errors/case021.json rename to __tests__/test-suite/groups/errors/case021.json diff --git a/test/test-suite/groups/errors/case022.json b/__tests__/test-suite/groups/errors/case022.json similarity index 100% rename from test/test-suite/groups/errors/case022.json rename to __tests__/test-suite/groups/errors/case022.json diff --git a/test/test-suite/groups/errors/case023.json b/__tests__/test-suite/groups/errors/case023.json similarity index 100% rename from test/test-suite/groups/errors/case023.json rename to __tests__/test-suite/groups/errors/case023.json diff --git a/test/test-suite/groups/errors/case024.json b/__tests__/test-suite/groups/errors/case024.json similarity index 100% rename from test/test-suite/groups/errors/case024.json rename to __tests__/test-suite/groups/errors/case024.json diff --git a/test/test-suite/groups/fields/case000.json b/__tests__/test-suite/groups/fields/case000.json similarity index 100% rename from test/test-suite/groups/fields/case000.json rename to __tests__/test-suite/groups/fields/case000.json diff --git a/test/test-suite/groups/fields/case001.json b/__tests__/test-suite/groups/fields/case001.json similarity index 100% rename from test/test-suite/groups/fields/case001.json rename to __tests__/test-suite/groups/fields/case001.json diff --git a/test/test-suite/groups/fields/case002.json b/__tests__/test-suite/groups/fields/case002.json similarity index 100% rename from test/test-suite/groups/fields/case002.json rename to __tests__/test-suite/groups/fields/case002.json diff --git a/test/test-suite/groups/fields/case003.json b/__tests__/test-suite/groups/fields/case003.json similarity index 100% rename from test/test-suite/groups/fields/case003.json rename to __tests__/test-suite/groups/fields/case003.json diff --git a/test/test-suite/groups/fields/case004.json b/__tests__/test-suite/groups/fields/case004.json similarity index 100% rename from test/test-suite/groups/fields/case004.json rename to __tests__/test-suite/groups/fields/case004.json diff --git a/test/test-suite/groups/fields/case005.json b/__tests__/test-suite/groups/fields/case005.json similarity index 100% rename from test/test-suite/groups/fields/case005.json rename to __tests__/test-suite/groups/fields/case005.json diff --git a/test/test-suite/groups/fields/case006.json b/__tests__/test-suite/groups/fields/case006.json similarity index 100% rename from test/test-suite/groups/fields/case006.json rename to __tests__/test-suite/groups/fields/case006.json diff --git a/test/test-suite/groups/fields/case007.json b/__tests__/test-suite/groups/fields/case007.json similarity index 100% rename from test/test-suite/groups/fields/case007.json rename to __tests__/test-suite/groups/fields/case007.json diff --git a/test/test-suite/groups/flattening/case000.json b/__tests__/test-suite/groups/flattening/case000.json similarity index 100% rename from test/test-suite/groups/flattening/case000.json rename to __tests__/test-suite/groups/flattening/case000.json diff --git a/test/test-suite/groups/flattening/case001.json b/__tests__/test-suite/groups/flattening/case001.json similarity index 100% rename from test/test-suite/groups/flattening/case001.json rename to __tests__/test-suite/groups/flattening/case001.json diff --git a/test/test-suite/groups/flattening/case002.json b/__tests__/test-suite/groups/flattening/case002.json similarity index 100% rename from test/test-suite/groups/flattening/case002.json rename to __tests__/test-suite/groups/flattening/case002.json diff --git a/test/test-suite/groups/flattening/case003.json b/__tests__/test-suite/groups/flattening/case003.json similarity index 100% rename from test/test-suite/groups/flattening/case003.json rename to __tests__/test-suite/groups/flattening/case003.json diff --git a/test/test-suite/groups/flattening/case004.json b/__tests__/test-suite/groups/flattening/case004.json similarity index 100% rename from test/test-suite/groups/flattening/case004.json rename to __tests__/test-suite/groups/flattening/case004.json diff --git a/test/test-suite/groups/flattening/case005.json b/__tests__/test-suite/groups/flattening/case005.json similarity index 100% rename from test/test-suite/groups/flattening/case005.json rename to __tests__/test-suite/groups/flattening/case005.json diff --git a/test/test-suite/groups/flattening/case006.json b/__tests__/test-suite/groups/flattening/case006.json similarity index 100% rename from test/test-suite/groups/flattening/case006.json rename to __tests__/test-suite/groups/flattening/case006.json diff --git a/test/test-suite/groups/flattening/case007.json b/__tests__/test-suite/groups/flattening/case007.json similarity index 100% rename from test/test-suite/groups/flattening/case007.json rename to __tests__/test-suite/groups/flattening/case007.json diff --git a/test/test-suite/groups/flattening/case008.json b/__tests__/test-suite/groups/flattening/case008.json similarity index 100% rename from test/test-suite/groups/flattening/case008.json rename to __tests__/test-suite/groups/flattening/case008.json diff --git a/test/test-suite/groups/flattening/case009.json b/__tests__/test-suite/groups/flattening/case009.json similarity index 100% rename from test/test-suite/groups/flattening/case009.json rename to __tests__/test-suite/groups/flattening/case009.json diff --git a/test/test-suite/groups/flattening/case010.json b/__tests__/test-suite/groups/flattening/case010.json similarity index 100% rename from test/test-suite/groups/flattening/case010.json rename to __tests__/test-suite/groups/flattening/case010.json diff --git a/test/test-suite/groups/flattening/case011.json b/__tests__/test-suite/groups/flattening/case011.json similarity index 100% rename from test/test-suite/groups/flattening/case011.json rename to __tests__/test-suite/groups/flattening/case011.json diff --git a/test/test-suite/groups/flattening/case012.json b/__tests__/test-suite/groups/flattening/case012.json similarity index 100% rename from test/test-suite/groups/flattening/case012.json rename to __tests__/test-suite/groups/flattening/case012.json diff --git a/test/test-suite/groups/flattening/case013.json b/__tests__/test-suite/groups/flattening/case013.json similarity index 100% rename from test/test-suite/groups/flattening/case013.json rename to __tests__/test-suite/groups/flattening/case013.json diff --git a/test/test-suite/groups/flattening/case014.json b/__tests__/test-suite/groups/flattening/case014.json similarity index 100% rename from test/test-suite/groups/flattening/case014.json rename to __tests__/test-suite/groups/flattening/case014.json diff --git a/test/test-suite/groups/flattening/case015.json b/__tests__/test-suite/groups/flattening/case015.json similarity index 100% rename from test/test-suite/groups/flattening/case015.json rename to __tests__/test-suite/groups/flattening/case015.json diff --git a/test/test-suite/groups/flattening/case016.json b/__tests__/test-suite/groups/flattening/case016.json similarity index 100% rename from test/test-suite/groups/flattening/case016.json rename to __tests__/test-suite/groups/flattening/case016.json diff --git a/test/test-suite/groups/flattening/case017.json b/__tests__/test-suite/groups/flattening/case017.json similarity index 100% rename from test/test-suite/groups/flattening/case017.json rename to __tests__/test-suite/groups/flattening/case017.json diff --git a/test/test-suite/groups/flattening/case018.json b/__tests__/test-suite/groups/flattening/case018.json similarity index 100% rename from test/test-suite/groups/flattening/case018.json rename to __tests__/test-suite/groups/flattening/case018.json diff --git a/test/test-suite/groups/flattening/case019.json b/__tests__/test-suite/groups/flattening/case019.json similarity index 100% rename from test/test-suite/groups/flattening/case019.json rename to __tests__/test-suite/groups/flattening/case019.json diff --git a/test/test-suite/groups/flattening/case020.json b/__tests__/test-suite/groups/flattening/case020.json similarity index 100% rename from test/test-suite/groups/flattening/case020.json rename to __tests__/test-suite/groups/flattening/case020.json diff --git a/test/test-suite/groups/flattening/case021.json b/__tests__/test-suite/groups/flattening/case021.json similarity index 100% rename from test/test-suite/groups/flattening/case021.json rename to __tests__/test-suite/groups/flattening/case021.json diff --git a/test/test-suite/groups/flattening/case022.json b/__tests__/test-suite/groups/flattening/case022.json similarity index 100% rename from test/test-suite/groups/flattening/case022.json rename to __tests__/test-suite/groups/flattening/case022.json diff --git a/test/test-suite/groups/flattening/case023.json b/__tests__/test-suite/groups/flattening/case023.json similarity index 100% rename from test/test-suite/groups/flattening/case023.json rename to __tests__/test-suite/groups/flattening/case023.json diff --git a/test/test-suite/groups/flattening/case024.json b/__tests__/test-suite/groups/flattening/case024.json similarity index 100% rename from test/test-suite/groups/flattening/case024.json rename to __tests__/test-suite/groups/flattening/case024.json diff --git a/test/test-suite/groups/flattening/case025.json b/__tests__/test-suite/groups/flattening/case025.json similarity index 100% rename from test/test-suite/groups/flattening/case025.json rename to __tests__/test-suite/groups/flattening/case025.json diff --git a/test/test-suite/groups/flattening/case026.json b/__tests__/test-suite/groups/flattening/case026.json similarity index 100% rename from test/test-suite/groups/flattening/case026.json rename to __tests__/test-suite/groups/flattening/case026.json diff --git a/test/test-suite/groups/flattening/case027.json b/__tests__/test-suite/groups/flattening/case027.json similarity index 100% rename from test/test-suite/groups/flattening/case027.json rename to __tests__/test-suite/groups/flattening/case027.json diff --git a/test/test-suite/groups/flattening/case028.json b/__tests__/test-suite/groups/flattening/case028.json similarity index 100% rename from test/test-suite/groups/flattening/case028.json rename to __tests__/test-suite/groups/flattening/case028.json diff --git a/test/test-suite/groups/flattening/case029.json b/__tests__/test-suite/groups/flattening/case029.json similarity index 100% rename from test/test-suite/groups/flattening/case029.json rename to __tests__/test-suite/groups/flattening/case029.json diff --git a/test/test-suite/groups/flattening/case030.json b/__tests__/test-suite/groups/flattening/case030.json similarity index 100% rename from test/test-suite/groups/flattening/case030.json rename to __tests__/test-suite/groups/flattening/case030.json diff --git a/test/test-suite/groups/flattening/case031.json b/__tests__/test-suite/groups/flattening/case031.json similarity index 100% rename from test/test-suite/groups/flattening/case031.json rename to __tests__/test-suite/groups/flattening/case031.json diff --git a/test/test-suite/groups/flattening/case032.json b/__tests__/test-suite/groups/flattening/case032.json similarity index 100% rename from test/test-suite/groups/flattening/case032.json rename to __tests__/test-suite/groups/flattening/case032.json diff --git a/test/test-suite/groups/flattening/case033.json b/__tests__/test-suite/groups/flattening/case033.json similarity index 100% rename from test/test-suite/groups/flattening/case033.json rename to __tests__/test-suite/groups/flattening/case033.json diff --git a/test/test-suite/groups/flattening/case034.json b/__tests__/test-suite/groups/flattening/case034.json similarity index 100% rename from test/test-suite/groups/flattening/case034.json rename to __tests__/test-suite/groups/flattening/case034.json diff --git a/test/test-suite/groups/flattening/case035.json b/__tests__/test-suite/groups/flattening/case035.json similarity index 100% rename from test/test-suite/groups/flattening/case035.json rename to __tests__/test-suite/groups/flattening/case035.json diff --git a/test/test-suite/groups/flattening/case036.json b/__tests__/test-suite/groups/flattening/case036.json similarity index 100% rename from test/test-suite/groups/flattening/case036.json rename to __tests__/test-suite/groups/flattening/case036.json diff --git a/test/test-suite/groups/flattening/case037.json b/__tests__/test-suite/groups/flattening/case037.json similarity index 100% rename from test/test-suite/groups/flattening/case037.json rename to __tests__/test-suite/groups/flattening/case037.json diff --git a/test/test-suite/groups/flattening/case038.json b/__tests__/test-suite/groups/flattening/case038.json similarity index 100% rename from test/test-suite/groups/flattening/case038.json rename to __tests__/test-suite/groups/flattening/case038.json diff --git a/test/test-suite/groups/flattening/case039.json b/__tests__/test-suite/groups/flattening/case039.json similarity index 100% rename from test/test-suite/groups/flattening/case039.json rename to __tests__/test-suite/groups/flattening/case039.json diff --git a/test/test-suite/groups/flattening/case040.json b/__tests__/test-suite/groups/flattening/case040.json similarity index 100% rename from test/test-suite/groups/flattening/case040.json rename to __tests__/test-suite/groups/flattening/case040.json diff --git a/test/test-suite/groups/flattening/case041.json b/__tests__/test-suite/groups/flattening/case041.json similarity index 100% rename from test/test-suite/groups/flattening/case041.json rename to __tests__/test-suite/groups/flattening/case041.json diff --git a/test/test-suite/groups/function-abs/case000.json b/__tests__/test-suite/groups/function-abs/case000.json similarity index 100% rename from test/test-suite/groups/function-abs/case000.json rename to __tests__/test-suite/groups/function-abs/case000.json diff --git a/test/test-suite/groups/function-abs/case001.json b/__tests__/test-suite/groups/function-abs/case001.json similarity index 100% rename from test/test-suite/groups/function-abs/case001.json rename to __tests__/test-suite/groups/function-abs/case001.json diff --git a/test/test-suite/groups/function-abs/case002.json b/__tests__/test-suite/groups/function-abs/case002.json similarity index 100% rename from test/test-suite/groups/function-abs/case002.json rename to __tests__/test-suite/groups/function-abs/case002.json diff --git a/test/test-suite/groups/function-abs/case003.json b/__tests__/test-suite/groups/function-abs/case003.json similarity index 100% rename from test/test-suite/groups/function-abs/case003.json rename to __tests__/test-suite/groups/function-abs/case003.json diff --git a/test/test-suite/groups/function-append/case000.json b/__tests__/test-suite/groups/function-append/case000.json similarity index 100% rename from test/test-suite/groups/function-append/case000.json rename to __tests__/test-suite/groups/function-append/case000.json diff --git a/test/test-suite/groups/function-append/case001.json b/__tests__/test-suite/groups/function-append/case001.json similarity index 100% rename from test/test-suite/groups/function-append/case001.json rename to __tests__/test-suite/groups/function-append/case001.json diff --git a/test/test-suite/groups/function-append/case002.json b/__tests__/test-suite/groups/function-append/case002.json similarity index 100% rename from test/test-suite/groups/function-append/case002.json rename to __tests__/test-suite/groups/function-append/case002.json diff --git a/test/test-suite/groups/function-append/case003.json b/__tests__/test-suite/groups/function-append/case003.json similarity index 100% rename from test/test-suite/groups/function-append/case003.json rename to __tests__/test-suite/groups/function-append/case003.json diff --git a/test/test-suite/groups/function-append/case004.json b/__tests__/test-suite/groups/function-append/case004.json similarity index 100% rename from test/test-suite/groups/function-append/case004.json rename to __tests__/test-suite/groups/function-append/case004.json diff --git a/test/test-suite/groups/function-applications/case000.json b/__tests__/test-suite/groups/function-applications/case000.json similarity index 100% rename from test/test-suite/groups/function-applications/case000.json rename to __tests__/test-suite/groups/function-applications/case000.json diff --git a/test/test-suite/groups/function-applications/case001.json b/__tests__/test-suite/groups/function-applications/case001.json similarity index 100% rename from test/test-suite/groups/function-applications/case001.json rename to __tests__/test-suite/groups/function-applications/case001.json diff --git a/test/test-suite/groups/function-applications/case002.json b/__tests__/test-suite/groups/function-applications/case002.json similarity index 100% rename from test/test-suite/groups/function-applications/case002.json rename to __tests__/test-suite/groups/function-applications/case002.json diff --git a/test/test-suite/groups/function-applications/case003.json b/__tests__/test-suite/groups/function-applications/case003.json similarity index 100% rename from test/test-suite/groups/function-applications/case003.json rename to __tests__/test-suite/groups/function-applications/case003.json diff --git a/test/test-suite/groups/function-applications/case004.json b/__tests__/test-suite/groups/function-applications/case004.json similarity index 100% rename from test/test-suite/groups/function-applications/case004.json rename to __tests__/test-suite/groups/function-applications/case004.json diff --git a/test/test-suite/groups/function-applications/case005.json b/__tests__/test-suite/groups/function-applications/case005.json similarity index 100% rename from test/test-suite/groups/function-applications/case005.json rename to __tests__/test-suite/groups/function-applications/case005.json diff --git a/test/test-suite/groups/function-applications/case006.json b/__tests__/test-suite/groups/function-applications/case006.json similarity index 100% rename from test/test-suite/groups/function-applications/case006.json rename to __tests__/test-suite/groups/function-applications/case006.json diff --git a/test/test-suite/groups/function-applications/case007.json b/__tests__/test-suite/groups/function-applications/case007.json similarity index 100% rename from test/test-suite/groups/function-applications/case007.json rename to __tests__/test-suite/groups/function-applications/case007.json diff --git a/test/test-suite/groups/function-applications/case008.json b/__tests__/test-suite/groups/function-applications/case008.json similarity index 100% rename from test/test-suite/groups/function-applications/case008.json rename to __tests__/test-suite/groups/function-applications/case008.json diff --git a/test/test-suite/groups/function-applications/case009.json b/__tests__/test-suite/groups/function-applications/case009.json similarity index 100% rename from test/test-suite/groups/function-applications/case009.json rename to __tests__/test-suite/groups/function-applications/case009.json diff --git a/test/test-suite/groups/function-applications/case010.json b/__tests__/test-suite/groups/function-applications/case010.json similarity index 100% rename from test/test-suite/groups/function-applications/case010.json rename to __tests__/test-suite/groups/function-applications/case010.json diff --git a/test/test-suite/groups/function-applications/case011.json b/__tests__/test-suite/groups/function-applications/case011.json similarity index 100% rename from test/test-suite/groups/function-applications/case011.json rename to __tests__/test-suite/groups/function-applications/case011.json diff --git a/test/test-suite/groups/function-applications/case012.json b/__tests__/test-suite/groups/function-applications/case012.json similarity index 100% rename from test/test-suite/groups/function-applications/case012.json rename to __tests__/test-suite/groups/function-applications/case012.json diff --git a/test/test-suite/groups/function-applications/case013.json b/__tests__/test-suite/groups/function-applications/case013.json similarity index 100% rename from test/test-suite/groups/function-applications/case013.json rename to __tests__/test-suite/groups/function-applications/case013.json diff --git a/test/test-suite/groups/function-applications/case014.json b/__tests__/test-suite/groups/function-applications/case014.json similarity index 100% rename from test/test-suite/groups/function-applications/case014.json rename to __tests__/test-suite/groups/function-applications/case014.json diff --git a/test/test-suite/groups/function-applications/case015.json b/__tests__/test-suite/groups/function-applications/case015.json similarity index 100% rename from test/test-suite/groups/function-applications/case015.json rename to __tests__/test-suite/groups/function-applications/case015.json diff --git a/test/test-suite/groups/function-applications/case016.json b/__tests__/test-suite/groups/function-applications/case016.json similarity index 100% rename from test/test-suite/groups/function-applications/case016.json rename to __tests__/test-suite/groups/function-applications/case016.json diff --git a/test/test-suite/groups/function-applications/case017.json b/__tests__/test-suite/groups/function-applications/case017.json similarity index 100% rename from test/test-suite/groups/function-applications/case017.json rename to __tests__/test-suite/groups/function-applications/case017.json diff --git a/test/test-suite/groups/function-applications/case018.json b/__tests__/test-suite/groups/function-applications/case018.json similarity index 100% rename from test/test-suite/groups/function-applications/case018.json rename to __tests__/test-suite/groups/function-applications/case018.json diff --git a/test/test-suite/groups/function-applications/case019.json b/__tests__/test-suite/groups/function-applications/case019.json similarity index 100% rename from test/test-suite/groups/function-applications/case019.json rename to __tests__/test-suite/groups/function-applications/case019.json diff --git a/test/test-suite/groups/function-applications/case020.json b/__tests__/test-suite/groups/function-applications/case020.json similarity index 100% rename from test/test-suite/groups/function-applications/case020.json rename to __tests__/test-suite/groups/function-applications/case020.json diff --git a/test/test-suite/groups/function-applications/case021.json b/__tests__/test-suite/groups/function-applications/case021.json similarity index 100% rename from test/test-suite/groups/function-applications/case021.json rename to __tests__/test-suite/groups/function-applications/case021.json diff --git a/test/test-suite/groups/function-average/case000.json b/__tests__/test-suite/groups/function-average/case000.json similarity index 100% rename from test/test-suite/groups/function-average/case000.json rename to __tests__/test-suite/groups/function-average/case000.json diff --git a/test/test-suite/groups/function-average/case001.json b/__tests__/test-suite/groups/function-average/case001.json similarity index 100% rename from test/test-suite/groups/function-average/case001.json rename to __tests__/test-suite/groups/function-average/case001.json diff --git a/test/test-suite/groups/function-average/case002.json b/__tests__/test-suite/groups/function-average/case002.json similarity index 100% rename from test/test-suite/groups/function-average/case002.json rename to __tests__/test-suite/groups/function-average/case002.json diff --git a/test/test-suite/groups/function-average/case003.json b/__tests__/test-suite/groups/function-average/case003.json similarity index 100% rename from test/test-suite/groups/function-average/case003.json rename to __tests__/test-suite/groups/function-average/case003.json diff --git a/test/test-suite/groups/function-average/case004.json b/__tests__/test-suite/groups/function-average/case004.json similarity index 100% rename from test/test-suite/groups/function-average/case004.json rename to __tests__/test-suite/groups/function-average/case004.json diff --git a/test/test-suite/groups/function-average/case005.json b/__tests__/test-suite/groups/function-average/case005.json similarity index 100% rename from test/test-suite/groups/function-average/case005.json rename to __tests__/test-suite/groups/function-average/case005.json diff --git a/test/test-suite/groups/function-average/case006.json b/__tests__/test-suite/groups/function-average/case006.json similarity index 100% rename from test/test-suite/groups/function-average/case006.json rename to __tests__/test-suite/groups/function-average/case006.json diff --git a/test/test-suite/groups/function-average/case007.json b/__tests__/test-suite/groups/function-average/case007.json similarity index 100% rename from test/test-suite/groups/function-average/case007.json rename to __tests__/test-suite/groups/function-average/case007.json diff --git a/test/test-suite/groups/function-average/case008.json b/__tests__/test-suite/groups/function-average/case008.json similarity index 100% rename from test/test-suite/groups/function-average/case008.json rename to __tests__/test-suite/groups/function-average/case008.json diff --git a/test/test-suite/groups/function-average/case009.json b/__tests__/test-suite/groups/function-average/case009.json similarity index 100% rename from test/test-suite/groups/function-average/case009.json rename to __tests__/test-suite/groups/function-average/case009.json diff --git a/test/test-suite/groups/function-average/case010.json b/__tests__/test-suite/groups/function-average/case010.json similarity index 100% rename from test/test-suite/groups/function-average/case010.json rename to __tests__/test-suite/groups/function-average/case010.json diff --git a/test/test-suite/groups/function-average/case011.json b/__tests__/test-suite/groups/function-average/case011.json similarity index 100% rename from test/test-suite/groups/function-average/case011.json rename to __tests__/test-suite/groups/function-average/case011.json diff --git a/test/test-suite/groups/function-average/case012.json b/__tests__/test-suite/groups/function-average/case012.json similarity index 100% rename from test/test-suite/groups/function-average/case012.json rename to __tests__/test-suite/groups/function-average/case012.json diff --git a/test/test-suite/groups/function-boolean/case000.json b/__tests__/test-suite/groups/function-boolean/case000.json similarity index 100% rename from test/test-suite/groups/function-boolean/case000.json rename to __tests__/test-suite/groups/function-boolean/case000.json diff --git a/test/test-suite/groups/function-boolean/case001.json b/__tests__/test-suite/groups/function-boolean/case001.json similarity index 100% rename from test/test-suite/groups/function-boolean/case001.json rename to __tests__/test-suite/groups/function-boolean/case001.json diff --git a/test/test-suite/groups/function-boolean/case002.json b/__tests__/test-suite/groups/function-boolean/case002.json similarity index 100% rename from test/test-suite/groups/function-boolean/case002.json rename to __tests__/test-suite/groups/function-boolean/case002.json diff --git a/test/test-suite/groups/function-boolean/case003.json b/__tests__/test-suite/groups/function-boolean/case003.json similarity index 100% rename from test/test-suite/groups/function-boolean/case003.json rename to __tests__/test-suite/groups/function-boolean/case003.json diff --git a/test/test-suite/groups/function-boolean/case004.json b/__tests__/test-suite/groups/function-boolean/case004.json similarity index 100% rename from test/test-suite/groups/function-boolean/case004.json rename to __tests__/test-suite/groups/function-boolean/case004.json diff --git a/test/test-suite/groups/function-boolean/case005.json b/__tests__/test-suite/groups/function-boolean/case005.json similarity index 100% rename from test/test-suite/groups/function-boolean/case005.json rename to __tests__/test-suite/groups/function-boolean/case005.json diff --git a/test/test-suite/groups/function-boolean/case006.json b/__tests__/test-suite/groups/function-boolean/case006.json similarity index 100% rename from test/test-suite/groups/function-boolean/case006.json rename to __tests__/test-suite/groups/function-boolean/case006.json diff --git a/test/test-suite/groups/function-boolean/case007.json b/__tests__/test-suite/groups/function-boolean/case007.json similarity index 100% rename from test/test-suite/groups/function-boolean/case007.json rename to __tests__/test-suite/groups/function-boolean/case007.json diff --git a/test/test-suite/groups/function-boolean/case008.json b/__tests__/test-suite/groups/function-boolean/case008.json similarity index 100% rename from test/test-suite/groups/function-boolean/case008.json rename to __tests__/test-suite/groups/function-boolean/case008.json diff --git a/test/test-suite/groups/function-boolean/case009.json b/__tests__/test-suite/groups/function-boolean/case009.json similarity index 100% rename from test/test-suite/groups/function-boolean/case009.json rename to __tests__/test-suite/groups/function-boolean/case009.json diff --git a/test/test-suite/groups/function-boolean/case010.json b/__tests__/test-suite/groups/function-boolean/case010.json similarity index 100% rename from test/test-suite/groups/function-boolean/case010.json rename to __tests__/test-suite/groups/function-boolean/case010.json diff --git a/test/test-suite/groups/function-boolean/case011.json b/__tests__/test-suite/groups/function-boolean/case011.json similarity index 100% rename from test/test-suite/groups/function-boolean/case011.json rename to __tests__/test-suite/groups/function-boolean/case011.json diff --git a/test/test-suite/groups/function-boolean/case012.json b/__tests__/test-suite/groups/function-boolean/case012.json similarity index 100% rename from test/test-suite/groups/function-boolean/case012.json rename to __tests__/test-suite/groups/function-boolean/case012.json diff --git a/test/test-suite/groups/function-boolean/case013.json b/__tests__/test-suite/groups/function-boolean/case013.json similarity index 100% rename from test/test-suite/groups/function-boolean/case013.json rename to __tests__/test-suite/groups/function-boolean/case013.json diff --git a/test/test-suite/groups/function-boolean/case014.json b/__tests__/test-suite/groups/function-boolean/case014.json similarity index 100% rename from test/test-suite/groups/function-boolean/case014.json rename to __tests__/test-suite/groups/function-boolean/case014.json diff --git a/test/test-suite/groups/function-boolean/case015.json b/__tests__/test-suite/groups/function-boolean/case015.json similarity index 100% rename from test/test-suite/groups/function-boolean/case015.json rename to __tests__/test-suite/groups/function-boolean/case015.json diff --git a/test/test-suite/groups/function-boolean/case016.json b/__tests__/test-suite/groups/function-boolean/case016.json similarity index 100% rename from test/test-suite/groups/function-boolean/case016.json rename to __tests__/test-suite/groups/function-boolean/case016.json diff --git a/test/test-suite/groups/function-boolean/case017.json b/__tests__/test-suite/groups/function-boolean/case017.json similarity index 100% rename from test/test-suite/groups/function-boolean/case017.json rename to __tests__/test-suite/groups/function-boolean/case017.json diff --git a/test/test-suite/groups/function-boolean/case018.json b/__tests__/test-suite/groups/function-boolean/case018.json similarity index 100% rename from test/test-suite/groups/function-boolean/case018.json rename to __tests__/test-suite/groups/function-boolean/case018.json diff --git a/test/test-suite/groups/function-boolean/case019.json b/__tests__/test-suite/groups/function-boolean/case019.json similarity index 100% rename from test/test-suite/groups/function-boolean/case019.json rename to __tests__/test-suite/groups/function-boolean/case019.json diff --git a/test/test-suite/groups/function-boolean/case020.json b/__tests__/test-suite/groups/function-boolean/case020.json similarity index 100% rename from test/test-suite/groups/function-boolean/case020.json rename to __tests__/test-suite/groups/function-boolean/case020.json diff --git a/test/test-suite/groups/function-boolean/case021.json b/__tests__/test-suite/groups/function-boolean/case021.json similarity index 100% rename from test/test-suite/groups/function-boolean/case021.json rename to __tests__/test-suite/groups/function-boolean/case021.json diff --git a/test/test-suite/groups/function-boolean/case022.json b/__tests__/test-suite/groups/function-boolean/case022.json similarity index 100% rename from test/test-suite/groups/function-boolean/case022.json rename to __tests__/test-suite/groups/function-boolean/case022.json diff --git a/test/test-suite/groups/function-boolean/case023.json b/__tests__/test-suite/groups/function-boolean/case023.json similarity index 100% rename from test/test-suite/groups/function-boolean/case023.json rename to __tests__/test-suite/groups/function-boolean/case023.json diff --git a/test/test-suite/groups/function-ceil/case000.json b/__tests__/test-suite/groups/function-ceil/case000.json similarity index 100% rename from test/test-suite/groups/function-ceil/case000.json rename to __tests__/test-suite/groups/function-ceil/case000.json diff --git a/test/test-suite/groups/function-ceil/case001.json b/__tests__/test-suite/groups/function-ceil/case001.json similarity index 100% rename from test/test-suite/groups/function-ceil/case001.json rename to __tests__/test-suite/groups/function-ceil/case001.json diff --git a/test/test-suite/groups/function-ceil/case002.json b/__tests__/test-suite/groups/function-ceil/case002.json similarity index 100% rename from test/test-suite/groups/function-ceil/case002.json rename to __tests__/test-suite/groups/function-ceil/case002.json diff --git a/test/test-suite/groups/function-ceil/case003.json b/__tests__/test-suite/groups/function-ceil/case003.json similarity index 100% rename from test/test-suite/groups/function-ceil/case003.json rename to __tests__/test-suite/groups/function-ceil/case003.json diff --git a/test/test-suite/groups/function-clone/case000.json b/__tests__/test-suite/groups/function-clone/case000.json similarity index 100% rename from test/test-suite/groups/function-clone/case000.json rename to __tests__/test-suite/groups/function-clone/case000.json diff --git a/test/test-suite/groups/function-clone/case001.json b/__tests__/test-suite/groups/function-clone/case001.json similarity index 100% rename from test/test-suite/groups/function-clone/case001.json rename to __tests__/test-suite/groups/function-clone/case001.json diff --git a/test/test-suite/groups/function-clone/case002.json b/__tests__/test-suite/groups/function-clone/case002.json similarity index 100% rename from test/test-suite/groups/function-clone/case002.json rename to __tests__/test-suite/groups/function-clone/case002.json diff --git a/test/test-suite/groups/function-contains/case000.json b/__tests__/test-suite/groups/function-contains/case000.json similarity index 100% rename from test/test-suite/groups/function-contains/case000.json rename to __tests__/test-suite/groups/function-contains/case000.json diff --git a/test/test-suite/groups/function-contains/case001.json b/__tests__/test-suite/groups/function-contains/case001.json similarity index 100% rename from test/test-suite/groups/function-contains/case001.json rename to __tests__/test-suite/groups/function-contains/case001.json diff --git a/test/test-suite/groups/function-contains/case002.json b/__tests__/test-suite/groups/function-contains/case002.json similarity index 100% rename from test/test-suite/groups/function-contains/case002.json rename to __tests__/test-suite/groups/function-contains/case002.json diff --git a/test/test-suite/groups/function-contains/case003.json b/__tests__/test-suite/groups/function-contains/case003.json similarity index 100% rename from test/test-suite/groups/function-contains/case003.json rename to __tests__/test-suite/groups/function-contains/case003.json diff --git a/test/test-suite/groups/function-contains/case004.json b/__tests__/test-suite/groups/function-contains/case004.json similarity index 100% rename from test/test-suite/groups/function-contains/case004.json rename to __tests__/test-suite/groups/function-contains/case004.json diff --git a/test/test-suite/groups/function-contains/case005.json b/__tests__/test-suite/groups/function-contains/case005.json similarity index 100% rename from test/test-suite/groups/function-contains/case005.json rename to __tests__/test-suite/groups/function-contains/case005.json diff --git a/test/test-suite/groups/function-contains/case006.json b/__tests__/test-suite/groups/function-contains/case006.json similarity index 100% rename from test/test-suite/groups/function-contains/case006.json rename to __tests__/test-suite/groups/function-contains/case006.json diff --git a/test/test-suite/groups/function-count/case000.json b/__tests__/test-suite/groups/function-count/case000.json similarity index 100% rename from test/test-suite/groups/function-count/case000.json rename to __tests__/test-suite/groups/function-count/case000.json diff --git a/test/test-suite/groups/function-count/case001.json b/__tests__/test-suite/groups/function-count/case001.json similarity index 100% rename from test/test-suite/groups/function-count/case001.json rename to __tests__/test-suite/groups/function-count/case001.json diff --git a/test/test-suite/groups/function-count/case002.json b/__tests__/test-suite/groups/function-count/case002.json similarity index 100% rename from test/test-suite/groups/function-count/case002.json rename to __tests__/test-suite/groups/function-count/case002.json diff --git a/test/test-suite/groups/function-count/case003.json b/__tests__/test-suite/groups/function-count/case003.json similarity index 100% rename from test/test-suite/groups/function-count/case003.json rename to __tests__/test-suite/groups/function-count/case003.json diff --git a/test/test-suite/groups/function-count/case004.json b/__tests__/test-suite/groups/function-count/case004.json similarity index 100% rename from test/test-suite/groups/function-count/case004.json rename to __tests__/test-suite/groups/function-count/case004.json diff --git a/test/test-suite/groups/function-count/case005.json b/__tests__/test-suite/groups/function-count/case005.json similarity index 100% rename from test/test-suite/groups/function-count/case005.json rename to __tests__/test-suite/groups/function-count/case005.json diff --git a/test/test-suite/groups/function-count/case006.json b/__tests__/test-suite/groups/function-count/case006.json similarity index 100% rename from test/test-suite/groups/function-count/case006.json rename to __tests__/test-suite/groups/function-count/case006.json diff --git a/test/test-suite/groups/function-count/case007.json b/__tests__/test-suite/groups/function-count/case007.json similarity index 100% rename from test/test-suite/groups/function-count/case007.json rename to __tests__/test-suite/groups/function-count/case007.json diff --git a/test/test-suite/groups/function-count/case008.json b/__tests__/test-suite/groups/function-count/case008.json similarity index 100% rename from test/test-suite/groups/function-count/case008.json rename to __tests__/test-suite/groups/function-count/case008.json diff --git a/test/test-suite/groups/function-count/case009.json b/__tests__/test-suite/groups/function-count/case009.json similarity index 100% rename from test/test-suite/groups/function-count/case009.json rename to __tests__/test-suite/groups/function-count/case009.json diff --git a/test/test-suite/groups/function-count/case010.json b/__tests__/test-suite/groups/function-count/case010.json similarity index 100% rename from test/test-suite/groups/function-count/case010.json rename to __tests__/test-suite/groups/function-count/case010.json diff --git a/test/test-suite/groups/function-count/case011.json b/__tests__/test-suite/groups/function-count/case011.json similarity index 100% rename from test/test-suite/groups/function-count/case011.json rename to __tests__/test-suite/groups/function-count/case011.json diff --git a/test/test-suite/groups/function-count/case012.json b/__tests__/test-suite/groups/function-count/case012.json similarity index 100% rename from test/test-suite/groups/function-count/case012.json rename to __tests__/test-suite/groups/function-count/case012.json diff --git a/test/test-suite/groups/function-count/case013.json b/__tests__/test-suite/groups/function-count/case013.json similarity index 100% rename from test/test-suite/groups/function-count/case013.json rename to __tests__/test-suite/groups/function-count/case013.json diff --git a/test/test-suite/groups/function-each/case000.json b/__tests__/test-suite/groups/function-each/case000.json similarity index 100% rename from test/test-suite/groups/function-each/case000.json rename to __tests__/test-suite/groups/function-each/case000.json diff --git a/test/test-suite/groups/function-each/case001.json b/__tests__/test-suite/groups/function-each/case001.json similarity index 100% rename from test/test-suite/groups/function-each/case001.json rename to __tests__/test-suite/groups/function-each/case001.json diff --git a/test/test-suite/groups/function-each/case002.json b/__tests__/test-suite/groups/function-each/case002.json similarity index 100% rename from test/test-suite/groups/function-each/case002.json rename to __tests__/test-suite/groups/function-each/case002.json diff --git a/test/test-suite/groups/function-each/case003.json b/__tests__/test-suite/groups/function-each/case003.json similarity index 100% rename from test/test-suite/groups/function-each/case003.json rename to __tests__/test-suite/groups/function-each/case003.json diff --git a/test/test-suite/groups/function-each/case004.json b/__tests__/test-suite/groups/function-each/case004.json similarity index 100% rename from test/test-suite/groups/function-each/case004.json rename to __tests__/test-suite/groups/function-each/case004.json diff --git a/test/test-suite/groups/function-exists/case000.json b/__tests__/test-suite/groups/function-exists/case000.json similarity index 100% rename from test/test-suite/groups/function-exists/case000.json rename to __tests__/test-suite/groups/function-exists/case000.json diff --git a/test/test-suite/groups/function-exists/case001.json b/__tests__/test-suite/groups/function-exists/case001.json similarity index 100% rename from test/test-suite/groups/function-exists/case001.json rename to __tests__/test-suite/groups/function-exists/case001.json diff --git a/test/test-suite/groups/function-exists/case002.json b/__tests__/test-suite/groups/function-exists/case002.json similarity index 100% rename from test/test-suite/groups/function-exists/case002.json rename to __tests__/test-suite/groups/function-exists/case002.json diff --git a/test/test-suite/groups/function-exists/case003.json b/__tests__/test-suite/groups/function-exists/case003.json similarity index 100% rename from test/test-suite/groups/function-exists/case003.json rename to __tests__/test-suite/groups/function-exists/case003.json diff --git a/test/test-suite/groups/function-exists/case004.json b/__tests__/test-suite/groups/function-exists/case004.json similarity index 100% rename from test/test-suite/groups/function-exists/case004.json rename to __tests__/test-suite/groups/function-exists/case004.json diff --git a/test/test-suite/groups/function-exists/case005.json b/__tests__/test-suite/groups/function-exists/case005.json similarity index 100% rename from test/test-suite/groups/function-exists/case005.json rename to __tests__/test-suite/groups/function-exists/case005.json diff --git a/test/test-suite/groups/function-exists/case006.json b/__tests__/test-suite/groups/function-exists/case006.json similarity index 100% rename from test/test-suite/groups/function-exists/case006.json rename to __tests__/test-suite/groups/function-exists/case006.json diff --git a/test/test-suite/groups/function-exists/case007.json b/__tests__/test-suite/groups/function-exists/case007.json similarity index 100% rename from test/test-suite/groups/function-exists/case007.json rename to __tests__/test-suite/groups/function-exists/case007.json diff --git a/test/test-suite/groups/function-exists/case008.json b/__tests__/test-suite/groups/function-exists/case008.json similarity index 100% rename from test/test-suite/groups/function-exists/case008.json rename to __tests__/test-suite/groups/function-exists/case008.json diff --git a/test/test-suite/groups/function-exists/case009.json b/__tests__/test-suite/groups/function-exists/case009.json similarity index 100% rename from test/test-suite/groups/function-exists/case009.json rename to __tests__/test-suite/groups/function-exists/case009.json diff --git a/test/test-suite/groups/function-exists/case010.json b/__tests__/test-suite/groups/function-exists/case010.json similarity index 100% rename from test/test-suite/groups/function-exists/case010.json rename to __tests__/test-suite/groups/function-exists/case010.json diff --git a/test/test-suite/groups/function-exists/case011.json b/__tests__/test-suite/groups/function-exists/case011.json similarity index 100% rename from test/test-suite/groups/function-exists/case011.json rename to __tests__/test-suite/groups/function-exists/case011.json diff --git a/test/test-suite/groups/function-exists/case012.json b/__tests__/test-suite/groups/function-exists/case012.json similarity index 100% rename from test/test-suite/groups/function-exists/case012.json rename to __tests__/test-suite/groups/function-exists/case012.json diff --git a/test/test-suite/groups/function-exists/case013.json b/__tests__/test-suite/groups/function-exists/case013.json similarity index 100% rename from test/test-suite/groups/function-exists/case013.json rename to __tests__/test-suite/groups/function-exists/case013.json diff --git a/test/test-suite/groups/function-exists/case014.json b/__tests__/test-suite/groups/function-exists/case014.json similarity index 100% rename from test/test-suite/groups/function-exists/case014.json rename to __tests__/test-suite/groups/function-exists/case014.json diff --git a/test/test-suite/groups/function-exists/case015.json b/__tests__/test-suite/groups/function-exists/case015.json similarity index 100% rename from test/test-suite/groups/function-exists/case015.json rename to __tests__/test-suite/groups/function-exists/case015.json diff --git a/test/test-suite/groups/function-exists/case016.json b/__tests__/test-suite/groups/function-exists/case016.json similarity index 100% rename from test/test-suite/groups/function-exists/case016.json rename to __tests__/test-suite/groups/function-exists/case016.json diff --git a/test/test-suite/groups/function-exists/case017.json b/__tests__/test-suite/groups/function-exists/case017.json similarity index 100% rename from test/test-suite/groups/function-exists/case017.json rename to __tests__/test-suite/groups/function-exists/case017.json diff --git a/test/test-suite/groups/function-exists/case018.json b/__tests__/test-suite/groups/function-exists/case018.json similarity index 100% rename from test/test-suite/groups/function-exists/case018.json rename to __tests__/test-suite/groups/function-exists/case018.json diff --git a/test/test-suite/groups/function-exists/case019.json b/__tests__/test-suite/groups/function-exists/case019.json similarity index 100% rename from test/test-suite/groups/function-exists/case019.json rename to __tests__/test-suite/groups/function-exists/case019.json diff --git a/test/test-suite/groups/function-exists/case020.json b/__tests__/test-suite/groups/function-exists/case020.json similarity index 100% rename from test/test-suite/groups/function-exists/case020.json rename to __tests__/test-suite/groups/function-exists/case020.json diff --git a/test/test-suite/groups/function-exists/case021.json b/__tests__/test-suite/groups/function-exists/case021.json similarity index 100% rename from test/test-suite/groups/function-exists/case021.json rename to __tests__/test-suite/groups/function-exists/case021.json diff --git a/test/test-suite/groups/function-exists/case022.json b/__tests__/test-suite/groups/function-exists/case022.json similarity index 100% rename from test/test-suite/groups/function-exists/case022.json rename to __tests__/test-suite/groups/function-exists/case022.json diff --git a/test/test-suite/groups/function-exists/case023.json b/__tests__/test-suite/groups/function-exists/case023.json similarity index 100% rename from test/test-suite/groups/function-exists/case023.json rename to __tests__/test-suite/groups/function-exists/case023.json diff --git a/test/test-suite/groups/function-exists/case024.json b/__tests__/test-suite/groups/function-exists/case024.json similarity index 100% rename from test/test-suite/groups/function-exists/case024.json rename to __tests__/test-suite/groups/function-exists/case024.json diff --git a/test/test-suite/groups/function-floor/case000.json b/__tests__/test-suite/groups/function-floor/case000.json similarity index 100% rename from test/test-suite/groups/function-floor/case000.json rename to __tests__/test-suite/groups/function-floor/case000.json diff --git a/test/test-suite/groups/function-floor/case001.json b/__tests__/test-suite/groups/function-floor/case001.json similarity index 100% rename from test/test-suite/groups/function-floor/case001.json rename to __tests__/test-suite/groups/function-floor/case001.json diff --git a/test/test-suite/groups/function-floor/case002.json b/__tests__/test-suite/groups/function-floor/case002.json similarity index 100% rename from test/test-suite/groups/function-floor/case002.json rename to __tests__/test-suite/groups/function-floor/case002.json diff --git a/test/test-suite/groups/function-floor/case003.json b/__tests__/test-suite/groups/function-floor/case003.json similarity index 100% rename from test/test-suite/groups/function-floor/case003.json rename to __tests__/test-suite/groups/function-floor/case003.json diff --git a/test/test-suite/groups/function-formatBase/case000.json b/__tests__/test-suite/groups/function-formatBase/case000.json similarity index 100% rename from test/test-suite/groups/function-formatBase/case000.json rename to __tests__/test-suite/groups/function-formatBase/case000.json diff --git a/test/test-suite/groups/function-formatBase/case001.json b/__tests__/test-suite/groups/function-formatBase/case001.json similarity index 100% rename from test/test-suite/groups/function-formatBase/case001.json rename to __tests__/test-suite/groups/function-formatBase/case001.json diff --git a/test/test-suite/groups/function-formatBase/case002.json b/__tests__/test-suite/groups/function-formatBase/case002.json similarity index 100% rename from test/test-suite/groups/function-formatBase/case002.json rename to __tests__/test-suite/groups/function-formatBase/case002.json diff --git a/test/test-suite/groups/function-formatBase/case003.json b/__tests__/test-suite/groups/function-formatBase/case003.json similarity index 100% rename from test/test-suite/groups/function-formatBase/case003.json rename to __tests__/test-suite/groups/function-formatBase/case003.json diff --git a/test/test-suite/groups/function-formatBase/case004.json b/__tests__/test-suite/groups/function-formatBase/case004.json similarity index 100% rename from test/test-suite/groups/function-formatBase/case004.json rename to __tests__/test-suite/groups/function-formatBase/case004.json diff --git a/test/test-suite/groups/function-formatBase/case005.json b/__tests__/test-suite/groups/function-formatBase/case005.json similarity index 100% rename from test/test-suite/groups/function-formatBase/case005.json rename to __tests__/test-suite/groups/function-formatBase/case005.json diff --git a/test/test-suite/groups/function-formatBase/case006.json b/__tests__/test-suite/groups/function-formatBase/case006.json similarity index 100% rename from test/test-suite/groups/function-formatBase/case006.json rename to __tests__/test-suite/groups/function-formatBase/case006.json diff --git a/test/test-suite/groups/function-formatBase/case007.json b/__tests__/test-suite/groups/function-formatBase/case007.json similarity index 100% rename from test/test-suite/groups/function-formatBase/case007.json rename to __tests__/test-suite/groups/function-formatBase/case007.json diff --git a/test/test-suite/groups/function-formatNumber/case000.json b/__tests__/test-suite/groups/function-formatNumber/case000.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case000.json rename to __tests__/test-suite/groups/function-formatNumber/case000.json diff --git a/test/test-suite/groups/function-formatNumber/case001.json b/__tests__/test-suite/groups/function-formatNumber/case001.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case001.json rename to __tests__/test-suite/groups/function-formatNumber/case001.json diff --git a/test/test-suite/groups/function-formatNumber/case002.json b/__tests__/test-suite/groups/function-formatNumber/case002.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case002.json rename to __tests__/test-suite/groups/function-formatNumber/case002.json diff --git a/test/test-suite/groups/function-formatNumber/case003.json b/__tests__/test-suite/groups/function-formatNumber/case003.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case003.json rename to __tests__/test-suite/groups/function-formatNumber/case003.json diff --git a/test/test-suite/groups/function-formatNumber/case004.json b/__tests__/test-suite/groups/function-formatNumber/case004.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case004.json rename to __tests__/test-suite/groups/function-formatNumber/case004.json diff --git a/test/test-suite/groups/function-formatNumber/case005.json b/__tests__/test-suite/groups/function-formatNumber/case005.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case005.json rename to __tests__/test-suite/groups/function-formatNumber/case005.json diff --git a/test/test-suite/groups/function-formatNumber/case006.json b/__tests__/test-suite/groups/function-formatNumber/case006.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case006.json rename to __tests__/test-suite/groups/function-formatNumber/case006.json diff --git a/test/test-suite/groups/function-formatNumber/case007.json b/__tests__/test-suite/groups/function-formatNumber/case007.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case007.json rename to __tests__/test-suite/groups/function-formatNumber/case007.json diff --git a/test/test-suite/groups/function-formatNumber/case008.json b/__tests__/test-suite/groups/function-formatNumber/case008.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case008.json rename to __tests__/test-suite/groups/function-formatNumber/case008.json diff --git a/test/test-suite/groups/function-formatNumber/case009.json b/__tests__/test-suite/groups/function-formatNumber/case009.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case009.json rename to __tests__/test-suite/groups/function-formatNumber/case009.json diff --git a/test/test-suite/groups/function-formatNumber/case010.json b/__tests__/test-suite/groups/function-formatNumber/case010.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case010.json rename to __tests__/test-suite/groups/function-formatNumber/case010.json diff --git a/test/test-suite/groups/function-formatNumber/case011.json b/__tests__/test-suite/groups/function-formatNumber/case011.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case011.json rename to __tests__/test-suite/groups/function-formatNumber/case011.json diff --git a/test/test-suite/groups/function-formatNumber/case012.json b/__tests__/test-suite/groups/function-formatNumber/case012.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case012.json rename to __tests__/test-suite/groups/function-formatNumber/case012.json diff --git a/test/test-suite/groups/function-formatNumber/case013.json b/__tests__/test-suite/groups/function-formatNumber/case013.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case013.json rename to __tests__/test-suite/groups/function-formatNumber/case013.json diff --git a/test/test-suite/groups/function-formatNumber/case014.json b/__tests__/test-suite/groups/function-formatNumber/case014.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case014.json rename to __tests__/test-suite/groups/function-formatNumber/case014.json diff --git a/test/test-suite/groups/function-formatNumber/case015.json b/__tests__/test-suite/groups/function-formatNumber/case015.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case015.json rename to __tests__/test-suite/groups/function-formatNumber/case015.json diff --git a/test/test-suite/groups/function-formatNumber/case016.json b/__tests__/test-suite/groups/function-formatNumber/case016.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case016.json rename to __tests__/test-suite/groups/function-formatNumber/case016.json diff --git a/test/test-suite/groups/function-formatNumber/case017.json b/__tests__/test-suite/groups/function-formatNumber/case017.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case017.json rename to __tests__/test-suite/groups/function-formatNumber/case017.json diff --git a/test/test-suite/groups/function-formatNumber/case018.json b/__tests__/test-suite/groups/function-formatNumber/case018.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case018.json rename to __tests__/test-suite/groups/function-formatNumber/case018.json diff --git a/test/test-suite/groups/function-formatNumber/case019.json b/__tests__/test-suite/groups/function-formatNumber/case019.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case019.json rename to __tests__/test-suite/groups/function-formatNumber/case019.json diff --git a/test/test-suite/groups/function-formatNumber/case020.json b/__tests__/test-suite/groups/function-formatNumber/case020.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case020.json rename to __tests__/test-suite/groups/function-formatNumber/case020.json diff --git a/test/test-suite/groups/function-formatNumber/case021.json b/__tests__/test-suite/groups/function-formatNumber/case021.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case021.json rename to __tests__/test-suite/groups/function-formatNumber/case021.json diff --git a/test/test-suite/groups/function-formatNumber/case022.json b/__tests__/test-suite/groups/function-formatNumber/case022.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case022.json rename to __tests__/test-suite/groups/function-formatNumber/case022.json diff --git a/test/test-suite/groups/function-formatNumber/case023.json b/__tests__/test-suite/groups/function-formatNumber/case023.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case023.json rename to __tests__/test-suite/groups/function-formatNumber/case023.json diff --git a/test/test-suite/groups/function-formatNumber/case024.json b/__tests__/test-suite/groups/function-formatNumber/case024.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case024.json rename to __tests__/test-suite/groups/function-formatNumber/case024.json diff --git a/test/test-suite/groups/function-formatNumber/case025.json b/__tests__/test-suite/groups/function-formatNumber/case025.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case025.json rename to __tests__/test-suite/groups/function-formatNumber/case025.json diff --git a/test/test-suite/groups/function-formatNumber/case026.json b/__tests__/test-suite/groups/function-formatNumber/case026.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case026.json rename to __tests__/test-suite/groups/function-formatNumber/case026.json diff --git a/test/test-suite/groups/function-formatNumber/case027.json b/__tests__/test-suite/groups/function-formatNumber/case027.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case027.json rename to __tests__/test-suite/groups/function-formatNumber/case027.json diff --git a/test/test-suite/groups/function-formatNumber/case028.json b/__tests__/test-suite/groups/function-formatNumber/case028.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case028.json rename to __tests__/test-suite/groups/function-formatNumber/case028.json diff --git a/test/test-suite/groups/function-formatNumber/case029.json b/__tests__/test-suite/groups/function-formatNumber/case029.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case029.json rename to __tests__/test-suite/groups/function-formatNumber/case029.json diff --git a/test/test-suite/groups/function-formatNumber/case030.json b/__tests__/test-suite/groups/function-formatNumber/case030.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case030.json rename to __tests__/test-suite/groups/function-formatNumber/case030.json diff --git a/test/test-suite/groups/function-formatNumber/case031.json b/__tests__/test-suite/groups/function-formatNumber/case031.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case031.json rename to __tests__/test-suite/groups/function-formatNumber/case031.json diff --git a/test/test-suite/groups/function-formatNumber/case032.json b/__tests__/test-suite/groups/function-formatNumber/case032.json similarity index 100% rename from test/test-suite/groups/function-formatNumber/case032.json rename to __tests__/test-suite/groups/function-formatNumber/case032.json diff --git a/test/test-suite/groups/function-fromMillis/case000.json b/__tests__/test-suite/groups/function-fromMillis/case000.json similarity index 100% rename from test/test-suite/groups/function-fromMillis/case000.json rename to __tests__/test-suite/groups/function-fromMillis/case000.json diff --git a/test/test-suite/groups/function-fromMillis/case001.json b/__tests__/test-suite/groups/function-fromMillis/case001.json similarity index 100% rename from test/test-suite/groups/function-fromMillis/case001.json rename to __tests__/test-suite/groups/function-fromMillis/case001.json diff --git a/test/test-suite/groups/function-fromMillis/case002.json b/__tests__/test-suite/groups/function-fromMillis/case002.json similarity index 100% rename from test/test-suite/groups/function-fromMillis/case002.json rename to __tests__/test-suite/groups/function-fromMillis/case002.json diff --git a/test/test-suite/groups/function-join/case000.json b/__tests__/test-suite/groups/function-join/case000.json similarity index 100% rename from test/test-suite/groups/function-join/case000.json rename to __tests__/test-suite/groups/function-join/case000.json diff --git a/test/test-suite/groups/function-join/case001.json b/__tests__/test-suite/groups/function-join/case001.json similarity index 100% rename from test/test-suite/groups/function-join/case001.json rename to __tests__/test-suite/groups/function-join/case001.json diff --git a/test/test-suite/groups/function-join/case002.json b/__tests__/test-suite/groups/function-join/case002.json similarity index 100% rename from test/test-suite/groups/function-join/case002.json rename to __tests__/test-suite/groups/function-join/case002.json diff --git a/test/test-suite/groups/function-join/case003.json b/__tests__/test-suite/groups/function-join/case003.json similarity index 100% rename from test/test-suite/groups/function-join/case003.json rename to __tests__/test-suite/groups/function-join/case003.json diff --git a/test/test-suite/groups/function-join/case004.json b/__tests__/test-suite/groups/function-join/case004.json similarity index 100% rename from test/test-suite/groups/function-join/case004.json rename to __tests__/test-suite/groups/function-join/case004.json diff --git a/test/test-suite/groups/function-join/case005.json b/__tests__/test-suite/groups/function-join/case005.json similarity index 100% rename from test/test-suite/groups/function-join/case005.json rename to __tests__/test-suite/groups/function-join/case005.json diff --git a/test/test-suite/groups/function-join/case006.json b/__tests__/test-suite/groups/function-join/case006.json similarity index 100% rename from test/test-suite/groups/function-join/case006.json rename to __tests__/test-suite/groups/function-join/case006.json diff --git a/test/test-suite/groups/function-join/case007.json b/__tests__/test-suite/groups/function-join/case007.json similarity index 100% rename from test/test-suite/groups/function-join/case007.json rename to __tests__/test-suite/groups/function-join/case007.json diff --git a/test/test-suite/groups/function-join/case008.json b/__tests__/test-suite/groups/function-join/case008.json similarity index 100% rename from test/test-suite/groups/function-join/case008.json rename to __tests__/test-suite/groups/function-join/case008.json diff --git a/test/test-suite/groups/function-join/case009.json b/__tests__/test-suite/groups/function-join/case009.json similarity index 100% rename from test/test-suite/groups/function-join/case009.json rename to __tests__/test-suite/groups/function-join/case009.json diff --git a/test/test-suite/groups/function-join/case010.json b/__tests__/test-suite/groups/function-join/case010.json similarity index 100% rename from test/test-suite/groups/function-join/case010.json rename to __tests__/test-suite/groups/function-join/case010.json diff --git a/test/test-suite/groups/function-join/case011.json b/__tests__/test-suite/groups/function-join/case011.json similarity index 100% rename from test/test-suite/groups/function-join/case011.json rename to __tests__/test-suite/groups/function-join/case011.json diff --git a/test/test-suite/groups/function-keys/case000.json b/__tests__/test-suite/groups/function-keys/case000.json similarity index 100% rename from test/test-suite/groups/function-keys/case000.json rename to __tests__/test-suite/groups/function-keys/case000.json diff --git a/test/test-suite/groups/function-keys/case001.json b/__tests__/test-suite/groups/function-keys/case001.json similarity index 100% rename from test/test-suite/groups/function-keys/case001.json rename to __tests__/test-suite/groups/function-keys/case001.json diff --git a/test/test-suite/groups/function-keys/case002.json b/__tests__/test-suite/groups/function-keys/case002.json similarity index 100% rename from test/test-suite/groups/function-keys/case002.json rename to __tests__/test-suite/groups/function-keys/case002.json diff --git a/test/test-suite/groups/function-keys/case003.json b/__tests__/test-suite/groups/function-keys/case003.json similarity index 100% rename from test/test-suite/groups/function-keys/case003.json rename to __tests__/test-suite/groups/function-keys/case003.json diff --git a/test/test-suite/groups/function-keys/case004.json b/__tests__/test-suite/groups/function-keys/case004.json similarity index 100% rename from test/test-suite/groups/function-keys/case004.json rename to __tests__/test-suite/groups/function-keys/case004.json diff --git a/test/test-suite/groups/function-keys/case005.json b/__tests__/test-suite/groups/function-keys/case005.json similarity index 100% rename from test/test-suite/groups/function-keys/case005.json rename to __tests__/test-suite/groups/function-keys/case005.json diff --git a/test/test-suite/groups/function-keys/case006.json b/__tests__/test-suite/groups/function-keys/case006.json similarity index 100% rename from test/test-suite/groups/function-keys/case006.json rename to __tests__/test-suite/groups/function-keys/case006.json diff --git a/test/test-suite/groups/function-length/case000.json b/__tests__/test-suite/groups/function-length/case000.json similarity index 100% rename from test/test-suite/groups/function-length/case000.json rename to __tests__/test-suite/groups/function-length/case000.json diff --git a/test/test-suite/groups/function-length/case001.json b/__tests__/test-suite/groups/function-length/case001.json similarity index 100% rename from test/test-suite/groups/function-length/case001.json rename to __tests__/test-suite/groups/function-length/case001.json diff --git a/test/test-suite/groups/function-length/case002.json b/__tests__/test-suite/groups/function-length/case002.json similarity index 100% rename from test/test-suite/groups/function-length/case002.json rename to __tests__/test-suite/groups/function-length/case002.json diff --git a/test/test-suite/groups/function-length/case003.json b/__tests__/test-suite/groups/function-length/case003.json similarity index 100% rename from test/test-suite/groups/function-length/case003.json rename to __tests__/test-suite/groups/function-length/case003.json diff --git a/test/test-suite/groups/function-length/case004.json b/__tests__/test-suite/groups/function-length/case004.json similarity index 100% rename from test/test-suite/groups/function-length/case004.json rename to __tests__/test-suite/groups/function-length/case004.json diff --git a/test/test-suite/groups/function-length/case005.json b/__tests__/test-suite/groups/function-length/case005.json similarity index 100% rename from test/test-suite/groups/function-length/case005.json rename to __tests__/test-suite/groups/function-length/case005.json diff --git a/test/test-suite/groups/function-length/case006.json b/__tests__/test-suite/groups/function-length/case006.json similarity index 100% rename from test/test-suite/groups/function-length/case006.json rename to __tests__/test-suite/groups/function-length/case006.json diff --git a/test/test-suite/groups/function-length/case007.json b/__tests__/test-suite/groups/function-length/case007.json similarity index 100% rename from test/test-suite/groups/function-length/case007.json rename to __tests__/test-suite/groups/function-length/case007.json diff --git a/test/test-suite/groups/function-length/case008.json b/__tests__/test-suite/groups/function-length/case008.json similarity index 100% rename from test/test-suite/groups/function-length/case008.json rename to __tests__/test-suite/groups/function-length/case008.json diff --git a/test/test-suite/groups/function-length/case009.json b/__tests__/test-suite/groups/function-length/case009.json similarity index 100% rename from test/test-suite/groups/function-length/case009.json rename to __tests__/test-suite/groups/function-length/case009.json diff --git a/test/test-suite/groups/function-length/case010.json b/__tests__/test-suite/groups/function-length/case010.json similarity index 100% rename from test/test-suite/groups/function-length/case010.json rename to __tests__/test-suite/groups/function-length/case010.json diff --git a/test/test-suite/groups/function-length/case011.json b/__tests__/test-suite/groups/function-length/case011.json similarity index 100% rename from test/test-suite/groups/function-length/case011.json rename to __tests__/test-suite/groups/function-length/case011.json diff --git a/test/test-suite/groups/function-length/case012.json b/__tests__/test-suite/groups/function-length/case012.json similarity index 100% rename from test/test-suite/groups/function-length/case012.json rename to __tests__/test-suite/groups/function-length/case012.json diff --git a/test/test-suite/groups/function-length/case013.json b/__tests__/test-suite/groups/function-length/case013.json similarity index 100% rename from test/test-suite/groups/function-length/case013.json rename to __tests__/test-suite/groups/function-length/case013.json diff --git a/test/test-suite/groups/function-length/case014.json b/__tests__/test-suite/groups/function-length/case014.json similarity index 100% rename from test/test-suite/groups/function-length/case014.json rename to __tests__/test-suite/groups/function-length/case014.json diff --git a/test/test-suite/groups/function-length/case015.json b/__tests__/test-suite/groups/function-length/case015.json similarity index 100% rename from test/test-suite/groups/function-length/case015.json rename to __tests__/test-suite/groups/function-length/case015.json diff --git a/test/test-suite/groups/function-lookup/case000.json b/__tests__/test-suite/groups/function-lookup/case000.json similarity index 100% rename from test/test-suite/groups/function-lookup/case000.json rename to __tests__/test-suite/groups/function-lookup/case000.json diff --git a/test/test-suite/groups/function-lookup/case001.json b/__tests__/test-suite/groups/function-lookup/case001.json similarity index 100% rename from test/test-suite/groups/function-lookup/case001.json rename to __tests__/test-suite/groups/function-lookup/case001.json diff --git a/test/test-suite/groups/function-lookup/case002.json b/__tests__/test-suite/groups/function-lookup/case002.json similarity index 100% rename from test/test-suite/groups/function-lookup/case002.json rename to __tests__/test-suite/groups/function-lookup/case002.json diff --git a/test/test-suite/groups/function-lookup/case003.json b/__tests__/test-suite/groups/function-lookup/case003.json similarity index 100% rename from test/test-suite/groups/function-lookup/case003.json rename to __tests__/test-suite/groups/function-lookup/case003.json diff --git a/test/test-suite/groups/function-lowercase/case000.json b/__tests__/test-suite/groups/function-lowercase/case000.json similarity index 100% rename from test/test-suite/groups/function-lowercase/case000.json rename to __tests__/test-suite/groups/function-lowercase/case000.json diff --git a/test/test-suite/groups/function-lowercase/case001.json b/__tests__/test-suite/groups/function-lowercase/case001.json similarity index 100% rename from test/test-suite/groups/function-lowercase/case001.json rename to __tests__/test-suite/groups/function-lowercase/case001.json diff --git a/test/test-suite/groups/function-max/case000.json b/__tests__/test-suite/groups/function-max/case000.json similarity index 100% rename from test/test-suite/groups/function-max/case000.json rename to __tests__/test-suite/groups/function-max/case000.json diff --git a/test/test-suite/groups/function-max/case001.json b/__tests__/test-suite/groups/function-max/case001.json similarity index 100% rename from test/test-suite/groups/function-max/case001.json rename to __tests__/test-suite/groups/function-max/case001.json diff --git a/test/test-suite/groups/function-max/case002.json b/__tests__/test-suite/groups/function-max/case002.json similarity index 100% rename from test/test-suite/groups/function-max/case002.json rename to __tests__/test-suite/groups/function-max/case002.json diff --git a/test/test-suite/groups/function-max/case003.json b/__tests__/test-suite/groups/function-max/case003.json similarity index 100% rename from test/test-suite/groups/function-max/case003.json rename to __tests__/test-suite/groups/function-max/case003.json diff --git a/test/test-suite/groups/function-max/case004.json b/__tests__/test-suite/groups/function-max/case004.json similarity index 100% rename from test/test-suite/groups/function-max/case004.json rename to __tests__/test-suite/groups/function-max/case004.json diff --git a/test/test-suite/groups/function-max/case005.json b/__tests__/test-suite/groups/function-max/case005.json similarity index 100% rename from test/test-suite/groups/function-max/case005.json rename to __tests__/test-suite/groups/function-max/case005.json diff --git a/test/test-suite/groups/function-max/case006.json b/__tests__/test-suite/groups/function-max/case006.json similarity index 100% rename from test/test-suite/groups/function-max/case006.json rename to __tests__/test-suite/groups/function-max/case006.json diff --git a/test/test-suite/groups/function-max/case007.json b/__tests__/test-suite/groups/function-max/case007.json similarity index 100% rename from test/test-suite/groups/function-max/case007.json rename to __tests__/test-suite/groups/function-max/case007.json diff --git a/test/test-suite/groups/function-max/case008.json b/__tests__/test-suite/groups/function-max/case008.json similarity index 100% rename from test/test-suite/groups/function-max/case008.json rename to __tests__/test-suite/groups/function-max/case008.json diff --git a/test/test-suite/groups/function-max/case009.json b/__tests__/test-suite/groups/function-max/case009.json similarity index 100% rename from test/test-suite/groups/function-max/case009.json rename to __tests__/test-suite/groups/function-max/case009.json diff --git a/test/test-suite/groups/function-max/case010.json b/__tests__/test-suite/groups/function-max/case010.json similarity index 100% rename from test/test-suite/groups/function-max/case010.json rename to __tests__/test-suite/groups/function-max/case010.json diff --git a/test/test-suite/groups/function-max/case011.json b/__tests__/test-suite/groups/function-max/case011.json similarity index 100% rename from test/test-suite/groups/function-max/case011.json rename to __tests__/test-suite/groups/function-max/case011.json diff --git a/test/test-suite/groups/function-max/case012.json b/__tests__/test-suite/groups/function-max/case012.json similarity index 100% rename from test/test-suite/groups/function-max/case012.json rename to __tests__/test-suite/groups/function-max/case012.json diff --git a/test/test-suite/groups/function-max/case013.json b/__tests__/test-suite/groups/function-max/case013.json similarity index 100% rename from test/test-suite/groups/function-max/case013.json rename to __tests__/test-suite/groups/function-max/case013.json diff --git a/test/test-suite/groups/function-max/case014.json b/__tests__/test-suite/groups/function-max/case014.json similarity index 100% rename from test/test-suite/groups/function-max/case014.json rename to __tests__/test-suite/groups/function-max/case014.json diff --git a/test/test-suite/groups/function-max/case015.json b/__tests__/test-suite/groups/function-max/case015.json similarity index 100% rename from test/test-suite/groups/function-max/case015.json rename to __tests__/test-suite/groups/function-max/case015.json diff --git a/test/test-suite/groups/function-max/case016.json b/__tests__/test-suite/groups/function-max/case016.json similarity index 100% rename from test/test-suite/groups/function-max/case016.json rename to __tests__/test-suite/groups/function-max/case016.json diff --git a/test/test-suite/groups/function-max/case017.json b/__tests__/test-suite/groups/function-max/case017.json similarity index 100% rename from test/test-suite/groups/function-max/case017.json rename to __tests__/test-suite/groups/function-max/case017.json diff --git a/test/test-suite/groups/function-max/case018.json b/__tests__/test-suite/groups/function-max/case018.json similarity index 100% rename from test/test-suite/groups/function-max/case018.json rename to __tests__/test-suite/groups/function-max/case018.json diff --git a/test/test-suite/groups/function-max/case019.json b/__tests__/test-suite/groups/function-max/case019.json similarity index 100% rename from test/test-suite/groups/function-max/case019.json rename to __tests__/test-suite/groups/function-max/case019.json diff --git a/test/test-suite/groups/function-max/case020.json b/__tests__/test-suite/groups/function-max/case020.json similarity index 100% rename from test/test-suite/groups/function-max/case020.json rename to __tests__/test-suite/groups/function-max/case020.json diff --git a/test/test-suite/groups/function-max/case021.json b/__tests__/test-suite/groups/function-max/case021.json similarity index 100% rename from test/test-suite/groups/function-max/case021.json rename to __tests__/test-suite/groups/function-max/case021.json diff --git a/test/test-suite/groups/function-max/case022.json b/__tests__/test-suite/groups/function-max/case022.json similarity index 100% rename from test/test-suite/groups/function-max/case022.json rename to __tests__/test-suite/groups/function-max/case022.json diff --git a/test/test-suite/groups/function-max/case023.json b/__tests__/test-suite/groups/function-max/case023.json similarity index 100% rename from test/test-suite/groups/function-max/case023.json rename to __tests__/test-suite/groups/function-max/case023.json diff --git a/test/test-suite/groups/function-max/case024.json b/__tests__/test-suite/groups/function-max/case024.json similarity index 100% rename from test/test-suite/groups/function-max/case024.json rename to __tests__/test-suite/groups/function-max/case024.json diff --git a/test/test-suite/groups/function-max/case025.json b/__tests__/test-suite/groups/function-max/case025.json similarity index 100% rename from test/test-suite/groups/function-max/case025.json rename to __tests__/test-suite/groups/function-max/case025.json diff --git a/test/test-suite/groups/function-max/case026.json b/__tests__/test-suite/groups/function-max/case026.json similarity index 100% rename from test/test-suite/groups/function-max/case026.json rename to __tests__/test-suite/groups/function-max/case026.json diff --git a/test/test-suite/groups/function-merge/case000.json b/__tests__/test-suite/groups/function-merge/case000.json similarity index 100% rename from test/test-suite/groups/function-merge/case000.json rename to __tests__/test-suite/groups/function-merge/case000.json diff --git a/test/test-suite/groups/function-merge/case001.json b/__tests__/test-suite/groups/function-merge/case001.json similarity index 100% rename from test/test-suite/groups/function-merge/case001.json rename to __tests__/test-suite/groups/function-merge/case001.json diff --git a/test/test-suite/groups/function-merge/case002.json b/__tests__/test-suite/groups/function-merge/case002.json similarity index 100% rename from test/test-suite/groups/function-merge/case002.json rename to __tests__/test-suite/groups/function-merge/case002.json diff --git a/test/test-suite/groups/function-merge/case003.json b/__tests__/test-suite/groups/function-merge/case003.json similarity index 100% rename from test/test-suite/groups/function-merge/case003.json rename to __tests__/test-suite/groups/function-merge/case003.json diff --git a/test/test-suite/groups/function-merge/case004.json b/__tests__/test-suite/groups/function-merge/case004.json similarity index 100% rename from test/test-suite/groups/function-merge/case004.json rename to __tests__/test-suite/groups/function-merge/case004.json diff --git a/test/test-suite/groups/function-number/case000.json b/__tests__/test-suite/groups/function-number/case000.json similarity index 100% rename from test/test-suite/groups/function-number/case000.json rename to __tests__/test-suite/groups/function-number/case000.json diff --git a/test/test-suite/groups/function-number/case001.json b/__tests__/test-suite/groups/function-number/case001.json similarity index 100% rename from test/test-suite/groups/function-number/case001.json rename to __tests__/test-suite/groups/function-number/case001.json diff --git a/test/test-suite/groups/function-number/case002.json b/__tests__/test-suite/groups/function-number/case002.json similarity index 100% rename from test/test-suite/groups/function-number/case002.json rename to __tests__/test-suite/groups/function-number/case002.json diff --git a/test/test-suite/groups/function-number/case003.json b/__tests__/test-suite/groups/function-number/case003.json similarity index 100% rename from test/test-suite/groups/function-number/case003.json rename to __tests__/test-suite/groups/function-number/case003.json diff --git a/test/test-suite/groups/function-number/case004.json b/__tests__/test-suite/groups/function-number/case004.json similarity index 100% rename from test/test-suite/groups/function-number/case004.json rename to __tests__/test-suite/groups/function-number/case004.json diff --git a/test/test-suite/groups/function-number/case005.json b/__tests__/test-suite/groups/function-number/case005.json similarity index 100% rename from test/test-suite/groups/function-number/case005.json rename to __tests__/test-suite/groups/function-number/case005.json diff --git a/test/test-suite/groups/function-number/case006.json b/__tests__/test-suite/groups/function-number/case006.json similarity index 100% rename from test/test-suite/groups/function-number/case006.json rename to __tests__/test-suite/groups/function-number/case006.json diff --git a/test/test-suite/groups/function-number/case007.json b/__tests__/test-suite/groups/function-number/case007.json similarity index 100% rename from test/test-suite/groups/function-number/case007.json rename to __tests__/test-suite/groups/function-number/case007.json diff --git a/test/test-suite/groups/function-number/case008.json b/__tests__/test-suite/groups/function-number/case008.json similarity index 100% rename from test/test-suite/groups/function-number/case008.json rename to __tests__/test-suite/groups/function-number/case008.json diff --git a/test/test-suite/groups/function-number/case009.json b/__tests__/test-suite/groups/function-number/case009.json similarity index 100% rename from test/test-suite/groups/function-number/case009.json rename to __tests__/test-suite/groups/function-number/case009.json diff --git a/test/test-suite/groups/function-number/case010.json b/__tests__/test-suite/groups/function-number/case010.json similarity index 100% rename from test/test-suite/groups/function-number/case010.json rename to __tests__/test-suite/groups/function-number/case010.json diff --git a/test/test-suite/groups/function-number/case011.json b/__tests__/test-suite/groups/function-number/case011.json similarity index 100% rename from test/test-suite/groups/function-number/case011.json rename to __tests__/test-suite/groups/function-number/case011.json diff --git a/test/test-suite/groups/function-number/case012.json b/__tests__/test-suite/groups/function-number/case012.json similarity index 100% rename from test/test-suite/groups/function-number/case012.json rename to __tests__/test-suite/groups/function-number/case012.json diff --git a/test/test-suite/groups/function-number/case013.json b/__tests__/test-suite/groups/function-number/case013.json similarity index 100% rename from test/test-suite/groups/function-number/case013.json rename to __tests__/test-suite/groups/function-number/case013.json diff --git a/test/test-suite/groups/function-number/case014.json b/__tests__/test-suite/groups/function-number/case014.json similarity index 100% rename from test/test-suite/groups/function-number/case014.json rename to __tests__/test-suite/groups/function-number/case014.json diff --git a/test/test-suite/groups/function-number/case015.json b/__tests__/test-suite/groups/function-number/case015.json similarity index 100% rename from test/test-suite/groups/function-number/case015.json rename to __tests__/test-suite/groups/function-number/case015.json diff --git a/test/test-suite/groups/function-number/case016.json b/__tests__/test-suite/groups/function-number/case016.json similarity index 100% rename from test/test-suite/groups/function-number/case016.json rename to __tests__/test-suite/groups/function-number/case016.json diff --git a/test/test-suite/groups/function-number/case017.json b/__tests__/test-suite/groups/function-number/case017.json similarity index 100% rename from test/test-suite/groups/function-number/case017.json rename to __tests__/test-suite/groups/function-number/case017.json diff --git a/test/test-suite/groups/function-number/case018.json b/__tests__/test-suite/groups/function-number/case018.json similarity index 100% rename from test/test-suite/groups/function-number/case018.json rename to __tests__/test-suite/groups/function-number/case018.json diff --git a/test/test-suite/groups/function-number/case019.json b/__tests__/test-suite/groups/function-number/case019.json similarity index 100% rename from test/test-suite/groups/function-number/case019.json rename to __tests__/test-suite/groups/function-number/case019.json diff --git a/test/test-suite/groups/function-number/case020.json b/__tests__/test-suite/groups/function-number/case020.json similarity index 100% rename from test/test-suite/groups/function-number/case020.json rename to __tests__/test-suite/groups/function-number/case020.json diff --git a/test/test-suite/groups/function-number/case021.json b/__tests__/test-suite/groups/function-number/case021.json similarity index 100% rename from test/test-suite/groups/function-number/case021.json rename to __tests__/test-suite/groups/function-number/case021.json diff --git a/test/test-suite/groups/function-number/case022.json b/__tests__/test-suite/groups/function-number/case022.json similarity index 100% rename from test/test-suite/groups/function-number/case022.json rename to __tests__/test-suite/groups/function-number/case022.json diff --git a/test/test-suite/groups/function-number/case023.json b/__tests__/test-suite/groups/function-number/case023.json similarity index 100% rename from test/test-suite/groups/function-number/case023.json rename to __tests__/test-suite/groups/function-number/case023.json diff --git a/test/test-suite/groups/function-number/case024.json b/__tests__/test-suite/groups/function-number/case024.json similarity index 100% rename from test/test-suite/groups/function-number/case024.json rename to __tests__/test-suite/groups/function-number/case024.json diff --git a/test/test-suite/groups/function-number/case025.json b/__tests__/test-suite/groups/function-number/case025.json similarity index 100% rename from test/test-suite/groups/function-number/case025.json rename to __tests__/test-suite/groups/function-number/case025.json diff --git a/test/test-suite/groups/function-number/case026.json b/__tests__/test-suite/groups/function-number/case026.json similarity index 100% rename from test/test-suite/groups/function-number/case026.json rename to __tests__/test-suite/groups/function-number/case026.json diff --git a/test/test-suite/groups/function-pad/case000.json b/__tests__/test-suite/groups/function-pad/case000.json similarity index 100% rename from test/test-suite/groups/function-pad/case000.json rename to __tests__/test-suite/groups/function-pad/case000.json diff --git a/test/test-suite/groups/function-pad/case001.json b/__tests__/test-suite/groups/function-pad/case001.json similarity index 100% rename from test/test-suite/groups/function-pad/case001.json rename to __tests__/test-suite/groups/function-pad/case001.json diff --git a/test/test-suite/groups/function-pad/case002.json b/__tests__/test-suite/groups/function-pad/case002.json similarity index 100% rename from test/test-suite/groups/function-pad/case002.json rename to __tests__/test-suite/groups/function-pad/case002.json diff --git a/test/test-suite/groups/function-pad/case003.json b/__tests__/test-suite/groups/function-pad/case003.json similarity index 100% rename from test/test-suite/groups/function-pad/case003.json rename to __tests__/test-suite/groups/function-pad/case003.json diff --git a/test/test-suite/groups/function-pad/case004.json b/__tests__/test-suite/groups/function-pad/case004.json similarity index 100% rename from test/test-suite/groups/function-pad/case004.json rename to __tests__/test-suite/groups/function-pad/case004.json diff --git a/test/test-suite/groups/function-pad/case005.json b/__tests__/test-suite/groups/function-pad/case005.json similarity index 100% rename from test/test-suite/groups/function-pad/case005.json rename to __tests__/test-suite/groups/function-pad/case005.json diff --git a/test/test-suite/groups/function-pad/case006.json b/__tests__/test-suite/groups/function-pad/case006.json similarity index 100% rename from test/test-suite/groups/function-pad/case006.json rename to __tests__/test-suite/groups/function-pad/case006.json diff --git a/test/test-suite/groups/function-power/case000.json b/__tests__/test-suite/groups/function-power/case000.json similarity index 100% rename from test/test-suite/groups/function-power/case000.json rename to __tests__/test-suite/groups/function-power/case000.json diff --git a/test/test-suite/groups/function-power/case001.json b/__tests__/test-suite/groups/function-power/case001.json similarity index 100% rename from test/test-suite/groups/function-power/case001.json rename to __tests__/test-suite/groups/function-power/case001.json diff --git a/test/test-suite/groups/function-power/case002.json b/__tests__/test-suite/groups/function-power/case002.json similarity index 100% rename from test/test-suite/groups/function-power/case002.json rename to __tests__/test-suite/groups/function-power/case002.json diff --git a/test/test-suite/groups/function-power/case003.json b/__tests__/test-suite/groups/function-power/case003.json similarity index 100% rename from test/test-suite/groups/function-power/case003.json rename to __tests__/test-suite/groups/function-power/case003.json diff --git a/test/test-suite/groups/function-power/case004.json b/__tests__/test-suite/groups/function-power/case004.json similarity index 100% rename from test/test-suite/groups/function-power/case004.json rename to __tests__/test-suite/groups/function-power/case004.json diff --git a/test/test-suite/groups/function-power/case005.json b/__tests__/test-suite/groups/function-power/case005.json similarity index 100% rename from test/test-suite/groups/function-power/case005.json rename to __tests__/test-suite/groups/function-power/case005.json diff --git a/test/test-suite/groups/function-power/case006.json b/__tests__/test-suite/groups/function-power/case006.json similarity index 100% rename from test/test-suite/groups/function-power/case006.json rename to __tests__/test-suite/groups/function-power/case006.json diff --git a/test/test-suite/groups/function-replace/case000.json b/__tests__/test-suite/groups/function-replace/case000.json similarity index 100% rename from test/test-suite/groups/function-replace/case000.json rename to __tests__/test-suite/groups/function-replace/case000.json diff --git a/test/test-suite/groups/function-replace/case001.json b/__tests__/test-suite/groups/function-replace/case001.json similarity index 100% rename from test/test-suite/groups/function-replace/case001.json rename to __tests__/test-suite/groups/function-replace/case001.json diff --git a/test/test-suite/groups/function-replace/case002.json b/__tests__/test-suite/groups/function-replace/case002.json similarity index 100% rename from test/test-suite/groups/function-replace/case002.json rename to __tests__/test-suite/groups/function-replace/case002.json diff --git a/test/test-suite/groups/function-replace/case003.json b/__tests__/test-suite/groups/function-replace/case003.json similarity index 100% rename from test/test-suite/groups/function-replace/case003.json rename to __tests__/test-suite/groups/function-replace/case003.json diff --git a/test/test-suite/groups/function-replace/case004.json b/__tests__/test-suite/groups/function-replace/case004.json similarity index 100% rename from test/test-suite/groups/function-replace/case004.json rename to __tests__/test-suite/groups/function-replace/case004.json diff --git a/test/test-suite/groups/function-replace/case005.json b/__tests__/test-suite/groups/function-replace/case005.json similarity index 100% rename from test/test-suite/groups/function-replace/case005.json rename to __tests__/test-suite/groups/function-replace/case005.json diff --git a/test/test-suite/groups/function-replace/case006.json b/__tests__/test-suite/groups/function-replace/case006.json similarity index 100% rename from test/test-suite/groups/function-replace/case006.json rename to __tests__/test-suite/groups/function-replace/case006.json diff --git a/test/test-suite/groups/function-replace/case007.json b/__tests__/test-suite/groups/function-replace/case007.json similarity index 100% rename from test/test-suite/groups/function-replace/case007.json rename to __tests__/test-suite/groups/function-replace/case007.json diff --git a/test/test-suite/groups/function-replace/case008.json b/__tests__/test-suite/groups/function-replace/case008.json similarity index 100% rename from test/test-suite/groups/function-replace/case008.json rename to __tests__/test-suite/groups/function-replace/case008.json diff --git a/test/test-suite/groups/function-replace/case009.json b/__tests__/test-suite/groups/function-replace/case009.json similarity index 100% rename from test/test-suite/groups/function-replace/case009.json rename to __tests__/test-suite/groups/function-replace/case009.json diff --git a/test/test-suite/groups/function-replace/case010.json b/__tests__/test-suite/groups/function-replace/case010.json similarity index 100% rename from test/test-suite/groups/function-replace/case010.json rename to __tests__/test-suite/groups/function-replace/case010.json diff --git a/test/test-suite/groups/function-replace/case011.json b/__tests__/test-suite/groups/function-replace/case011.json similarity index 100% rename from test/test-suite/groups/function-replace/case011.json rename to __tests__/test-suite/groups/function-replace/case011.json diff --git a/test/test-suite/groups/function-round/case000.json b/__tests__/test-suite/groups/function-round/case000.json similarity index 100% rename from test/test-suite/groups/function-round/case000.json rename to __tests__/test-suite/groups/function-round/case000.json diff --git a/test/test-suite/groups/function-round/case001.json b/__tests__/test-suite/groups/function-round/case001.json similarity index 100% rename from test/test-suite/groups/function-round/case001.json rename to __tests__/test-suite/groups/function-round/case001.json diff --git a/test/test-suite/groups/function-round/case002.json b/__tests__/test-suite/groups/function-round/case002.json similarity index 100% rename from test/test-suite/groups/function-round/case002.json rename to __tests__/test-suite/groups/function-round/case002.json diff --git a/test/test-suite/groups/function-round/case003.json b/__tests__/test-suite/groups/function-round/case003.json similarity index 100% rename from test/test-suite/groups/function-round/case003.json rename to __tests__/test-suite/groups/function-round/case003.json diff --git a/test/test-suite/groups/function-round/case004.json b/__tests__/test-suite/groups/function-round/case004.json similarity index 100% rename from test/test-suite/groups/function-round/case004.json rename to __tests__/test-suite/groups/function-round/case004.json diff --git a/test/test-suite/groups/function-round/case005.json b/__tests__/test-suite/groups/function-round/case005.json similarity index 100% rename from test/test-suite/groups/function-round/case005.json rename to __tests__/test-suite/groups/function-round/case005.json diff --git a/test/test-suite/groups/function-round/case006.json b/__tests__/test-suite/groups/function-round/case006.json similarity index 100% rename from test/test-suite/groups/function-round/case006.json rename to __tests__/test-suite/groups/function-round/case006.json diff --git a/test/test-suite/groups/function-round/case007.json b/__tests__/test-suite/groups/function-round/case007.json similarity index 100% rename from test/test-suite/groups/function-round/case007.json rename to __tests__/test-suite/groups/function-round/case007.json diff --git a/test/test-suite/groups/function-round/case008.json b/__tests__/test-suite/groups/function-round/case008.json similarity index 100% rename from test/test-suite/groups/function-round/case008.json rename to __tests__/test-suite/groups/function-round/case008.json diff --git a/test/test-suite/groups/function-round/case009.json b/__tests__/test-suite/groups/function-round/case009.json similarity index 100% rename from test/test-suite/groups/function-round/case009.json rename to __tests__/test-suite/groups/function-round/case009.json diff --git a/test/test-suite/groups/function-round/case010.json b/__tests__/test-suite/groups/function-round/case010.json similarity index 100% rename from test/test-suite/groups/function-round/case010.json rename to __tests__/test-suite/groups/function-round/case010.json diff --git a/test/test-suite/groups/function-round/case011.json b/__tests__/test-suite/groups/function-round/case011.json similarity index 100% rename from test/test-suite/groups/function-round/case011.json rename to __tests__/test-suite/groups/function-round/case011.json diff --git a/test/test-suite/groups/function-round/case012.json b/__tests__/test-suite/groups/function-round/case012.json similarity index 100% rename from test/test-suite/groups/function-round/case012.json rename to __tests__/test-suite/groups/function-round/case012.json diff --git a/test/test-suite/groups/function-round/case013.json b/__tests__/test-suite/groups/function-round/case013.json similarity index 100% rename from test/test-suite/groups/function-round/case013.json rename to __tests__/test-suite/groups/function-round/case013.json diff --git a/test/test-suite/groups/function-round/case014.json b/__tests__/test-suite/groups/function-round/case014.json similarity index 100% rename from test/test-suite/groups/function-round/case014.json rename to __tests__/test-suite/groups/function-round/case014.json diff --git a/test/test-suite/groups/function-round/case015.json b/__tests__/test-suite/groups/function-round/case015.json similarity index 100% rename from test/test-suite/groups/function-round/case015.json rename to __tests__/test-suite/groups/function-round/case015.json diff --git a/test/test-suite/groups/function-round/case016.json b/__tests__/test-suite/groups/function-round/case016.json similarity index 100% rename from test/test-suite/groups/function-round/case016.json rename to __tests__/test-suite/groups/function-round/case016.json diff --git a/test/test-suite/groups/function-round/case017.json b/__tests__/test-suite/groups/function-round/case017.json similarity index 100% rename from test/test-suite/groups/function-round/case017.json rename to __tests__/test-suite/groups/function-round/case017.json diff --git a/test/test-suite/groups/function-shuffle/case000.json b/__tests__/test-suite/groups/function-shuffle/case000.json similarity index 100% rename from test/test-suite/groups/function-shuffle/case000.json rename to __tests__/test-suite/groups/function-shuffle/case000.json diff --git a/test/test-suite/groups/function-shuffle/case001.json b/__tests__/test-suite/groups/function-shuffle/case001.json similarity index 100% rename from test/test-suite/groups/function-shuffle/case001.json rename to __tests__/test-suite/groups/function-shuffle/case001.json diff --git a/test/test-suite/groups/function-shuffle/case002.json b/__tests__/test-suite/groups/function-shuffle/case002.json similarity index 100% rename from test/test-suite/groups/function-shuffle/case002.json rename to __tests__/test-suite/groups/function-shuffle/case002.json diff --git a/test/test-suite/groups/function-shuffle/case003.json b/__tests__/test-suite/groups/function-shuffle/case003.json similarity index 100% rename from test/test-suite/groups/function-shuffle/case003.json rename to __tests__/test-suite/groups/function-shuffle/case003.json diff --git a/test/test-suite/groups/function-sift/case000.json b/__tests__/test-suite/groups/function-sift/case000.json similarity index 100% rename from test/test-suite/groups/function-sift/case000.json rename to __tests__/test-suite/groups/function-sift/case000.json diff --git a/test/test-suite/groups/function-sift/case001.json b/__tests__/test-suite/groups/function-sift/case001.json similarity index 100% rename from test/test-suite/groups/function-sift/case001.json rename to __tests__/test-suite/groups/function-sift/case001.json diff --git a/test/test-suite/groups/function-sift/case002.json b/__tests__/test-suite/groups/function-sift/case002.json similarity index 100% rename from test/test-suite/groups/function-sift/case002.json rename to __tests__/test-suite/groups/function-sift/case002.json diff --git a/test/test-suite/groups/function-sift/case003.json b/__tests__/test-suite/groups/function-sift/case003.json similarity index 100% rename from test/test-suite/groups/function-sift/case003.json rename to __tests__/test-suite/groups/function-sift/case003.json diff --git a/test/test-suite/groups/function-sift/case004.json b/__tests__/test-suite/groups/function-sift/case004.json similarity index 100% rename from test/test-suite/groups/function-sift/case004.json rename to __tests__/test-suite/groups/function-sift/case004.json diff --git a/test/test-suite/groups/function-sift/case005.json b/__tests__/test-suite/groups/function-sift/case005.json similarity index 100% rename from test/test-suite/groups/function-sift/case005.json rename to __tests__/test-suite/groups/function-sift/case005.json diff --git a/test/test-suite/groups/function-sift/case006.json b/__tests__/test-suite/groups/function-sift/case006.json similarity index 100% rename from test/test-suite/groups/function-sift/case006.json rename to __tests__/test-suite/groups/function-sift/case006.json diff --git a/test/test-suite/groups/function-signatures/case000.json b/__tests__/test-suite/groups/function-signatures/case000.json similarity index 100% rename from test/test-suite/groups/function-signatures/case000.json rename to __tests__/test-suite/groups/function-signatures/case000.json diff --git a/test/test-suite/groups/function-signatures/case001.json b/__tests__/test-suite/groups/function-signatures/case001.json similarity index 100% rename from test/test-suite/groups/function-signatures/case001.json rename to __tests__/test-suite/groups/function-signatures/case001.json diff --git a/test/test-suite/groups/function-signatures/case002.json b/__tests__/test-suite/groups/function-signatures/case002.json similarity index 100% rename from test/test-suite/groups/function-signatures/case002.json rename to __tests__/test-suite/groups/function-signatures/case002.json diff --git a/test/test-suite/groups/function-signatures/case003.json b/__tests__/test-suite/groups/function-signatures/case003.json similarity index 100% rename from test/test-suite/groups/function-signatures/case003.json rename to __tests__/test-suite/groups/function-signatures/case003.json diff --git a/test/test-suite/groups/function-signatures/case004.json b/__tests__/test-suite/groups/function-signatures/case004.json similarity index 100% rename from test/test-suite/groups/function-signatures/case004.json rename to __tests__/test-suite/groups/function-signatures/case004.json diff --git a/test/test-suite/groups/function-signatures/case005.json b/__tests__/test-suite/groups/function-signatures/case005.json similarity index 100% rename from test/test-suite/groups/function-signatures/case005.json rename to __tests__/test-suite/groups/function-signatures/case005.json diff --git a/test/test-suite/groups/function-signatures/case006.json b/__tests__/test-suite/groups/function-signatures/case006.json similarity index 100% rename from test/test-suite/groups/function-signatures/case006.json rename to __tests__/test-suite/groups/function-signatures/case006.json diff --git a/test/test-suite/groups/function-signatures/case007.json b/__tests__/test-suite/groups/function-signatures/case007.json similarity index 100% rename from test/test-suite/groups/function-signatures/case007.json rename to __tests__/test-suite/groups/function-signatures/case007.json diff --git a/test/test-suite/groups/function-signatures/case008.json b/__tests__/test-suite/groups/function-signatures/case008.json similarity index 100% rename from test/test-suite/groups/function-signatures/case008.json rename to __tests__/test-suite/groups/function-signatures/case008.json diff --git a/test/test-suite/groups/function-signatures/case009.json b/__tests__/test-suite/groups/function-signatures/case009.json similarity index 100% rename from test/test-suite/groups/function-signatures/case009.json rename to __tests__/test-suite/groups/function-signatures/case009.json diff --git a/test/test-suite/groups/function-signatures/case010.json b/__tests__/test-suite/groups/function-signatures/case010.json similarity index 100% rename from test/test-suite/groups/function-signatures/case010.json rename to __tests__/test-suite/groups/function-signatures/case010.json diff --git a/test/test-suite/groups/function-signatures/case011.json b/__tests__/test-suite/groups/function-signatures/case011.json similarity index 100% rename from test/test-suite/groups/function-signatures/case011.json rename to __tests__/test-suite/groups/function-signatures/case011.json diff --git a/test/test-suite/groups/function-signatures/case012.json b/__tests__/test-suite/groups/function-signatures/case012.json similarity index 100% rename from test/test-suite/groups/function-signatures/case012.json rename to __tests__/test-suite/groups/function-signatures/case012.json diff --git a/test/test-suite/groups/function-signatures/case013.json b/__tests__/test-suite/groups/function-signatures/case013.json similarity index 100% rename from test/test-suite/groups/function-signatures/case013.json rename to __tests__/test-suite/groups/function-signatures/case013.json diff --git a/test/test-suite/groups/function-signatures/case014.json b/__tests__/test-suite/groups/function-signatures/case014.json similarity index 100% rename from test/test-suite/groups/function-signatures/case014.json rename to __tests__/test-suite/groups/function-signatures/case014.json diff --git a/test/test-suite/groups/function-signatures/case015.json b/__tests__/test-suite/groups/function-signatures/case015.json similarity index 100% rename from test/test-suite/groups/function-signatures/case015.json rename to __tests__/test-suite/groups/function-signatures/case015.json diff --git a/test/test-suite/groups/function-signatures/case016.json b/__tests__/test-suite/groups/function-signatures/case016.json similarity index 100% rename from test/test-suite/groups/function-signatures/case016.json rename to __tests__/test-suite/groups/function-signatures/case016.json diff --git a/test/test-suite/groups/function-signatures/case017.json b/__tests__/test-suite/groups/function-signatures/case017.json similarity index 100% rename from test/test-suite/groups/function-signatures/case017.json rename to __tests__/test-suite/groups/function-signatures/case017.json diff --git a/test/test-suite/groups/function-signatures/case018.json b/__tests__/test-suite/groups/function-signatures/case018.json similarity index 100% rename from test/test-suite/groups/function-signatures/case018.json rename to __tests__/test-suite/groups/function-signatures/case018.json diff --git a/test/test-suite/groups/function-signatures/case019.json b/__tests__/test-suite/groups/function-signatures/case019.json similarity index 100% rename from test/test-suite/groups/function-signatures/case019.json rename to __tests__/test-suite/groups/function-signatures/case019.json diff --git a/test/test-suite/groups/function-signatures/case020.json b/__tests__/test-suite/groups/function-signatures/case020.json similarity index 100% rename from test/test-suite/groups/function-signatures/case020.json rename to __tests__/test-suite/groups/function-signatures/case020.json diff --git a/test/test-suite/groups/function-signatures/case021.json b/__tests__/test-suite/groups/function-signatures/case021.json similarity index 100% rename from test/test-suite/groups/function-signatures/case021.json rename to __tests__/test-suite/groups/function-signatures/case021.json diff --git a/test/test-suite/groups/function-signatures/case022.json b/__tests__/test-suite/groups/function-signatures/case022.json similarity index 100% rename from test/test-suite/groups/function-signatures/case022.json rename to __tests__/test-suite/groups/function-signatures/case022.json diff --git a/test/test-suite/groups/function-signatures/case023.json b/__tests__/test-suite/groups/function-signatures/case023.json similarity index 100% rename from test/test-suite/groups/function-signatures/case023.json rename to __tests__/test-suite/groups/function-signatures/case023.json diff --git a/test/test-suite/groups/function-signatures/case024.json b/__tests__/test-suite/groups/function-signatures/case024.json similarity index 100% rename from test/test-suite/groups/function-signatures/case024.json rename to __tests__/test-suite/groups/function-signatures/case024.json diff --git a/test/test-suite/groups/function-signatures/case025.json b/__tests__/test-suite/groups/function-signatures/case025.json similarity index 100% rename from test/test-suite/groups/function-signatures/case025.json rename to __tests__/test-suite/groups/function-signatures/case025.json diff --git a/test/test-suite/groups/function-signatures/case026.json b/__tests__/test-suite/groups/function-signatures/case026.json similarity index 100% rename from test/test-suite/groups/function-signatures/case026.json rename to __tests__/test-suite/groups/function-signatures/case026.json diff --git a/test/test-suite/groups/function-signatures/case027.json b/__tests__/test-suite/groups/function-signatures/case027.json similarity index 100% rename from test/test-suite/groups/function-signatures/case027.json rename to __tests__/test-suite/groups/function-signatures/case027.json diff --git a/test/test-suite/groups/function-signatures/case028.json b/__tests__/test-suite/groups/function-signatures/case028.json similarity index 100% rename from test/test-suite/groups/function-signatures/case028.json rename to __tests__/test-suite/groups/function-signatures/case028.json diff --git a/test/test-suite/groups/function-signatures/case029.json b/__tests__/test-suite/groups/function-signatures/case029.json similarity index 100% rename from test/test-suite/groups/function-signatures/case029.json rename to __tests__/test-suite/groups/function-signatures/case029.json diff --git a/test/test-suite/groups/function-signatures/case030.json b/__tests__/test-suite/groups/function-signatures/case030.json similarity index 100% rename from test/test-suite/groups/function-signatures/case030.json rename to __tests__/test-suite/groups/function-signatures/case030.json diff --git a/test/test-suite/groups/function-signatures/case031.json b/__tests__/test-suite/groups/function-signatures/case031.json similarity index 100% rename from test/test-suite/groups/function-signatures/case031.json rename to __tests__/test-suite/groups/function-signatures/case031.json diff --git a/test/test-suite/groups/function-signatures/case032.json b/__tests__/test-suite/groups/function-signatures/case032.json similarity index 100% rename from test/test-suite/groups/function-signatures/case032.json rename to __tests__/test-suite/groups/function-signatures/case032.json diff --git a/test/test-suite/groups/function-signatures/case033.json b/__tests__/test-suite/groups/function-signatures/case033.json similarity index 100% rename from test/test-suite/groups/function-signatures/case033.json rename to __tests__/test-suite/groups/function-signatures/case033.json diff --git a/test/test-suite/groups/function-signatures/case034.json b/__tests__/test-suite/groups/function-signatures/case034.json similarity index 100% rename from test/test-suite/groups/function-signatures/case034.json rename to __tests__/test-suite/groups/function-signatures/case034.json diff --git a/test/test-suite/groups/function-sort/case000.json b/__tests__/test-suite/groups/function-sort/case000.json similarity index 100% rename from test/test-suite/groups/function-sort/case000.json rename to __tests__/test-suite/groups/function-sort/case000.json diff --git a/test/test-suite/groups/function-sort/case001.json b/__tests__/test-suite/groups/function-sort/case001.json similarity index 100% rename from test/test-suite/groups/function-sort/case001.json rename to __tests__/test-suite/groups/function-sort/case001.json diff --git a/test/test-suite/groups/function-sort/case002.json b/__tests__/test-suite/groups/function-sort/case002.json similarity index 100% rename from test/test-suite/groups/function-sort/case002.json rename to __tests__/test-suite/groups/function-sort/case002.json diff --git a/test/test-suite/groups/function-sort/case003.json b/__tests__/test-suite/groups/function-sort/case003.json similarity index 100% rename from test/test-suite/groups/function-sort/case003.json rename to __tests__/test-suite/groups/function-sort/case003.json diff --git a/test/test-suite/groups/function-sort/case004.json b/__tests__/test-suite/groups/function-sort/case004.json similarity index 100% rename from test/test-suite/groups/function-sort/case004.json rename to __tests__/test-suite/groups/function-sort/case004.json diff --git a/test/test-suite/groups/function-sort/case005.json b/__tests__/test-suite/groups/function-sort/case005.json similarity index 100% rename from test/test-suite/groups/function-sort/case005.json rename to __tests__/test-suite/groups/function-sort/case005.json diff --git a/test/test-suite/groups/function-sort/case006.json b/__tests__/test-suite/groups/function-sort/case006.json similarity index 100% rename from test/test-suite/groups/function-sort/case006.json rename to __tests__/test-suite/groups/function-sort/case006.json diff --git a/test/test-suite/groups/function-sort/case007.json b/__tests__/test-suite/groups/function-sort/case007.json similarity index 100% rename from test/test-suite/groups/function-sort/case007.json rename to __tests__/test-suite/groups/function-sort/case007.json diff --git a/test/test-suite/groups/function-sort/case008.json b/__tests__/test-suite/groups/function-sort/case008.json similarity index 100% rename from test/test-suite/groups/function-sort/case008.json rename to __tests__/test-suite/groups/function-sort/case008.json diff --git a/test/test-suite/groups/function-sort/case009.json b/__tests__/test-suite/groups/function-sort/case009.json similarity index 100% rename from test/test-suite/groups/function-sort/case009.json rename to __tests__/test-suite/groups/function-sort/case009.json diff --git a/test/test-suite/groups/function-sort/case010.json b/__tests__/test-suite/groups/function-sort/case010.json similarity index 100% rename from test/test-suite/groups/function-sort/case010.json rename to __tests__/test-suite/groups/function-sort/case010.json diff --git a/test/test-suite/groups/function-split/case000.json b/__tests__/test-suite/groups/function-split/case000.json similarity index 100% rename from test/test-suite/groups/function-split/case000.json rename to __tests__/test-suite/groups/function-split/case000.json diff --git a/test/test-suite/groups/function-split/case001.json b/__tests__/test-suite/groups/function-split/case001.json similarity index 100% rename from test/test-suite/groups/function-split/case001.json rename to __tests__/test-suite/groups/function-split/case001.json diff --git a/test/test-suite/groups/function-split/case002.json b/__tests__/test-suite/groups/function-split/case002.json similarity index 100% rename from test/test-suite/groups/function-split/case002.json rename to __tests__/test-suite/groups/function-split/case002.json diff --git a/test/test-suite/groups/function-split/case003.json b/__tests__/test-suite/groups/function-split/case003.json similarity index 100% rename from test/test-suite/groups/function-split/case003.json rename to __tests__/test-suite/groups/function-split/case003.json diff --git a/test/test-suite/groups/function-split/case004.json b/__tests__/test-suite/groups/function-split/case004.json similarity index 100% rename from test/test-suite/groups/function-split/case004.json rename to __tests__/test-suite/groups/function-split/case004.json diff --git a/test/test-suite/groups/function-split/case005.json b/__tests__/test-suite/groups/function-split/case005.json similarity index 100% rename from test/test-suite/groups/function-split/case005.json rename to __tests__/test-suite/groups/function-split/case005.json diff --git a/test/test-suite/groups/function-split/case006.json b/__tests__/test-suite/groups/function-split/case006.json similarity index 100% rename from test/test-suite/groups/function-split/case006.json rename to __tests__/test-suite/groups/function-split/case006.json diff --git a/test/test-suite/groups/function-split/case007.json b/__tests__/test-suite/groups/function-split/case007.json similarity index 100% rename from test/test-suite/groups/function-split/case007.json rename to __tests__/test-suite/groups/function-split/case007.json diff --git a/test/test-suite/groups/function-split/case008.json b/__tests__/test-suite/groups/function-split/case008.json similarity index 100% rename from test/test-suite/groups/function-split/case008.json rename to __tests__/test-suite/groups/function-split/case008.json diff --git a/test/test-suite/groups/function-split/case009.json b/__tests__/test-suite/groups/function-split/case009.json similarity index 100% rename from test/test-suite/groups/function-split/case009.json rename to __tests__/test-suite/groups/function-split/case009.json diff --git a/test/test-suite/groups/function-split/case010.json b/__tests__/test-suite/groups/function-split/case010.json similarity index 100% rename from test/test-suite/groups/function-split/case010.json rename to __tests__/test-suite/groups/function-split/case010.json diff --git a/test/test-suite/groups/function-split/case011.json b/__tests__/test-suite/groups/function-split/case011.json similarity index 100% rename from test/test-suite/groups/function-split/case011.json rename to __tests__/test-suite/groups/function-split/case011.json diff --git a/test/test-suite/groups/function-split/case012.json b/__tests__/test-suite/groups/function-split/case012.json similarity index 100% rename from test/test-suite/groups/function-split/case012.json rename to __tests__/test-suite/groups/function-split/case012.json diff --git a/test/test-suite/groups/function-split/case013.json b/__tests__/test-suite/groups/function-split/case013.json similarity index 100% rename from test/test-suite/groups/function-split/case013.json rename to __tests__/test-suite/groups/function-split/case013.json diff --git a/test/test-suite/groups/function-split/case014.json b/__tests__/test-suite/groups/function-split/case014.json similarity index 100% rename from test/test-suite/groups/function-split/case014.json rename to __tests__/test-suite/groups/function-split/case014.json diff --git a/test/test-suite/groups/function-split/case015.json b/__tests__/test-suite/groups/function-split/case015.json similarity index 100% rename from test/test-suite/groups/function-split/case015.json rename to __tests__/test-suite/groups/function-split/case015.json diff --git a/test/test-suite/groups/function-split/case016.json b/__tests__/test-suite/groups/function-split/case016.json similarity index 100% rename from test/test-suite/groups/function-split/case016.json rename to __tests__/test-suite/groups/function-split/case016.json diff --git a/test/test-suite/groups/function-split/case017.json b/__tests__/test-suite/groups/function-split/case017.json similarity index 100% rename from test/test-suite/groups/function-split/case017.json rename to __tests__/test-suite/groups/function-split/case017.json diff --git a/test/test-suite/groups/function-spread/case000.json b/__tests__/test-suite/groups/function-spread/case000.json similarity index 100% rename from test/test-suite/groups/function-spread/case000.json rename to __tests__/test-suite/groups/function-spread/case000.json diff --git a/test/test-suite/groups/function-spread/case001.json b/__tests__/test-suite/groups/function-spread/case001.json similarity index 100% rename from test/test-suite/groups/function-spread/case001.json rename to __tests__/test-suite/groups/function-spread/case001.json diff --git a/test/test-suite/groups/function-spread/case002.json b/__tests__/test-suite/groups/function-spread/case002.json similarity index 100% rename from test/test-suite/groups/function-spread/case002.json rename to __tests__/test-suite/groups/function-spread/case002.json diff --git a/test/test-suite/groups/function-spread/case003.json b/__tests__/test-suite/groups/function-spread/case003.json similarity index 100% rename from test/test-suite/groups/function-spread/case003.json rename to __tests__/test-suite/groups/function-spread/case003.json diff --git a/test/test-suite/groups/function-sqrt/case000.json b/__tests__/test-suite/groups/function-sqrt/case000.json similarity index 100% rename from test/test-suite/groups/function-sqrt/case000.json rename to __tests__/test-suite/groups/function-sqrt/case000.json diff --git a/test/test-suite/groups/function-sqrt/case001.json b/__tests__/test-suite/groups/function-sqrt/case001.json similarity index 100% rename from test/test-suite/groups/function-sqrt/case001.json rename to __tests__/test-suite/groups/function-sqrt/case001.json diff --git a/test/test-suite/groups/function-sqrt/case002.json b/__tests__/test-suite/groups/function-sqrt/case002.json similarity index 100% rename from test/test-suite/groups/function-sqrt/case002.json rename to __tests__/test-suite/groups/function-sqrt/case002.json diff --git a/test/test-suite/groups/function-sqrt/case003.json b/__tests__/test-suite/groups/function-sqrt/case003.json similarity index 100% rename from test/test-suite/groups/function-sqrt/case003.json rename to __tests__/test-suite/groups/function-sqrt/case003.json diff --git a/test/test-suite/groups/function-string/case000.json b/__tests__/test-suite/groups/function-string/case000.json similarity index 100% rename from test/test-suite/groups/function-string/case000.json rename to __tests__/test-suite/groups/function-string/case000.json diff --git a/test/test-suite/groups/function-string/case001.json b/__tests__/test-suite/groups/function-string/case001.json similarity index 100% rename from test/test-suite/groups/function-string/case001.json rename to __tests__/test-suite/groups/function-string/case001.json diff --git a/test/test-suite/groups/function-string/case002.json b/__tests__/test-suite/groups/function-string/case002.json similarity index 100% rename from test/test-suite/groups/function-string/case002.json rename to __tests__/test-suite/groups/function-string/case002.json diff --git a/test/test-suite/groups/function-string/case003.json b/__tests__/test-suite/groups/function-string/case003.json similarity index 100% rename from test/test-suite/groups/function-string/case003.json rename to __tests__/test-suite/groups/function-string/case003.json diff --git a/test/test-suite/groups/function-string/case004.json b/__tests__/test-suite/groups/function-string/case004.json similarity index 100% rename from test/test-suite/groups/function-string/case004.json rename to __tests__/test-suite/groups/function-string/case004.json diff --git a/test/test-suite/groups/function-string/case005.json b/__tests__/test-suite/groups/function-string/case005.json similarity index 100% rename from test/test-suite/groups/function-string/case005.json rename to __tests__/test-suite/groups/function-string/case005.json diff --git a/test/test-suite/groups/function-string/case006.json b/__tests__/test-suite/groups/function-string/case006.json similarity index 100% rename from test/test-suite/groups/function-string/case006.json rename to __tests__/test-suite/groups/function-string/case006.json diff --git a/test/test-suite/groups/function-string/case007.json b/__tests__/test-suite/groups/function-string/case007.json similarity index 100% rename from test/test-suite/groups/function-string/case007.json rename to __tests__/test-suite/groups/function-string/case007.json diff --git a/test/test-suite/groups/function-string/case008.json b/__tests__/test-suite/groups/function-string/case008.json similarity index 100% rename from test/test-suite/groups/function-string/case008.json rename to __tests__/test-suite/groups/function-string/case008.json diff --git a/test/test-suite/groups/function-string/case009.json b/__tests__/test-suite/groups/function-string/case009.json similarity index 100% rename from test/test-suite/groups/function-string/case009.json rename to __tests__/test-suite/groups/function-string/case009.json diff --git a/test/test-suite/groups/function-string/case010.json b/__tests__/test-suite/groups/function-string/case010.json similarity index 100% rename from test/test-suite/groups/function-string/case010.json rename to __tests__/test-suite/groups/function-string/case010.json diff --git a/test/test-suite/groups/function-string/case011.json b/__tests__/test-suite/groups/function-string/case011.json similarity index 100% rename from test/test-suite/groups/function-string/case011.json rename to __tests__/test-suite/groups/function-string/case011.json diff --git a/test/test-suite/groups/function-string/case012.json b/__tests__/test-suite/groups/function-string/case012.json similarity index 100% rename from test/test-suite/groups/function-string/case012.json rename to __tests__/test-suite/groups/function-string/case012.json diff --git a/test/test-suite/groups/function-string/case013.json b/__tests__/test-suite/groups/function-string/case013.json similarity index 100% rename from test/test-suite/groups/function-string/case013.json rename to __tests__/test-suite/groups/function-string/case013.json diff --git a/test/test-suite/groups/function-string/case014.json b/__tests__/test-suite/groups/function-string/case014.json similarity index 100% rename from test/test-suite/groups/function-string/case014.json rename to __tests__/test-suite/groups/function-string/case014.json diff --git a/test/test-suite/groups/function-string/case015.json b/__tests__/test-suite/groups/function-string/case015.json similarity index 100% rename from test/test-suite/groups/function-string/case015.json rename to __tests__/test-suite/groups/function-string/case015.json diff --git a/test/test-suite/groups/function-string/case016.json b/__tests__/test-suite/groups/function-string/case016.json similarity index 100% rename from test/test-suite/groups/function-string/case016.json rename to __tests__/test-suite/groups/function-string/case016.json diff --git a/test/test-suite/groups/function-string/case017.json b/__tests__/test-suite/groups/function-string/case017.json similarity index 100% rename from test/test-suite/groups/function-string/case017.json rename to __tests__/test-suite/groups/function-string/case017.json diff --git a/test/test-suite/groups/function-string/case018.json b/__tests__/test-suite/groups/function-string/case018.json similarity index 100% rename from test/test-suite/groups/function-string/case018.json rename to __tests__/test-suite/groups/function-string/case018.json diff --git a/test/test-suite/groups/function-string/case019.json b/__tests__/test-suite/groups/function-string/case019.json similarity index 100% rename from test/test-suite/groups/function-string/case019.json rename to __tests__/test-suite/groups/function-string/case019.json diff --git a/test/test-suite/groups/function-string/case020.json b/__tests__/test-suite/groups/function-string/case020.json similarity index 100% rename from test/test-suite/groups/function-string/case020.json rename to __tests__/test-suite/groups/function-string/case020.json diff --git a/test/test-suite/groups/function-string/case021.json b/__tests__/test-suite/groups/function-string/case021.json similarity index 100% rename from test/test-suite/groups/function-string/case021.json rename to __tests__/test-suite/groups/function-string/case021.json diff --git a/test/test-suite/groups/function-string/case022.json b/__tests__/test-suite/groups/function-string/case022.json similarity index 100% rename from test/test-suite/groups/function-string/case022.json rename to __tests__/test-suite/groups/function-string/case022.json diff --git a/test/test-suite/groups/function-substring/case000.json b/__tests__/test-suite/groups/function-substring/case000.json similarity index 100% rename from test/test-suite/groups/function-substring/case000.json rename to __tests__/test-suite/groups/function-substring/case000.json diff --git a/test/test-suite/groups/function-substring/case001.json b/__tests__/test-suite/groups/function-substring/case001.json similarity index 100% rename from test/test-suite/groups/function-substring/case001.json rename to __tests__/test-suite/groups/function-substring/case001.json diff --git a/test/test-suite/groups/function-substring/case002.json b/__tests__/test-suite/groups/function-substring/case002.json similarity index 100% rename from test/test-suite/groups/function-substring/case002.json rename to __tests__/test-suite/groups/function-substring/case002.json diff --git a/test/test-suite/groups/function-substring/case003.json b/__tests__/test-suite/groups/function-substring/case003.json similarity index 100% rename from test/test-suite/groups/function-substring/case003.json rename to __tests__/test-suite/groups/function-substring/case003.json diff --git a/test/test-suite/groups/function-substringAfter/case000.json b/__tests__/test-suite/groups/function-substringAfter/case000.json similarity index 100% rename from test/test-suite/groups/function-substringAfter/case000.json rename to __tests__/test-suite/groups/function-substringAfter/case000.json diff --git a/test/test-suite/groups/function-substringAfter/case001.json b/__tests__/test-suite/groups/function-substringAfter/case001.json similarity index 100% rename from test/test-suite/groups/function-substringAfter/case001.json rename to __tests__/test-suite/groups/function-substringAfter/case001.json diff --git a/test/test-suite/groups/function-substringAfter/case002.json b/__tests__/test-suite/groups/function-substringAfter/case002.json similarity index 100% rename from test/test-suite/groups/function-substringAfter/case002.json rename to __tests__/test-suite/groups/function-substringAfter/case002.json diff --git a/test/test-suite/groups/function-substringAfter/case003.json b/__tests__/test-suite/groups/function-substringAfter/case003.json similarity index 100% rename from test/test-suite/groups/function-substringAfter/case003.json rename to __tests__/test-suite/groups/function-substringAfter/case003.json diff --git a/test/test-suite/groups/function-substringAfter/case004.json b/__tests__/test-suite/groups/function-substringAfter/case004.json similarity index 100% rename from test/test-suite/groups/function-substringAfter/case004.json rename to __tests__/test-suite/groups/function-substringAfter/case004.json diff --git a/test/test-suite/groups/function-substringBefore/case000.json b/__tests__/test-suite/groups/function-substringBefore/case000.json similarity index 100% rename from test/test-suite/groups/function-substringBefore/case000.json rename to __tests__/test-suite/groups/function-substringBefore/case000.json diff --git a/test/test-suite/groups/function-substringBefore/case001.json b/__tests__/test-suite/groups/function-substringBefore/case001.json similarity index 100% rename from test/test-suite/groups/function-substringBefore/case001.json rename to __tests__/test-suite/groups/function-substringBefore/case001.json diff --git a/test/test-suite/groups/function-substringBefore/case002.json b/__tests__/test-suite/groups/function-substringBefore/case002.json similarity index 100% rename from test/test-suite/groups/function-substringBefore/case002.json rename to __tests__/test-suite/groups/function-substringBefore/case002.json diff --git a/test/test-suite/groups/function-substringBefore/case003.json b/__tests__/test-suite/groups/function-substringBefore/case003.json similarity index 100% rename from test/test-suite/groups/function-substringBefore/case003.json rename to __tests__/test-suite/groups/function-substringBefore/case003.json diff --git a/test/test-suite/groups/function-substringBefore/case004.json b/__tests__/test-suite/groups/function-substringBefore/case004.json similarity index 100% rename from test/test-suite/groups/function-substringBefore/case004.json rename to __tests__/test-suite/groups/function-substringBefore/case004.json diff --git a/test/test-suite/groups/function-sum/case000.json b/__tests__/test-suite/groups/function-sum/case000.json similarity index 100% rename from test/test-suite/groups/function-sum/case000.json rename to __tests__/test-suite/groups/function-sum/case000.json diff --git a/test/test-suite/groups/function-sum/case001.json b/__tests__/test-suite/groups/function-sum/case001.json similarity index 100% rename from test/test-suite/groups/function-sum/case001.json rename to __tests__/test-suite/groups/function-sum/case001.json diff --git a/test/test-suite/groups/function-sum/case002.json b/__tests__/test-suite/groups/function-sum/case002.json similarity index 100% rename from test/test-suite/groups/function-sum/case002.json rename to __tests__/test-suite/groups/function-sum/case002.json diff --git a/test/test-suite/groups/function-sum/case003.json b/__tests__/test-suite/groups/function-sum/case003.json similarity index 100% rename from test/test-suite/groups/function-sum/case003.json rename to __tests__/test-suite/groups/function-sum/case003.json diff --git a/test/test-suite/groups/function-sum/case004.json b/__tests__/test-suite/groups/function-sum/case004.json similarity index 100% rename from test/test-suite/groups/function-sum/case004.json rename to __tests__/test-suite/groups/function-sum/case004.json diff --git a/test/test-suite/groups/function-sum/case005.json b/__tests__/test-suite/groups/function-sum/case005.json similarity index 100% rename from test/test-suite/groups/function-sum/case005.json rename to __tests__/test-suite/groups/function-sum/case005.json diff --git a/test/test-suite/groups/function-sum/case006.json b/__tests__/test-suite/groups/function-sum/case006.json similarity index 100% rename from test/test-suite/groups/function-sum/case006.json rename to __tests__/test-suite/groups/function-sum/case006.json diff --git a/test/test-suite/groups/function-trim/case000.json b/__tests__/test-suite/groups/function-trim/case000.json similarity index 100% rename from test/test-suite/groups/function-trim/case000.json rename to __tests__/test-suite/groups/function-trim/case000.json diff --git a/test/test-suite/groups/function-trim/case001.json b/__tests__/test-suite/groups/function-trim/case001.json similarity index 100% rename from test/test-suite/groups/function-trim/case001.json rename to __tests__/test-suite/groups/function-trim/case001.json diff --git a/test/test-suite/groups/function-trim/case002.json b/__tests__/test-suite/groups/function-trim/case002.json similarity index 100% rename from test/test-suite/groups/function-trim/case002.json rename to __tests__/test-suite/groups/function-trim/case002.json diff --git a/test/test-suite/groups/function-uppercase/case000.json b/__tests__/test-suite/groups/function-uppercase/case000.json similarity index 100% rename from test/test-suite/groups/function-uppercase/case000.json rename to __tests__/test-suite/groups/function-uppercase/case000.json diff --git a/test/test-suite/groups/function-uppercase/case001.json b/__tests__/test-suite/groups/function-uppercase/case001.json similarity index 100% rename from test/test-suite/groups/function-uppercase/case001.json rename to __tests__/test-suite/groups/function-uppercase/case001.json diff --git a/test/test-suite/groups/function-zip/case000.json b/__tests__/test-suite/groups/function-zip/case000.json similarity index 100% rename from test/test-suite/groups/function-zip/case000.json rename to __tests__/test-suite/groups/function-zip/case000.json diff --git a/test/test-suite/groups/function-zip/case001.json b/__tests__/test-suite/groups/function-zip/case001.json similarity index 100% rename from test/test-suite/groups/function-zip/case001.json rename to __tests__/test-suite/groups/function-zip/case001.json diff --git a/test/test-suite/groups/function-zip/case002.json b/__tests__/test-suite/groups/function-zip/case002.json similarity index 100% rename from test/test-suite/groups/function-zip/case002.json rename to __tests__/test-suite/groups/function-zip/case002.json diff --git a/test/test-suite/groups/function-zip/case003.json b/__tests__/test-suite/groups/function-zip/case003.json similarity index 100% rename from test/test-suite/groups/function-zip/case003.json rename to __tests__/test-suite/groups/function-zip/case003.json diff --git a/test/test-suite/groups/function-zip/case004.json b/__tests__/test-suite/groups/function-zip/case004.json similarity index 100% rename from test/test-suite/groups/function-zip/case004.json rename to __tests__/test-suite/groups/function-zip/case004.json diff --git a/test/test-suite/groups/function-zip/case005.json b/__tests__/test-suite/groups/function-zip/case005.json similarity index 100% rename from test/test-suite/groups/function-zip/case005.json rename to __tests__/test-suite/groups/function-zip/case005.json diff --git a/test/test-suite/groups/higher-order-functions/case000.json b/__tests__/test-suite/groups/higher-order-functions/case000.json similarity index 100% rename from test/test-suite/groups/higher-order-functions/case000.json rename to __tests__/test-suite/groups/higher-order-functions/case000.json diff --git a/test/test-suite/groups/higher-order-functions/case001.json b/__tests__/test-suite/groups/higher-order-functions/case001.json similarity index 100% rename from test/test-suite/groups/higher-order-functions/case001.json rename to __tests__/test-suite/groups/higher-order-functions/case001.json diff --git a/test/test-suite/groups/higher-order-functions/case002.json b/__tests__/test-suite/groups/higher-order-functions/case002.json similarity index 100% rename from test/test-suite/groups/higher-order-functions/case002.json rename to __tests__/test-suite/groups/higher-order-functions/case002.json diff --git a/test/test-suite/groups/hof-filter/case000.json b/__tests__/test-suite/groups/hof-filter/case000.json similarity index 100% rename from test/test-suite/groups/hof-filter/case000.json rename to __tests__/test-suite/groups/hof-filter/case000.json diff --git a/test/test-suite/groups/hof-filter/case001.json b/__tests__/test-suite/groups/hof-filter/case001.json similarity index 100% rename from test/test-suite/groups/hof-filter/case001.json rename to __tests__/test-suite/groups/hof-filter/case001.json diff --git a/test/test-suite/groups/hof-map/case000.json b/__tests__/test-suite/groups/hof-map/case000.json similarity index 100% rename from test/test-suite/groups/hof-map/case000.json rename to __tests__/test-suite/groups/hof-map/case000.json diff --git a/test/test-suite/groups/hof-map/case001.json b/__tests__/test-suite/groups/hof-map/case001.json similarity index 100% rename from test/test-suite/groups/hof-map/case001.json rename to __tests__/test-suite/groups/hof-map/case001.json diff --git a/test/test-suite/groups/hof-map/case002.json b/__tests__/test-suite/groups/hof-map/case002.json similarity index 100% rename from test/test-suite/groups/hof-map/case002.json rename to __tests__/test-suite/groups/hof-map/case002.json diff --git a/test/test-suite/groups/hof-map/case003.json b/__tests__/test-suite/groups/hof-map/case003.json similarity index 100% rename from test/test-suite/groups/hof-map/case003.json rename to __tests__/test-suite/groups/hof-map/case003.json diff --git a/test/test-suite/groups/hof-map/case004.json b/__tests__/test-suite/groups/hof-map/case004.json similarity index 100% rename from test/test-suite/groups/hof-map/case004.json rename to __tests__/test-suite/groups/hof-map/case004.json diff --git a/test/test-suite/groups/hof-map/case005.json b/__tests__/test-suite/groups/hof-map/case005.json similarity index 100% rename from test/test-suite/groups/hof-map/case005.json rename to __tests__/test-suite/groups/hof-map/case005.json diff --git a/test/test-suite/groups/hof-map/case006.json b/__tests__/test-suite/groups/hof-map/case006.json similarity index 100% rename from test/test-suite/groups/hof-map/case006.json rename to __tests__/test-suite/groups/hof-map/case006.json diff --git a/test/test-suite/groups/hof-map/case007.json b/__tests__/test-suite/groups/hof-map/case007.json similarity index 100% rename from test/test-suite/groups/hof-map/case007.json rename to __tests__/test-suite/groups/hof-map/case007.json diff --git a/test/test-suite/groups/hof-map/case008.json b/__tests__/test-suite/groups/hof-map/case008.json similarity index 100% rename from test/test-suite/groups/hof-map/case008.json rename to __tests__/test-suite/groups/hof-map/case008.json diff --git a/test/test-suite/groups/hof-reduce/case000.json b/__tests__/test-suite/groups/hof-reduce/case000.json similarity index 100% rename from test/test-suite/groups/hof-reduce/case000.json rename to __tests__/test-suite/groups/hof-reduce/case000.json diff --git a/test/test-suite/groups/hof-reduce/case001.json b/__tests__/test-suite/groups/hof-reduce/case001.json similarity index 100% rename from test/test-suite/groups/hof-reduce/case001.json rename to __tests__/test-suite/groups/hof-reduce/case001.json diff --git a/test/test-suite/groups/hof-reduce/case002.json b/__tests__/test-suite/groups/hof-reduce/case002.json similarity index 100% rename from test/test-suite/groups/hof-reduce/case002.json rename to __tests__/test-suite/groups/hof-reduce/case002.json diff --git a/test/test-suite/groups/hof-reduce/case003.json b/__tests__/test-suite/groups/hof-reduce/case003.json similarity index 100% rename from test/test-suite/groups/hof-reduce/case003.json rename to __tests__/test-suite/groups/hof-reduce/case003.json diff --git a/test/test-suite/groups/hof-reduce/case004.json b/__tests__/test-suite/groups/hof-reduce/case004.json similarity index 100% rename from test/test-suite/groups/hof-reduce/case004.json rename to __tests__/test-suite/groups/hof-reduce/case004.json diff --git a/test/test-suite/groups/hof-reduce/case005.json b/__tests__/test-suite/groups/hof-reduce/case005.json similarity index 100% rename from test/test-suite/groups/hof-reduce/case005.json rename to __tests__/test-suite/groups/hof-reduce/case005.json diff --git a/test/test-suite/groups/hof-reduce/case006.json b/__tests__/test-suite/groups/hof-reduce/case006.json similarity index 100% rename from test/test-suite/groups/hof-reduce/case006.json rename to __tests__/test-suite/groups/hof-reduce/case006.json diff --git a/test/test-suite/groups/hof-reduce/case007.json b/__tests__/test-suite/groups/hof-reduce/case007.json similarity index 100% rename from test/test-suite/groups/hof-reduce/case007.json rename to __tests__/test-suite/groups/hof-reduce/case007.json diff --git a/test/test-suite/groups/hof-reduce/case008.json b/__tests__/test-suite/groups/hof-reduce/case008.json similarity index 100% rename from test/test-suite/groups/hof-reduce/case008.json rename to __tests__/test-suite/groups/hof-reduce/case008.json diff --git a/test/test-suite/groups/hof-zip-map/case000.json b/__tests__/test-suite/groups/hof-zip-map/case000.json similarity index 100% rename from test/test-suite/groups/hof-zip-map/case000.json rename to __tests__/test-suite/groups/hof-zip-map/case000.json diff --git a/test/test-suite/groups/hof-zip-map/case001.json b/__tests__/test-suite/groups/hof-zip-map/case001.json similarity index 100% rename from test/test-suite/groups/hof-zip-map/case001.json rename to __tests__/test-suite/groups/hof-zip-map/case001.json diff --git a/test/test-suite/groups/hof-zip-map/case002.json b/__tests__/test-suite/groups/hof-zip-map/case002.json similarity index 100% rename from test/test-suite/groups/hof-zip-map/case002.json rename to __tests__/test-suite/groups/hof-zip-map/case002.json diff --git a/test/test-suite/groups/hof-zip-map/case003.json b/__tests__/test-suite/groups/hof-zip-map/case003.json similarity index 100% rename from test/test-suite/groups/hof-zip-map/case003.json rename to __tests__/test-suite/groups/hof-zip-map/case003.json diff --git a/test/test-suite/groups/inclusion-operator/case000.json b/__tests__/test-suite/groups/inclusion-operator/case000.json similarity index 100% rename from test/test-suite/groups/inclusion-operator/case000.json rename to __tests__/test-suite/groups/inclusion-operator/case000.json diff --git a/test/test-suite/groups/inclusion-operator/case001.json b/__tests__/test-suite/groups/inclusion-operator/case001.json similarity index 100% rename from test/test-suite/groups/inclusion-operator/case001.json rename to __tests__/test-suite/groups/inclusion-operator/case001.json diff --git a/test/test-suite/groups/inclusion-operator/case002.json b/__tests__/test-suite/groups/inclusion-operator/case002.json similarity index 100% rename from test/test-suite/groups/inclusion-operator/case002.json rename to __tests__/test-suite/groups/inclusion-operator/case002.json diff --git a/test/test-suite/groups/inclusion-operator/case003.json b/__tests__/test-suite/groups/inclusion-operator/case003.json similarity index 100% rename from test/test-suite/groups/inclusion-operator/case003.json rename to __tests__/test-suite/groups/inclusion-operator/case003.json diff --git a/test/test-suite/groups/inclusion-operator/case004.json b/__tests__/test-suite/groups/inclusion-operator/case004.json similarity index 100% rename from test/test-suite/groups/inclusion-operator/case004.json rename to __tests__/test-suite/groups/inclusion-operator/case004.json diff --git a/test/test-suite/groups/inclusion-operator/case005.json b/__tests__/test-suite/groups/inclusion-operator/case005.json similarity index 100% rename from test/test-suite/groups/inclusion-operator/case005.json rename to __tests__/test-suite/groups/inclusion-operator/case005.json diff --git a/test/test-suite/groups/inclusion-operator/case006.json b/__tests__/test-suite/groups/inclusion-operator/case006.json similarity index 100% rename from test/test-suite/groups/inclusion-operator/case006.json rename to __tests__/test-suite/groups/inclusion-operator/case006.json diff --git a/test/test-suite/groups/inclusion-operator/case007.json b/__tests__/test-suite/groups/inclusion-operator/case007.json similarity index 100% rename from test/test-suite/groups/inclusion-operator/case007.json rename to __tests__/test-suite/groups/inclusion-operator/case007.json diff --git a/test/test-suite/groups/inclusion-operator/case008.json b/__tests__/test-suite/groups/inclusion-operator/case008.json similarity index 100% rename from test/test-suite/groups/inclusion-operator/case008.json rename to __tests__/test-suite/groups/inclusion-operator/case008.json diff --git a/test/test-suite/groups/lambdas/case000.json b/__tests__/test-suite/groups/lambdas/case000.json similarity index 100% rename from test/test-suite/groups/lambdas/case000.json rename to __tests__/test-suite/groups/lambdas/case000.json diff --git a/test/test-suite/groups/lambdas/case001.json b/__tests__/test-suite/groups/lambdas/case001.json similarity index 100% rename from test/test-suite/groups/lambdas/case001.json rename to __tests__/test-suite/groups/lambdas/case001.json diff --git a/test/test-suite/groups/lambdas/case002.json b/__tests__/test-suite/groups/lambdas/case002.json similarity index 100% rename from test/test-suite/groups/lambdas/case002.json rename to __tests__/test-suite/groups/lambdas/case002.json diff --git a/test/test-suite/groups/lambdas/case003.json b/__tests__/test-suite/groups/lambdas/case003.json similarity index 100% rename from test/test-suite/groups/lambdas/case003.json rename to __tests__/test-suite/groups/lambdas/case003.json diff --git a/test/test-suite/groups/lambdas/case004.json b/__tests__/test-suite/groups/lambdas/case004.json similarity index 100% rename from test/test-suite/groups/lambdas/case004.json rename to __tests__/test-suite/groups/lambdas/case004.json diff --git a/test/test-suite/groups/lambdas/case005.json b/__tests__/test-suite/groups/lambdas/case005.json similarity index 100% rename from test/test-suite/groups/lambdas/case005.json rename to __tests__/test-suite/groups/lambdas/case005.json diff --git a/test/test-suite/groups/lambdas/case006.json b/__tests__/test-suite/groups/lambdas/case006.json similarity index 100% rename from test/test-suite/groups/lambdas/case006.json rename to __tests__/test-suite/groups/lambdas/case006.json diff --git a/test/test-suite/groups/lambdas/case007.json b/__tests__/test-suite/groups/lambdas/case007.json similarity index 100% rename from test/test-suite/groups/lambdas/case007.json rename to __tests__/test-suite/groups/lambdas/case007.json diff --git a/test/test-suite/groups/lambdas/case008.json b/__tests__/test-suite/groups/lambdas/case008.json similarity index 100% rename from test/test-suite/groups/lambdas/case008.json rename to __tests__/test-suite/groups/lambdas/case008.json diff --git a/test/test-suite/groups/lambdas/case009.json b/__tests__/test-suite/groups/lambdas/case009.json similarity index 100% rename from test/test-suite/groups/lambdas/case009.json rename to __tests__/test-suite/groups/lambdas/case009.json diff --git a/test/test-suite/groups/lambdas/case010.json b/__tests__/test-suite/groups/lambdas/case010.json similarity index 100% rename from test/test-suite/groups/lambdas/case010.json rename to __tests__/test-suite/groups/lambdas/case010.json diff --git a/test/test-suite/groups/lambdas/case011.json b/__tests__/test-suite/groups/lambdas/case011.json similarity index 100% rename from test/test-suite/groups/lambdas/case011.json rename to __tests__/test-suite/groups/lambdas/case011.json diff --git a/test/test-suite/groups/literals/case000.json b/__tests__/test-suite/groups/literals/case000.json similarity index 100% rename from test/test-suite/groups/literals/case000.json rename to __tests__/test-suite/groups/literals/case000.json diff --git a/test/test-suite/groups/literals/case001.json b/__tests__/test-suite/groups/literals/case001.json similarity index 100% rename from test/test-suite/groups/literals/case001.json rename to __tests__/test-suite/groups/literals/case001.json diff --git a/test/test-suite/groups/literals/case002.json b/__tests__/test-suite/groups/literals/case002.json similarity index 100% rename from test/test-suite/groups/literals/case002.json rename to __tests__/test-suite/groups/literals/case002.json diff --git a/test/test-suite/groups/literals/case003.json b/__tests__/test-suite/groups/literals/case003.json similarity index 100% rename from test/test-suite/groups/literals/case003.json rename to __tests__/test-suite/groups/literals/case003.json diff --git a/test/test-suite/groups/literals/case004.json b/__tests__/test-suite/groups/literals/case004.json similarity index 100% rename from test/test-suite/groups/literals/case004.json rename to __tests__/test-suite/groups/literals/case004.json diff --git a/test/test-suite/groups/literals/case005.json b/__tests__/test-suite/groups/literals/case005.json similarity index 100% rename from test/test-suite/groups/literals/case005.json rename to __tests__/test-suite/groups/literals/case005.json diff --git a/test/test-suite/groups/literals/case006.json b/__tests__/test-suite/groups/literals/case006.json similarity index 100% rename from test/test-suite/groups/literals/case006.json rename to __tests__/test-suite/groups/literals/case006.json diff --git a/test/test-suite/groups/literals/case007.json b/__tests__/test-suite/groups/literals/case007.json similarity index 100% rename from test/test-suite/groups/literals/case007.json rename to __tests__/test-suite/groups/literals/case007.json diff --git a/test/test-suite/groups/literals/case008.json b/__tests__/test-suite/groups/literals/case008.json similarity index 100% rename from test/test-suite/groups/literals/case008.json rename to __tests__/test-suite/groups/literals/case008.json diff --git a/test/test-suite/groups/literals/case009.json b/__tests__/test-suite/groups/literals/case009.json similarity index 100% rename from test/test-suite/groups/literals/case009.json rename to __tests__/test-suite/groups/literals/case009.json diff --git a/test/test-suite/groups/literals/case010.json b/__tests__/test-suite/groups/literals/case010.json similarity index 100% rename from test/test-suite/groups/literals/case010.json rename to __tests__/test-suite/groups/literals/case010.json diff --git a/test/test-suite/groups/literals/case011.json b/__tests__/test-suite/groups/literals/case011.json similarity index 100% rename from test/test-suite/groups/literals/case011.json rename to __tests__/test-suite/groups/literals/case011.json diff --git a/test/test-suite/groups/literals/case012.json b/__tests__/test-suite/groups/literals/case012.json similarity index 100% rename from test/test-suite/groups/literals/case012.json rename to __tests__/test-suite/groups/literals/case012.json diff --git a/test/test-suite/groups/literals/case013.json b/__tests__/test-suite/groups/literals/case013.json similarity index 100% rename from test/test-suite/groups/literals/case013.json rename to __tests__/test-suite/groups/literals/case013.json diff --git a/test/test-suite/groups/literals/case014.json b/__tests__/test-suite/groups/literals/case014.json similarity index 100% rename from test/test-suite/groups/literals/case014.json rename to __tests__/test-suite/groups/literals/case014.json diff --git a/test/test-suite/groups/literals/case015.json b/__tests__/test-suite/groups/literals/case015.json similarity index 100% rename from test/test-suite/groups/literals/case015.json rename to __tests__/test-suite/groups/literals/case015.json diff --git a/test/test-suite/groups/literals/case016.json b/__tests__/test-suite/groups/literals/case016.json similarity index 100% rename from test/test-suite/groups/literals/case016.json rename to __tests__/test-suite/groups/literals/case016.json diff --git a/test/test-suite/groups/literals/case017.json b/__tests__/test-suite/groups/literals/case017.json similarity index 100% rename from test/test-suite/groups/literals/case017.json rename to __tests__/test-suite/groups/literals/case017.json diff --git a/test/test-suite/groups/missing-paths/case000.json b/__tests__/test-suite/groups/missing-paths/case000.json similarity index 100% rename from test/test-suite/groups/missing-paths/case000.json rename to __tests__/test-suite/groups/missing-paths/case000.json diff --git a/test/test-suite/groups/missing-paths/case001.json b/__tests__/test-suite/groups/missing-paths/case001.json similarity index 100% rename from test/test-suite/groups/missing-paths/case001.json rename to __tests__/test-suite/groups/missing-paths/case001.json diff --git a/test/test-suite/groups/missing-paths/case002.json b/__tests__/test-suite/groups/missing-paths/case002.json similarity index 100% rename from test/test-suite/groups/missing-paths/case002.json rename to __tests__/test-suite/groups/missing-paths/case002.json diff --git a/test/test-suite/groups/missing-paths/case003.json b/__tests__/test-suite/groups/missing-paths/case003.json similarity index 100% rename from test/test-suite/groups/missing-paths/case003.json rename to __tests__/test-suite/groups/missing-paths/case003.json diff --git a/test/test-suite/groups/missing-paths/case004.json b/__tests__/test-suite/groups/missing-paths/case004.json similarity index 100% rename from test/test-suite/groups/missing-paths/case004.json rename to __tests__/test-suite/groups/missing-paths/case004.json diff --git a/test/test-suite/groups/missing-paths/case005.json b/__tests__/test-suite/groups/missing-paths/case005.json similarity index 100% rename from test/test-suite/groups/missing-paths/case005.json rename to __tests__/test-suite/groups/missing-paths/case005.json diff --git a/test/test-suite/groups/multiple-array-selectors/case000.json b/__tests__/test-suite/groups/multiple-array-selectors/case000.json similarity index 100% rename from test/test-suite/groups/multiple-array-selectors/case000.json rename to __tests__/test-suite/groups/multiple-array-selectors/case000.json diff --git a/test/test-suite/groups/multiple-array-selectors/case001.json b/__tests__/test-suite/groups/multiple-array-selectors/case001.json similarity index 100% rename from test/test-suite/groups/multiple-array-selectors/case001.json rename to __tests__/test-suite/groups/multiple-array-selectors/case001.json diff --git a/test/test-suite/groups/multiple-array-selectors/case002.json b/__tests__/test-suite/groups/multiple-array-selectors/case002.json similarity index 100% rename from test/test-suite/groups/multiple-array-selectors/case002.json rename to __tests__/test-suite/groups/multiple-array-selectors/case002.json diff --git a/test/test-suite/groups/null/case000.json b/__tests__/test-suite/groups/null/case000.json similarity index 100% rename from test/test-suite/groups/null/case000.json rename to __tests__/test-suite/groups/null/case000.json diff --git a/test/test-suite/groups/null/case001.json b/__tests__/test-suite/groups/null/case001.json similarity index 100% rename from test/test-suite/groups/null/case001.json rename to __tests__/test-suite/groups/null/case001.json diff --git a/test/test-suite/groups/null/case002.json b/__tests__/test-suite/groups/null/case002.json similarity index 100% rename from test/test-suite/groups/null/case002.json rename to __tests__/test-suite/groups/null/case002.json diff --git a/test/test-suite/groups/null/case003.json b/__tests__/test-suite/groups/null/case003.json similarity index 100% rename from test/test-suite/groups/null/case003.json rename to __tests__/test-suite/groups/null/case003.json diff --git a/test/test-suite/groups/null/case004.json b/__tests__/test-suite/groups/null/case004.json similarity index 100% rename from test/test-suite/groups/null/case004.json rename to __tests__/test-suite/groups/null/case004.json diff --git a/test/test-suite/groups/null/case005.json b/__tests__/test-suite/groups/null/case005.json similarity index 100% rename from test/test-suite/groups/null/case005.json rename to __tests__/test-suite/groups/null/case005.json diff --git a/test/test-suite/groups/null/case006.json b/__tests__/test-suite/groups/null/case006.json similarity index 100% rename from test/test-suite/groups/null/case006.json rename to __tests__/test-suite/groups/null/case006.json diff --git a/test/test-suite/groups/numeric-operators/case000.json b/__tests__/test-suite/groups/numeric-operators/case000.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case000.json rename to __tests__/test-suite/groups/numeric-operators/case000.json diff --git a/test/test-suite/groups/numeric-operators/case001.json b/__tests__/test-suite/groups/numeric-operators/case001.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case001.json rename to __tests__/test-suite/groups/numeric-operators/case001.json diff --git a/test/test-suite/groups/numeric-operators/case002.json b/__tests__/test-suite/groups/numeric-operators/case002.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case002.json rename to __tests__/test-suite/groups/numeric-operators/case002.json diff --git a/test/test-suite/groups/numeric-operators/case003.json b/__tests__/test-suite/groups/numeric-operators/case003.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case003.json rename to __tests__/test-suite/groups/numeric-operators/case003.json diff --git a/test/test-suite/groups/numeric-operators/case004.json b/__tests__/test-suite/groups/numeric-operators/case004.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case004.json rename to __tests__/test-suite/groups/numeric-operators/case004.json diff --git a/test/test-suite/groups/numeric-operators/case005.json b/__tests__/test-suite/groups/numeric-operators/case005.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case005.json rename to __tests__/test-suite/groups/numeric-operators/case005.json diff --git a/test/test-suite/groups/numeric-operators/case006.json b/__tests__/test-suite/groups/numeric-operators/case006.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case006.json rename to __tests__/test-suite/groups/numeric-operators/case006.json diff --git a/test/test-suite/groups/numeric-operators/case007.json b/__tests__/test-suite/groups/numeric-operators/case007.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case007.json rename to __tests__/test-suite/groups/numeric-operators/case007.json diff --git a/test/test-suite/groups/numeric-operators/case008.json b/__tests__/test-suite/groups/numeric-operators/case008.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case008.json rename to __tests__/test-suite/groups/numeric-operators/case008.json diff --git a/test/test-suite/groups/numeric-operators/case009.json b/__tests__/test-suite/groups/numeric-operators/case009.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case009.json rename to __tests__/test-suite/groups/numeric-operators/case009.json diff --git a/test/test-suite/groups/numeric-operators/case010.json b/__tests__/test-suite/groups/numeric-operators/case010.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case010.json rename to __tests__/test-suite/groups/numeric-operators/case010.json diff --git a/test/test-suite/groups/numeric-operators/case011.json b/__tests__/test-suite/groups/numeric-operators/case011.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case011.json rename to __tests__/test-suite/groups/numeric-operators/case011.json diff --git a/test/test-suite/groups/numeric-operators/case012.json b/__tests__/test-suite/groups/numeric-operators/case012.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case012.json rename to __tests__/test-suite/groups/numeric-operators/case012.json diff --git a/test/test-suite/groups/numeric-operators/case013.json b/__tests__/test-suite/groups/numeric-operators/case013.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case013.json rename to __tests__/test-suite/groups/numeric-operators/case013.json diff --git a/test/test-suite/groups/numeric-operators/case014.json b/__tests__/test-suite/groups/numeric-operators/case014.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case014.json rename to __tests__/test-suite/groups/numeric-operators/case014.json diff --git a/test/test-suite/groups/numeric-operators/case015.json b/__tests__/test-suite/groups/numeric-operators/case015.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case015.json rename to __tests__/test-suite/groups/numeric-operators/case015.json diff --git a/test/test-suite/groups/numeric-operators/case016.json b/__tests__/test-suite/groups/numeric-operators/case016.json similarity index 100% rename from test/test-suite/groups/numeric-operators/case016.json rename to __tests__/test-suite/groups/numeric-operators/case016.json diff --git a/test/test-suite/groups/object-constructor/case000.json b/__tests__/test-suite/groups/object-constructor/case000.json similarity index 100% rename from test/test-suite/groups/object-constructor/case000.json rename to __tests__/test-suite/groups/object-constructor/case000.json diff --git a/test/test-suite/groups/object-constructor/case001.json b/__tests__/test-suite/groups/object-constructor/case001.json similarity index 100% rename from test/test-suite/groups/object-constructor/case001.json rename to __tests__/test-suite/groups/object-constructor/case001.json diff --git a/test/test-suite/groups/object-constructor/case002.json b/__tests__/test-suite/groups/object-constructor/case002.json similarity index 100% rename from test/test-suite/groups/object-constructor/case002.json rename to __tests__/test-suite/groups/object-constructor/case002.json diff --git a/test/test-suite/groups/object-constructor/case003.json b/__tests__/test-suite/groups/object-constructor/case003.json similarity index 100% rename from test/test-suite/groups/object-constructor/case003.json rename to __tests__/test-suite/groups/object-constructor/case003.json diff --git a/test/test-suite/groups/object-constructor/case004.json b/__tests__/test-suite/groups/object-constructor/case004.json similarity index 100% rename from test/test-suite/groups/object-constructor/case004.json rename to __tests__/test-suite/groups/object-constructor/case004.json diff --git a/test/test-suite/groups/object-constructor/case005.json b/__tests__/test-suite/groups/object-constructor/case005.json similarity index 100% rename from test/test-suite/groups/object-constructor/case005.json rename to __tests__/test-suite/groups/object-constructor/case005.json diff --git a/test/test-suite/groups/object-constructor/case006.json b/__tests__/test-suite/groups/object-constructor/case006.json similarity index 100% rename from test/test-suite/groups/object-constructor/case006.json rename to __tests__/test-suite/groups/object-constructor/case006.json diff --git a/test/test-suite/groups/object-constructor/case007.json b/__tests__/test-suite/groups/object-constructor/case007.json similarity index 100% rename from test/test-suite/groups/object-constructor/case007.json rename to __tests__/test-suite/groups/object-constructor/case007.json diff --git a/test/test-suite/groups/object-constructor/case008.json b/__tests__/test-suite/groups/object-constructor/case008.json similarity index 100% rename from test/test-suite/groups/object-constructor/case008.json rename to __tests__/test-suite/groups/object-constructor/case008.json diff --git a/test/test-suite/groups/object-constructor/case009.json b/__tests__/test-suite/groups/object-constructor/case009.json similarity index 100% rename from test/test-suite/groups/object-constructor/case009.json rename to __tests__/test-suite/groups/object-constructor/case009.json diff --git a/test/test-suite/groups/object-constructor/case010.json b/__tests__/test-suite/groups/object-constructor/case010.json similarity index 100% rename from test/test-suite/groups/object-constructor/case010.json rename to __tests__/test-suite/groups/object-constructor/case010.json diff --git a/test/test-suite/groups/object-constructor/case011.json b/__tests__/test-suite/groups/object-constructor/case011.json similarity index 100% rename from test/test-suite/groups/object-constructor/case011.json rename to __tests__/test-suite/groups/object-constructor/case011.json diff --git a/test/test-suite/groups/object-constructor/case012.json b/__tests__/test-suite/groups/object-constructor/case012.json similarity index 100% rename from test/test-suite/groups/object-constructor/case012.json rename to __tests__/test-suite/groups/object-constructor/case012.json diff --git a/test/test-suite/groups/object-constructor/case013.json b/__tests__/test-suite/groups/object-constructor/case013.json similarity index 100% rename from test/test-suite/groups/object-constructor/case013.json rename to __tests__/test-suite/groups/object-constructor/case013.json diff --git a/test/test-suite/groups/object-constructor/case014.json b/__tests__/test-suite/groups/object-constructor/case014.json similarity index 100% rename from test/test-suite/groups/object-constructor/case014.json rename to __tests__/test-suite/groups/object-constructor/case014.json diff --git a/test/test-suite/groups/object-constructor/case015.json b/__tests__/test-suite/groups/object-constructor/case015.json similarity index 100% rename from test/test-suite/groups/object-constructor/case015.json rename to __tests__/test-suite/groups/object-constructor/case015.json diff --git a/test/test-suite/groups/object-constructor/case016.json b/__tests__/test-suite/groups/object-constructor/case016.json similarity index 100% rename from test/test-suite/groups/object-constructor/case016.json rename to __tests__/test-suite/groups/object-constructor/case016.json diff --git a/test/test-suite/groups/object-constructor/case017.json b/__tests__/test-suite/groups/object-constructor/case017.json similarity index 100% rename from test/test-suite/groups/object-constructor/case017.json rename to __tests__/test-suite/groups/object-constructor/case017.json diff --git a/test/test-suite/groups/object-constructor/case018.json b/__tests__/test-suite/groups/object-constructor/case018.json similarity index 100% rename from test/test-suite/groups/object-constructor/case018.json rename to __tests__/test-suite/groups/object-constructor/case018.json diff --git a/test/test-suite/groups/object-constructor/case019.json b/__tests__/test-suite/groups/object-constructor/case019.json similarity index 100% rename from test/test-suite/groups/object-constructor/case019.json rename to __tests__/test-suite/groups/object-constructor/case019.json diff --git a/test/test-suite/groups/object-constructor/case020.json b/__tests__/test-suite/groups/object-constructor/case020.json similarity index 100% rename from test/test-suite/groups/object-constructor/case020.json rename to __tests__/test-suite/groups/object-constructor/case020.json diff --git a/test/test-suite/groups/object-constructor/case021.json b/__tests__/test-suite/groups/object-constructor/case021.json similarity index 100% rename from test/test-suite/groups/object-constructor/case021.json rename to __tests__/test-suite/groups/object-constructor/case021.json diff --git a/test/test-suite/groups/object-constructor/case022.json b/__tests__/test-suite/groups/object-constructor/case022.json similarity index 100% rename from test/test-suite/groups/object-constructor/case022.json rename to __tests__/test-suite/groups/object-constructor/case022.json diff --git a/test/test-suite/groups/parentheses/case000.json b/__tests__/test-suite/groups/parentheses/case000.json similarity index 100% rename from test/test-suite/groups/parentheses/case000.json rename to __tests__/test-suite/groups/parentheses/case000.json diff --git a/test/test-suite/groups/parentheses/case001.json b/__tests__/test-suite/groups/parentheses/case001.json similarity index 100% rename from test/test-suite/groups/parentheses/case001.json rename to __tests__/test-suite/groups/parentheses/case001.json diff --git a/test/test-suite/groups/parentheses/case002.json b/__tests__/test-suite/groups/parentheses/case002.json similarity index 100% rename from test/test-suite/groups/parentheses/case002.json rename to __tests__/test-suite/groups/parentheses/case002.json diff --git a/test/test-suite/groups/parentheses/case003.json b/__tests__/test-suite/groups/parentheses/case003.json similarity index 100% rename from test/test-suite/groups/parentheses/case003.json rename to __tests__/test-suite/groups/parentheses/case003.json diff --git a/test/test-suite/groups/parentheses/case004.json b/__tests__/test-suite/groups/parentheses/case004.json similarity index 100% rename from test/test-suite/groups/parentheses/case004.json rename to __tests__/test-suite/groups/parentheses/case004.json diff --git a/test/test-suite/groups/parentheses/case005.json b/__tests__/test-suite/groups/parentheses/case005.json similarity index 100% rename from test/test-suite/groups/parentheses/case005.json rename to __tests__/test-suite/groups/parentheses/case005.json diff --git a/test/test-suite/groups/parentheses/case006.json b/__tests__/test-suite/groups/parentheses/case006.json similarity index 100% rename from test/test-suite/groups/parentheses/case006.json rename to __tests__/test-suite/groups/parentheses/case006.json diff --git a/test/test-suite/groups/parentheses/case007.json b/__tests__/test-suite/groups/parentheses/case007.json similarity index 100% rename from test/test-suite/groups/parentheses/case007.json rename to __tests__/test-suite/groups/parentheses/case007.json diff --git a/test/test-suite/groups/partial-application/case000.json b/__tests__/test-suite/groups/partial-application/case000.json similarity index 100% rename from test/test-suite/groups/partial-application/case000.json rename to __tests__/test-suite/groups/partial-application/case000.json diff --git a/test/test-suite/groups/partial-application/case001.json b/__tests__/test-suite/groups/partial-application/case001.json similarity index 100% rename from test/test-suite/groups/partial-application/case001.json rename to __tests__/test-suite/groups/partial-application/case001.json diff --git a/test/test-suite/groups/partial-application/case002.json b/__tests__/test-suite/groups/partial-application/case002.json similarity index 100% rename from test/test-suite/groups/partial-application/case002.json rename to __tests__/test-suite/groups/partial-application/case002.json diff --git a/test/test-suite/groups/partial-application/case003.json b/__tests__/test-suite/groups/partial-application/case003.json similarity index 100% rename from test/test-suite/groups/partial-application/case003.json rename to __tests__/test-suite/groups/partial-application/case003.json diff --git a/test/test-suite/groups/partial-application/case004.json b/__tests__/test-suite/groups/partial-application/case004.json similarity index 100% rename from test/test-suite/groups/partial-application/case004.json rename to __tests__/test-suite/groups/partial-application/case004.json diff --git a/test/test-suite/groups/predicates/case000.json b/__tests__/test-suite/groups/predicates/case000.json similarity index 100% rename from test/test-suite/groups/predicates/case000.json rename to __tests__/test-suite/groups/predicates/case000.json diff --git a/test/test-suite/groups/predicates/case001.json b/__tests__/test-suite/groups/predicates/case001.json similarity index 100% rename from test/test-suite/groups/predicates/case001.json rename to __tests__/test-suite/groups/predicates/case001.json diff --git a/test/test-suite/groups/predicates/case002.json b/__tests__/test-suite/groups/predicates/case002.json similarity index 100% rename from test/test-suite/groups/predicates/case002.json rename to __tests__/test-suite/groups/predicates/case002.json diff --git a/test/test-suite/groups/predicates/case003.json b/__tests__/test-suite/groups/predicates/case003.json similarity index 100% rename from test/test-suite/groups/predicates/case003.json rename to __tests__/test-suite/groups/predicates/case003.json diff --git a/test/test-suite/groups/quoted-selectors/case000.json b/__tests__/test-suite/groups/quoted-selectors/case000.json similarity index 100% rename from test/test-suite/groups/quoted-selectors/case000.json rename to __tests__/test-suite/groups/quoted-selectors/case000.json diff --git a/test/test-suite/groups/quoted-selectors/case001.json b/__tests__/test-suite/groups/quoted-selectors/case001.json similarity index 100% rename from test/test-suite/groups/quoted-selectors/case001.json rename to __tests__/test-suite/groups/quoted-selectors/case001.json diff --git a/test/test-suite/groups/quoted-selectors/case002.json b/__tests__/test-suite/groups/quoted-selectors/case002.json similarity index 100% rename from test/test-suite/groups/quoted-selectors/case002.json rename to __tests__/test-suite/groups/quoted-selectors/case002.json diff --git a/test/test-suite/groups/quoted-selectors/case003.json b/__tests__/test-suite/groups/quoted-selectors/case003.json similarity index 100% rename from test/test-suite/groups/quoted-selectors/case003.json rename to __tests__/test-suite/groups/quoted-selectors/case003.json diff --git a/test/test-suite/groups/quoted-selectors/case004.json b/__tests__/test-suite/groups/quoted-selectors/case004.json similarity index 100% rename from test/test-suite/groups/quoted-selectors/case004.json rename to __tests__/test-suite/groups/quoted-selectors/case004.json diff --git a/test/test-suite/groups/quoted-selectors/case005.json b/__tests__/test-suite/groups/quoted-selectors/case005.json similarity index 100% rename from test/test-suite/groups/quoted-selectors/case005.json rename to __tests__/test-suite/groups/quoted-selectors/case005.json diff --git a/test/test-suite/groups/quoted-selectors/case006.json b/__tests__/test-suite/groups/quoted-selectors/case006.json similarity index 100% rename from test/test-suite/groups/quoted-selectors/case006.json rename to __tests__/test-suite/groups/quoted-selectors/case006.json diff --git a/test/test-suite/groups/quoted-selectors/case007.json b/__tests__/test-suite/groups/quoted-selectors/case007.json similarity index 100% rename from test/test-suite/groups/quoted-selectors/case007.json rename to __tests__/test-suite/groups/quoted-selectors/case007.json diff --git a/test/test-suite/groups/range-operator/case000.json b/__tests__/test-suite/groups/range-operator/case000.json similarity index 100% rename from test/test-suite/groups/range-operator/case000.json rename to __tests__/test-suite/groups/range-operator/case000.json diff --git a/test/test-suite/groups/range-operator/case001.json b/__tests__/test-suite/groups/range-operator/case001.json similarity index 100% rename from test/test-suite/groups/range-operator/case001.json rename to __tests__/test-suite/groups/range-operator/case001.json diff --git a/test/test-suite/groups/range-operator/case002.json b/__tests__/test-suite/groups/range-operator/case002.json similarity index 100% rename from test/test-suite/groups/range-operator/case002.json rename to __tests__/test-suite/groups/range-operator/case002.json diff --git a/test/test-suite/groups/range-operator/case003.json b/__tests__/test-suite/groups/range-operator/case003.json similarity index 100% rename from test/test-suite/groups/range-operator/case003.json rename to __tests__/test-suite/groups/range-operator/case003.json diff --git a/test/test-suite/groups/range-operator/case004.json b/__tests__/test-suite/groups/range-operator/case004.json similarity index 100% rename from test/test-suite/groups/range-operator/case004.json rename to __tests__/test-suite/groups/range-operator/case004.json diff --git a/test/test-suite/groups/range-operator/case005.json b/__tests__/test-suite/groups/range-operator/case005.json similarity index 100% rename from test/test-suite/groups/range-operator/case005.json rename to __tests__/test-suite/groups/range-operator/case005.json diff --git a/test/test-suite/groups/range-operator/case006.json b/__tests__/test-suite/groups/range-operator/case006.json similarity index 100% rename from test/test-suite/groups/range-operator/case006.json rename to __tests__/test-suite/groups/range-operator/case006.json diff --git a/test/test-suite/groups/range-operator/case007.json b/__tests__/test-suite/groups/range-operator/case007.json similarity index 100% rename from test/test-suite/groups/range-operator/case007.json rename to __tests__/test-suite/groups/range-operator/case007.json diff --git a/test/test-suite/groups/range-operator/case008.json b/__tests__/test-suite/groups/range-operator/case008.json similarity index 100% rename from test/test-suite/groups/range-operator/case008.json rename to __tests__/test-suite/groups/range-operator/case008.json diff --git a/test/test-suite/groups/range-operator/case009.json b/__tests__/test-suite/groups/range-operator/case009.json similarity index 100% rename from test/test-suite/groups/range-operator/case009.json rename to __tests__/test-suite/groups/range-operator/case009.json diff --git a/test/test-suite/groups/range-operator/case010.json b/__tests__/test-suite/groups/range-operator/case010.json similarity index 100% rename from test/test-suite/groups/range-operator/case010.json rename to __tests__/test-suite/groups/range-operator/case010.json diff --git a/test/test-suite/groups/regex/case000.json b/__tests__/test-suite/groups/regex/case000.json similarity index 100% rename from test/test-suite/groups/regex/case000.json rename to __tests__/test-suite/groups/regex/case000.json diff --git a/test/test-suite/groups/regex/case001.json b/__tests__/test-suite/groups/regex/case001.json similarity index 100% rename from test/test-suite/groups/regex/case001.json rename to __tests__/test-suite/groups/regex/case001.json diff --git a/test/test-suite/groups/regex/case002.json b/__tests__/test-suite/groups/regex/case002.json similarity index 100% rename from test/test-suite/groups/regex/case002.json rename to __tests__/test-suite/groups/regex/case002.json diff --git a/test/test-suite/groups/regex/case003.json b/__tests__/test-suite/groups/regex/case003.json similarity index 100% rename from test/test-suite/groups/regex/case003.json rename to __tests__/test-suite/groups/regex/case003.json diff --git a/test/test-suite/groups/regex/case004.json b/__tests__/test-suite/groups/regex/case004.json similarity index 100% rename from test/test-suite/groups/regex/case004.json rename to __tests__/test-suite/groups/regex/case004.json diff --git a/test/test-suite/groups/regex/case005.json b/__tests__/test-suite/groups/regex/case005.json similarity index 100% rename from test/test-suite/groups/regex/case005.json rename to __tests__/test-suite/groups/regex/case005.json diff --git a/test/test-suite/groups/regex/case006.json b/__tests__/test-suite/groups/regex/case006.json similarity index 100% rename from test/test-suite/groups/regex/case006.json rename to __tests__/test-suite/groups/regex/case006.json diff --git a/test/test-suite/groups/regex/case007.json b/__tests__/test-suite/groups/regex/case007.json similarity index 100% rename from test/test-suite/groups/regex/case007.json rename to __tests__/test-suite/groups/regex/case007.json diff --git a/test/test-suite/groups/regex/case008.json b/__tests__/test-suite/groups/regex/case008.json similarity index 100% rename from test/test-suite/groups/regex/case008.json rename to __tests__/test-suite/groups/regex/case008.json diff --git a/test/test-suite/groups/regex/case009.json b/__tests__/test-suite/groups/regex/case009.json similarity index 100% rename from test/test-suite/groups/regex/case009.json rename to __tests__/test-suite/groups/regex/case009.json diff --git a/test/test-suite/groups/regex/case010.json b/__tests__/test-suite/groups/regex/case010.json similarity index 100% rename from test/test-suite/groups/regex/case010.json rename to __tests__/test-suite/groups/regex/case010.json diff --git a/test/test-suite/groups/regex/case011.json b/__tests__/test-suite/groups/regex/case011.json similarity index 100% rename from test/test-suite/groups/regex/case011.json rename to __tests__/test-suite/groups/regex/case011.json diff --git a/test/test-suite/groups/regex/case012.json b/__tests__/test-suite/groups/regex/case012.json similarity index 100% rename from test/test-suite/groups/regex/case012.json rename to __tests__/test-suite/groups/regex/case012.json diff --git a/test/test-suite/groups/regex/case013.json b/__tests__/test-suite/groups/regex/case013.json similarity index 100% rename from test/test-suite/groups/regex/case013.json rename to __tests__/test-suite/groups/regex/case013.json diff --git a/test/test-suite/groups/regex/case014.json b/__tests__/test-suite/groups/regex/case014.json similarity index 100% rename from test/test-suite/groups/regex/case014.json rename to __tests__/test-suite/groups/regex/case014.json diff --git a/test/test-suite/groups/regex/case015.json b/__tests__/test-suite/groups/regex/case015.json similarity index 100% rename from test/test-suite/groups/regex/case015.json rename to __tests__/test-suite/groups/regex/case015.json diff --git a/test/test-suite/groups/regex/case016.json b/__tests__/test-suite/groups/regex/case016.json similarity index 100% rename from test/test-suite/groups/regex/case016.json rename to __tests__/test-suite/groups/regex/case016.json diff --git a/test/test-suite/groups/regex/case017.json b/__tests__/test-suite/groups/regex/case017.json similarity index 100% rename from test/test-suite/groups/regex/case017.json rename to __tests__/test-suite/groups/regex/case017.json diff --git a/test/test-suite/groups/regex/case018.json b/__tests__/test-suite/groups/regex/case018.json similarity index 100% rename from test/test-suite/groups/regex/case018.json rename to __tests__/test-suite/groups/regex/case018.json diff --git a/test/test-suite/groups/regex/case019.json b/__tests__/test-suite/groups/regex/case019.json similarity index 100% rename from test/test-suite/groups/regex/case019.json rename to __tests__/test-suite/groups/regex/case019.json diff --git a/test/test-suite/groups/regex/case020.json b/__tests__/test-suite/groups/regex/case020.json similarity index 100% rename from test/test-suite/groups/regex/case020.json rename to __tests__/test-suite/groups/regex/case020.json diff --git a/test/test-suite/groups/regex/case021.json b/__tests__/test-suite/groups/regex/case021.json similarity index 100% rename from test/test-suite/groups/regex/case021.json rename to __tests__/test-suite/groups/regex/case021.json diff --git a/test/test-suite/groups/regex/case022.json b/__tests__/test-suite/groups/regex/case022.json similarity index 100% rename from test/test-suite/groups/regex/case022.json rename to __tests__/test-suite/groups/regex/case022.json diff --git a/test/test-suite/groups/regex/case023.json b/__tests__/test-suite/groups/regex/case023.json similarity index 100% rename from test/test-suite/groups/regex/case023.json rename to __tests__/test-suite/groups/regex/case023.json diff --git a/test/test-suite/groups/regex/case024.json b/__tests__/test-suite/groups/regex/case024.json similarity index 100% rename from test/test-suite/groups/regex/case024.json rename to __tests__/test-suite/groups/regex/case024.json diff --git a/test/test-suite/groups/regex/case025.json b/__tests__/test-suite/groups/regex/case025.json similarity index 100% rename from test/test-suite/groups/regex/case025.json rename to __tests__/test-suite/groups/regex/case025.json diff --git a/test/test-suite/groups/regex/case026.json b/__tests__/test-suite/groups/regex/case026.json similarity index 100% rename from test/test-suite/groups/regex/case026.json rename to __tests__/test-suite/groups/regex/case026.json diff --git a/test/test-suite/groups/regex/case027.json b/__tests__/test-suite/groups/regex/case027.json similarity index 100% rename from test/test-suite/groups/regex/case027.json rename to __tests__/test-suite/groups/regex/case027.json diff --git a/test/test-suite/groups/regex/case028.json b/__tests__/test-suite/groups/regex/case028.json similarity index 100% rename from test/test-suite/groups/regex/case028.json rename to __tests__/test-suite/groups/regex/case028.json diff --git a/test/test-suite/groups/regex/case029.json b/__tests__/test-suite/groups/regex/case029.json similarity index 100% rename from test/test-suite/groups/regex/case029.json rename to __tests__/test-suite/groups/regex/case029.json diff --git a/test/test-suite/groups/regex/case030.json b/__tests__/test-suite/groups/regex/case030.json similarity index 100% rename from test/test-suite/groups/regex/case030.json rename to __tests__/test-suite/groups/regex/case030.json diff --git a/test/test-suite/groups/regex/case031.json b/__tests__/test-suite/groups/regex/case031.json similarity index 100% rename from test/test-suite/groups/regex/case031.json rename to __tests__/test-suite/groups/regex/case031.json diff --git a/test/test-suite/groups/regex/case032.json b/__tests__/test-suite/groups/regex/case032.json similarity index 100% rename from test/test-suite/groups/regex/case032.json rename to __tests__/test-suite/groups/regex/case032.json diff --git a/test/test-suite/groups/regex/case033.json b/__tests__/test-suite/groups/regex/case033.json similarity index 100% rename from test/test-suite/groups/regex/case033.json rename to __tests__/test-suite/groups/regex/case033.json diff --git a/test/test-suite/groups/regex/case034.json b/__tests__/test-suite/groups/regex/case034.json similarity index 100% rename from test/test-suite/groups/regex/case034.json rename to __tests__/test-suite/groups/regex/case034.json diff --git a/test/test-suite/groups/regex/case035.json b/__tests__/test-suite/groups/regex/case035.json similarity index 100% rename from test/test-suite/groups/regex/case035.json rename to __tests__/test-suite/groups/regex/case035.json diff --git a/test/test-suite/groups/regex/case036.json b/__tests__/test-suite/groups/regex/case036.json similarity index 100% rename from test/test-suite/groups/regex/case036.json rename to __tests__/test-suite/groups/regex/case036.json diff --git a/test/test-suite/groups/simple-array-selectors/case000.json b/__tests__/test-suite/groups/simple-array-selectors/case000.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case000.json rename to __tests__/test-suite/groups/simple-array-selectors/case000.json diff --git a/test/test-suite/groups/simple-array-selectors/case001.json b/__tests__/test-suite/groups/simple-array-selectors/case001.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case001.json rename to __tests__/test-suite/groups/simple-array-selectors/case001.json diff --git a/test/test-suite/groups/simple-array-selectors/case002.json b/__tests__/test-suite/groups/simple-array-selectors/case002.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case002.json rename to __tests__/test-suite/groups/simple-array-selectors/case002.json diff --git a/test/test-suite/groups/simple-array-selectors/case003.json b/__tests__/test-suite/groups/simple-array-selectors/case003.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case003.json rename to __tests__/test-suite/groups/simple-array-selectors/case003.json diff --git a/test/test-suite/groups/simple-array-selectors/case004.json b/__tests__/test-suite/groups/simple-array-selectors/case004.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case004.json rename to __tests__/test-suite/groups/simple-array-selectors/case004.json diff --git a/test/test-suite/groups/simple-array-selectors/case005.json b/__tests__/test-suite/groups/simple-array-selectors/case005.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case005.json rename to __tests__/test-suite/groups/simple-array-selectors/case005.json diff --git a/test/test-suite/groups/simple-array-selectors/case006.json b/__tests__/test-suite/groups/simple-array-selectors/case006.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case006.json rename to __tests__/test-suite/groups/simple-array-selectors/case006.json diff --git a/test/test-suite/groups/simple-array-selectors/case007.json b/__tests__/test-suite/groups/simple-array-selectors/case007.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case007.json rename to __tests__/test-suite/groups/simple-array-selectors/case007.json diff --git a/test/test-suite/groups/simple-array-selectors/case008.json b/__tests__/test-suite/groups/simple-array-selectors/case008.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case008.json rename to __tests__/test-suite/groups/simple-array-selectors/case008.json diff --git a/test/test-suite/groups/simple-array-selectors/case009.json b/__tests__/test-suite/groups/simple-array-selectors/case009.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case009.json rename to __tests__/test-suite/groups/simple-array-selectors/case009.json diff --git a/test/test-suite/groups/simple-array-selectors/case010.json b/__tests__/test-suite/groups/simple-array-selectors/case010.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case010.json rename to __tests__/test-suite/groups/simple-array-selectors/case010.json diff --git a/test/test-suite/groups/simple-array-selectors/case011.json b/__tests__/test-suite/groups/simple-array-selectors/case011.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case011.json rename to __tests__/test-suite/groups/simple-array-selectors/case011.json diff --git a/test/test-suite/groups/simple-array-selectors/case012.json b/__tests__/test-suite/groups/simple-array-selectors/case012.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case012.json rename to __tests__/test-suite/groups/simple-array-selectors/case012.json diff --git a/test/test-suite/groups/simple-array-selectors/case013.json b/__tests__/test-suite/groups/simple-array-selectors/case013.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case013.json rename to __tests__/test-suite/groups/simple-array-selectors/case013.json diff --git a/test/test-suite/groups/simple-array-selectors/case014.json b/__tests__/test-suite/groups/simple-array-selectors/case014.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case014.json rename to __tests__/test-suite/groups/simple-array-selectors/case014.json diff --git a/test/test-suite/groups/simple-array-selectors/case015.json b/__tests__/test-suite/groups/simple-array-selectors/case015.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case015.json rename to __tests__/test-suite/groups/simple-array-selectors/case015.json diff --git a/test/test-suite/groups/simple-array-selectors/case016.json b/__tests__/test-suite/groups/simple-array-selectors/case016.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case016.json rename to __tests__/test-suite/groups/simple-array-selectors/case016.json diff --git a/test/test-suite/groups/simple-array-selectors/case017.json b/__tests__/test-suite/groups/simple-array-selectors/case017.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case017.json rename to __tests__/test-suite/groups/simple-array-selectors/case017.json diff --git a/test/test-suite/groups/simple-array-selectors/case018.json b/__tests__/test-suite/groups/simple-array-selectors/case018.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case018.json rename to __tests__/test-suite/groups/simple-array-selectors/case018.json diff --git a/test/test-suite/groups/simple-array-selectors/case019.json b/__tests__/test-suite/groups/simple-array-selectors/case019.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case019.json rename to __tests__/test-suite/groups/simple-array-selectors/case019.json diff --git a/test/test-suite/groups/simple-array-selectors/case020.json b/__tests__/test-suite/groups/simple-array-selectors/case020.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case020.json rename to __tests__/test-suite/groups/simple-array-selectors/case020.json diff --git a/test/test-suite/groups/simple-array-selectors/case021.json b/__tests__/test-suite/groups/simple-array-selectors/case021.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case021.json rename to __tests__/test-suite/groups/simple-array-selectors/case021.json diff --git a/test/test-suite/groups/simple-array-selectors/case022.json b/__tests__/test-suite/groups/simple-array-selectors/case022.json similarity index 100% rename from test/test-suite/groups/simple-array-selectors/case022.json rename to __tests__/test-suite/groups/simple-array-selectors/case022.json diff --git a/test/test-suite/groups/sorting/case000.json b/__tests__/test-suite/groups/sorting/case000.json similarity index 100% rename from test/test-suite/groups/sorting/case000.json rename to __tests__/test-suite/groups/sorting/case000.json diff --git a/test/test-suite/groups/sorting/case001.json b/__tests__/test-suite/groups/sorting/case001.json similarity index 100% rename from test/test-suite/groups/sorting/case001.json rename to __tests__/test-suite/groups/sorting/case001.json diff --git a/test/test-suite/groups/sorting/case002.json b/__tests__/test-suite/groups/sorting/case002.json similarity index 100% rename from test/test-suite/groups/sorting/case002.json rename to __tests__/test-suite/groups/sorting/case002.json diff --git a/test/test-suite/groups/sorting/case003.json b/__tests__/test-suite/groups/sorting/case003.json similarity index 100% rename from test/test-suite/groups/sorting/case003.json rename to __tests__/test-suite/groups/sorting/case003.json diff --git a/test/test-suite/groups/sorting/case004.json b/__tests__/test-suite/groups/sorting/case004.json similarity index 100% rename from test/test-suite/groups/sorting/case004.json rename to __tests__/test-suite/groups/sorting/case004.json diff --git a/test/test-suite/groups/sorting/case005.json b/__tests__/test-suite/groups/sorting/case005.json similarity index 100% rename from test/test-suite/groups/sorting/case005.json rename to __tests__/test-suite/groups/sorting/case005.json diff --git a/test/test-suite/groups/sorting/case006.json b/__tests__/test-suite/groups/sorting/case006.json similarity index 100% rename from test/test-suite/groups/sorting/case006.json rename to __tests__/test-suite/groups/sorting/case006.json diff --git a/test/test-suite/groups/sorting/case007.json b/__tests__/test-suite/groups/sorting/case007.json similarity index 100% rename from test/test-suite/groups/sorting/case007.json rename to __tests__/test-suite/groups/sorting/case007.json diff --git a/test/test-suite/groups/sorting/case008.json b/__tests__/test-suite/groups/sorting/case008.json similarity index 100% rename from test/test-suite/groups/sorting/case008.json rename to __tests__/test-suite/groups/sorting/case008.json diff --git a/test/test-suite/groups/sorting/case009.json b/__tests__/test-suite/groups/sorting/case009.json similarity index 100% rename from test/test-suite/groups/sorting/case009.json rename to __tests__/test-suite/groups/sorting/case009.json diff --git a/test/test-suite/groups/sorting/case010.json b/__tests__/test-suite/groups/sorting/case010.json similarity index 100% rename from test/test-suite/groups/sorting/case010.json rename to __tests__/test-suite/groups/sorting/case010.json diff --git a/test/test-suite/groups/sorting/case011.json b/__tests__/test-suite/groups/sorting/case011.json similarity index 100% rename from test/test-suite/groups/sorting/case011.json rename to __tests__/test-suite/groups/sorting/case011.json diff --git a/test/test-suite/groups/sorting/case012.json b/__tests__/test-suite/groups/sorting/case012.json similarity index 100% rename from test/test-suite/groups/sorting/case012.json rename to __tests__/test-suite/groups/sorting/case012.json diff --git a/test/test-suite/groups/sorting/case013.json b/__tests__/test-suite/groups/sorting/case013.json similarity index 100% rename from test/test-suite/groups/sorting/case013.json rename to __tests__/test-suite/groups/sorting/case013.json diff --git a/test/test-suite/groups/string-concat/case000.json b/__tests__/test-suite/groups/string-concat/case000.json similarity index 100% rename from test/test-suite/groups/string-concat/case000.json rename to __tests__/test-suite/groups/string-concat/case000.json diff --git a/test/test-suite/groups/string-concat/case001.json b/__tests__/test-suite/groups/string-concat/case001.json similarity index 100% rename from test/test-suite/groups/string-concat/case001.json rename to __tests__/test-suite/groups/string-concat/case001.json diff --git a/test/test-suite/groups/string-concat/case002.json b/__tests__/test-suite/groups/string-concat/case002.json similarity index 100% rename from test/test-suite/groups/string-concat/case002.json rename to __tests__/test-suite/groups/string-concat/case002.json diff --git a/test/test-suite/groups/string-concat/case003.json b/__tests__/test-suite/groups/string-concat/case003.json similarity index 100% rename from test/test-suite/groups/string-concat/case003.json rename to __tests__/test-suite/groups/string-concat/case003.json diff --git a/test/test-suite/groups/string-concat/case004.json b/__tests__/test-suite/groups/string-concat/case004.json similarity index 100% rename from test/test-suite/groups/string-concat/case004.json rename to __tests__/test-suite/groups/string-concat/case004.json diff --git a/test/test-suite/groups/string-concat/case005.json b/__tests__/test-suite/groups/string-concat/case005.json similarity index 100% rename from test/test-suite/groups/string-concat/case005.json rename to __tests__/test-suite/groups/string-concat/case005.json diff --git a/test/test-suite/groups/string-concat/case006.json b/__tests__/test-suite/groups/string-concat/case006.json similarity index 100% rename from test/test-suite/groups/string-concat/case006.json rename to __tests__/test-suite/groups/string-concat/case006.json diff --git a/test/test-suite/groups/string-concat/case007.json b/__tests__/test-suite/groups/string-concat/case007.json similarity index 100% rename from test/test-suite/groups/string-concat/case007.json rename to __tests__/test-suite/groups/string-concat/case007.json diff --git a/test/test-suite/groups/string-concat/case008.json b/__tests__/test-suite/groups/string-concat/case008.json similarity index 100% rename from test/test-suite/groups/string-concat/case008.json rename to __tests__/test-suite/groups/string-concat/case008.json diff --git a/test/test-suite/groups/string-concat/case009.json b/__tests__/test-suite/groups/string-concat/case009.json similarity index 100% rename from test/test-suite/groups/string-concat/case009.json rename to __tests__/test-suite/groups/string-concat/case009.json diff --git a/test/test-suite/groups/string-concat/case010.json b/__tests__/test-suite/groups/string-concat/case010.json similarity index 100% rename from test/test-suite/groups/string-concat/case010.json rename to __tests__/test-suite/groups/string-concat/case010.json diff --git a/test/test-suite/groups/string-concat/case011.json b/__tests__/test-suite/groups/string-concat/case011.json similarity index 100% rename from test/test-suite/groups/string-concat/case011.json rename to __tests__/test-suite/groups/string-concat/case011.json diff --git a/test/test-suite/groups/tail-recursion/case000.json b/__tests__/test-suite/groups/tail-recursion/case000.json similarity index 100% rename from test/test-suite/groups/tail-recursion/case000.json rename to __tests__/test-suite/groups/tail-recursion/case000.json diff --git a/test/test-suite/groups/tail-recursion/case001.json b/__tests__/test-suite/groups/tail-recursion/case001.json similarity index 90% rename from test/test-suite/groups/tail-recursion/case001.json rename to __tests__/test-suite/groups/tail-recursion/case001.json index c9fdf2f9..15ef1d31 100644 --- a/test/test-suite/groups/tail-recursion/case001.json +++ b/__tests__/test-suite/groups/tail-recursion/case001.json @@ -1,7 +1,7 @@ { "expr": "( $factorial := function($n){$n = 0 ? 1 : $n * $factorial($n - 1)}; $factorial(99)) ", "dataset": null, - "timelimit": 1000, + "timelimit": 2000, "depth": 302, "bindings": {}, "result": 9.33262154439441e+155 diff --git a/test/test-suite/groups/tail-recursion/case002.json b/__tests__/test-suite/groups/tail-recursion/case002.json similarity index 100% rename from test/test-suite/groups/tail-recursion/case002.json rename to __tests__/test-suite/groups/tail-recursion/case002.json diff --git a/test/test-suite/groups/tail-recursion/case003.json b/__tests__/test-suite/groups/tail-recursion/case003.json similarity index 100% rename from test/test-suite/groups/tail-recursion/case003.json rename to __tests__/test-suite/groups/tail-recursion/case003.json diff --git a/test/test-suite/groups/tail-recursion/case004.json b/__tests__/test-suite/groups/tail-recursion/case004.json similarity index 100% rename from test/test-suite/groups/tail-recursion/case004.json rename to __tests__/test-suite/groups/tail-recursion/case004.json diff --git a/test/test-suite/groups/tail-recursion/case005.json b/__tests__/test-suite/groups/tail-recursion/case005.json similarity index 100% rename from test/test-suite/groups/tail-recursion/case005.json rename to __tests__/test-suite/groups/tail-recursion/case005.json diff --git a/test/test-suite/groups/tail-recursion/case006.json b/__tests__/test-suite/groups/tail-recursion/case006.json similarity index 100% rename from test/test-suite/groups/tail-recursion/case006.json rename to __tests__/test-suite/groups/tail-recursion/case006.json diff --git a/test/test-suite/groups/tail-recursion/case007.json b/__tests__/test-suite/groups/tail-recursion/case007.json similarity index 100% rename from test/test-suite/groups/tail-recursion/case007.json rename to __tests__/test-suite/groups/tail-recursion/case007.json diff --git a/test/test-suite/groups/transform/case000.json b/__tests__/test-suite/groups/transform/case000.json similarity index 100% rename from test/test-suite/groups/transform/case000.json rename to __tests__/test-suite/groups/transform/case000.json diff --git a/test/test-suite/groups/transform/case001.json b/__tests__/test-suite/groups/transform/case001.json similarity index 100% rename from test/test-suite/groups/transform/case001.json rename to __tests__/test-suite/groups/transform/case001.json diff --git a/test/test-suite/groups/transform/case002.json b/__tests__/test-suite/groups/transform/case002.json similarity index 100% rename from test/test-suite/groups/transform/case002.json rename to __tests__/test-suite/groups/transform/case002.json diff --git a/test/test-suite/groups/transform/case003.json b/__tests__/test-suite/groups/transform/case003.json similarity index 100% rename from test/test-suite/groups/transform/case003.json rename to __tests__/test-suite/groups/transform/case003.json diff --git a/test/test-suite/groups/transform/case004.json b/__tests__/test-suite/groups/transform/case004.json similarity index 100% rename from test/test-suite/groups/transform/case004.json rename to __tests__/test-suite/groups/transform/case004.json diff --git a/test/test-suite/groups/transform/case005.json b/__tests__/test-suite/groups/transform/case005.json similarity index 100% rename from test/test-suite/groups/transform/case005.json rename to __tests__/test-suite/groups/transform/case005.json diff --git a/test/test-suite/groups/transform/case006.json b/__tests__/test-suite/groups/transform/case006.json similarity index 100% rename from test/test-suite/groups/transform/case006.json rename to __tests__/test-suite/groups/transform/case006.json diff --git a/test/test-suite/groups/transform/case007.json b/__tests__/test-suite/groups/transform/case007.json similarity index 100% rename from test/test-suite/groups/transform/case007.json rename to __tests__/test-suite/groups/transform/case007.json diff --git a/test/test-suite/groups/transform/case008.json b/__tests__/test-suite/groups/transform/case008.json similarity index 100% rename from test/test-suite/groups/transform/case008.json rename to __tests__/test-suite/groups/transform/case008.json diff --git a/test/test-suite/groups/transform/case009.json b/__tests__/test-suite/groups/transform/case009.json similarity index 100% rename from test/test-suite/groups/transform/case009.json rename to __tests__/test-suite/groups/transform/case009.json diff --git a/test/test-suite/groups/transform/case010.json b/__tests__/test-suite/groups/transform/case010.json similarity index 100% rename from test/test-suite/groups/transform/case010.json rename to __tests__/test-suite/groups/transform/case010.json diff --git a/test/test-suite/groups/transform/case011.json b/__tests__/test-suite/groups/transform/case011.json similarity index 100% rename from test/test-suite/groups/transform/case011.json rename to __tests__/test-suite/groups/transform/case011.json diff --git a/test/test-suite/groups/transform/case012.json b/__tests__/test-suite/groups/transform/case012.json similarity index 100% rename from test/test-suite/groups/transform/case012.json rename to __tests__/test-suite/groups/transform/case012.json diff --git a/test/test-suite/groups/transform/case013.json b/__tests__/test-suite/groups/transform/case013.json similarity index 100% rename from test/test-suite/groups/transform/case013.json rename to __tests__/test-suite/groups/transform/case013.json diff --git a/test/test-suite/groups/transform/case014.json b/__tests__/test-suite/groups/transform/case014.json similarity index 100% rename from test/test-suite/groups/transform/case014.json rename to __tests__/test-suite/groups/transform/case014.json diff --git a/test/test-suite/groups/transform/case015.json b/__tests__/test-suite/groups/transform/case015.json similarity index 100% rename from test/test-suite/groups/transform/case015.json rename to __tests__/test-suite/groups/transform/case015.json diff --git a/test/test-suite/groups/transform/case016.json b/__tests__/test-suite/groups/transform/case016.json similarity index 100% rename from test/test-suite/groups/transform/case016.json rename to __tests__/test-suite/groups/transform/case016.json diff --git a/test/test-suite/groups/transform/case017.json b/__tests__/test-suite/groups/transform/case017.json similarity index 100% rename from test/test-suite/groups/transform/case017.json rename to __tests__/test-suite/groups/transform/case017.json diff --git a/test/test-suite/groups/transform/case018.json b/__tests__/test-suite/groups/transform/case018.json similarity index 100% rename from test/test-suite/groups/transform/case018.json rename to __tests__/test-suite/groups/transform/case018.json diff --git a/test/test-suite/groups/transform/case019.json b/__tests__/test-suite/groups/transform/case019.json similarity index 100% rename from test/test-suite/groups/transform/case019.json rename to __tests__/test-suite/groups/transform/case019.json diff --git a/test/test-suite/groups/transform/case020.json b/__tests__/test-suite/groups/transform/case020.json similarity index 100% rename from test/test-suite/groups/transform/case020.json rename to __tests__/test-suite/groups/transform/case020.json diff --git a/test/test-suite/groups/transform/case021.json b/__tests__/test-suite/groups/transform/case021.json similarity index 100% rename from test/test-suite/groups/transform/case021.json rename to __tests__/test-suite/groups/transform/case021.json diff --git a/test/test-suite/groups/transform/case022.json b/__tests__/test-suite/groups/transform/case022.json similarity index 100% rename from test/test-suite/groups/transform/case022.json rename to __tests__/test-suite/groups/transform/case022.json diff --git a/test/test-suite/groups/transform/case023.json b/__tests__/test-suite/groups/transform/case023.json similarity index 100% rename from test/test-suite/groups/transform/case023.json rename to __tests__/test-suite/groups/transform/case023.json diff --git a/test/test-suite/groups/transform/case024.json b/__tests__/test-suite/groups/transform/case024.json similarity index 100% rename from test/test-suite/groups/transform/case024.json rename to __tests__/test-suite/groups/transform/case024.json diff --git a/test/test-suite/groups/transform/case025.json b/__tests__/test-suite/groups/transform/case025.json similarity index 100% rename from test/test-suite/groups/transform/case025.json rename to __tests__/test-suite/groups/transform/case025.json diff --git a/test/test-suite/groups/transform/case026.json b/__tests__/test-suite/groups/transform/case026.json similarity index 100% rename from test/test-suite/groups/transform/case026.json rename to __tests__/test-suite/groups/transform/case026.json diff --git a/test/test-suite/groups/transform/case027.json b/__tests__/test-suite/groups/transform/case027.json similarity index 100% rename from test/test-suite/groups/transform/case027.json rename to __tests__/test-suite/groups/transform/case027.json diff --git a/test/test-suite/groups/transform/case028.json b/__tests__/test-suite/groups/transform/case028.json similarity index 100% rename from test/test-suite/groups/transform/case028.json rename to __tests__/test-suite/groups/transform/case028.json diff --git a/test/test-suite/groups/transform/case029.json b/__tests__/test-suite/groups/transform/case029.json similarity index 100% rename from test/test-suite/groups/transform/case029.json rename to __tests__/test-suite/groups/transform/case029.json diff --git a/test/test-suite/groups/transform/case030.json b/__tests__/test-suite/groups/transform/case030.json similarity index 100% rename from test/test-suite/groups/transform/case030.json rename to __tests__/test-suite/groups/transform/case030.json diff --git a/test/test-suite/groups/transform/case031.json b/__tests__/test-suite/groups/transform/case031.json similarity index 100% rename from test/test-suite/groups/transform/case031.json rename to __tests__/test-suite/groups/transform/case031.json diff --git a/test/test-suite/groups/transform/case032.json b/__tests__/test-suite/groups/transform/case032.json similarity index 100% rename from test/test-suite/groups/transform/case032.json rename to __tests__/test-suite/groups/transform/case032.json diff --git a/test/test-suite/groups/transform/case033.json b/__tests__/test-suite/groups/transform/case033.json similarity index 100% rename from test/test-suite/groups/transform/case033.json rename to __tests__/test-suite/groups/transform/case033.json diff --git a/test/test-suite/groups/transform/case034.json b/__tests__/test-suite/groups/transform/case034.json similarity index 100% rename from test/test-suite/groups/transform/case034.json rename to __tests__/test-suite/groups/transform/case034.json diff --git a/test/test-suite/groups/transform/case035.json b/__tests__/test-suite/groups/transform/case035.json similarity index 100% rename from test/test-suite/groups/transform/case035.json rename to __tests__/test-suite/groups/transform/case035.json diff --git a/test/test-suite/groups/transform/case036.json b/__tests__/test-suite/groups/transform/case036.json similarity index 100% rename from test/test-suite/groups/transform/case036.json rename to __tests__/test-suite/groups/transform/case036.json diff --git a/test/test-suite/groups/transform/case037.json b/__tests__/test-suite/groups/transform/case037.json similarity index 100% rename from test/test-suite/groups/transform/case037.json rename to __tests__/test-suite/groups/transform/case037.json diff --git a/test/test-suite/groups/transform/case038.json b/__tests__/test-suite/groups/transform/case038.json similarity index 100% rename from test/test-suite/groups/transform/case038.json rename to __tests__/test-suite/groups/transform/case038.json diff --git a/test/test-suite/groups/transform/case039.json b/__tests__/test-suite/groups/transform/case039.json similarity index 100% rename from test/test-suite/groups/transform/case039.json rename to __tests__/test-suite/groups/transform/case039.json diff --git a/test/test-suite/groups/transform/case040.json b/__tests__/test-suite/groups/transform/case040.json similarity index 100% rename from test/test-suite/groups/transform/case040.json rename to __tests__/test-suite/groups/transform/case040.json diff --git a/test/test-suite/groups/transform/case041.json b/__tests__/test-suite/groups/transform/case041.json similarity index 100% rename from test/test-suite/groups/transform/case041.json rename to __tests__/test-suite/groups/transform/case041.json diff --git a/test/test-suite/groups/transform/case042.json b/__tests__/test-suite/groups/transform/case042.json similarity index 100% rename from test/test-suite/groups/transform/case042.json rename to __tests__/test-suite/groups/transform/case042.json diff --git a/test/test-suite/groups/transform/case043.json b/__tests__/test-suite/groups/transform/case043.json similarity index 100% rename from test/test-suite/groups/transform/case043.json rename to __tests__/test-suite/groups/transform/case043.json diff --git a/test/test-suite/groups/transform/case044.json b/__tests__/test-suite/groups/transform/case044.json similarity index 100% rename from test/test-suite/groups/transform/case044.json rename to __tests__/test-suite/groups/transform/case044.json diff --git a/test/test-suite/groups/transform/case045.json b/__tests__/test-suite/groups/transform/case045.json similarity index 100% rename from test/test-suite/groups/transform/case045.json rename to __tests__/test-suite/groups/transform/case045.json diff --git a/test/test-suite/groups/transform/case046.json b/__tests__/test-suite/groups/transform/case046.json similarity index 100% rename from test/test-suite/groups/transform/case046.json rename to __tests__/test-suite/groups/transform/case046.json diff --git a/test/test-suite/groups/transform/case047.json b/__tests__/test-suite/groups/transform/case047.json similarity index 100% rename from test/test-suite/groups/transform/case047.json rename to __tests__/test-suite/groups/transform/case047.json diff --git a/test/test-suite/groups/transform/case048.json b/__tests__/test-suite/groups/transform/case048.json similarity index 100% rename from test/test-suite/groups/transform/case048.json rename to __tests__/test-suite/groups/transform/case048.json diff --git a/test/test-suite/groups/transform/case049.json b/__tests__/test-suite/groups/transform/case049.json similarity index 100% rename from test/test-suite/groups/transform/case049.json rename to __tests__/test-suite/groups/transform/case049.json diff --git a/test/test-suite/groups/transform/case050.json b/__tests__/test-suite/groups/transform/case050.json similarity index 100% rename from test/test-suite/groups/transform/case050.json rename to __tests__/test-suite/groups/transform/case050.json diff --git a/test/test-suite/groups/transform/case051.json b/__tests__/test-suite/groups/transform/case051.json similarity index 100% rename from test/test-suite/groups/transform/case051.json rename to __tests__/test-suite/groups/transform/case051.json diff --git a/test/test-suite/groups/transform/case052.json b/__tests__/test-suite/groups/transform/case052.json similarity index 100% rename from test/test-suite/groups/transform/case052.json rename to __tests__/test-suite/groups/transform/case052.json diff --git a/test/test-suite/groups/transform/case053.json b/__tests__/test-suite/groups/transform/case053.json similarity index 100% rename from test/test-suite/groups/transform/case053.json rename to __tests__/test-suite/groups/transform/case053.json diff --git a/test/test-suite/groups/transform/case054.json b/__tests__/test-suite/groups/transform/case054.json similarity index 100% rename from test/test-suite/groups/transform/case054.json rename to __tests__/test-suite/groups/transform/case054.json diff --git a/test/test-suite/groups/transform/case055.json b/__tests__/test-suite/groups/transform/case055.json similarity index 100% rename from test/test-suite/groups/transform/case055.json rename to __tests__/test-suite/groups/transform/case055.json diff --git a/test/test-suite/groups/transform/case056.json b/__tests__/test-suite/groups/transform/case056.json similarity index 100% rename from test/test-suite/groups/transform/case056.json rename to __tests__/test-suite/groups/transform/case056.json diff --git a/test/test-suite/groups/transform/case057.json b/__tests__/test-suite/groups/transform/case057.json similarity index 100% rename from test/test-suite/groups/transform/case057.json rename to __tests__/test-suite/groups/transform/case057.json diff --git a/test/test-suite/groups/transform/case058.json b/__tests__/test-suite/groups/transform/case058.json similarity index 100% rename from test/test-suite/groups/transform/case058.json rename to __tests__/test-suite/groups/transform/case058.json diff --git a/test/test-suite/groups/transform/case059.json b/__tests__/test-suite/groups/transform/case059.json similarity index 100% rename from test/test-suite/groups/transform/case059.json rename to __tests__/test-suite/groups/transform/case059.json diff --git a/test/test-suite/groups/transform/case060.json b/__tests__/test-suite/groups/transform/case060.json similarity index 100% rename from test/test-suite/groups/transform/case060.json rename to __tests__/test-suite/groups/transform/case060.json diff --git a/test/test-suite/groups/transform/case061.json b/__tests__/test-suite/groups/transform/case061.json similarity index 100% rename from test/test-suite/groups/transform/case061.json rename to __tests__/test-suite/groups/transform/case061.json diff --git a/test/test-suite/groups/transform/case062.json b/__tests__/test-suite/groups/transform/case062.json similarity index 100% rename from test/test-suite/groups/transform/case062.json rename to __tests__/test-suite/groups/transform/case062.json diff --git a/test/test-suite/groups/transform/case063.json b/__tests__/test-suite/groups/transform/case063.json similarity index 100% rename from test/test-suite/groups/transform/case063.json rename to __tests__/test-suite/groups/transform/case063.json diff --git a/test/test-suite/groups/transform/case064.json b/__tests__/test-suite/groups/transform/case064.json similarity index 100% rename from test/test-suite/groups/transform/case064.json rename to __tests__/test-suite/groups/transform/case064.json diff --git a/test/test-suite/groups/transform/case065.json b/__tests__/test-suite/groups/transform/case065.json similarity index 100% rename from test/test-suite/groups/transform/case065.json rename to __tests__/test-suite/groups/transform/case065.json diff --git a/test/test-suite/groups/transform/case066.json b/__tests__/test-suite/groups/transform/case066.json similarity index 100% rename from test/test-suite/groups/transform/case066.json rename to __tests__/test-suite/groups/transform/case066.json diff --git a/test/test-suite/groups/transform/case067.json b/__tests__/test-suite/groups/transform/case067.json similarity index 100% rename from test/test-suite/groups/transform/case067.json rename to __tests__/test-suite/groups/transform/case067.json diff --git a/test/test-suite/groups/transform/case068.json b/__tests__/test-suite/groups/transform/case068.json similarity index 100% rename from test/test-suite/groups/transform/case068.json rename to __tests__/test-suite/groups/transform/case068.json diff --git a/test/test-suite/groups/transform/case069.json b/__tests__/test-suite/groups/transform/case069.json similarity index 100% rename from test/test-suite/groups/transform/case069.json rename to __tests__/test-suite/groups/transform/case069.json diff --git a/test/test-suite/groups/transform/case070.json b/__tests__/test-suite/groups/transform/case070.json similarity index 100% rename from test/test-suite/groups/transform/case070.json rename to __tests__/test-suite/groups/transform/case070.json diff --git a/test/test-suite/groups/transform/case071.json b/__tests__/test-suite/groups/transform/case071.json similarity index 100% rename from test/test-suite/groups/transform/case071.json rename to __tests__/test-suite/groups/transform/case071.json diff --git a/test/test-suite/groups/transform/case072.json b/__tests__/test-suite/groups/transform/case072.json similarity index 100% rename from test/test-suite/groups/transform/case072.json rename to __tests__/test-suite/groups/transform/case072.json diff --git a/test/test-suite/groups/transform/case073.json b/__tests__/test-suite/groups/transform/case073.json similarity index 100% rename from test/test-suite/groups/transform/case073.json rename to __tests__/test-suite/groups/transform/case073.json diff --git a/test/test-suite/groups/transform/case074.json b/__tests__/test-suite/groups/transform/case074.json similarity index 100% rename from test/test-suite/groups/transform/case074.json rename to __tests__/test-suite/groups/transform/case074.json diff --git a/test/test-suite/groups/transform/case075.json b/__tests__/test-suite/groups/transform/case075.json similarity index 100% rename from test/test-suite/groups/transform/case075.json rename to __tests__/test-suite/groups/transform/case075.json diff --git a/test/test-suite/groups/transform/case076.json b/__tests__/test-suite/groups/transform/case076.json similarity index 100% rename from test/test-suite/groups/transform/case076.json rename to __tests__/test-suite/groups/transform/case076.json diff --git a/test/test-suite/groups/transform/case077.json b/__tests__/test-suite/groups/transform/case077.json similarity index 100% rename from test/test-suite/groups/transform/case077.json rename to __tests__/test-suite/groups/transform/case077.json diff --git a/test/test-suite/groups/transform/case078.json b/__tests__/test-suite/groups/transform/case078.json similarity index 100% rename from test/test-suite/groups/transform/case078.json rename to __tests__/test-suite/groups/transform/case078.json diff --git a/test/test-suite/groups/transform/case079.json b/__tests__/test-suite/groups/transform/case079.json similarity index 100% rename from test/test-suite/groups/transform/case079.json rename to __tests__/test-suite/groups/transform/case079.json diff --git a/test/test-suite/groups/transform/case080.json b/__tests__/test-suite/groups/transform/case080.json similarity index 100% rename from test/test-suite/groups/transform/case080.json rename to __tests__/test-suite/groups/transform/case080.json diff --git a/test/test-suite/groups/transform/case081.json b/__tests__/test-suite/groups/transform/case081.json similarity index 100% rename from test/test-suite/groups/transform/case081.json rename to __tests__/test-suite/groups/transform/case081.json diff --git a/test/test-suite/groups/transform/case082.json b/__tests__/test-suite/groups/transform/case082.json similarity index 100% rename from test/test-suite/groups/transform/case082.json rename to __tests__/test-suite/groups/transform/case082.json diff --git a/test/test-suite/groups/transform/case083.json b/__tests__/test-suite/groups/transform/case083.json similarity index 100% rename from test/test-suite/groups/transform/case083.json rename to __tests__/test-suite/groups/transform/case083.json diff --git a/test/test-suite/groups/transform/case084.json b/__tests__/test-suite/groups/transform/case084.json similarity index 100% rename from test/test-suite/groups/transform/case084.json rename to __tests__/test-suite/groups/transform/case084.json diff --git a/test/test-suite/groups/transform/case085.json b/__tests__/test-suite/groups/transform/case085.json similarity index 100% rename from test/test-suite/groups/transform/case085.json rename to __tests__/test-suite/groups/transform/case085.json diff --git a/test/test-suite/groups/transform/case086.json b/__tests__/test-suite/groups/transform/case086.json similarity index 100% rename from test/test-suite/groups/transform/case086.json rename to __tests__/test-suite/groups/transform/case086.json diff --git a/test/test-suite/groups/transform/case087.json b/__tests__/test-suite/groups/transform/case087.json similarity index 100% rename from test/test-suite/groups/transform/case087.json rename to __tests__/test-suite/groups/transform/case087.json diff --git a/test/test-suite/groups/transform/case088.json b/__tests__/test-suite/groups/transform/case088.json similarity index 100% rename from test/test-suite/groups/transform/case088.json rename to __tests__/test-suite/groups/transform/case088.json diff --git a/test/test-suite/groups/transform/case089.json b/__tests__/test-suite/groups/transform/case089.json similarity index 100% rename from test/test-suite/groups/transform/case089.json rename to __tests__/test-suite/groups/transform/case089.json diff --git a/test/test-suite/groups/transform/case090.json b/__tests__/test-suite/groups/transform/case090.json similarity index 100% rename from test/test-suite/groups/transform/case090.json rename to __tests__/test-suite/groups/transform/case090.json diff --git a/test/test-suite/groups/transform/case091.json b/__tests__/test-suite/groups/transform/case091.json similarity index 100% rename from test/test-suite/groups/transform/case091.json rename to __tests__/test-suite/groups/transform/case091.json diff --git a/test/test-suite/groups/transform/case092.json b/__tests__/test-suite/groups/transform/case092.json similarity index 100% rename from test/test-suite/groups/transform/case092.json rename to __tests__/test-suite/groups/transform/case092.json diff --git a/test/test-suite/groups/transform/case093.json b/__tests__/test-suite/groups/transform/case093.json similarity index 100% rename from test/test-suite/groups/transform/case093.json rename to __tests__/test-suite/groups/transform/case093.json diff --git a/test/test-suite/groups/transform/case094.json b/__tests__/test-suite/groups/transform/case094.json similarity index 100% rename from test/test-suite/groups/transform/case094.json rename to __tests__/test-suite/groups/transform/case094.json diff --git a/test/test-suite/groups/transform/case095.json b/__tests__/test-suite/groups/transform/case095.json similarity index 100% rename from test/test-suite/groups/transform/case095.json rename to __tests__/test-suite/groups/transform/case095.json diff --git a/test/test-suite/groups/transform/case096.json b/__tests__/test-suite/groups/transform/case096.json similarity index 100% rename from test/test-suite/groups/transform/case096.json rename to __tests__/test-suite/groups/transform/case096.json diff --git a/test/test-suite/groups/transform/case097.json b/__tests__/test-suite/groups/transform/case097.json similarity index 100% rename from test/test-suite/groups/transform/case097.json rename to __tests__/test-suite/groups/transform/case097.json diff --git a/test/test-suite/groups/transform/case098.json b/__tests__/test-suite/groups/transform/case098.json similarity index 100% rename from test/test-suite/groups/transform/case098.json rename to __tests__/test-suite/groups/transform/case098.json diff --git a/test/test-suite/groups/transform/case099.json b/__tests__/test-suite/groups/transform/case099.json similarity index 100% rename from test/test-suite/groups/transform/case099.json rename to __tests__/test-suite/groups/transform/case099.json diff --git a/test/test-suite/groups/transform/case100.json b/__tests__/test-suite/groups/transform/case100.json similarity index 100% rename from test/test-suite/groups/transform/case100.json rename to __tests__/test-suite/groups/transform/case100.json diff --git a/test/test-suite/groups/transform/case101.json b/__tests__/test-suite/groups/transform/case101.json similarity index 100% rename from test/test-suite/groups/transform/case101.json rename to __tests__/test-suite/groups/transform/case101.json diff --git a/test/test-suite/groups/transform/case102.json b/__tests__/test-suite/groups/transform/case102.json similarity index 100% rename from test/test-suite/groups/transform/case102.json rename to __tests__/test-suite/groups/transform/case102.json diff --git a/test/test-suite/groups/transform/case103.json b/__tests__/test-suite/groups/transform/case103.json similarity index 100% rename from test/test-suite/groups/transform/case103.json rename to __tests__/test-suite/groups/transform/case103.json diff --git a/test/test-suite/groups/transforms/case000.json b/__tests__/test-suite/groups/transforms/case000.json similarity index 100% rename from test/test-suite/groups/transforms/case000.json rename to __tests__/test-suite/groups/transforms/case000.json diff --git a/test/test-suite/groups/transforms/case001.json b/__tests__/test-suite/groups/transforms/case001.json similarity index 100% rename from test/test-suite/groups/transforms/case001.json rename to __tests__/test-suite/groups/transforms/case001.json diff --git a/test/test-suite/groups/transforms/case002.json b/__tests__/test-suite/groups/transforms/case002.json similarity index 100% rename from test/test-suite/groups/transforms/case002.json rename to __tests__/test-suite/groups/transforms/case002.json diff --git a/test/test-suite/groups/transforms/case003.json b/__tests__/test-suite/groups/transforms/case003.json similarity index 100% rename from test/test-suite/groups/transforms/case003.json rename to __tests__/test-suite/groups/transforms/case003.json diff --git a/test/test-suite/groups/transforms/case004.json b/__tests__/test-suite/groups/transforms/case004.json similarity index 100% rename from test/test-suite/groups/transforms/case004.json rename to __tests__/test-suite/groups/transforms/case004.json diff --git a/test/test-suite/groups/transforms/case005.json b/__tests__/test-suite/groups/transforms/case005.json similarity index 100% rename from test/test-suite/groups/transforms/case005.json rename to __tests__/test-suite/groups/transforms/case005.json diff --git a/test/test-suite/groups/transforms/case006.json b/__tests__/test-suite/groups/transforms/case006.json similarity index 100% rename from test/test-suite/groups/transforms/case006.json rename to __tests__/test-suite/groups/transforms/case006.json diff --git a/test/test-suite/groups/transforms/case007.json b/__tests__/test-suite/groups/transforms/case007.json similarity index 100% rename from test/test-suite/groups/transforms/case007.json rename to __tests__/test-suite/groups/transforms/case007.json diff --git a/test/test-suite/groups/transforms/case008.json b/__tests__/test-suite/groups/transforms/case008.json similarity index 100% rename from test/test-suite/groups/transforms/case008.json rename to __tests__/test-suite/groups/transforms/case008.json diff --git a/test/test-suite/groups/transforms/case009.json b/__tests__/test-suite/groups/transforms/case009.json similarity index 100% rename from test/test-suite/groups/transforms/case009.json rename to __tests__/test-suite/groups/transforms/case009.json diff --git a/test/test-suite/groups/transforms/case010.json b/__tests__/test-suite/groups/transforms/case010.json similarity index 100% rename from test/test-suite/groups/transforms/case010.json rename to __tests__/test-suite/groups/transforms/case010.json diff --git a/test/test-suite/groups/transforms/case011.json b/__tests__/test-suite/groups/transforms/case011.json similarity index 100% rename from test/test-suite/groups/transforms/case011.json rename to __tests__/test-suite/groups/transforms/case011.json diff --git a/test/test-suite/groups/transforms/case012.json b/__tests__/test-suite/groups/transforms/case012.json similarity index 100% rename from test/test-suite/groups/transforms/case012.json rename to __tests__/test-suite/groups/transforms/case012.json diff --git a/test/test-suite/groups/variables/case000.json b/__tests__/test-suite/groups/variables/case000.json similarity index 100% rename from test/test-suite/groups/variables/case000.json rename to __tests__/test-suite/groups/variables/case000.json diff --git a/test/test-suite/groups/variables/case001.json b/__tests__/test-suite/groups/variables/case001.json similarity index 100% rename from test/test-suite/groups/variables/case001.json rename to __tests__/test-suite/groups/variables/case001.json diff --git a/test/test-suite/groups/variables/case002.json b/__tests__/test-suite/groups/variables/case002.json similarity index 100% rename from test/test-suite/groups/variables/case002.json rename to __tests__/test-suite/groups/variables/case002.json diff --git a/test/test-suite/groups/variables/case003.json b/__tests__/test-suite/groups/variables/case003.json similarity index 100% rename from test/test-suite/groups/variables/case003.json rename to __tests__/test-suite/groups/variables/case003.json diff --git a/test/test-suite/groups/variables/case004.json b/__tests__/test-suite/groups/variables/case004.json similarity index 100% rename from test/test-suite/groups/variables/case004.json rename to __tests__/test-suite/groups/variables/case004.json diff --git a/test/test-suite/groups/variables/case005.json b/__tests__/test-suite/groups/variables/case005.json similarity index 100% rename from test/test-suite/groups/variables/case005.json rename to __tests__/test-suite/groups/variables/case005.json diff --git a/test/test-suite/groups/variables/case006.json b/__tests__/test-suite/groups/variables/case006.json similarity index 100% rename from test/test-suite/groups/variables/case006.json rename to __tests__/test-suite/groups/variables/case006.json diff --git a/test/test-suite/groups/variables/case007.json b/__tests__/test-suite/groups/variables/case007.json similarity index 100% rename from test/test-suite/groups/variables/case007.json rename to __tests__/test-suite/groups/variables/case007.json diff --git a/test/test-suite/groups/variables/case008.json b/__tests__/test-suite/groups/variables/case008.json similarity index 100% rename from test/test-suite/groups/variables/case008.json rename to __tests__/test-suite/groups/variables/case008.json diff --git a/test/test-suite/groups/variables/case009.json b/__tests__/test-suite/groups/variables/case009.json similarity index 100% rename from test/test-suite/groups/variables/case009.json rename to __tests__/test-suite/groups/variables/case009.json diff --git a/test/test-suite/groups/variables/case010.json b/__tests__/test-suite/groups/variables/case010.json similarity index 100% rename from test/test-suite/groups/variables/case010.json rename to __tests__/test-suite/groups/variables/case010.json diff --git a/test/test-suite/groups/variables/case011.json b/__tests__/test-suite/groups/variables/case011.json similarity index 100% rename from test/test-suite/groups/variables/case011.json rename to __tests__/test-suite/groups/variables/case011.json diff --git a/test/test-suite/groups/wildcards/case000.json b/__tests__/test-suite/groups/wildcards/case000.json similarity index 100% rename from test/test-suite/groups/wildcards/case000.json rename to __tests__/test-suite/groups/wildcards/case000.json diff --git a/test/test-suite/groups/wildcards/case001.json b/__tests__/test-suite/groups/wildcards/case001.json similarity index 100% rename from test/test-suite/groups/wildcards/case001.json rename to __tests__/test-suite/groups/wildcards/case001.json diff --git a/test/test-suite/groups/wildcards/case002.json b/__tests__/test-suite/groups/wildcards/case002.json similarity index 100% rename from test/test-suite/groups/wildcards/case002.json rename to __tests__/test-suite/groups/wildcards/case002.json diff --git a/test/test-suite/groups/wildcards/case003.json b/__tests__/test-suite/groups/wildcards/case003.json similarity index 100% rename from test/test-suite/groups/wildcards/case003.json rename to __tests__/test-suite/groups/wildcards/case003.json diff --git a/test/test-suite/groups/wildcards/case004.json b/__tests__/test-suite/groups/wildcards/case004.json similarity index 100% rename from test/test-suite/groups/wildcards/case004.json rename to __tests__/test-suite/groups/wildcards/case004.json diff --git a/test/test-suite/groups/wildcards/case005.json b/__tests__/test-suite/groups/wildcards/case005.json similarity index 100% rename from test/test-suite/groups/wildcards/case005.json rename to __tests__/test-suite/groups/wildcards/case005.json diff --git a/test/test-suite/groups/wildcards/case006.json b/__tests__/test-suite/groups/wildcards/case006.json similarity index 100% rename from test/test-suite/groups/wildcards/case006.json rename to __tests__/test-suite/groups/wildcards/case006.json diff --git a/test/test-suite/groups/wildcards/case007.json b/__tests__/test-suite/groups/wildcards/case007.json similarity index 100% rename from test/test-suite/groups/wildcards/case007.json rename to __tests__/test-suite/groups/wildcards/case007.json diff --git a/test/test-suite/groups/wildcards/case008.json b/__tests__/test-suite/groups/wildcards/case008.json similarity index 100% rename from test/test-suite/groups/wildcards/case008.json rename to __tests__/test-suite/groups/wildcards/case008.json diff --git a/test/test-suite/groups/wildcards/case009.json b/__tests__/test-suite/groups/wildcards/case009.json similarity index 100% rename from test/test-suite/groups/wildcards/case009.json rename to __tests__/test-suite/groups/wildcards/case009.json diff --git a/jsonata.d.ts b/jsonata.d.ts deleted file mode 100644 index cb55c8e7..00000000 --- a/jsonata.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Type definitions for jsonata 1.4 -// Project: https://github.com/jsonata-js/jsonata -// Definitions by: Nick and Michael M. Tiller - -declare function jsonata(str: string): jsonata.Expression; -declare namespace jsonata { - interface ExprNode { - type: string; - value: any; - position: number; - } - interface Expression { - evaluate(input: any, bindings?: { [name: string]: any }, callback?: (err: Error, resp: any) => void): any; - assign(name: string, value: any): void; - registerFunction(name: string, f: Function, signature?: string): void; - ast(): ExprNode; - } -} - -export = jsonata; \ No newline at end of file diff --git a/jsonata.js b/jsonata.js deleted file mode 100644 index 291e758a..00000000 --- a/jsonata.js +++ /dev/null @@ -1,5008 +0,0 @@ -/** - * © Copyright IBM Corp. 2016, 2017 All Rights Reserved - * Project name: JSONata - * This project is licensed under the MIT License, see LICENSE - */ - -/** - * @module JSONata - * @description JSON query and transformation language - */ - -/** - * jsonata - * @function - * @param {Object} expr - JSONata expression - * @returns {{evaluate: evaluate, assign: assign}} Evaluated expression - */ -var jsonata = (function() { - 'use strict'; - - var operators = { - '.': 75, - '[': 80, - ']': 0, - '{': 70, - '}': 0, - '(': 80, - ')': 0, - ',': 0, - '@': 75, - '#': 70, - ';': 80, - ':': 80, - '?': 20, - '+': 50, - '-': 50, - '*': 60, - '/': 60, - '%': 60, - '|': 20, - '=': 40, - '<': 40, - '>': 40, - '^': 40, - '**': 60, - '..': 20, - ':=': 10, - '!=': 40, - '<=': 40, - '>=': 40, - '~>': 40, - 'and': 30, - 'or': 25, - 'in': 40, - '&': 50, - '!': 0, // not an operator, but needed as a stop character for name tokens - '~': 0 // not an operator, but needed as a stop character for name tokens - }; - - var escapes = { // JSON string escape sequences - see json.org - '"': '"', - '\\': '\\', - '/': '/', - 'b': '\b', - 'f': '\f', - 'n': '\n', - 'r': '\r', - 't': '\t' - }; - - // Tokenizer (lexer) - invoked by the parser to return one token at a time - var tokenizer = function (path) { - var position = 0; - var length = path.length; - - var create = function (type, value) { - var obj = {type: type, value: value, position: position}; - return obj; - }; - - var scanRegex = function() { - // the prefix '/' will have been previously scanned. Find the end of the regex. - // search for closing '/' ignoring any that are escaped, or within brackets - var start = position; - var depth = 0; - var pattern; - var flags; - while(position < length) { - var currentChar = path.charAt(position); - if(currentChar === '/' && path.charAt(position - 1) !== '\\' && depth === 0) { - // end of regex found - pattern = path.substring(start, position); - if(pattern === '') { - throw { - code: "S0301", - stack: (new Error()).stack, - position: position - }; - } - position++; - currentChar = path.charAt(position); - // flags - start = position; - while(currentChar === 'i' || currentChar === 'm') { - position++; - currentChar = path.charAt(position); - } - flags = path.substring(start, position) + 'g'; - return new RegExp(pattern, flags); - } - if((currentChar === '(' || currentChar === '[' || currentChar === '{') && path.charAt(position - 1) !== '\\' ) { - depth++; - } - if((currentChar === ')' || currentChar === ']' || currentChar === '}') && path.charAt(position - 1) !== '\\' ) { - depth--; - } - - position++; - } - throw { - code: "S0302", - stack: (new Error()).stack, - position: position - }; - }; - - var next = function (prefix) { - if (position >= length) return null; - var currentChar = path.charAt(position); - // skip whitespace - while (position < length && ' \t\n\r\v'.indexOf(currentChar) > -1) { - position++; - currentChar = path.charAt(position); - } - // test for regex - if (prefix !== true && currentChar === '/') { - position++; - return create('regex', scanRegex()); - } - // handle double-char operators - if (currentChar === '.' && path.charAt(position + 1) === '.') { - // double-dot .. range operator - position += 2; - return create('operator', '..'); - } - if (currentChar === ':' && path.charAt(position + 1) === '=') { - // := assignment - position += 2; - return create('operator', ':='); - } - if (currentChar === '!' && path.charAt(position + 1) === '=') { - // != - position += 2; - return create('operator', '!='); - } - if (currentChar === '>' && path.charAt(position + 1) === '=') { - // >= - position += 2; - return create('operator', '>='); - } - if (currentChar === '<' && path.charAt(position + 1) === '=') { - // <= - position += 2; - return create('operator', '<='); - } - if (currentChar === '*' && path.charAt(position + 1) === '*') { - // ** descendant wildcard - position += 2; - return create('operator', '**'); - } - if (currentChar === '~' && path.charAt(position + 1) === '>') { - // ~> chain function - position += 2; - return create('operator', '~>'); - } - // test for single char operators - if (operators.hasOwnProperty(currentChar)) { - position++; - return create('operator', currentChar); - } - // test for string literals - if (currentChar === '"' || currentChar === "'") { - var quoteType = currentChar; - // double quoted string literal - find end of string - position++; - var qstr = ""; - while (position < length) { - currentChar = path.charAt(position); - if (currentChar === '\\') { // escape sequence - position++; - currentChar = path.charAt(position); - if (escapes.hasOwnProperty(currentChar)) { - qstr += escapes[currentChar]; - } else if (currentChar === 'u') { - // \u should be followed by 4 hex digits - var octets = path.substr(position + 1, 4); - if (/^[0-9a-fA-F]+$/.test(octets)) { - var codepoint = parseInt(octets, 16); - qstr += String.fromCharCode(codepoint); - position += 4; - } else { - throw { - code: "S0104", - stack: (new Error()).stack, - position: position - }; - } - } else { - // illegal escape sequence - throw { - code: "S0103", - stack: (new Error()).stack, - position: position, - token: currentChar - }; - - } - } else if (currentChar === quoteType) { - position++; - return create('string', qstr); - } else { - qstr += currentChar; - } - position++; - } - throw { - code: "S0101", - stack: (new Error()).stack, - position: position - }; - } - // test for numbers - var numregex = /^-?(0|([1-9][0-9]*))(\.[0-9]+)?([Ee][-+]?[0-9]+)?/; - var match = numregex.exec(path.substring(position)); - if (match !== null) { - var num = parseFloat(match[0]); - if (!isNaN(num) && isFinite(num)) { - position += match[0].length; - return create('number', num); - } else { - throw { - code: "S0102", - stack: (new Error()).stack, - position: position, - token: match[0] - }; - } - } - // test for quoted names (backticks) - var name; - if(currentChar === '`') { - // scan for closing quote - position++; - var end = path.indexOf('`', position); - if(end !== -1) { - name = path.substring(position, end); - position = end + 1; - return create('name', name); - } - position = length; - throw { - code: "S0105", - stack: (new Error()).stack, - position: position - }; - } - // test for names - var i = position; - var ch; - for (;;) { - ch = path.charAt(i); - if (i === length || ' \t\n\r\v'.indexOf(ch) > -1 || operators.hasOwnProperty(ch)) { - if (path.charAt(position) === '$') { - // variable reference - name = path.substring(position + 1, i); - position = i; - return create('variable', name); - } else { - name = path.substring(position, i); - position = i; - switch (name) { - case 'or': - case 'in': - case 'and': - return create('operator', name); - case 'true': - return create('value', true); - case 'false': - return create('value', false); - case 'null': - return create('value', null); - default: - if (position === length && name === '') { - // whitespace at end of input - return null; - } - return create('name', name); - } - } - } else { - i++; - } - } - }; - - return next; - }; - - /** - * Parses a function signature definition and returns a validation function - * @param {string} signature - the signature between the - * @returns {Function} validation function - */ - function parseSignature(signature) { - // create a Regex that represents this signature and return a function that when invoked, - // returns the validated (possibly fixed-up) arguments, or throws a validation error - // step through the signature, one symbol at a time - var position = 1; - var params = []; - var param = {}; - var prevParam = param; - while (position < signature.length) { - var symbol = signature.charAt(position); - if(symbol === ':') { - // TODO figure out what to do with the return type - // ignore it for now - break; - } - - var next = function() { - params.push(param); - prevParam = param; - param = {}; - }; - - var findClosingBracket = function(str, start, openSymbol, closeSymbol) { - // returns the position of the closing symbol (e.g. bracket) in a string - // that balances the opening symbol at position start - var depth = 1; - var position = start; - while(position < str.length) { - position++; - symbol = str.charAt(position); - if(symbol === closeSymbol) { - depth--; - if(depth === 0) { - // we're done - break; // out of while loop - } - } else if(symbol === openSymbol) { - depth++; - } - } - return position; - }; - - switch (symbol) { - case 's': // string - case 'n': // number - case 'b': // boolean - case 'l': // not so sure about expecting null? - case 'o': // object - param.regex = '[' + symbol + 'm]'; - param.type = symbol; - next(); - break; - case 'a': // array - // normally treat any value as singleton array - param.regex = '[asnblfom]'; - param.type = symbol; - param.array = true; - next(); - break; - case 'f': // function - param.regex = 'f'; - param.type = symbol; - next(); - break; - case 'j': // any JSON type - param.regex = '[asnblom]'; - param.type = symbol; - next(); - break; - case 'x': // any type - param.regex = '[asnblfom]'; - param.type = symbol; - next(); - break; - case '-': // use context if param not supplied - prevParam.context = true; - prevParam.contextRegex = new RegExp(prevParam.regex); // pre-compiled to test the context type at runtime - prevParam.regex += '?'; - break; - case '?': // optional param - case '+': // one or more - prevParam.regex += symbol; - break; - case '(': // choice of types - // search forward for matching ')' - var endParen = findClosingBracket(signature, position, '(', ')'); - var choice = signature.substring(position + 1, endParen); - if(choice.indexOf('<') === -1) { - // no parameterized types, simple regex - param.regex = '[' + choice + 'm]'; - } else { - // TODO harder - throw { - code: "S0402", - stack: (new Error()).stack, - value: choice, - offset: position - }; - } - param.type = '(' + choice + ')'; - position = endParen; - next(); - break; - case '<': // type parameter - can only be applied to 'a' and 'f' - if(prevParam.type === 'a' || prevParam.type === 'f') { - // search forward for matching '>' - var endPos = findClosingBracket(signature, position, '<', '>'); - prevParam.subtype = signature.substring(position + 1, endPos); - position = endPos; - } else { - throw { - code: "S0401", - stack: (new Error()).stack, - value: prevParam.type, - offset: position - }; - } - break; - } - position++; - } - var regexStr = '^' + - params.map(function(param) { - return '(' + param.regex + ')'; - }).join('') + - '$'; - var regex = new RegExp(regexStr); - var getSymbol = function(value) { - var symbol; - if(isFunction(value)) { - symbol = 'f'; - } else { - var type = typeof value; - switch (type) { - case 'string': - symbol = 's'; - break; - case 'number': - symbol = 'n'; - break; - case 'boolean': - symbol = 'b'; - break; - case 'object': - if (value === null) { - symbol = 'l'; - } else if (Array.isArray(value)) { - symbol = 'a'; - } else { - symbol = 'o'; - } - break; - case 'undefined': - default: - // any value can be undefined, but should be allowed to match - symbol = 'm'; // m for missing - } - } - return symbol; - }; - - var throwValidationError = function(badArgs, badSig) { - // to figure out where this went wrong we need apply each component of the - // regex to each argument until we get to the one that fails to match - var partialPattern = '^'; - var goodTo = 0; - for(var index = 0; index < params.length; index++) { - partialPattern += params[index].regex; - var match = badSig.match(partialPattern); - if(match === null) { - // failed here - throw { - code: "T0410", - stack: (new Error()).stack, - value: badArgs[goodTo], - index: goodTo + 1 - }; - } - goodTo = match[0].length; - } - // if it got this far, it's probably because of extraneous arguments (we - // haven't added the trailing '$' in the regex yet. - throw { - code: "T0410", - stack: (new Error()).stack, - value: badArgs[goodTo], - index: goodTo + 1 - }; - }; - - return { - definition: signature, - validate: function(args, context) { - var suppliedSig = ''; - args.forEach(function(arg) { - suppliedSig += getSymbol(arg); - }); - var isValid = regex.exec(suppliedSig); - if(isValid) { - var validatedArgs = []; - var argIndex = 0; - params.forEach(function(param, index) { - var arg = args[argIndex]; - var match = isValid[index + 1]; - if(match === '') { - if (param.context && param.contextRegex) { - // substitute context value for missing arg - // first check that the context value is the right type - var contextType = getSymbol(context); - // test contextType against the regex for this arg (without the trailing ?) - if(param.contextRegex.test(contextType)) { - validatedArgs.push(context); - } else { - // context value not compatible with this argument - throw { - code: "T0411", - stack: (new Error()).stack, - value: context, - index: argIndex + 1 - }; - } - } else { - validatedArgs.push(arg); - argIndex++; - } - } else { - // may have matched multiple args (if the regex ends with a '+' - // split into single tokens - match.split('').forEach(function(single) { - if (param.type === 'a') { - if (single === 'm') { - // missing (undefined) - arg = undefined; - } else { - arg = args[argIndex]; - var arrayOK = true; - // is there type information on the contents of the array? - if (typeof param.subtype !== 'undefined') { - if (single !== 'a' && match !== param.subtype) { - arrayOK = false; - } else if (single === 'a') { - if (arg.length > 0) { - var itemType = getSymbol(arg[0]); - if (itemType !== param.subtype.charAt(0)) { // TODO recurse further - arrayOK = false; - } else { - // make sure every item in the array is this type - var differentItems = arg.filter(function (val) { - return (getSymbol(val) !== itemType); - }); - arrayOK = (differentItems.length === 0); - } - } - } - } - if (!arrayOK) { - throw { - code: "T0412", - stack: (new Error()).stack, - value: arg, - index: argIndex + 1, - type: param.subtype // TODO translate symbol to type name - }; - } - // the function expects an array. If it's not one, make it so - if (single !== 'a') { - arg = [arg]; - } - } - validatedArgs.push(arg); - argIndex++; - } else { - validatedArgs.push(arg); - argIndex++; - } - }); - } - }); - return validatedArgs; - } - throwValidationError(args, suppliedSig); - } - }; - } - - // This parser implements the 'Top down operator precedence' algorithm developed by Vaughan R Pratt; http://dl.acm.org/citation.cfm?id=512931. - // and builds on the Javascript framework described by Douglas Crockford at http://javascript.crockford.com/tdop/tdop.html - // and in 'Beautiful Code', edited by Andy Oram and Greg Wilson, Copyright 2007 O'Reilly Media, Inc. 798-0-596-51004-6 - - var parser = function (source, recover) { - var node; - var lexer; - - var symbol_table = {}; - var errors = []; - - var remainingTokens = function() { - var remaining = []; - if(node.id !== '(end)') { - remaining.push({type: node.type, value: node.value, position: node.position}); - } - var nxt = lexer(); - while(nxt !== null) { - remaining.push(nxt); - nxt = lexer(); - } - return remaining; - }; - - var base_symbol = { - nud: function () { - // error - symbol has been invoked as a unary operator - var err = { - code: 'S0211', - token: this.value, - position: this.position - }; - - if(recover) { - err.remaining = remainingTokens(); - err.type = 'error'; - errors.push(err); - return err; - } else { - err.stack = (new Error()).stack; - throw err; - } - } - }; - - var symbol = function (id, bp) { - var s = symbol_table[id]; - bp = bp || 0; - if (s) { - if (bp >= s.lbp) { - s.lbp = bp; - } - } else { - s = Object.create(base_symbol); - s.id = s.value = id; - s.lbp = bp; - symbol_table[id] = s; - } - return s; - }; - - var handleError = function(err) { - if(recover) { - // tokenize the rest of the buffer and add it to an error token - err.remaining = remainingTokens(); - errors.push(err); - var symbol = symbol_table["(error)"]; - node = Object.create(symbol); - node.error = err; - node.type = "(error)"; - return node; - } else { - err.stack = (new Error()).stack; - throw err; - } - }; - - var advance = function (id, infix) { - if (id && node.id !== id) { - var code; - if(node.id === '(end)') { - // unexpected end of buffer - code = "S0203"; - } else { - code = "S0202"; - } - var err = { - code: code, - position: node.position, - token: node.value, - value: id - }; - return handleError(err); - } - var next_token = lexer(infix); - if (next_token === null) { - node = symbol_table["(end)"]; - node.position = source.length; - return node; - } - var value = next_token.value; - var type = next_token.type; - var symbol; - switch (type) { - case 'name': - case 'variable': - symbol = symbol_table["(name)"]; - break; - case 'operator': - symbol = symbol_table[value]; - if (!symbol) { - return handleError( { - code: "S0204", - stack: (new Error()).stack, - position: next_token.position, - token: value - }); - } - break; - case 'string': - case 'number': - case 'value': - type = "literal"; - symbol = symbol_table["(literal)"]; - break; - case 'regex': - type = "regex"; - symbol = symbol_table["(regex)"]; - break; - /* istanbul ignore next */ - default: - return handleError( { - code: "S0205", - stack: (new Error()).stack, - position: next_token.position, - token: value - }); - } - - node = Object.create(symbol); - node.value = value; - node.type = type; - node.position = next_token.position; - return node; - }; - - // Pratt's algorithm - var expression = function (rbp) { - var left; - var t = node; - advance(null, true); - left = t.nud(); - while (rbp < node.lbp) { - t = node; - advance(); - left = t.led(left); - } - return left; - }; - - var terminal = function(id) { - var s = symbol(id, 0); - s.nud = function() { - return this; - }; - }; - - // match infix operators - // - // left associative - var infix = function (id, bp, led) { - var bindingPower = bp || operators[id]; - var s = symbol(id, bindingPower); - s.led = led || function (left) { - this.lhs = left; - this.rhs = expression(bindingPower); - this.type = "binary"; - return this; - }; - return s; - }; - - // match infix operators - // - // right associative - var infixr = function (id, bp, led) { - var bindingPower = bp || operators[id]; - var s = symbol(id, bindingPower); - s.led = led || function (left) { - this.lhs = left; - this.rhs = expression(bindingPower - 1); // subtract 1 from bindingPower for right associative operators - this.type = "binary"; - return this; - }; - return s; - }; - - // match prefix operators - // - var prefix = function (id, nud) { - var s = symbol(id); - s.nud = nud || function () { - this.expression = expression(70); - this.type = "unary"; - return this; - }; - return s; - }; - - terminal("(end)"); - terminal("(name)"); - terminal("(literal)"); - terminal("(regex)"); - symbol(":"); - symbol(";"); - symbol(","); - symbol(")"); - symbol("]"); - symbol("}"); - symbol(".."); // range operator - infix("."); // field reference - infix("+"); // numeric addition - infix("-"); // numeric subtraction - infix("*"); // numeric multiplication - infix("/"); // numeric division - infix("%"); // numeric modulus - infix("="); // equality - infix("<"); // less than - infix(">"); // greater than - infix("!="); // not equal to - infix("<="); // less than or equal - infix(">="); // greater than or equal - infix("&"); // string concatenation - infix("and"); // Boolean AND - infix("or"); // Boolean OR - infix("in"); // is member of array - terminal("and"); // the 'keywords' can also be used as terminals (field names) - terminal("or"); // - terminal("in"); // - infixr(":="); // bind variable - prefix("-"); // unary numeric negation - infix("~>"); // function application - - infixr("(error)", 10, function(left) { - this.lhs = left; - - this.error = node.error; - this.remaining = remainingTokens(); - this.type = 'error'; - return this; - }); - - // field wildcard (single level) - prefix('*', function () { - this.type = "wildcard"; - return this; - }); - - // descendant wildcard (multi-level) - prefix('**', function () { - this.type = "descendant"; - return this; - }); - - // function invocation - infix("(", operators['('], function (left) { - // left is is what we are trying to invoke - this.procedure = left; - this.type = 'function'; - this.arguments = []; - if (node.id !== ')') { - for (;;) { - if (node.type === 'operator' && node.id === '?') { - // partial function application - this.type = 'partial'; - this.arguments.push(node); - advance('?'); - } else { - this.arguments.push(expression(0)); - } - if (node.id !== ',') break; - advance(','); - } - } - advance(")", true); - // if the name of the function is 'function' or λ, then this is function definition (lambda function) - if (left.type === 'name' && (left.value === 'function' || left.value === '\u03BB')) { - // all of the args must be VARIABLE tokens - this.arguments.forEach(function (arg, index) { - if (arg.type !== 'variable') { - return handleError( { - code: "S0208", - stack: (new Error()).stack, - position: arg.position, - token: arg.value, - value: index + 1 - }); - } - }); - this.type = 'lambda'; - // is the next token a '<' - if so, parse the function signature - if(node.id === '<') { - var sigPos = node.position; - var depth = 1; - var sig = '<'; - while(depth > 0 && node.id !== '{' && node.id !== '(end)') { - var tok = advance(); - if(tok.id === '>') { - depth--; - } else if(tok.id === '<') { - depth++; - } - sig += tok.value; - } - advance('>'); - try { - this.signature = parseSignature(sig); - } catch(err) { - // insert the position into this error - err.position = sigPos + err.offset; - return handleError( err ); - } - } - // parse the function body - advance('{'); - this.body = expression(0); - advance('}'); - } - return this; - }); - - // parenthesis - block expression - prefix("(", function () { - var expressions = []; - while (node.id !== ")") { - expressions.push(expression(0)); - if (node.id !== ";") { - break; - } - advance(";"); - } - advance(")", true); - this.type = 'block'; - this.expressions = expressions; - return this; - }); - - // array constructor - prefix("[", function () { - var a = []; - if (node.id !== "]") { - for (;;) { - var item = expression(0); - if (node.id === "..") { - // range operator - var range = {type: "binary", value: "..", position: node.position, lhs: item}; - advance(".."); - range.rhs = expression(0); - item = range; - } - a.push(item); - if (node.id !== ",") { - break; - } - advance(","); - } - } - advance("]", true); - this.expressions = a; - this.type = "unary"; - return this; - }); - - // filter - predicate or array index - infix("[", operators['['], function (left) { - if(node.id === "]") { - // empty predicate means maintain singleton arrays in the output - var step = left; - while(step && step.type === 'binary' && step.value === '[') { - step = step.lhs; - } - step.keepArray = true; - advance("]"); - return left; - } else { - this.lhs = left; - this.rhs = expression(operators[']']); - this.type = 'binary'; - advance("]", true); - return this; - } - }); - - // order-by - infix("^", operators['^'], function (left) { - advance("("); - var terms = []; - for(;;) { - var term = { - descending: false - }; - if (node.id === "<") { - // ascending sort - advance("<"); - } else if (node.id === ">") { - // descending sort - term.descending = true; - advance(">"); - } else { - //unspecified - default to ascending - } - term.expression = expression(0); - terms.push(term); - if(node.id !== ",") { - break; - } - advance(","); - } - advance(")"); - this.lhs = left; - this.rhs = terms; - this.type = 'binary'; - return this; - }); - - var objectParser = function (left) { - var a = []; - if (node.id !== "}") { - for (;;) { - var n = expression(0); - advance(":"); - var v = expression(0); - a.push([n, v]); // holds an array of name/value expression pairs - if (node.id !== ",") { - break; - } - advance(","); - } - } - advance("}", true); - if(typeof left === 'undefined') { - // NUD - unary prefix form - this.lhs = a; - this.type = "unary"; - } else { - // LED - binary infix form - this.lhs = left; - this.rhs = a; - this.type = 'binary'; - } - return this; - }; - - // object constructor - prefix("{", objectParser); - - // object grouping - infix("{", operators['{'], objectParser); - - // if/then/else ternary operator ?: - infix("?", operators['?'], function (left) { - this.type = 'condition'; - this.condition = left; - this.then = expression(0); - if (node.id === ':') { - // else condition - advance(":"); - this.else = expression(0); - } - return this; - }); - - // object transformer - prefix("|", function () { - this.type = 'transform'; - this.pattern = expression(0); - advance('|'); - this.update = expression(0); - if(node.id === ',') { - advance(','); - this.delete = expression(0); - } - advance('|'); - return this; - }); - - // tail call optimization - // this is invoked by the post parser to analyse lambda functions to see - // if they make a tail call. If so, it is replaced by a thunk which will - // be invoked by the trampoline loop during function application. - // This enables tail-recursive functions to be written without growing the stack - var tail_call_optimize = function(expr) { - var result; - if(expr.type === 'function') { - var thunk = {type: 'lambda', thunk: true, arguments: [], position: expr.position}; - thunk.body = expr; - result = thunk; - } else if(expr.type === 'condition') { - // analyse both branches - expr.then = tail_call_optimize(expr.then); - if(typeof expr.else !== 'undefined') { - expr.else = tail_call_optimize(expr.else); - } - result = expr; - } else if(expr.type === 'block') { - // only the last expression in the block - var length = expr.expressions.length; - if(length > 0) { - expr.expressions[length - 1] = tail_call_optimize(expr.expressions[length - 1]); - } - result = expr; - } else { - result = expr; - } - return result; - }; - - // post-parse stage - // the purpose of this is flatten the parts of the AST representing location paths, - // converting them to arrays of steps which in turn may contain arrays of predicates. - // following this, nodes containing '.' and '[' should be eliminated from the AST. - var ast_optimize = function (expr) { - var result; - switch (expr.type) { - case 'binary': - switch (expr.value) { - case '.': - var lstep = ast_optimize(expr.lhs); - result = {type: 'path', steps: []}; - if (lstep.type === 'path') { - Array.prototype.push.apply(result.steps, lstep.steps); - } else { - result.steps = [lstep]; - } - var rest = ast_optimize(expr.rhs); - if(rest.type === 'function' && - rest.procedure.type === 'path' && - rest.procedure.steps.length === 1 && - rest.procedure.steps[0].type === 'name' && - result.steps[result.steps.length-1].type === 'function') { - // next function in chain of functions - will override a thenable - result.steps[result.steps.length-1].nextFunction = rest.procedure.steps[0].value; - } - if(rest.type !== 'path') { - rest = {type: 'path', steps: [rest]}; - } - Array.prototype.push.apply(result.steps, rest.steps); - // any steps within a path that are literals, should be changed to 'name' - result.steps.filter(function(step) { - return step.type === 'literal'; - }).forEach(function(lit) { - lit.type = 'name'; - }); - // any step that signals keeping a singleton array, should be flagged on the path - if(result.steps.filter(function(step) { return step.keepArray === true;}).length > 0) { - result.keepSingletonArray = true; - } - // if first step is a path constructor, flag it for special handling - var firststep = result.steps[0]; - if(firststep.type === 'unary' && firststep.value === '[') { - firststep.consarray = true; - } - // if the last step is an array constructor, flag it so it doesn't flatten - var laststep = result.steps[result.steps.length - 1]; - if(laststep.type === 'unary' && laststep.value === '[') { - laststep.consarray = true; - } - break; - case '[': - // predicated step - // LHS is a step or a predicated step - // RHS is the predicate expr - result = ast_optimize(expr.lhs); - var step = result; - if(result.type === 'path') { - step = result.steps[result.steps.length - 1]; - } - if (typeof step.group !== 'undefined') { - throw { - code: "S0209", - stack: (new Error()).stack, - position: expr.position - }; - } - if (typeof step.predicate === 'undefined') { - step.predicate = []; - } - step.predicate.push(ast_optimize(expr.rhs)); - break; - case '{': - // group-by - // LHS is a step or a predicated step - // RHS is the object constructor expr - result = ast_optimize(expr.lhs); - if (typeof result.group !== 'undefined') { - throw { - code: "S0210", - stack: (new Error()).stack, - position: expr.position - }; - } - // object constructor - process each pair - result.group = { - lhs: expr.rhs.map(function (pair) { - return [ast_optimize(pair[0]), ast_optimize(pair[1])]; - }), - position: expr.position - }; - break; - case '^': - // order-by - // LHS is the array to be ordered - // RHS defines the terms - result = {type: 'sort', value: expr.value, position: expr.position}; - result.lhs = ast_optimize(expr.lhs); - result.rhs = expr.rhs.map(function (terms) { - return { - descending: terms.descending, - expression: ast_optimize(terms.expression) - }; - }); - break; - case ':=': - result = {type: 'bind', value: expr.value, position: expr.position}; - result.lhs = ast_optimize(expr.lhs); - result.rhs = ast_optimize(expr.rhs); - break; - case '~>': - result = {type: 'apply', value: expr.value, position: expr.position}; - result.lhs = ast_optimize(expr.lhs); - result.rhs = ast_optimize(expr.rhs); - break; - default: - result = {type: expr.type, value: expr.value, position: expr.position}; - result.lhs = ast_optimize(expr.lhs); - result.rhs = ast_optimize(expr.rhs); - } - break; - case 'unary': - result = {type: expr.type, value: expr.value, position: expr.position}; - if (expr.value === '[') { - // array constructor - process each item - result.expressions = expr.expressions.map(function (item) { - return ast_optimize(item); - }); - } else if (expr.value === '{') { - // object constructor - process each pair - result.lhs = expr.lhs.map(function (pair) { - return [ast_optimize(pair[0]), ast_optimize(pair[1])]; - }); - } else { - // all other unary expressions - just process the expression - result.expression = ast_optimize(expr.expression); - // if unary minus on a number, then pre-process - if (expr.value === '-' && result.expression.type === 'literal' && isNumeric(result.expression.value)) { - result = result.expression; - result.value = -result.value; - } - } - break; - case 'function': - case 'partial': - result = {type: expr.type, name: expr.name, value: expr.value, position: expr.position}; - result.arguments = expr.arguments.map(function (arg) { - return ast_optimize(arg); - }); - result.procedure = ast_optimize(expr.procedure); - break; - case 'lambda': - result = {type: expr.type, arguments: expr.arguments, signature: expr.signature, position: expr.position}; - var body = ast_optimize(expr.body); - result.body = tail_call_optimize(body); - break; - case 'condition': - result = {type: expr.type, position: expr.position}; - result.condition = ast_optimize(expr.condition); - result.then = ast_optimize(expr.then); - if (typeof expr.else !== 'undefined') { - result.else = ast_optimize(expr.else); - } - break; - case 'transform': - result = {type: expr.type, position: expr.position}; - result.pattern = ast_optimize(expr.pattern); - result.update = ast_optimize(expr.update); - if(typeof expr.delete !== 'undefined') { - result.delete = ast_optimize(expr.delete); - } - break; - case 'block': - result = {type: expr.type, position: expr.position}; - // array of expressions - process each one - result.expressions = expr.expressions.map(function (item) { - return ast_optimize(item); - }); - // TODO scan the array of expressions to see if any of them assign variables - // if so, need to mark the block as one that needs to create a new frame - break; - case 'name': - result = {type: 'path', steps: [expr]}; - if(expr.keepArray) { - result.keepSingletonArray = true; - } - break; - case 'literal': - case 'wildcard': - case 'descendant': - case 'variable': - case 'regex': - result = expr; - break; - case 'operator': - // the tokens 'and' and 'or' might have been used as a name rather than an operator - if (expr.value === 'and' || expr.value === 'or' || expr.value === 'in') { - expr.type = 'name'; - result = ast_optimize(expr); - } else /* istanbul ignore else */ if (expr.value === '?') { - // partial application - result = expr; - } else { - throw { - code: "S0201", - stack: (new Error()).stack, - position: expr.position, - token: expr.value - }; - } - break; - case 'error': - result = expr; - if(expr.lhs) { - result = ast_optimize(expr.lhs); - } - break; - default: - var code = "S0206"; - /* istanbul ignore else */ - if (expr.id === '(end)') { - code = "S0207"; - } - var err = { - code: code, - position: expr.position, - token: expr.value - }; - if(recover) { - errors.push(err); - return {type: 'error', error: err}; - } else { - err.stack = (new Error()).stack; - throw err; - } - } - return result; - }; - - // now invoke the tokenizer and the parser and return the syntax tree - lexer = tokenizer(source); - advance(); - // parse the tokens - var expr = expression(0); - if (node.id !== '(end)') { - var err = { - code: "S0201", - position: node.position, - token: node.value - }; - handleError(err); - } - expr = ast_optimize(expr); - - if(errors.length > 0) { - expr.errors = errors; - } - - return expr; - }; - - // Start of Evaluator code - - var staticFrame = createFrame(null); - - /** - * Check if value is a finite number - * @param {float} n - number to evaluate - * @returns {boolean} True if n is a finite number - */ - function isNumeric(n) { - var isNum = false; - if(typeof n === 'number') { - isNum = !isNaN(n); - if (isNum && !isFinite(n)) { - throw { - code: "D1001", - value: n, - stack: (new Error()).stack - }; - } - } - return isNum; - } - - /** - * Returns true if the arg is an array of strings - * @param {*} arg - the item to test - * @returns {boolean} True if arg is an array of strings - */ - function isArrayOfStrings(arg) { - var result = false; - /* istanbul ignore else */ - if(Array.isArray(arg)) { - result = (arg.filter(function(item){return typeof item !== 'string';}).length === 0); - } - return result; - } - - /** - * Returns true if the arg is an array of numbers - * @param {*} arg - the item to test - * @returns {boolean} True if arg is an array of numbers - */ - function isArrayOfNumbers(arg) { - var result = false; - if(Array.isArray(arg)) { - result = (arg.filter(function(item){return !isNumeric(item);}).length === 0); - } - return result; - } - - // Polyfill - /* istanbul ignore next */ - Number.isInteger = Number.isInteger || function(value) { - return typeof value === "number" && - isFinite(value) && - Math.floor(value) === value; - }; - - /** - * Evaluate expression against input data - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {*} Evaluated input data - */ - function* evaluate(expr, input, environment) { - var result; - - var entryCallback = environment.lookup('__evaluate_entry'); - if(entryCallback) { - entryCallback(expr, input, environment); - } - - switch (expr.type) { - case 'path': - result = yield * evaluatePath(expr, input, environment); - break; - case 'binary': - result = yield * evaluateBinary(expr, input, environment); - break; - case 'unary': - result = yield * evaluateUnary(expr, input, environment); - break; - case 'name': - result = evaluateName(expr, input, environment); - break; - case 'literal': - result = evaluateLiteral(expr, input, environment); - break; - case 'wildcard': - result = evaluateWildcard(expr, input, environment); - break; - case 'descendant': - result = evaluateDescendants(expr, input, environment); - break; - case 'condition': - result = yield * evaluateCondition(expr, input, environment); - break; - case 'block': - result = yield * evaluateBlock(expr, input, environment); - break; - case 'bind': - result = yield * evaluateBindExpression(expr, input, environment); - break; - case 'regex': - result = evaluateRegex(expr, input, environment); - break; - case 'function': - result = yield * evaluateFunction(expr, input, environment); - break; - case 'variable': - result = evaluateVariable(expr, input, environment); - break; - case 'lambda': - result = evaluateLambda(expr, input, environment); - break; - case 'partial': - result = yield * evaluatePartialApplication(expr, input, environment); - break; - case 'apply': - result = yield * evaluateApplyExpression(expr, input, environment); - break; - case 'sort': - result = yield * evaluateSortExpression(expr, input, environment); - break; - case 'transform': - result = evaluateTransformExpression(expr, input, environment); - break; - } - - if(environment.lookup('__jsonata_async') && - (typeof result === 'undefined' || result === null || typeof result.then !== 'function')) { - result = Promise.resolve(result); - } - if(environment.lookup('__jsonata_async') && typeof result.then === 'function' && expr.nextFunction && typeof result[expr.nextFunction] === 'function') { - // although this is a 'thenable', it is chaining a different function - // so don't yield since yielding will trigger the .then() - } else { - result = yield result; - } - - - if (expr.hasOwnProperty('predicate')) { - result = yield * applyPredicates(expr.predicate, result, environment); - - } - if (expr.hasOwnProperty('group')) { - result = yield * evaluateGroupExpression(expr.group, result, environment); - } - - var exitCallback = environment.lookup('__evaluate_exit'); - if(exitCallback) { - exitCallback(expr, input, environment, result); - } - - if(result && result.sequence) { - result = result.value(); - } - - return result; - } - - /** - * Create an empty sequence to contain query results - * @returns {Array} - empty sequence - */ - function createSequence() { - var sequence = toSequence([]); - if (arguments.length === 1) { - sequence.push(arguments[0]); - } - return sequence; - } - - /** - * Converts an array to a result sequence (by adding special properties) - * @param {Array} arr - the array to convert - * @returns {*} - the sequence - */ - function toSequence(arr) { - Object.defineProperty(arr, 'sequence', { - enumerable: false, - configurable: false, - get: function () { - return true; - } - }); - Object.defineProperty(arr, 'keepSingleton', { - enumerable: false, - configurable: false, - writable: true, - value: false - }); - Object.defineProperty(arr, 'value', { - enumerable: false, - configurable: false, - get: function () { - return function() { - switch (this.length) { - case 0: - return undefined; - case 1: - return this.keepSingleton ? this : this[0]; - default: - return this; - } - }; - } - }); - return arr; - } - - /** - * Evaluate path expression against input data - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {*} Evaluated input data - */ - function* evaluatePath(expr, input, environment) { - var inputSequence; - // expr is an array of steps - // if the first step is a variable reference ($...), including root reference ($$), - // then the path is absolute rather than relative - if (expr.steps[0].type === 'variable') { - inputSequence = createSequence(input); // dummy singleton sequence for first (absolute) step - } else if (Array.isArray(input)) { - inputSequence = input; - } else { - // if input is not an array, make it so - inputSequence = createSequence(input); - } - - var resultSequence; - - // evaluate each step in turn - for(var ii = 0; ii < expr.steps.length; ii++) { - var step = expr.steps[ii]; - - // if the first step is an explicit array constructor, then just evaluate that (i.e. don't iterate over a context array) - if(ii === 0 && step.consarray) { - resultSequence = yield * evaluate(step, inputSequence, environment); - } else { - resultSequence = yield * evaluateStep(step, inputSequence, environment, ii === expr.steps.length - 1); - } - - if(typeof resultSequence === 'undefined' || resultSequence.length === 0) { - break; - } - inputSequence = resultSequence; - } - - if(expr.keepSingletonArray) { - resultSequence.keepSingleton = true; - } - - return resultSequence; - } - - /** - * Evaluate a step within a path - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @param {boolean} lastStep - flag the last step in a path - * @returns {*} Evaluated input data - */ - function* evaluateStep(expr, input, environment, lastStep) { - var result = createSequence(); - - for(var ii = 0; ii < input.length; ii++) { - var res = yield * evaluate(expr, input[ii], environment); - if(typeof res !== 'undefined') { - result.push(res); - } - } - - var resultSequence = createSequence(); - if(lastStep && result.length === 1 && Array.isArray(result[0]) && !result[0].sequence) { - resultSequence = result[0]; - } else { - // flatten the sequence - result.forEach(function(res) { - if (!Array.isArray(res) || res.cons || res.keepSingleton) { - // it's not an array - just push into the result sequence - resultSequence.push(res); - } else { - // res is a sequence - flatten it into the parent sequence - Array.prototype.push.apply(resultSequence, res); - } - }); - } - - return resultSequence; - } - - /** - * Apply predicates to input data - * @param {Object} predicates - Predicates - * @param {Object} input - Input data to apply predicates against - * @param {Object} environment - Environment - * @returns {*} Result after applying predicates - */ - function* applyPredicates(predicates, input, environment) { - var inputSequence = input; - // lhs potentially holds an array - // we want to iterate over the array, and only keep the items that are - // truthy when applied to the predicate. - // if the predicate evaluates to an integer, then select that index - - var results = createSequence(); - for(var ii = 0; ii < predicates.length; ii++) { - var predicate = predicates[ii]; - // if it's not an array, turn it into one - // since in XPath >= 2.0 an item is equivalent to a singleton sequence of that item - // if input is not an array, make it so - if (!Array.isArray(inputSequence)) { - inputSequence = createSequence(inputSequence); - } - results = createSequence(); - if (predicate.type === 'literal' && isNumeric(predicate.value)) { - var index = predicate.value; - if (!Number.isInteger(index)) { - // round it down - index = Math.floor(index); - } - if (index < 0) { - // count in from end of array - index = inputSequence.length + index; - } - results = inputSequence[index]; - } else { - results = yield * evaluateFilter(predicate, inputSequence, environment); - } - inputSequence = results; - } - return results; - } - - /** - * Apply filter predicate to input data - * @param {Object} predicate - filter expression - * @param {Object} input - Input data to apply predicates against - * @param {Object} environment - Environment - * @returns {*} Result after applying predicates - */ - function* evaluateFilter(predicate, input, environment) { - var results = createSequence(); - for(var index = 0; index < input.length; index++) { - var item = input[index]; - var res = yield * evaluate(predicate, item, environment); - if (isNumeric(res)) { - res = [res]; - } - if(isArrayOfNumbers(res)) { - res.forEach(function(ires) { - if (!Number.isInteger(ires)) { - // round it down - ires = Math.floor(ires); - } - if (ires < 0) { - // count in from end of array - ires = input.length + ires; - } - if (ires === index) { - results.push(item); - } - }); - } else if (functionBoolean(res)) { // truthy - results.push(item); - } - } - return results; - } - - /** - * Evaluate binary expression against input data - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {*} Evaluated input data - */ - function * evaluateBinary(expr, input, environment) { - var result; - var lhs = yield * evaluate(expr.lhs, input, environment); - var rhs = yield * evaluate(expr.rhs, input, environment); - var op = expr.value; - - try { - switch (op) { - case '+': - case '-': - case '*': - case '/': - case '%': - result = evaluateNumericExpression(lhs, rhs, op); - break; - case '=': - case '!=': - case '<': - case '<=': - case '>': - case '>=': - result = evaluateComparisonExpression(lhs, rhs, op); - break; - case '&': - result = evaluateStringConcat(lhs, rhs); - break; - case 'and': - case 'or': - result = evaluateBooleanExpression(lhs, rhs, op); - break; - case '..': - result = evaluateRangeExpression(lhs, rhs); - break; - case 'in': - result = evaluateIncludesExpression(lhs, rhs); - break; - } - } catch(err) { - err.position = expr.position; - err.token = op; - throw err; - } - return result; - } - - /** - * Evaluate unary expression against input data - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {*} Evaluated input data - */ - function* evaluateUnary(expr, input, environment) { - var result; - - switch (expr.value) { - case '-': - result = yield * evaluate(expr.expression, input, environment); - if(typeof result === 'undefined') { - result = undefined; - } else if (isNumeric(result)) { - result = -result; - } else { - throw { - code: "D1002", - stack: (new Error()).stack, - position: expr.position, - token: expr.value, - value: result - }; - } - break; - case '[': - // array constructor - evaluate each item - result = []; - for(var ii = 0; ii < expr.expressions.length; ii++) { - var item = expr.expressions[ii]; - var value = yield * evaluate(item, input, environment); - if (typeof value !== 'undefined') { - if(item.value === '[') { - result.push(value); - } else { - result = functionAppend(result, value); - } - } - } - if(expr.consarray) { - Object.defineProperty(result, 'cons', { - enumerable: false, - configurable: false, - value: true - }); - } - break; - case '{': - // object constructor - apply grouping - result = yield * evaluateGroupExpression(expr, input, environment); - break; - - } - return result; - } - - /** - * Evaluate name object against input data - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {*} Evaluated input data - */ - function evaluateName(expr, input, environment) { - // lookup the 'name' item in the input - var result; - if (Array.isArray(input)) { - result = createSequence(); - for(var ii = 0; ii < input.length; ii++) { - var res = evaluateName(expr, input[ii], environment); - if (typeof res !== 'undefined') { - result.push(res); - } - } - } else if (input !== null && typeof input === 'object') { - result = input[expr.value]; - } - return result; - } - - /** - * Evaluate literal against input data - * @param {Object} expr - JSONata expression - * @returns {*} Evaluated input data - */ - function evaluateLiteral(expr) { - return expr.value; - } - - /** - * Evaluate wildcard against input data - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @returns {*} Evaluated input data - */ - function evaluateWildcard(expr, input) { - var results = createSequence(); - if (input !== null && typeof input === 'object') { - Object.keys(input).forEach(function (key) { - var value = input[key]; - if(Array.isArray(value)) { - value = flatten(value); - results = functionAppend(results, value); - } else { - results.push(value); - } - }); - } - - // result = normalizeSequence(results); - return results; - } - - /** - * Returns a flattened array - * @param {Array} arg - the array to be flatten - * @param {Array} flattened - carries the flattened array - if not defined, will initialize to [] - * @returns {Array} - the flattened array - */ - function flatten(arg, flattened) { - if(typeof flattened === 'undefined') { - flattened = []; - } - if(Array.isArray(arg)) { - arg.forEach(function (item) { - flatten(item, flattened); - }); - } else { - flattened.push(arg); - } - return flattened; - } - - /** - * Evaluate descendants against input data - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @returns {*} Evaluated input data - */ - function evaluateDescendants(expr, input) { - var result; - var resultSequence = createSequence(); - if (typeof input !== 'undefined') { - // traverse all descendants of this object/array - recurseDescendants(input, resultSequence); - if (resultSequence.length === 1) { - result = resultSequence[0]; - } else { - result = resultSequence; - } - } - return result; - } - - /** - * Recurse through descendants - * @param {Object} input - Input data - * @param {Object} results - Results - */ - function recurseDescendants(input, results) { - // this is the equivalent of //* in XPath - if (!Array.isArray(input)) { - results.push(input); - } - if (Array.isArray(input)) { - input.forEach(function (member) { - recurseDescendants(member, results); - }); - } else if (input !== null && typeof input === 'object') { - Object.keys(input).forEach(function (key) { - recurseDescendants(input[key], results); - }); - } - } - - /** - * Evaluate numeric expression against input data - * @param {Object} lhs - LHS value - * @param {Object} rhs - RHS value - * @param {Object} op - opcode - * @returns {*} Result - */ - function evaluateNumericExpression(lhs, rhs, op) { - var result; - - if (typeof lhs === 'undefined' || typeof rhs === 'undefined') { - // if either side is undefined, the result is undefined - return result; - } - - if (!isNumeric(lhs)) { - throw { - code: "T2001", - stack: (new Error()).stack, - value: lhs - }; - } - if (!isNumeric(rhs)) { - throw { - code: "T2002", - stack: (new Error()).stack, - value: rhs - }; - } - - switch (op) { - case '+': - result = lhs + rhs; - break; - case '-': - result = lhs - rhs; - break; - case '*': - result = lhs * rhs; - break; - case '/': - result = lhs / rhs; - break; - case '%': - result = lhs % rhs; - break; - } - return result; - } - - /** - * Evaluate comparison expression against input data - * @param {Object} lhs - LHS value - * @param {Object} rhs - RHS value - * @param {Object} op - opcode - * @returns {*} Result - */ - function evaluateComparisonExpression(lhs, rhs, op) { - var result; - - // type checks - var ltype = typeof lhs; - var rtype = typeof rhs; - - if (ltype === 'undefined' || rtype === 'undefined') { - // if either side is undefined, the result is false - return false; - } - - var validate = function() { - // if aa or bb are not string or numeric values, then throw an error - if (!(ltype === 'string' || ltype === 'number') || !(rtype === 'string' || rtype === 'number')) { - throw { - code: "T2010", - stack: (new Error()).stack, - value: !(ltype === 'string' || ltype === 'number') ? lhs : rhs - }; - } - - //if aa and bb are not of the same type - if (ltype !== rtype) { - throw { - code: "T2009", - stack: (new Error()).stack, - value: lhs, - value2: rhs - }; - } - }; - - switch (op) { - case '=': - result = lhs === rhs; - break; - case '!=': - result = (lhs !== rhs); - break; - case '<': - validate(); - result = lhs < rhs; - break; - case '<=': - validate(); - result = lhs <= rhs; - break; - case '>': - validate(); - result = lhs > rhs; - break; - case '>=': - validate(); - result = lhs >= rhs; - break; - } - return result; - } - - /** - * Inclusion operator - in - * - * @param {Object} lhs - LHS value - * @param {Object} rhs - RHS value - * @returns {boolean} - true if lhs is a member of rhs - */ - function evaluateIncludesExpression(lhs, rhs) { - var result = false; - - if (typeof lhs === 'undefined' || typeof rhs === 'undefined') { - // if either side is undefined, the result is false - return false; - } - - if(!Array.isArray(rhs)) { - rhs = [rhs]; - } - - for(var i = 0; i < rhs.length; i++) { - if(rhs[i] === lhs) { - result = true; - break; - } - } - - return result; - } - - /** - * Evaluate boolean expression against input data - * @param {Object} lhs - LHS value - * @param {Object} rhs - RHS value - * @param {Object} op - opcode - * @returns {*} Result - */ - function evaluateBooleanExpression(lhs, rhs, op) { - var result; - - switch (op) { - case 'and': - result = functionBoolean(lhs) && functionBoolean(rhs); - break; - case 'or': - result = functionBoolean(lhs) || functionBoolean(rhs); - break; - } - return result; - } - - /** - * Evaluate string concatenation against input data - * @param {Object} lhs - LHS value - * @param {Object} rhs - RHS value - * @returns {string|*} Concatenated string - */ - function evaluateStringConcat(lhs, rhs) { - var result; - - var lstr = ''; - var rstr = ''; - if (typeof lhs !== 'undefined') { - lstr = functionString(lhs); - } - if (typeof rhs !== 'undefined') { - rstr = functionString(rhs); - } - - result = lstr.concat(rstr); - return result; - } - - /** - * Evaluate group expression against input data - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {{}} Evaluated input data - */ - function* evaluateGroupExpression(expr, input, environment) { - var result = {}; - var groups = {}; - // group the input sequence by 'key' expression - if (!Array.isArray(input)) { - input = createSequence(input); - } - for(var itemIndex = 0; itemIndex < input.length; itemIndex++) { - var item = input[itemIndex]; - for(var pairIndex = 0; pairIndex < expr.lhs.length; pairIndex++) { - var pair = expr.lhs[pairIndex]; - var key = yield * evaluate(pair[0], item, environment); - // key has to be a string - if (typeof key !== 'string') { - throw { - code: "T1003", - stack: (new Error()).stack, - position: expr.position, - value: key - }; - } - var entry = {data: item, expr: pair[1]}; - if (groups.hasOwnProperty(key)) { - // a value already exists in this slot - // append it as an array - groups[key].data = functionAppend(groups[key].data, item); - } else { - groups[key] = entry; - } - } - } - - // iterate over the groups to evaluate the 'value' expression - for (key in groups) { - entry = groups[key]; - var value = yield * evaluate(entry.expr, entry.data, environment); - if(typeof value !== 'undefined') { - result[key] = value; - } - } - - return result; - } - - /** - * Evaluate range expression against input data - * @param {Object} lhs - LHS value - * @param {Object} rhs - RHS value - * @returns {Array} Resultant array - */ - function evaluateRangeExpression(lhs, rhs) { - var result; - - if (typeof lhs === 'undefined' || typeof rhs === 'undefined') { - // if either side is undefined, the result is undefined - return result; - } - - if (lhs > rhs) { - // if the lhs is greater than the rhs, return undefined - return result; - } - - if (!Number.isInteger(lhs)) { - throw { - code: "T2003", - stack: (new Error()).stack, - value: lhs - }; - } - if (!Number.isInteger(rhs)) { - throw { - code: "T2004", - stack: (new Error()).stack, - value: rhs - }; - } - - result = new Array(rhs - lhs + 1); - for (var item = lhs, index = 0; item <= rhs; item++, index++) { - result[index] = item; - } - return toSequence(result); - } - - /** - * Evaluate bind expression against input data - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {*} Evaluated input data - */ - function* evaluateBindExpression(expr, input, environment) { - // The RHS is the expression to evaluate - // The LHS is the name of the variable to bind to - should be a VARIABLE token - var value = yield * evaluate(expr.rhs, input, environment); - if (expr.lhs.type !== 'variable') { - throw { - code: "D2005", - stack: (new Error()).stack, - position: expr.position, - token: expr.value, - value: expr.lhs.type === 'path' ? expr.lhs.steps[0].value : expr.lhs.value - }; - } - environment.bind(expr.lhs.value, value); - return value; - } - - /** - * Evaluate condition against input data - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {*} Evaluated input data - */ - function* evaluateCondition(expr, input, environment) { - var result; - var condition = yield * evaluate(expr.condition, input, environment); - if (functionBoolean(condition)) { - result = yield * evaluate(expr.then, input, environment); - } else if (typeof expr.else !== 'undefined') { - result = yield * evaluate(expr.else, input, environment); - } - return result; - } - - /** - * Evaluate block against input data - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {*} Evaluated input data - */ - function* evaluateBlock(expr, input, environment) { - var result; - // create a new frame to limit the scope of variable assignments - // TODO, only do this if the post-parse stage has flagged this as required - var frame = createFrame(environment); - // invoke each expression in turn - // only return the result of the last one - for(var ii = 0; ii < expr.expressions.length; ii++) { - result = yield * evaluate(expr.expressions[ii], input, frame); - } - - return result; - } - - /** - * Prepare a regex - * @param {Object} expr - expression containing regex - * @returns {Function} Higher order function representing prepared regex - */ - function evaluateRegex(expr) { - expr.value.lastIndex = 0; - var closure = function(str) { - var re = expr.value; - var result; - var match = re.exec(str); - if(match !== null) { - result = { - match: match[0], - start: match.index, - end: match.index + match[0].length, - groups: [] - }; - if(match.length > 1) { - for(var i = 1; i < match.length; i++) { - result.groups.push(match[i]); - } - } - result.next = function() { - if(re.lastIndex >= str.length) { - return undefined; - } else { - var next = closure(str); - if(next && next.match === '' && re.lastIndex === expr.value.lastIndex) { - // matches zero length string; this will never progress - throw { - code: "D1004", - stack: (new Error()).stack, - position: expr.position, - value: expr.value.source - }; - } - return next; - } - }; - } - - return result; - }; - return closure; - } - - /** - * Evaluate variable against input data - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {*} Evaluated input data - */ - function evaluateVariable(expr, input, environment) { - // lookup the variable value in the environment - var result; - // if the variable name is empty string, then it refers to context value - if (expr.value === '') { - result = input; - } else { - result = environment.lookup(expr.value); - } - return result; - } - - /** - * sort / order-by operator - * @param {Object} expr - AST for operator - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {*} Ordered sequence - */ - function* evaluateSortExpression(expr, input, environment) { - var result; - - // evaluate the lhs, then sort the results in order according to rhs expression - var lhs = yield * evaluate(expr.lhs, input, environment); - - // sort the lhs array - // use comparator function - var comparator = function(a, b) { - // expr.rhs is an array of order-by in priority order - var comp = 0; - for(var index = 0; comp === 0 && index < expr.rhs.length; index++) { - var term = expr.rhs[index]; - //evaluate the rhs expression in the context of a - var aa = driveGenerator(term.expression, a, environment); - //evaluate the rhs expression in the context of b - var bb = driveGenerator(term.expression, b, environment); - - // type checks - var atype = typeof aa; - var btype = typeof bb; - // undefined should be last in sort order - if(atype === 'undefined') { - // swap them, unless btype is also undefined - comp = (btype === 'undefined') ? 0 : 1; - continue; - } - if(btype === 'undefined') { - comp = -1; - continue; - } - - // if aa or bb are not string or numeric values, then throw an error - if(!(atype === 'string' || atype === 'number') || !(btype === 'string' || btype === 'number')) { - throw { - code: "T2008", - stack: (new Error()).stack, - position: expr.position, - value: !(atype === 'string' || atype === 'number') ? aa : bb - }; - } - - //if aa and bb are not of the same type - if(atype !== btype) { - throw { - code: "T2007", - stack: (new Error()).stack, - position: expr.position, - value: aa, - value2: bb - }; - } - if(aa === bb) { - // both the same - move on to next term - continue; - } else if (aa < bb) { - comp = -1; - } else { - comp = 1; - } - if(term.descending === true) { - comp = -comp; - } - } - // only swap a & b if comp equals 1 - return comp === 1; - }; - - result = functionSort(lhs, comparator); - - return result; - } - - /** - * create a transformer function - * @param {Object} expr - AST for operator - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {*} tranformer function - */ - function evaluateTransformExpression(expr, input, environment) { - // create a function to implement the transform definition - var transformer = function*(obj) { // signature <(oa):o> - // undefined inputs always return undefined - if(typeof obj === 'undefined') { - return undefined; - } - - // this function returns a copy of obj with changes specified by the pattern/operation - var cloneFunction = environment.lookup('clone'); - if(!isFunction(cloneFunction)) { - // throw type error - throw { - code: "T2013", - stack: (new Error()).stack, - position: expr.position - }; - } - var result = yield * apply(cloneFunction, [obj], environment); - var matches = yield * evaluate(expr.pattern, result, environment); - if(typeof matches !== 'undefined') { - if(!Array.isArray(matches)) { - matches = [matches]; - } - for(var ii = 0; ii < matches.length; ii++) { - var match = matches[ii]; - // evaluate the update value for each match - var update = yield * evaluate(expr.update, match, environment); - // update must be an object - var updateType = typeof update; - if(updateType !== 'undefined') { - if(updateType !== 'object' || update === null) { - // throw type error - throw { - code: "T2011", - stack: (new Error()).stack, - position: expr.update.position, - value: update - }; - } - // merge the update - for(var prop in update) { - match[prop] = update[prop]; - } - } - - // delete, if specified, must be an array of strings (or single string) - if(typeof expr.delete !== 'undefined') { - var deletions = yield * evaluate(expr.delete, match, environment); - if(typeof deletions !== 'undefined') { - var val = deletions; - if (!Array.isArray(deletions)) { - deletions = [deletions]; - } - if (!isArrayOfStrings(deletions)) { - // throw type error - throw { - code: "T2012", - stack: (new Error()).stack, - position: expr.delete.position, - value: val - }; - } - for (var jj = 0; jj < deletions.length; jj++) { - delete match[deletions[jj]]; - } - } - } - } - } - - return result; - }; - - return defineFunction(transformer, '<(oa):o>'); - } - - /** - * Evaluate an expression by driving the generator to completion - * Used when it's not possible to yield - * @param {Object} expr - AST - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {*} result - */ - function driveGenerator(expr, input, environment) { - var gen = evaluate(expr, input, environment); - // returns a generator - so iterate over it - var comp = gen.next(); - while (!comp.done) { - comp = gen.next(comp.value); - } - return comp.value; - } - - var chain = driveGenerator(parser('function($f, $g) { function($x){ $g($f($x)) } }'), null, staticFrame); - - /** - * Apply the function on the RHS using the sequence on the LHS as the first argument - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {*} Evaluated input data - */ - function* evaluateApplyExpression(expr, input, environment) { - var result; - - - if(expr.rhs.type === 'function') { - // this is a function _invocation_; invoke it with lhs expression as the first argument - expr.rhs.arguments.unshift(expr.lhs); - result = yield * evaluateFunction(expr.rhs, input, environment); - expr.rhs.arguments.shift(); - } else { - var lhs = yield * evaluate(expr.lhs, input, environment); - var func = yield * evaluate(expr.rhs, input, environment); - - if(!isFunction(func)) { - throw { - code: "T2006", - stack: (new Error()).stack, - position: expr.position, - value: func - }; - } - - if(isFunction(lhs)) { - // this is function chaining (func1 ~> func2) - // λ($f, $g) { λ($x){ $g($f($x)) } } - result = yield * apply(chain, [lhs, func], environment); - } else { - result = yield * apply(func, [lhs], environment); - } - - } - - return result; - } - - /** - * - * @param {Object} arg - expression to test - * @returns {boolean} - true if it is a function (lambda or built-in) - */ - function isFunction(arg) { - return ((arg && (arg._jsonata_function === true || arg._jsonata_lambda === true)) || typeof arg === 'function'); - } - - /** - * Tests whether arg is a lambda function - * @param {*} arg - the value to test - * @returns {boolean} - true if it is a lambda function - */ - function isLambda(arg) { - return arg && arg._jsonata_lambda === true; - } - - /** - * @param {Object} arg - expression to test - * @returns {boolean} - true if it is a generator i.e. the result from calling a - * generator function - */ - function isGenerator(arg) { - return ( - typeof arg === 'object' && - arg !== null && - Symbol.iterator in arg && - typeof arg[Symbol.iterator] === 'function' && - 'next' in arg && - typeof arg.next === 'function' - ); - } - - /** - * Evaluate function against input data - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @param {Object} [applyto] - LHS of ~> operator - * @returns {*} Evaluated input data - */ - function* evaluateFunction(expr, input, environment) { - var result; - - // create the procedure - // can't assume that expr.procedure is a lambda type directly - // could be an expression that evaluates to a function (e.g. variable reference, parens expr etc. - // evaluate it generically first, then check that it is a function. Throw error if not. - var proc = yield * evaluate(expr.procedure, input, environment); - - if (typeof proc === 'undefined' && expr.procedure.type === 'path' && environment.lookup(expr.procedure.steps[0].value)) { - // help the user out here if they simply forgot the leading $ - throw { - code: "T1005", - stack: (new Error()).stack, - position: expr.position, - token: expr.procedure.steps[0].value - }; - } - - var evaluatedArgs = []; - // eager evaluation - evaluate the arguments - for (var jj = 0; jj < expr.arguments.length; jj++) { - evaluatedArgs.push(yield* evaluate(expr.arguments[jj], input, environment)); - } - // apply the procedure - try { - result = yield * apply(proc, evaluatedArgs, input); - } catch (err) { - // add the position field to the error - err.position = expr.position; - // and the function identifier - err.token = expr.procedure.type === 'path' ? expr.procedure.steps[0].value : expr.procedure.value; - throw err; - } - return result; - } - - /** - * Apply procedure or function - * @param {Object} proc - Procedure - * @param {Array} args - Arguments - * @param {Object} self - Self - * @returns {*} Result of procedure - */ - function* apply(proc, args, self) { - var result; - result = yield * applyInner(proc, args, self); - while(isLambda(result) && result.thunk === true) { - // trampoline loop - this gets invoked as a result of tail-call optimization - // the function returned a tail-call thunk - // unpack it, evaluate its arguments, and apply the tail call - var next = yield * evaluate(result.body.procedure, result.input, result.environment); - var evaluatedArgs = []; - for(var ii = 0; ii < result.body.arguments.length; ii++) { - evaluatedArgs.push(yield * evaluate(result.body.arguments[ii], result.input, result.environment)); - } - - result = yield * applyInner(next, evaluatedArgs, self); - } - return result; - } - - /** - * Apply procedure or function - * @param {Object} proc - Procedure - * @param {Array} args - Arguments - * @param {Object} self - Self - * @returns {*} Result of procedure - */ - function* applyInner(proc, args, self) { - var result; - var validatedArgs = args; - if(proc) { - validatedArgs = validateArguments(proc.signature, args, self); - } - if (isLambda(proc)) { - result = yield * applyProcedure(proc, validatedArgs); - } else if (proc && proc._jsonata_function === true) { - result = proc.implementation.apply(self, validatedArgs); - // `proc.implementation` might be a generator function - // and `result` might be a generator - if so, yield - if(isGenerator(result)) { - result = yield *result; - } - } else if (typeof proc === 'function') { - result = proc.apply(self, validatedArgs); - /* istanbul ignore next */ - if(isGenerator(result)) { - result = yield *result; - } - } else { - throw { - code: "T1006", - stack: (new Error()).stack - }; - } - return result; - } - - /** - * Evaluate lambda against input data - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {{lambda: boolean, input: *, environment: *, arguments: *, body: *}} Evaluated input data - */ - function evaluateLambda(expr, input, environment) { - // make a function (closure) - var procedure = { - _jsonata_lambda: true, - input: input, - environment: environment, - arguments: expr.arguments, - signature: expr.signature, - body: expr.body - }; - if(expr.thunk === true) { - procedure.thunk = true; - } - return procedure; - } - - /** - * Evaluate partial application - * @param {Object} expr - JSONata expression - * @param {Object} input - Input data to evaluate against - * @param {Object} environment - Environment - * @returns {*} Evaluated input data - */ - function* evaluatePartialApplication(expr, input, environment) { - // partially apply a function - var result; - // evaluate the arguments - var evaluatedArgs = []; - for(var ii = 0; ii < expr.arguments.length; ii++) { - var arg = expr.arguments[ii]; - if (arg.type === 'operator' && arg.value === '?') { - evaluatedArgs.push(arg); - } else { - evaluatedArgs.push(yield * evaluate(arg, input, environment)); - } - } - // lookup the procedure - var proc = yield * evaluate(expr.procedure, input, environment); - if (typeof proc === 'undefined' && expr.procedure.type === 'path' && environment.lookup(expr.procedure.steps[0].value)) { - // help the user out here if they simply forgot the leading $ - throw { - code: "T1007", - stack: (new Error()).stack, - position: expr.position, - token: expr.procedure.steps[0].value - }; - } - if (isLambda(proc)) { - result = partialApplyProcedure(proc, evaluatedArgs); - } else if (proc && proc._jsonata_function === true) { - result = partialApplyNativeFunction(proc.implementation, evaluatedArgs); - } else if (typeof proc === 'function') { - result = partialApplyNativeFunction(proc, evaluatedArgs); - } else { - throw { - code: "T1008", - stack: (new Error()).stack, - position: expr.position, - token: expr.procedure.type === 'path' ? expr.procedure.steps[0].value : expr.procedure.value - }; - } - return result; - } - - /** - * Validate the arguments against the signature validator (if it exists) - * @param {Function} signature - validator function - * @param {Array} args - function arguments - * @param {*} context - context value - * @returns {Array} - validated arguments - */ - function validateArguments(signature, args, context) { - if(typeof signature === 'undefined') { - // nothing to validate - return args; - } - var validatedArgs = signature.validate(args, context); - return validatedArgs; - } - - /** - * Apply procedure - * @param {Object} proc - Procedure - * @param {Array} args - Arguments - * @returns {*} Result of procedure - */ - function* applyProcedure(proc, args) { - var result; - var env = createFrame(proc.environment); - proc.arguments.forEach(function (param, index) { - env.bind(param.value, args[index]); - }); - if (typeof proc.body === 'function') { - // this is a lambda that wraps a native function - generated by partially evaluating a native - result = yield * applyNativeFunction(proc.body, env); - } else { - result = yield * evaluate(proc.body, proc.input, env); - } - return result; - } - - /** - * Partially apply procedure - * @param {Object} proc - Procedure - * @param {Array} args - Arguments - * @returns {{lambda: boolean, input: *, environment: {bind, lookup}, arguments: Array, body: *}} Result of partially applied procedure - */ - function partialApplyProcedure(proc, args) { - // create a closure, bind the supplied parameters and return a function that takes the remaining (?) parameters - var env = createFrame(proc.environment); - var unboundArgs = []; - proc.arguments.forEach(function (param, index) { - var arg = args[index]; - if (arg && arg.type === 'operator' && arg.value === '?') { - unboundArgs.push(param); - } else { - env.bind(param.value, arg); - } - }); - var procedure = { - _jsonata_lambda: true, - input: proc.input, - environment: env, - arguments: unboundArgs, - body: proc.body - }; - return procedure; - } - - /** - * Partially apply native function - * @param {Function} native - Native function - * @param {Array} args - Arguments - * @returns {{lambda: boolean, input: *, environment: {bind, lookup}, arguments: Array, body: *}} Result of partially applying native function - */ - function partialApplyNativeFunction(native, args) { - // create a lambda function that wraps and invokes the native function - // get the list of declared arguments from the native function - // this has to be picked out from the toString() value - var sigArgs = getNativeFunctionArguments(native); - sigArgs = sigArgs.map(function (sigArg) { - return '$' + sigArg.trim(); - }); - var body = 'function(' + sigArgs.join(', ') + '){ _ }'; - - var bodyAST = parser(body); - bodyAST.body = native; - - var partial = partialApplyProcedure(bodyAST, args); - return partial; - } - - /** - * Apply native function - * @param {Object} proc - Procedure - * @param {Object} env - Environment - * @returns {*} Result of applying native function - */ - function* applyNativeFunction(proc, env) { - var sigArgs = getNativeFunctionArguments(proc); - // generate the array of arguments for invoking the function - look them up in the environment - var args = sigArgs.map(function (sigArg) { - return env.lookup(sigArg.trim()); - }); - - var result = proc.apply(null, args); - if(isGenerator(result)) { - result = yield * result; - } - return result; - } - - /** - * Get native function arguments - * @param {Function} func - Function - * @returns {*|Array} Native function arguments - */ - function getNativeFunctionArguments(func) { - var signature = func.toString(); - var sigParens = /\(([^)]*)\)/.exec(signature)[1]; // the contents of the parens - var sigArgs = sigParens.split(','); - return sigArgs; - } - - /** - * Creates a function definition - * @param {Function} func - function implementation in Javascript - * @param {string} signature - JSONata function signature definition - * @returns {{implementation: *, signature: *}} function definition - */ - function defineFunction(func, signature) { - var definition = { - _jsonata_function: true, - implementation: func - }; - if(typeof signature !== 'undefined') { - definition.signature = parseSignature(signature); - } - return definition; - } - - /** - * Sum function - * @param {Object} args - Arguments - * @returns {number} Total value of arguments - */ - function functionSum(args) { - // undefined inputs always return undefined - if(typeof args === 'undefined') { - return undefined; - } - - var total = 0; - args.forEach(function(num){total += num;}); - return total; - } - - /** - * Count function - * @param {Object} args - Arguments - * @returns {number} Number of elements in the array - */ - function functionCount(args) { - // undefined inputs always return undefined - if(typeof args === 'undefined') { - return 0; - } - - return args.length; - } - - /** - * Max function - * @param {Object} args - Arguments - * @returns {number} Max element in the array - */ - function functionMax(args) { - // undefined inputs always return undefined - if(typeof args === 'undefined' || args.length === 0) { - return undefined; - } - - return Math.max.apply(Math, args); - } - - /** - * Min function - * @param {Object} args - Arguments - * @returns {number} Min element in the array - */ - function functionMin(args) { - // undefined inputs always return undefined - if(typeof args === 'undefined' || args.length === 0) { - return undefined; - } - - return Math.min.apply(Math, args); - } - - /** - * Average function - * @param {Object} args - Arguments - * @returns {number} Average element in the array - */ - function functionAverage(args) { - // undefined inputs always return undefined - if(typeof args === 'undefined' || args.length === 0) { - return undefined; - } - - var total = 0; - args.forEach(function(num){total += num;}); - return total/args.length; - } - - /** - * Stingify arguments - * @param {Object} arg - Arguments - * @returns {String} String from arguments - */ - function functionString(arg) { - // undefined inputs always return undefined - if(typeof arg === 'undefined') { - return undefined; - } - - var str; - - if (typeof arg === 'string') { - // already a string - str = arg; - } else if(isFunction(arg)) { - // functions (built-in and lambda convert to empty string - str = ''; - } else if (typeof arg === 'number' && !isFinite(arg)) { - throw { - code: "D3001", - value: arg, - stack: (new Error()).stack - }; - } else - str = JSON.stringify(arg, function (key, val) { - return (typeof val !== 'undefined' && val !== null && val.toPrecision && isNumeric(val)) ? Number(val.toPrecision(13)) : - (val && isFunction(val)) ? '' : val; - }); - return str; - } - - /** - * Create substring based on character number and length - * @param {String} str - String to evaluate - * @param {Integer} start - Character number to start substring - * @param {Integer} [length] - Number of characters in substring - * @returns {string|*} Substring - */ - function functionSubstring(str, start, length) { - // undefined inputs always return undefined - if(typeof str === 'undefined') { - return undefined; - } - - return str.substr(start, length); - } - - /** - * Create substring up until a character - * @param {String} str - String to evaluate - * @param {String} chars - Character to define substring boundary - * @returns {*} Substring - */ - function functionSubstringBefore(str, chars) { - // undefined inputs always return undefined - if(typeof str === 'undefined') { - return undefined; - } - - var pos = str.indexOf(chars); - if (pos > -1) { - return str.substr(0, pos); - } else { - return str; - } - } - - /** - * Create substring after a character - * @param {String} str - String to evaluate - * @param {String} chars - Character to define substring boundary - * @returns {*} Substring - */ - function functionSubstringAfter(str, chars) { - // undefined inputs always return undefined - if(typeof str === 'undefined') { - return undefined; - } - - var pos = str.indexOf(chars); - if (pos > -1) { - return str.substr(pos + chars.length); - } else { - return str; - } - } - - /** - * Lowercase a string - * @param {String} str - String to evaluate - * @returns {string} Lowercase string - */ - function functionLowercase(str) { - // undefined inputs always return undefined - if(typeof str === 'undefined') { - return undefined; - } - - return str.toLowerCase(); - } - - /** - * Uppercase a string - * @param {String} str - String to evaluate - * @returns {string} Uppercase string - */ - function functionUppercase(str) { - // undefined inputs always return undefined - if(typeof str === 'undefined') { - return undefined; - } - - return str.toUpperCase(); - } - - /** - * length of a string - * @param {String} str - string - * @returns {Number} The number of characters in the string - */ - function functionLength(str) { - // undefined inputs always return undefined - if(typeof str === 'undefined') { - return undefined; - } - - return str.length; - } - - /** - * Normalize and trim whitespace within a string - * @param {string} str - string to be trimmed - * @returns {string} - trimmed string - */ - function functionTrim(str) { - // undefined inputs always return undefined - if(typeof str === 'undefined') { - return undefined; - } - - // normalize whitespace - var result = str.replace(/[ \t\n\r]+/gm, ' '); - if(result.charAt(0) === ' ') { - // strip leading space - result = result.substring(1); - } - if(result.charAt(result.length - 1) === ' ') { - // strip trailing space - result = result.substring(0, result.length - 1); - } - return result; - } - - /** - * Pad a string to a minimum width by adding characters to the start or end - * @param {string} str - string to be padded - * @param {number} width - the minimum width; +ve pads to the right, -ve pads to the left - * @param {string} [char] - the pad character(s); defaults to ' ' - * @returns {string} - padded string - */ - function functionPad(str, width, char) { - // undefined inputs always return undefined - if(typeof str === 'undefined') { - return undefined; - } - - if(typeof char === 'undefined' || char.length === 0) { - char = ' '; - } - - var result; - var padLength = Math.abs(width) - str.length; - if(padLength > 0) { - var padding = (new Array(padLength + 1)).join(char); - if(char.length > 1) { - padding = padding.substring(0, padLength); - } - if(width > 0) { - result = str + padding; - } else { - result = padding + str; - } - } else { - result = str; - } - return result; - } - - /** - * Tests if the str contains the token - * @param {String} str - string to test - * @param {String} token - substring or regex to find - * @returns {Boolean} - true if str contains token - */ - function functionContains(str, token) { - // undefined inputs always return undefined - if(typeof str === 'undefined') { - return undefined; - } - - var result; - - if(typeof token === 'string') { - result = (str.indexOf(token) !== -1); - } else { - var matches = token(str); - result = (typeof matches !== 'undefined'); - } - - return result; - } - - /** - * Match a string with a regex returning an array of object containing details of each match - * @param {String} str - string - * @param {String} regex - the regex applied to the string - * @param {Integer} [limit] - max number of matches to return - * @returns {Array} The array of match objects - */ - function functionMatch(str, regex, limit) { - // undefined inputs always return undefined - if(typeof str === 'undefined') { - return undefined; - } - - // limit, if specified, must be a non-negative number - if(limit < 0) { - throw { - stack: (new Error()).stack, - value: limit, - code: 'D3040', - index: 3 - }; - } - - var result = createSequence(); - - if(typeof limit === 'undefined' || limit > 0) { - var count = 0; - var matches = regex(str); - if (typeof matches !== 'undefined') { - while (typeof matches !== 'undefined' && (typeof limit === 'undefined' || count < limit)) { - result.push({ - match: matches.match, - index: matches.start, - groups: matches.groups - }); - matches = matches.next(); - count++; - } - } - } - - return result; - } - - /** - * Match a string with a regex returning an array of object containing details of each match - * @param {String} str - string - * @param {String} pattern - the substring/regex applied to the string - * @param {String} replacement - text to replace the matched substrings - * @param {Integer} [limit] - max number of matches to return - * @returns {Array} The array of match objects - */ - function* functionReplace(str, pattern, replacement, limit) { - // undefined inputs always return undefined - if(typeof str === 'undefined') { - return undefined; - } - - // pattern cannot be an empty string - if(pattern === '') { - throw { - code: "D3010", - stack: (new Error()).stack, - value: pattern, - index: 2 - }; - } - - // limit, if specified, must be a non-negative number - if(limit < 0) { - throw { - code: "D3011", - stack: (new Error()).stack, - value: limit, - index: 4 - }; - } - - var replacer; - if(typeof replacement === 'string') { - replacer = function (regexMatch) { - var substitute = ''; - // scan forward, copying the replacement text into the substitute string - // and replace any occurrence of $n with the values matched by the regex - var position = 0; - var index = replacement.indexOf('$', position); - while (index !== -1 && position < replacement.length) { - substitute += replacement.substring(position, index); - position = index + 1; - var dollarVal = replacement.charAt(position); - if (dollarVal === '$') { - // literal $ - substitute += '$'; - position++; - } else if (dollarVal === '0') { - substitute += regexMatch.match; - position++; - } else { - var maxDigits; - if(regexMatch.groups.length === 0) { - // no sub-matches; any $ followed by a digit will be replaced by an empty string - maxDigits = 1; - } else { - // max number of digits to parse following the $ - maxDigits = Math.floor(Math.log(regexMatch.groups.length) * Math.LOG10E) + 1; - } - index = parseInt(replacement.substring(position, position + maxDigits), 10); - if(maxDigits > 1 && index > regexMatch.groups.length) { - index = parseInt(replacement.substring(position, position + maxDigits - 1), 10); - } - if (!isNaN(index)) { - if(regexMatch.groups.length > 0 ) { - var submatch = regexMatch.groups[index - 1]; - if (typeof submatch !== 'undefined') { - substitute += submatch; - } - } - position += index.toString().length; - } else { - // not a capture group, treat the $ as literal - substitute += '$'; - } - } - index = replacement.indexOf('$', position); - } - substitute += replacement.substring(position); - return substitute; - }; - } else { - replacer = replacement; - } - - var result = ''; - var position = 0; - - if(typeof limit === 'undefined' || limit > 0) { - var count = 0; - if(typeof pattern === 'string') { - var index = str.indexOf(pattern, position); - while(index !== -1 && (typeof limit === 'undefined' || count < limit)) { - result += str.substring(position, index); - result += replacement; - position = index + pattern.length; - count++; - index = str.indexOf(pattern, position); - } - result += str.substring(position); - } else { - var matches = pattern(str); - if (typeof matches !== 'undefined') { - while (typeof matches !== 'undefined' && (typeof limit === 'undefined' || count < limit)) { - result += str.substring(position, matches.start); - var replacedWith = yield * apply(replacer, [matches], null); - // check replacedWith is a string - if(typeof replacedWith === 'string') { - result += replacedWith; - } else { - // not a string - throw error - throw { - code: "D3012", - stack: (new Error()).stack, - value: replacedWith - }; - } - position = matches.start + matches.match.length; - count++; - matches = matches.next(); - } - result += str.substring(position); - } else { - result = str; - } - } - } else { - result = str; - } - - return result; - } - - /** - * Base64 encode a string - * @param {String} str - string - * @returns {String} Base 64 encoding of the binary data - */ - function functionBase64encode(str) { - // undefined inputs always return undefined - if(typeof str === 'undefined') { - return undefined; - } - // Use btoa in a browser, or Buffer in Node.js - - var btoa = typeof window !== 'undefined' ? - /* istanbul ignore next */ window.btoa : - function(str) { - // Simply doing `new Buffer` at this point causes Browserify to pull - // in the entire Buffer browser library, which is large and unnecessary. - // Using `global.Buffer` defeats this. - return new global.Buffer(str, 'binary').toString('base64'); - }; - return btoa(str); - } - - /** - * Base64 decode a string - * @param {String} str - string - * @returns {String} Base 64 encoding of the binary data - */ - function functionBase64decode(str) { - // undefined inputs always return undefined - if(typeof str === 'undefined') { - return undefined; - } - // Use btoa in a browser, or Buffer in Node.js - var atob = typeof window !== 'undefined' ? - /* istanbul ignore next */ window.atob : - function(str) { - // Simply doing `new Buffer` at this point causes Browserify to pull - // in the entire Buffer browser library, which is large and unnecessary. - // Using `global.Buffer` defeats this. - return new global.Buffer(str, 'base64').toString('binary'); - }; - return atob(str); - } - - /** - * Split a string into an array of substrings - * @param {String} str - string - * @param {String} separator - the token or regex that splits the string - * @param {Integer} [limit] - max number of substrings - * @returns {Array} The array of string - */ - function functionSplit(str, separator, limit) { - // undefined inputs always return undefined - if(typeof str === 'undefined') { - return undefined; - } - - // limit, if specified, must be a non-negative number - if(limit < 0) { - throw { - code: "D3020", - stack: (new Error()).stack, - value: limit, - index: 3 - }; - } - - var result = []; - - if(typeof limit === 'undefined' || limit > 0) { - if (typeof separator === 'string') { - result = str.split(separator, limit); - } else { - var count = 0; - var matches = separator(str); - if (typeof matches !== 'undefined') { - var start = 0; - while (typeof matches !== 'undefined' && (typeof limit === 'undefined' || count < limit)) { - result.push(str.substring(start, matches.start)); - start = matches.end; - matches = matches.next(); - count++; - } - if(typeof limit === 'undefined' || count < limit) { - result.push(str.substring(start)); - } - } else { - result.push(str); - } - } - } - - return result; - } - - /** - * Join an array of strings - * @param {Array} strs - array of string - * @param {String} [separator] - the token that splits the string - * @returns {String} The concatenated string - */ - function functionJoin(strs, separator) { - // undefined inputs always return undefined - if(typeof strs === 'undefined') { - return undefined; - } - - // if separator is not specified, default to empty string - if(typeof separator === 'undefined') { - separator = ""; - } - - return strs.join(separator); - } - - /** - * Formats a number into a decimal string representation using XPath 3.1 F&O fn:format-number spec - * @param {number} value - number to format - * @param {String} picture - picture string definition - * @param {Object} [options] - override locale defaults - * @returns {String} The formatted string - */ - function functionFormatNumber(value, picture, options) { - var defaults = { - "decimal-separator": ".", - "grouping-separator": ",", - "exponent-separator": "e", - "infinity": "Infinity", - "minus-sign": "-", - "NaN": "NaN", - "percent": "%", - "per-mille": "\u2030", - "zero-digit": "0", - "digit": "#", - "pattern-separator": ";" - }; - - // if `options` is specified, then its entries override defaults - var properties = defaults; - if(typeof options !== 'undefined') { - Object.keys(options).forEach(function (key) { - properties[key] = options[key]; - }); - } - - var decimalDigitFamily = []; - var zeroCharCode = properties['zero-digit'].charCodeAt(0); - for(var ii = zeroCharCode; ii < zeroCharCode + 10; ii++) { - decimalDigitFamily.push(String.fromCharCode(ii)); - } - - var activeChars = decimalDigitFamily.concat([properties['decimal-separator'], properties['exponent-separator'], properties['grouping-separator'], properties.digit, properties['pattern-separator']]); - - var subPictures = picture.split(properties['pattern-separator']); - - if(subPictures.length > 2) { - throw { - code: 'D3080', - stack: (new Error()).stack - }; - } - - var splitParts = function(subpicture) { - var prefix = (function() { - var ch; - for(var ii = 0; ii < subpicture.length; ii++) { - ch = subpicture.charAt(ii); - if(activeChars.indexOf(ch) !== -1 && ch !== properties['exponent-separator']) { - return subpicture.substring(0, ii); - } - } - })(); - var suffix = (function() { - var ch; - for(var ii = subpicture.length - 1; ii >= 0; ii--) { - ch = subpicture.charAt(ii); - if(activeChars.indexOf(ch) !== -1 && ch !== properties['exponent-separator']) { - return subpicture.substring(ii + 1); - } - } - })(); - var activePart = subpicture.substring(prefix.length, subpicture.length - suffix.length); - var mantissaPart, exponentPart, integerPart, fractionalPart; - var exponentPosition = subpicture.indexOf(properties['exponent-separator'], prefix.length); - if(exponentPosition === -1 || exponentPosition > subpicture.length - suffix.length) { - mantissaPart = activePart; - exponentPart = undefined; - } else { - mantissaPart = activePart.substring(0, exponentPosition); - exponentPart = activePart.substring(exponentPosition + 1); - } - var decimalPosition = mantissaPart.indexOf(properties['decimal-separator']); - if(decimalPosition === -1) { - integerPart = mantissaPart; - fractionalPart = suffix; - } else { - integerPart = mantissaPart.substring(0, decimalPosition); - fractionalPart = mantissaPart.substring(decimalPosition + 1); - } - return { - prefix: prefix, - suffix: suffix, - activePart: activePart, - mantissaPart: mantissaPart, - exponentPart: exponentPart, - integerPart: integerPart, - fractionalPart: fractionalPart, - subpicture: subpicture - }; - }; - - // validate the picture string, F&O 4.7.3 - var validate = function(parts) { - var error; - var ii; - var subpicture = parts.subpicture; - var decimalPos = subpicture.indexOf(properties['decimal-separator']); - if(decimalPos !== subpicture.lastIndexOf(properties['decimal-separator'])) { - error = 'D3081'; - } - if(subpicture.indexOf(properties.percent) !== subpicture.lastIndexOf(properties.percent)) { - error = 'D3082'; - } - if(subpicture.indexOf(properties['per-mille']) !== subpicture.lastIndexOf(properties['per-mille'])) { - error = 'D3083'; - } - if(subpicture.indexOf(properties.percent) !== -1 && subpicture.indexOf(properties['per-mille']) !== -1) { - error = 'D3084'; - } - var valid = false; - for(ii = 0; ii < parts.mantissaPart.length; ii++) { - var ch = parts.mantissaPart.charAt(ii); - if(decimalDigitFamily.indexOf(ch) !== -1 || ch === properties.digit) { - valid = true; - break; - } - } - if(!valid) { - error = 'D3085'; - } - var charTypes = parts.activePart.split('').map(function(char) { - return activeChars.indexOf(char) === -1 ? 'p' : 'a'; - }).join(''); - if(charTypes.indexOf('p') !== -1) { - error = 'D3086'; - } - if(decimalPos !== -1) { - if(subpicture.charAt(decimalPos - 1) === properties['grouping-separator'] || subpicture.charAt(decimalPos + 1) === properties['grouping-separator']) { - error = 'D3087'; - } - } else if(parts.integerPart.charAt(parts.integerPart.length - 1) === properties['grouping-separator']) { - error = 'D3088'; - } - if(subpicture.indexOf(properties['grouping-separator'] + properties['grouping-separator']) !== -1) { - error = 'D3089'; - } - var optionalDigitPos = parts.integerPart.indexOf(properties.digit); - if(optionalDigitPos !== -1 && parts.integerPart.substring(0, optionalDigitPos).split('').filter(function(char) { - return decimalDigitFamily.indexOf(char) > -1; - }).length > 0) { - error = 'D3090'; - } - optionalDigitPos = parts.fractionalPart.lastIndexOf(properties.digit); - if(optionalDigitPos !== -1 && parts.fractionalPart.substring(optionalDigitPos).split('').filter(function(char) { - return decimalDigitFamily.indexOf(char) > -1; - }).length > 0) { - error = 'D3091'; - } - var exponentExists = (typeof parts.exponentPart === 'string'); - if(exponentExists && parts.exponentPart.length > 0 && (subpicture.indexOf(properties.percent) !== -1 || subpicture.indexOf(properties['per-mille']) !== -1)) { - error = 'D3092'; - } - if(exponentExists && (parts.exponentPart.length === 0 || parts.exponentPart.split('').filter(function(char) { - return decimalDigitFamily.indexOf(char) === -1; - }).length > 0)) { - error = 'D3093'; - } - if(error) { - throw { - code: error, - stack: (new Error()).stack - }; - } - }; - - // analyse the picture string, F&O 4.7.4 - var analyse = function(parts) { - var getGroupingPositions = function(part, toLeft) { - var positions = []; - var groupingPosition = part.indexOf(properties['grouping-separator']); - while(groupingPosition !== -1) { - var charsToTheRight = (toLeft ? part.substring(0, groupingPosition) : part.substring(groupingPosition)).split('').filter(function(char) { - return decimalDigitFamily.indexOf(char) !== -1 || char === properties.digit; - }).length; - positions.push(charsToTheRight); - groupingPosition = parts.integerPart.indexOf(properties['grouping-separator'], groupingPosition + 1); - } - return positions; - }; - var integerPartGroupingPositions = getGroupingPositions(parts.integerPart); - var regular = function(indexes) { - // are the grouping positions regular? i.e. same interval between each of them - if(indexes.length === 0) { - return 0; - } - var gcd = function(a, b) { - return b === 0 ? a : gcd(b, a % b); - }; - // find the greatest common divisor of all the positions - var factor = indexes.reduce(gcd); - // is every position separated by this divisor? If so, it's regular - for(var index = 1; index <= indexes.length; index++) { - if(indexes.indexOf(index * factor) === -1) { - return 0; - } - } - return factor; - }; - - var regularGrouping = regular(integerPartGroupingPositions); - var fractionalPartGroupingPositions = getGroupingPositions(parts.fractionalPart, true); - - var minimumIntegerPartSize = parts.integerPart.split('').filter(function(char) { return decimalDigitFamily.indexOf(char) !== -1; }).length; - var scalingFactor = minimumIntegerPartSize; - - var fractionalPartArray = parts.fractionalPart.split(''); - var minimumFactionalPartSize = fractionalPartArray.filter(function(char) { return decimalDigitFamily.indexOf(char) !== -1; }).length; - var maximumFactionalPartSize = fractionalPartArray.filter(function(char) { return decimalDigitFamily.indexOf(char) !== -1 || char === properties.digit; }).length; - var exponentPresent = typeof parts.exponentPart === 'string'; - if(minimumIntegerPartSize === 0 && maximumFactionalPartSize === 0) { - if(exponentPresent) { - minimumFactionalPartSize = 1; - maximumFactionalPartSize = 1; - } else { - minimumIntegerPartSize = 1; - } - } - if(exponentPresent && minimumIntegerPartSize === 0 && parts.integerPart.indexOf(properties.digit) !== -1) { - minimumIntegerPartSize = 1; - } - if(minimumIntegerPartSize === 0 && minimumFactionalPartSize === 0) { - minimumFactionalPartSize = 1; - } - var minimumExponentSize = 0; - if(exponentPresent) { - minimumExponentSize = parts.exponentPart.split('').filter(function(char) { return decimalDigitFamily.indexOf(char) !== -1; }).length; - } - - return { - integerPartGroupingPositions: integerPartGroupingPositions, - regularGrouping: regularGrouping, - minimumIntegerPartSize: minimumIntegerPartSize, - scalingFactor: scalingFactor, - prefix: parts.prefix, - fractionalPartGroupingPositions: fractionalPartGroupingPositions, - minimumFactionalPartSize: minimumFactionalPartSize, - maximumFactionalPartSize: maximumFactionalPartSize, - minimumExponentSize: minimumExponentSize, - suffix: parts.suffix, - picture: parts.subpicture - }; - }; - - var parts = subPictures.map(splitParts); - parts.forEach(validate); - - var variables = parts.map(analyse); - - if(variables.length === 1) { - variables.push(JSON.parse(JSON.stringify(variables[0]))); - variables[1].prefix = properties['minus-sign'] + variables[1].prefix; - } - - // TODO cache the result of the analysis - - // format the number - // bullet 1: TODO: NaN - not sure we'd ever get this in JSON - var pic; - // bullet 2: - if(value >= 0) { - pic = variables[0]; - } else { - pic = variables[1]; - } - var adjustedNumber; - // bullet 3: - if(pic.picture.indexOf(properties.percent) !== -1) { - adjustedNumber = value * 100; - } else if(pic.picture.indexOf(properties['per-mille']) !== -1) { - adjustedNumber = value * 1000; - } else { - adjustedNumber = value; - } - // bullet 4: - // TODO: infinity - not sure we'd ever get this in JSON - // bullet 5: - var mantissa, exponent; - if(pic.minimumExponentSize === 0) { - mantissa = adjustedNumber; - } else { - // mantissa * 10^exponent = adjustedNumber - var maxMantissa = Math.pow(10, pic.scalingFactor); - var minMantissa = Math.pow(10, pic.scalingFactor - 1); - mantissa = adjustedNumber; - exponent = 0; - while(mantissa < minMantissa) { - mantissa *= 10; - exponent -= 1; - } - while(mantissa > maxMantissa) { - mantissa /= 10; - exponent += 1; - } - } - // bullet 6: - var roundedNumber = functionRound(mantissa, pic.maximumFactionalPartSize); - // bullet 7: - var makeString = function(value, dp) { - var str = Math.abs(value).toFixed(dp); - if (properties['zero-digit'] !== '0') { - str = str.split('').map(function (digit) { - if(digit >= '0' && digit <='9') { - return decimalDigitFamily[digit.charCodeAt(0) - 48]; - } else { - return digit; - } - }).join(''); - } - return str; - }; - var stringValue = makeString(roundedNumber, pic.maximumFactionalPartSize); - var decimalPos = stringValue.indexOf('.'); - if(decimalPos === -1) { - stringValue = stringValue + properties['decimal-separator']; - } else { - stringValue = stringValue.replace('.', properties['decimal-separator']); - } - while(stringValue.charAt(0) === properties['zero-digit']) { - stringValue = stringValue.substring(1); - } - while(stringValue.charAt(stringValue.length - 1) === properties['zero-digit']) { - stringValue = stringValue.substring(0, stringValue.length - 1); - } - // bullets 8 & 9: - decimalPos = stringValue.indexOf(properties['decimal-separator']); - var padLeft = pic.minimumIntegerPartSize - decimalPos; - var padRight = pic.minimumFactionalPartSize - (stringValue.length - decimalPos - 1); - stringValue = (padLeft > 0 ? new Array(padLeft + 1).join('0') : '') + stringValue; - stringValue = stringValue + (padRight > 0 ? new Array(padRight + 1).join('0') : ''); - decimalPos = stringValue.indexOf(properties['decimal-separator']); - // bullet 10: - if(pic.regularGrouping > 0) { - var groupCount = Math.floor((decimalPos - 1) / pic.regularGrouping); - for(var group = 1; group <= groupCount; group++) { - stringValue = [stringValue.slice(0, decimalPos - group * pic.regularGrouping), properties['grouping-separator'], stringValue.slice(decimalPos - group * pic.regularGrouping)].join(''); - } - } else { - pic.integerPartGroupingPositions.forEach(function (pos) { - stringValue = [stringValue.slice(0, decimalPos - pos), properties['grouping-separator'], stringValue.slice(decimalPos - pos)].join(''); - decimalPos++; - }); - } - // bullet 11: - decimalPos = stringValue.indexOf(properties['decimal-separator']); - pic.fractionalPartGroupingPositions.forEach(function(pos) { - stringValue = [stringValue.slice(0, pos + decimalPos + 1), properties['grouping-separator'], stringValue.slice(pos + decimalPos + 1)].join(''); - }); - // bullet 12: - decimalPos = stringValue.indexOf(properties['decimal-separator']); - if(pic.picture.indexOf(properties['decimal-separator']) === -1 || decimalPos === stringValue.length - 1) { - stringValue = stringValue.substring(0, stringValue.length - 1); - } - // bullet 13: - if(typeof exponent !== 'undefined') { - var stringExponent = makeString(exponent, 0); - padLeft = pic.minimumExponentSize - stringExponent.length; - if(padLeft > 0) { - stringExponent = new Array(padLeft + 1).join('0') + stringExponent; - } - stringValue = stringValue + properties['exponent-separator'] + (exponent < 0 ? properties['minus-sign'] : '') + stringExponent; - } - // bullet 14: - stringValue = pic.prefix + stringValue + pic.suffix; - return stringValue; - } - - /** - * Converts a number to a string using a specified number base - * @param {string} value - the number to convert - * @param {number} [radix] - the number base; must be between 2 and 36. Defaults to 10 - * @returns {string} - the converted string - */ - function functionFormatBase(value, radix) { - // undefined inputs always return undefined - if(typeof value === 'undefined') { - return undefined; - } - - value = functionRound(value); - - if(typeof radix === 'undefined') { - radix = 10; - } else { - radix = functionRound(radix); - } - - if(radix < 2 || radix > 36) { - throw { - code: 'D3100', - stack: (new Error()).stack, - value: radix - }; - - } - - var result = value.toString(radix); - - return result; - } - - /** - * Cast argument to number - * @param {Object} arg - Argument - * @returns {Number} numeric value of argument - */ - function functionNumber(arg) { - var result; - - // undefined inputs always return undefined - if(typeof arg === 'undefined') { - return undefined; - } - - if (typeof arg === 'number') { - // already a number - result = arg; - } else if(typeof arg === 'string' && /^-?(0|([1-9][0-9]*))(\.[0-9]+)?([Ee][-+]?[0-9]+)?$/.test(arg) && !isNaN(parseFloat(arg)) && isFinite(arg)) { - result = parseFloat(arg); - } else { - throw { - code: "D3030", - value: arg, - stack: (new Error()).stack, - index: 1 - }; - } - return result; - } - - /** - * Absolute value of a number - * @param {Number} arg - Argument - * @returns {Number} absolute value of argument - */ - function functionAbs(arg) { - var result; - - // undefined inputs always return undefined - if(typeof arg === 'undefined') { - return undefined; - } - - result = Math.abs(arg); - return result; - } - - /** - * Rounds a number down to integer - * @param {Number} arg - Argument - * @returns {Number} rounded integer - */ - function functionFloor(arg) { - var result; - - // undefined inputs always return undefined - if(typeof arg === 'undefined') { - return undefined; - } - - result = Math.floor(arg); - return result; - } - - /** - * Rounds a number up to integer - * @param {Number} arg - Argument - * @returns {Number} rounded integer - */ - function functionCeil(arg) { - var result; - - // undefined inputs always return undefined - if(typeof arg === 'undefined') { - return undefined; - } - - result = Math.ceil(arg); - return result; - } - - /** - * Round to half even - * @param {Number} arg - Argument - * @param {Number} precision - number of decimal places - * @returns {Number} rounded integer - */ - function functionRound(arg, precision) { - var result; - - // undefined inputs always return undefined - if(typeof arg === 'undefined') { - return undefined; - } - - if(precision) { - // shift the decimal place - this needs to be done in a string since multiplying - // by a power of ten can introduce floating point precision errors which mess up - // this rounding algorithm - See 'Decimal rounding' in - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round - // Shift - var value = arg.toString().split('e'); - arg = +(value[0] + 'e' + (value[1] ? (+value[1] + precision) : precision)); - - } - - // round up to nearest int - result = Math.round(arg); - var diff = result - arg; - if(Math.abs(diff) === 0.5 && Math.abs(result % 2) === 1) { - // rounded the wrong way - adjust to nearest even number - result = result - 1; - } - if(precision) { - // Shift back - value = result.toString().split('e'); - /* istanbul ignore next */ - result = +(value[0] + 'e' + (value[1] ? (+value[1] - precision) : -precision)); - } - if(Object.is(result, -0)) { // ESLint rule 'no-compare-neg-zero' suggests this way - // JSON doesn't do -0 - result = 0; - } - return result; - } - - /** - * Square root of number - * @param {Number} arg - Argument - * @returns {Number} square root - */ - function functionSqrt(arg) { - var result; - - // undefined inputs always return undefined - if(typeof arg === 'undefined') { - return undefined; - } - - if(arg < 0) { - throw { - stack: (new Error()).stack, - code: "D3060", - index: 1, - value: arg - }; - } - - result = Math.sqrt(arg); - - return result; - } - - /** - * Raises number to the power of the second number - * @param {Number} arg - the base - * @param {Number} exp - the exponent - * @returns {Number} rounded integer - */ - function functionPower(arg, exp) { - var result; - - // undefined inputs always return undefined - if(typeof arg === 'undefined') { - return undefined; - } - - result = Math.pow(arg, exp); - - if(!isFinite(result)) { - throw { - stack: (new Error()).stack, - code: "D3061", - index: 1, - value: arg, - exp: exp - }; - } - - return result; - } - - /** - * Returns a random number 0 <= n < 1 - * @returns {number} random number - */ - function functionRandom() { - return Math.random(); - } - - /** - * Evaluate an input and return a boolean - * @param {*} arg - Arguments - * @returns {boolean} Boolean - */ - function functionBoolean(arg) { - // cast arg to its effective boolean value - // boolean: unchanged - // string: zero-length -> false; otherwise -> true - // number: 0 -> false; otherwise -> true - // null -> false - // array: empty -> false; length > 1 -> true - // object: empty -> false; non-empty -> true - // function -> false - - // undefined inputs always return undefined - if(typeof arg === 'undefined') { - return undefined; - } - - var result = false; - if (Array.isArray(arg)) { - if (arg.length === 1) { - result = functionBoolean(arg[0]); - } else if (arg.length > 1) { - var trues = arg.filter(function(val) {return functionBoolean(val);}); - result = trues.length > 0; - } - } else if (typeof arg === 'string') { - if (arg.length > 0) { - result = true; - } - } else if (isNumeric(arg)) { - if (arg !== 0) { - result = true; - } - } else if (arg !== null && typeof arg === 'object') { - if (Object.keys(arg).length > 0) { - // make sure it's not a lambda function - if (!(isLambda(arg) || arg._jsonata_function)) { - result = true; - } - } - } else if (typeof arg === 'boolean' && arg === true) { - result = true; - } - return result; - } - - /** - * returns the Boolean NOT of the arg - * @param {*} arg - argument - * @returns {boolean} - NOT arg - */ - function functionNot(arg) { - return !functionBoolean(arg); - } - - /** - * Create a map from an array of arguments - * @param {Array} [arr] - array to map over - * @param {Function} func - function to apply - * @returns {Array} Map array - */ - function* functionMap(arr, func) { - // undefined inputs always return undefined - if(typeof arr === 'undefined') { - return undefined; - } - - var result = createSequence(); - // do the map - iterate over the arrays, and invoke func - for (var i = 0; i < arr.length; i++) { - var func_args = [arr[i]]; // the first arg (value) is required - // the other two are optional - only supply it if the function can take it - var length = typeof func === 'function' ? func.length : - func._jsonata_function === true ? func.implementation.length : func.arguments.length; - if(length >= 2) { - func_args.push(i); - } - if(length >= 3) { - func_args.push(arr); - } - // invoke func - var res = yield * apply(func, func_args, null); - if(typeof res !== 'undefined') { - result.push(res); - } - } - - return result; - } - - // This generator function does not have a yield(), presumably to make it - // consistent with other similar functions. - /** - * Create a map from an array of arguments - * @param {Array} [arr] - array to filter - * @param {Function} func - predicate function - * @returns {Array} Map array - */ - function* functionFilter(arr, func) { // eslint-disable-line require-yield - // undefined inputs always return undefined - if(typeof arr === 'undefined') { - return undefined; - } - - var result = createSequence(); - - var predicate = function (value, index, array) { - var it = apply(func, [value, index, array], null); - // returns a generator - so iterate over it - var res = it.next(); - while (!res.done) { - res = it.next(res.value); - } - return res.value; - }; - - for(var i = 0; i < arr.length; i++) { - var entry = arr[i]; - if(functionBoolean(predicate(entry, i, arr))) { - result.push(entry); - } - } - - return result; - } - - /** - * Convolves (zips) each value from a set of arrays - * @param {Array} [args] - arrays to zip - * @returns {Array} Zipped array - */ - function functionZip() { - // this can take a variable number of arguments - var result = []; - var args = Array.prototype.slice.call(arguments); - // length of the shortest array - var length = Math.min.apply(Math, args.map(function(arg) { - if(Array.isArray(arg)) { - return arg.length; - } - return 0; - })); - for(var i = 0; i < length; i++) { - var tuple = args.map((arg) => {return arg[i];}); - result.push(tuple); - } - return result; - } - - /** - * Fold left function - * @param {Array} sequence - Sequence - * @param {Function} func - Function - * @param {Object} init - Initial value - * @returns {*} Result - */ - function* functionFoldLeft(sequence, func, init) { - // undefined inputs always return undefined - if(typeof sequence === 'undefined') { - return undefined; - } - - var result; - - if (!(func.length === 2 || (func._jsonata_function === true && func.implementation.length === 2) || func.arguments.length === 2)) { - throw { - stack: (new Error()).stack, - code: "D3050", - index: 1 - }; - } - - var index; - if (typeof init === 'undefined' && sequence.length > 0) { - result = sequence[0]; - index = 1; - } else { - result = init; - index = 0; - } - - while (index < sequence.length) { - result = yield * apply(func, [result, sequence[index]], null); - index++; - } - - return result; - } - - /** - * Return keys for an object - * @param {Object} arg - Object - * @returns {Array} Array of keys - */ - function functionKeys(arg) { - var result = createSequence(); - - if(Array.isArray(arg)) { - // merge the keys of all of the items in the array - var merge = {}; - arg.forEach(function(item) { - var keys = functionKeys(item); - if(Array.isArray(keys)) { - keys.forEach(function(key) { - merge[key] = true; - }); - } - }); - result = functionKeys(merge); - } else if(arg !== null && typeof arg === 'object' && !(isLambda(arg))) { - result = Object.keys(arg); - if(result.length === 0) { - result = undefined; - } - } else { - result = undefined; - } - return result; - } - - /** - * Return value from an object for a given key - * @param {Object} object - Object - * @param {String} key - Key in object - * @returns {*} Value of key in object - */ - function functionLookup(object, key) { - var result = evaluateName({value: key}, object); - return result; - } - - /** - * Append second argument to first - * @param {Array|Object} arg1 - First argument - * @param {Array|Object} arg2 - Second argument - * @returns {*} Appended arguments - */ - function functionAppend(arg1, arg2) { - // disregard undefined args - if (typeof arg1 === 'undefined') { - return arg2; - } - if (typeof arg2 === 'undefined') { - return arg1; - } - // if either argument is not an array, make it so - if (!Array.isArray(arg1)) { - arg1 = createSequence(arg1); - } - if (!Array.isArray(arg2)) { - arg2 = [arg2]; - } - Array.prototype.push.apply(arg1, arg2); - return arg1; - } - - /** - * Determines if the argument is undefined - * @param {*} arg - argument - * @returns {boolean} False if argument undefined, otherwise true - */ - function functionExists(arg){ - if (typeof arg === 'undefined') { - return false; - } else { - return true; - } - } - - /** - * Splits an object into an array of object with one property each - * @param {*} arg - the object to split - * @returns {*} - the array - */ - function functionSpread(arg) { - var result = createSequence(); - - if(Array.isArray(arg)) { - // spread all of the items in the array - arg.forEach(function(item) { - result = functionAppend(result, functionSpread(item)); - }); - } else if(arg !== null && typeof arg === 'object' && !isLambda(arg)) { - for(var key in arg) { - var obj = {}; - obj[key] = arg[key]; - result.push(obj); - } - } else { - result = arg; - } - return result; - } - - /** - * Merges an array of objects into a single object. Duplicate properties are - * overridden by entries later in the array - * @param {*} arg - the objects to merge - * @returns {*} - the object - */ - function functionMerge(arg) { - // undefined inputs always return undefined - if(typeof arg === 'undefined') { - return undefined; - } - - var result = {}; - - arg.forEach(function(obj) { - for(var prop in obj) { - result[prop] = obj[prop]; - } - }); - return result; - } - - /** - * Reverses the order of items in an array - * @param {Array} arr - the array to reverse - * @returns {Array} - the reversed array - */ - function functionReverse(arr) { - // undefined inputs always return undefined - if(typeof arr === 'undefined') { - return undefined; - } - - if(arr.length <= 1) { - return arr; - } - - var length = arr.length; - var result = new Array(length); - for(var i = 0; i < length; i++) { - result[length - i - 1] = arr[i]; - } - - return result; - } - - /** - * - * @param {*} obj - the input object to iterate over - * @param {*} func - the function to apply to each key/value pair - * @returns {Array} - the resultant array - */ - function* functionEach(obj, func) { - var result = createSequence(); - - for(var key in obj) { - var func_args = [obj[key], key]; - // invoke func - result.push(yield * apply(func, func_args, null)); - } - - return result; - } - - /** - * Implements the merge sort (stable) with optional comparator function - * - * @param {Array} arr - the array to sort - * @param {*} comparator - comparator function - * @returns {Array} - sorted array - */ - function functionSort(arr, comparator) { - // undefined inputs always return undefined - if(typeof arr === 'undefined') { - return undefined; - } - - if(arr.length <= 1) { - return arr; - } - - var comp; - if(typeof comparator === 'undefined') { - // inject a default comparator - only works for numeric or string arrays - if (!isArrayOfNumbers(arr) && !isArrayOfStrings(arr)) { - throw { - stack: (new Error()).stack, - code: "D3070", - index: 1 - }; - } - - comp = function (a, b) { - return a > b; - }; - } else if(typeof comparator === 'function') { - // for internal usage of functionSort (i.e. order-by syntax) - comp = comparator; - } else { - comp = function (a, b) { - var it = apply(comparator, [a, b], null); - // returns a generator - so iterate over it - var comp = it.next(); - while (!comp.done) { - comp = it.next(comp.value); - } - return comp.value; - }; - } - - var merge = function(l, r) { - var merge_iter = function(result, left, right) { - if (left.length === 0) { - Array.prototype.push.apply(result, right); - } else if (right.length === 0) { - Array.prototype.push.apply(result, left); - } else if (comp(left[0], right[0])) { // invoke the comparator function - // if it returns true - swap left and right - result.push(right[0]); - merge_iter(result, left, right.slice(1)); - } else { - // otherwise keep the same order - result.push(left[0]); - merge_iter(result, left.slice(1), right); - } - }; - var merged = []; - merge_iter(merged, l, r); - return merged; - }; - - var sort = function(array) { - if(array.length <= 1) { - return array; - } else { - var middle = Math.floor(array.length / 2); - var left = array.slice(0, middle); - var right = array.slice(middle); - left = sort(left); - right = sort(right); - return merge(left, right); - } - }; - - var result = sort(arr); - - return result; - } - - /** - * Randomly shuffles the contents of an array - * @param {Array} arr - the input array - * @returns {Array} the shuffled array - */ - function functionShuffle(arr) { - // undefined inputs always return undefined - if(typeof arr === 'undefined') { - return undefined; - } - - if(arr.length <= 1) { - return arr; - } - - // shuffle using the 'inside-out' variant of the Fisher-Yates algorithm - var result = new Array(arr.length); - for(var i = 0; i < arr.length; i++) { - var j = Math.floor(Math.random() * (i + 1)); // random integer such that 0 ≤ j ≤ i - if(i !== j) { - result[i] = result[j]; - } - result[j] = arr[i]; - } - - return result; - } - - /** - * Applies a predicate function to each key/value pair in an object, and returns an object containing - * only the key/value pairs that passed the predicate - * - * @param {object} arg - the object to be sifted - * @param {object} func - the predicate function (lambda or native) - * @returns {object} - sifted object - */ - function functionSift(arg, func) { - var result = {}; - - var predicate = function (value, key, object) { - var it = apply(func, [value, key, object], null); - // returns a generator - so iterate over it - var res = it.next(); - while (!res.done) { - res = it.next(res.value); - } - return res.value; - }; - - for(var item in arg) { - var entry = arg[item]; - if(functionBoolean(predicate(entry, item, arg))) { - result[item] = entry; - } - } - - // empty objects should be changed to undefined - if(Object.keys(result).length === 0) { - result = undefined; - } - - return result; - } - - // Regular expression to match an ISO 8601 formatted timestamp - var iso8601regex = new RegExp('^\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)$'); - - /** - * Converts an ISO 8601 timestamp to milliseconds since the epoch - * - * @param {string} timestamp - the ISO 8601 timestamp to be converted - * @returns {Number} - milliseconds since the epoch - */ - function functionToMillis(timestamp) { - // undefined inputs always return undefined - if(typeof timestamp === 'undefined') { - return undefined; - } - - if(!iso8601regex.test(timestamp)) { - throw { - stack: (new Error()).stack, - code: "D3110", - value: timestamp - }; - } - - return Date.parse(timestamp); - } - - /** - * Converts milliseconds since the epoch to an ISO 8601 timestamp - * @param {Number} millis - milliseconds since the epoch to be converted - * @returns {String} - an ISO 8601 formatted timestamp - */ - function functionFromMillis(millis) { - // undefined inputs always return undefined - if(typeof millis === 'undefined') { - return undefined; - } - - return new Date(millis).toISOString(); - } - - /** - * Clones an object - * @param {Object} arg - object to clone (deep copy) - * @returns {*} - the cloned object - */ - function functionClone(arg) { - // undefined inputs always return undefined - if(typeof arg === 'undefined') { - return undefined; - } - - return JSON.parse(functionString(arg)); - } - - /** - * Create frame - * @param {Object} enclosingEnvironment - Enclosing environment - * @returns {{bind: bind, lookup: lookup}} Created frame - */ - function createFrame(enclosingEnvironment) { - var bindings = {}; - return { - bind: function (name, value) { - bindings[name] = value; - }, - lookup: function (name) { - var value; - if(bindings.hasOwnProperty(name)) { - value = bindings[name]; - } else if (enclosingEnvironment) { - value = enclosingEnvironment.lookup(name); - } - return value; - } - }; - } - - // Function registration - staticFrame.bind('sum', defineFunction(functionSum, ':n>')); - staticFrame.bind('count', defineFunction(functionCount, '')); - staticFrame.bind('max', defineFunction(functionMax, ':n>')); - staticFrame.bind('min', defineFunction(functionMin, ':n>')); - staticFrame.bind('average', defineFunction(functionAverage, ':n>')); - staticFrame.bind('string', defineFunction(functionString, '')); - staticFrame.bind('substring', defineFunction(functionSubstring, '')); - staticFrame.bind('substringBefore', defineFunction(functionSubstringBefore, '')); - staticFrame.bind('substringAfter', defineFunction(functionSubstringAfter, '')); - staticFrame.bind('lowercase', defineFunction(functionLowercase, '')); - staticFrame.bind('uppercase', defineFunction(functionUppercase, '')); - staticFrame.bind('length', defineFunction(functionLength, '')); - staticFrame.bind('trim', defineFunction(functionTrim, '')); - staticFrame.bind('pad', defineFunction(functionPad, '')); - staticFrame.bind('match', defineFunction(functionMatch, 'n?:a>')); - staticFrame.bind('contains', defineFunction(functionContains, '')); // TODO ):b> - staticFrame.bind('replace', defineFunction(functionReplace, '')); // TODO )(sf)n?:s> - staticFrame.bind('split', defineFunction(functionSplit, '>')); // TODO )n?:a> - staticFrame.bind('join', defineFunction(functionJoin, 's?:s>')); - staticFrame.bind('formatNumber', defineFunction(functionFormatNumber, '')); - staticFrame.bind('formatBase', defineFunction(functionFormatBase, '')); - staticFrame.bind('number', defineFunction(functionNumber, '<(ns)-:n>')); - staticFrame.bind('floor', defineFunction(functionFloor, '')); - staticFrame.bind('ceil', defineFunction(functionCeil, '')); - staticFrame.bind('round', defineFunction(functionRound, '')); - staticFrame.bind('abs', defineFunction(functionAbs, '')); - staticFrame.bind('sqrt', defineFunction(functionSqrt, '')); - staticFrame.bind('power', defineFunction(functionPower, '')); - staticFrame.bind('random', defineFunction(functionRandom, '<:n>')); - staticFrame.bind('boolean', defineFunction(functionBoolean, '')); - staticFrame.bind('not', defineFunction(functionNot, '')); - staticFrame.bind('map', defineFunction(functionMap, '')); - staticFrame.bind('zip', defineFunction(functionZip, '')); - staticFrame.bind('filter', defineFunction(functionFilter, '')); - staticFrame.bind('reduce', defineFunction(functionFoldLeft, '')); // TODO aj?:j> - staticFrame.bind('sift', defineFunction(functionSift, '')); - staticFrame.bind('keys', defineFunction(functionKeys, '>')); - staticFrame.bind('lookup', defineFunction(functionLookup, '')); - staticFrame.bind('append', defineFunction(functionAppend, '')); - staticFrame.bind('exists', defineFunction(functionExists, '')); - staticFrame.bind('spread', defineFunction(functionSpread, '>')); - staticFrame.bind('merge', defineFunction(functionMerge, ':o>')); - staticFrame.bind('reverse', defineFunction(functionReverse, '')); - staticFrame.bind('each', defineFunction(functionEach, '')); - staticFrame.bind('sort', defineFunction(functionSort, '')); - staticFrame.bind('shuffle', defineFunction(functionShuffle, '')); - staticFrame.bind('base64encode', defineFunction(functionBase64encode, '')); - staticFrame.bind('base64decode', defineFunction(functionBase64decode, '')); - staticFrame.bind('toMillis', defineFunction(functionToMillis, '')); - staticFrame.bind('fromMillis', defineFunction(functionFromMillis, '')); - staticFrame.bind('clone', defineFunction(functionClone, '<(oa)-:o>')); - - /** - * Error codes - * - */ - var errorCodes = { - "S0101": "String literal must be terminated by a matching quote", - "S0102": "Number out of range: {{token}}", - "S0103": "Unsupported escape sequence: \\{{token}}", - "S0104": "The escape sequence \\u must be followed by 4 hex digits", - "S0105": "Quoted property name must be terminated with a backquote (`)", - "S0201": "Syntax error: {{token}}", - "S0202": "Expected {{value}}, got {{token}}", - "S0203": "Expected {{value}} before end of expression", - "S0204": "Unknown operator: {{token}}", - "S0205": "Unexpected token: {{token}}", - "S0206": "Unknown expression type: {{token}}", - "S0207": "Unexpected end of expression", - "S0208": "Parameter {{value}} of function definition must be a variable name (start with $)", - "S0209": "A predicate cannot follow a grouping expression in a step", - "S0210": "Each step can only have one grouping expression", - "S0211": "The symbol {{token}} cannot be used as a unary operator", - "S0301": "Empty regular expressions are not allowed", - "S0302": "No terminating / in regular expression", - "S0402": "Choice groups containing parameterized types are not supported", - "S0401": "Type parameters can only be applied to functions and arrays", - "S0500": "Attempted to evaluate an expression containing syntax error(s)", - "T0410": "Argument {{index}} of function {{token}} does not match function signature", - "T0411": "Context value is not a compatible type with argument {{index}} of function {{token}}", - "T0412": "Argument {{index}} of function {{token}} must be an array of {{type}}", - "D1001": "Number out of range: {{value}}", - "D1002": "Cannot negate a non-numeric value: {{value}}", - "T1003": "Key in object structure must evaluate to a string; got: {{value}}", - "D1004": "Regular expression matches zero length string", - "T1005": "Attempted to invoke a non-function. Did you mean ${{{token}}}?", - "T1006": "Attempted to invoke a non-function", - "T1007": "Attempted to partially apply a non-function. Did you mean ${{{token}}}?", - "T1008": "Attempted to partially apply a non-function", - "T2001": "The left side of the {{token}} operator must evaluate to a number", - "T2002": "The right side of the {{token}} operator must evaluate to a number", - "T2003": "The left side of the range operator (..) must evaluate to an integer", - "T2004": "The right side of the range operator (..) must evaluate to an integer", - "D2005": "The left side of := must be a variable name (start with $)", - "T2006": "The right side of the function application operator ~> must be a function", - "T2007": "Type mismatch when comparing values {{value}} and {{value2}} in order-by clause", - "T2008": "The expressions within an order-by clause must evaluate to numeric or string values", - "T2009": "The values {{value}} and {{value2}} either side of operator {{token}} must be of the same data type", - "T2010": "The expressions either side of operator {{token}} must evaluate to numeric or string values", - "T2011": "The insert/update clause of the transform expression must evaluate to an object: {{value}}", - "T2012": "The delete clause of the transform expression must evaluate to a string or array of strings: {{value}}", - "T2013": "The transform expression clones the input object using the $clone() function. This has been overridden in the current scope by a non-function.", - "D3001": "Attempting to invoke string function on Infinity or NaN", - "D3010": "Second argument of replace function cannot be an empty string", - "D3011": "Fourth argument of replace function must evaluate to a positive number", - "D3012": "Attempted to replace a matched string with a non-string value", - "D3020": "Third argument of split function must evaluate to a positive number", - "D3030": "Unable to cast value to a number: {{value}}", - "D3040": "Third argument of match function must evaluate to a positive number", - "D3050": "First argument of reduce function must be a function with two arguments", - "D3060": "The sqrt function cannot be applied to a negative number: {{value}}", - "D3061": "The power function has resulted in a value that cannot be represented as a JSON number: base={{value}}, exponent={{exp}}", - "D3070": "The single argument form of the sort function can only be applied to an array of strings or an array of numbers. Use the second argument to specify a comparison function", - "D3080": "The picture string must only contain a maximum of two sub-pictures", - "D3081": "The sub-picture must not contain more than one instance of the 'decimal-separator' character", - "D3082": "The sub-picture must not contain more than one instance of the 'percent' character", - "D3083": "The sub-picture must not contain more than one instance of the 'per-mille' character", - "D3084": "The sub-picture must not contain both a 'percent' and a 'per-mille' character", - "D3085": "The mantissa part of a sub-picture must contain at least one character that is either an 'optional digit character' or a member of the 'decimal digit family'", - "D3086": "The sub-picture must not contain a passive character that is preceded by an active character and that is followed by another active character", - "D3087": "The sub-picture must not contain a 'grouping-separator' character that appears adjacent to a 'decimal-separator' character", - "D3088": "The sub-picture must not contain a 'grouping-separator' at the end of the integer part", - "D3089": "The sub-picture must not contain two adjacent instances of the 'grouping-separator' character", - "D3090": "The integer part of the sub-picture must not contain a member of the 'decimal digit family' that is followed by an instance of the 'optional digit character'", - "D3091": "The fractional part of the sub-picture must not contain an instance of the 'optional digit character' that is followed by a member of the 'decimal digit family'", - "D3092": "A sub-picture that contains a 'percent' or 'per-mille' character must not contain a character treated as an 'exponent-separator'", - "D3093": "The exponent part of the sub-picture must comprise only of one or more characters that are members of the 'decimal digit family'", - "D3100": "The radix of the formatBase function must be between 2 and 36. It was given {{value}}", - "D3110": "The argument of the toMillis function must be an ISO 8601 formatted timestamp. Given {{value}}" - }; - - /** - * lookup a message template from the catalog and substitute the inserts - * @param {string} err - error code to lookup - * @returns {string} message - */ - function lookupMessage(err) { - var message = 'Unknown error'; - if(typeof err.message !== 'undefined') { - message = err.message; - } - var template = errorCodes[err.code]; - if(typeof template !== 'undefined') { - // if there are any handlebars, replace them with the field references - // triple braces - replace with value - // double braces - replace with json stringified value - message = template.replace(/\{\{\{([^}]+)}}}/g, function() { - return err[arguments[1]]; - }); - message = message.replace(/\{\{([^}]+)}}/g, function() { - return JSON.stringify(err[arguments[1]]); - }); - } - return message; - } - - /** - * JSONata - * @param {Object} expr - JSONata expression - * @param {boolean} options - recover: attempt to recover on parse error - * @returns {{evaluate: evaluate, assign: assign}} Evaluated expression - */ - function jsonata(expr, options) { - var ast; - var errors; - try { - ast = parser(expr, options && options.recover); - errors = ast.errors; - delete ast.errors; - } catch(err) { - // insert error message into structure - err.message = lookupMessage(err); - throw err; - } - var environment = createFrame(staticFrame); - - var timestamp = new Date(); // will be overridden on each call to evalute() - environment.bind('now', defineFunction(function() { - return timestamp.toJSON(); - }, '<:s>')); - environment.bind('millis', defineFunction(function() { - return timestamp.getTime(); - }, '<:n>')); - - return { - evaluate: function (input, bindings, callback) { - // throw if the expression compiled with syntax errors - if(typeof errors !== 'undefined') { - var err = { - code: 'S0500', - position: 0 - }; - err.message = lookupMessage(err); - throw err; - } - - if (typeof bindings !== 'undefined') { - var exec_env; - // the variable bindings have been passed in - create a frame to hold these - exec_env = createFrame(environment); - for (var v in bindings) { - exec_env.bind(v, bindings[v]); - } - } else { - exec_env = environment; - } - // put the input document into the environment as the root object - exec_env.bind('$', input); - - // capture the timestamp and put it in the execution environment - // the $now() and $millis() functions will return this value - whenever it is called - timestamp = new Date(); - - var result, it; - // if a callback function is supplied, then drive the generator in a promise chain - if(typeof callback === 'function') { - exec_env.bind('__jsonata_async', true); - var thenHandler = function (response) { - result = it.next(response); - if (result.done) { - callback(null, result.value); - } else { - result.value.then(thenHandler) - .catch(function (err) { - err.message = lookupMessage(err); - callback(err, null); - }); - } - }; - it = evaluate(ast, input, exec_env); - result = it.next(); - result.value.then(thenHandler); - } else { - // no callback function - drive the generator to completion synchronously - try { - it = evaluate(ast, input, exec_env); - result = it.next(); - while (!result.done) { - result = it.next(result.value); - } - return result.value; - } catch (err) { - // insert error message into structure - err.message = lookupMessage(err); - throw err; - } - } - }, - assign: function (name, value) { - environment.bind(name, value); - }, - registerFunction: function(name, implementation, signature) { - var func = defineFunction(implementation, signature); - environment.bind(name, func); - }, - ast: function() { - return ast; - }, - errors: function() { - return errors; - } - }; - } - - jsonata.parser = parser; // TODO remove this in a future release - use ast() instead - - return jsonata; - -})(); - -// node.js only - export the jsonata and parser functions -// istanbul ignore else -if(typeof module !== 'undefined') { - module.exports = jsonata; -} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 87a5bf1f..00000000 --- a/package-lock.json +++ /dev/null @@ -1,5441 +0,0 @@ -{ - "name": "jsonata", - "version": "1.3.3", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "JSONStream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", - "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", - "dev": true, - "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" - } - }, - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "3.3.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - }, - "dependencies": { - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - } - } - }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-escapes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", - "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "anymatch": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", - "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", - "dev": true, - "optional": true, - "requires": { - "arrify": "1.0.1", - "micromatch": "2.3.11" - } - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "1.0.3" - } - }, - "arr-flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz", - "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=", - "dev": true, - "optional": true - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true, - "optional": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "asn1.js": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", - "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "assertion-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", - "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", - "dev": true - }, - "astw": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", - "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", - "dev": true, - "requires": { - "acorn": "4.0.13" - } - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true - }, - "babel-cli": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.24.1.tgz", - "integrity": "sha1-IHzXBbumFImy6kG1MSNBz2rKIoM=", - "dev": true, - "requires": { - "babel-core": "6.25.0", - "babel-polyfill": "6.23.0", - "babel-register": "6.24.1", - "babel-runtime": "6.23.0", - "chokidar": "1.7.0", - "commander": "2.10.0", - "convert-source-map": "1.5.0", - "fs-readdir-recursive": "1.0.0", - "glob": "7.1.2", - "lodash": "4.17.4", - "output-file-sync": "1.1.2", - "path-is-absolute": "1.0.1", - "slash": "1.0.0", - "source-map": "0.5.6", - "v8flags": "2.1.1" - } - }, - "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.1" - } - }, - "babel-core": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", - "dev": true, - "requires": { - "babel-code-frame": "6.22.0", - "babel-generator": "6.25.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.24.1", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "convert-source-map": "1.5.0", - "debug": "2.6.8", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.7", - "slash": "1.0.0", - "source-map": "0.5.6" - } - }, - "babel-generator": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", - "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.6", - "trim-right": "1.0.1" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.23.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-define-map": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", - "integrity": "sha1-epdH8ljYlH0y1RX2qhx70CIEoIA=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", - "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-template": "6.25.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", - "integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "6.24.1", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.23.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.23.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", - "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", - "dev": true, - "requires": { - "regenerator-transform": "0.9.11" - } - }, - "babel-plugin-transform-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0" - } - }, - "babel-polyfill": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", - "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "core-js": "2.4.1", - "regenerator-runtime": "0.10.5" - } - }, - "babel-preset-env": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.5.2.tgz", - "integrity": "sha1-zUrpCm6Utwn5c3SzPl+LmDVWre8=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.24.1", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.24.1", - "browserslist": "2.1.5", - "invariant": "2.2.2", - "semver": "5.3.0" - } - }, - "babel-register": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", - "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=", - "dev": true, - "requires": { - "babel-core": "6.25.0", - "babel-runtime": "6.23.0", - "core-js": "2.4.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.15" - } - }, - "babel-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", - "dev": true, - "requires": { - "core-js": "2.4.1", - "regenerator-runtime": "0.10.5" - } - }, - "babel-template": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", - "dev": true, - "requires": { - "babel-code-frame": "6.22.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.17.4", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "binary-extensions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", - "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=", - "dev": true, - "optional": true - }, - "bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", - "dev": true - }, - "bn.js": { - "version": "4.11.7", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "integrity": "sha512-LxFiV5mefv0ley0SzqkOPR1bC4EbpPx8LkOz5vMe/Yi15t5hzwgO/G+tc7wOtL4PZTYjwHu8JnEiSLumuSjSfA==", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "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" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "optional": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-pack": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.2.tgz", - "integrity": "sha1-+GzWzvT1MAyOY+B6TVEvZfv/RTE=", - "dev": true, - "requires": { - "JSONStream": "1.3.1", - "combine-source-map": "0.7.2", - "defined": "1.0.0", - "through2": "2.0.3", - "umd": "3.0.1" - } - }, - "browser-resolve": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "browserify": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-14.4.0.tgz", - "integrity": "sha1-CJo0Y69Y0OSNjNQHCz90ZU1avKk=", - "dev": true, - "requires": { - "JSONStream": "1.3.1", - "assert": "1.4.1", - "browser-pack": "6.0.2", - "browser-resolve": "1.11.2", - "browserify-zlib": "0.1.4", - "buffer": "5.0.6", - "cached-path-relative": "1.0.1", - "concat-stream": "1.5.2", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.11.0", - "defined": "1.0.0", - "deps-sort": "2.0.0", - "domain-browser": "1.1.7", - "duplexer2": "0.1.4", - "events": "1.1.1", - "glob": "7.1.2", - "has": "1.0.1", - "htmlescape": "1.1.1", - "https-browserify": "1.0.0", - "inherits": "2.0.3", - "insert-module-globals": "7.0.1", - "labeled-stream-splicer": "2.0.0", - "module-deps": "4.1.1", - "os-browserify": "0.1.2", - "parents": "1.0.1", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "read-only-stream": "2.0.0", - "readable-stream": "2.3.2", - "resolve": "1.3.3", - "shasum": "1.0.2", - "shell-quote": "1.6.1", - "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "1.0.3", - "subarg": "1.0.0", - "syntax-error": "1.3.0", - "through2": "2.0.3", - "timers-browserify": "1.4.2", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4", - "xtend": "4.0.1" - } - }, - "browserify-aes": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", - "dev": true, - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.3", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.0", - "inherits": "2.0.3" - } - }, - "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "dev": true, - "requires": { - "browserify-aes": "1.0.6", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.0" - } - }, - "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "dev": true, - "requires": { - "cipher-base": "1.0.3", - "des.js": "1.0.0", - "inherits": "2.0.3" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "randombytes": "2.0.5" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.0" - } - }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "dev": true, - "requires": { - "pako": "0.2.9" - } - }, - "browserslist": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.1.5.tgz", - "integrity": "sha1-6IJVDfPRzW1IHBo+ADjyuvE6RxE=", - "dev": true, - "requires": { - "caniuse-lite": "1.0.30000694", - "electron-to-chromium": "1.3.14" - } - }, - "buffer": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.6.tgz", - "integrity": "sha1-LqZp9+7Atu2gWwj4tf9mGyhXNYg=", - "dev": true, - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8" - } - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "cached-path-relative": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", - "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=", - "dev": true - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "caniuse-lite": { - "version": "1.0.30000694", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000694.tgz", - "integrity": "sha1-FJLat8EMYIydN6cj5uPnhz4M6U8=", - "dev": true - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - }, - "catharsis": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.8.tgz", - "integrity": "sha1-aTR59DqsVJ2Aa9c+kkzQ2USVGgY=", - "dev": true, - "requires": { - "underscore-contrib": "0.3.0" - } - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chai": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", - "dev": true, - "requires": { - "assertion-error": "1.0.2", - "deep-eql": "0.1.3", - "type-detect": "1.0.0" - } - }, - "chai-as-promised": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-6.0.0.tgz", - "integrity": "sha1-GgKkM6byTa+sY7nJb6FoTbGqjaY=", - "dev": true, - "requires": { - "check-error": "1.0.2" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "optional": true, - "requires": { - "anymatch": "1.3.0", - "async-each": "1.0.1", - "fsevents": "1.1.2", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - } - }, - "cipher-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz", - "integrity": "sha1-7qvxlEGc6QDaMBjCB9IS8qbfCgc=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "circular-json": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz", - "integrity": "sha1-vos2rvzN6LPKeqLWr8B6NyQsDS0=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-width": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "combine-source-map": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz", - "integrity": "sha1-CHAxKFazB6h8xKxIbzqaYq7MwJ4=", - "dev": true, - "requires": { - "convert-source-map": "1.1.3", - "inline-source-map": "0.6.2", - "lodash.memoize": "3.0.4", - "source-map": "0.5.6" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - } - } - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.10.0.tgz", - "integrity": "sha512-q/r9trjmuikWDRJNTBHAVnWhuU6w+z80KgBq7j9YDclik5E7X4xi0KnlZBNFA1zOQ+SH/vHMWd2mC9QTOz7GpA==", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "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.5.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", - "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.0.6", - "typedarray": "0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", - "dev": true - }, - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", - "dev": true - }, - "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=", - "dev": true - }, - "coveralls": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.1.tgz", - "integrity": "sha1-1wu5rMGDXsTwY/+drFQjwXsR8Xg=", - "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" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.11.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "qs": "6.3.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.4.3", - "uuid": "3.1.0" - } - } - } - }, - "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "elliptic": "6.4.0" - } - }, - "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "dev": true, - "requires": { - "cipher-base": "1.0.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.8" - } - }, - "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "dev": true, - "requires": { - "cipher-base": "1.0.3", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "crypto-browserify": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz", - "integrity": "sha1-NlKgkGq5sqfgw85mpAjpV6JIVSI=", - "dev": true, - "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.12", - "public-encrypt": "4.0.0", - "randombytes": "2.0.5" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "optional": true - }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "dev": true, - "requires": { - "type-detect": "0.1.1" - }, - "dependencies": { - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", - "dev": true - } - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.1" - } - }, - "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 - }, - "deps-sort": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", - "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", - "dev": true, - "requires": { - "JSONStream": "1.3.1", - "shasum": "1.0.2", - "subarg": "1.0.0", - "through2": "2.0.3" - } - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "detective": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz", - "integrity": "sha1-blqMaybmx6JUsca210kNmOyR7dE=", - "dev": true, - "requires": { - "acorn": "4.0.13", - "defined": "1.0.0" - } - }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "miller-rabin": "4.0.0", - "randombytes": "2.0.5" - } - }, - "doctrine": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", - "dev": true - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "2.3.2" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "electron-to-chromium": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.14.tgz", - "integrity": "sha1-ZK8Pnv08PGrNV9cfg7Scp+6cS0M=", - "dev": true - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "brorand": "1.1.0", - "hash.js": "1.1.1", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "requires": { - "esprima": "2.7.3", - "estraverse": "1.9.3", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.2.0" - }, - "dependencies": { - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "eslint": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.1.1.tgz", - "integrity": "sha1-+svfz+Pg+s06i4DcmMTmwTrlgt8=", - "dev": true, - "requires": { - "babel-code-frame": "6.22.0", - "chalk": "1.1.3", - "concat-stream": "1.6.0", - "debug": "2.6.8", - "doctrine": "2.0.0", - "eslint-scope": "3.7.1", - "espree": "3.4.3", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.3", - "imurmurhash": "0.1.4", - "inquirer": "3.1.1", - "is-my-json-valid": "2.16.0", - "is-resolvable": "1.0.0", - "js-yaml": "3.8.4", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "4.0.0", - "progress": "2.0.0", - "require-uncached": "1.0.3", - "strip-json-comments": "2.0.1", - "table": "4.0.1", - "text-table": "0.2.0" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.2", - "typedarray": "0.0.6" - } - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "js-yaml": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz", - "integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "3.1.3" - } - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - } - } - }, - "eslint-plugin-ideal": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-ideal/-/eslint-plugin-ideal-0.1.3.tgz", - "integrity": "sha1-DOkLme8KCaEqdB8NdSwYmEtFXkw=", - "dev": true - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "requires": { - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "espree": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", - "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=", - "dev": true, - "requires": { - "acorn": "5.0.3", - "acorn-jsx": "3.0.1" - }, - "dependencies": { - "acorn": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.0.3.tgz", - "integrity": "sha1-xGDfCEkUY/AozLguqzcwvwEIez0=", - "dev": true - } - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", - "dev": true, - "requires": { - "estraverse": "4.2.0" - } - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", - "dev": true, - "requires": { - "create-hash": "1.1.3" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "optional": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "optional": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "external-editor": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", - "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", - "dev": true, - "requires": { - "iconv-lite": "0.4.18", - "jschardet": "1.4.2", - "tmp": "0.0.31" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "1.2.2", - "object-assign": "4.1.1" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "optional": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "flat-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", - "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", - "dev": true, - "requires": { - "circular-json": "0.3.1", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "optional": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "optional": true, - "requires": { - "for-in": "1.0.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs-readdir-recursive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", - "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.6.2", - "node-pre-gyp": "0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "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" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "dev": true, - "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": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.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.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": 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", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } - } - }, - "function-bind": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", - "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", - "dev": true - }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "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" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "optional": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, - "handlebars": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", - "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true, - "optional": true - } - } - } - } - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "commander": "2.10.0", - "is-my-json-valid": "2.16.0", - "pinkie-promise": "2.0.1" - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true, - "requires": { - "function-bind": "1.1.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "hash.js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.1.tgz", - "integrity": "sha512-I2TYCUjYQMmqmRMCp6jKMC5bvdXxGIZ/heITRR/0F1u0OP920ImEj/cXt3WgcTKBnNYGn7enxUzdai3db829JA==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "1.1.1", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.1" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", - "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==", - "dev": true - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", - "dev": true - }, - "ignore": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", - "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "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=", - "dev": true - }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "requires": { - "source-map": "0.5.6" - } - }, - "inquirer": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.1.1.tgz", - "integrity": "sha512-H50sHQwgvvaTBd3HpKMVtL/u6LoHDvYym51gd7bGQe/+9HkCE+J0/3N5FJLfd6O6oz44hHewC2Pc2LodzWVafQ==", - "dev": true, - "requires": { - "ansi-escapes": "2.0.0", - "chalk": "1.1.3", - "cli-cursor": "2.1.0", - "cli-width": "2.1.0", - "external-editor": "2.0.4", - "figures": "2.0.0", - "lodash": "4.17.4", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.0.0", - "strip-ansi": "3.0.1", - "through": "2.3.8" - } - }, - "insert-module-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz", - "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=", - "dev": true, - "requires": { - "JSONStream": "1.3.1", - "combine-source-map": "0.7.2", - "concat-stream": "1.5.2", - "is-buffer": "1.1.5", - "lexical-scope": "1.2.0", - "process": "0.11.10", - "through2": "2.0.3", - "xtend": "4.0.1" - } - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "1.8.0" - } - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true, - "optional": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "optional": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "optional": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-my-json-valid": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", - "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", - "dev": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true, - "requires": { - "is-path-inside": "1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true, - "optional": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-resolvable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "dev": true, - "requires": { - "tryit": "1.0.3" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "optional": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "dev": true, - "requires": { - "abbrev": "1.0.9", - "async": "1.5.2", - "escodegen": "1.8.1", - "esprima": "2.7.3", - "glob": "5.0.15", - "handlebars": "4.0.10", - "js-yaml": "3.6.1", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "once": "1.4.0", - "resolve": "1.1.7", - "supports-color": "3.2.3", - "which": "1.2.14", - "wordwrap": "1.0.0" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "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" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "js-tokens": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", - "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=", - "dev": true - }, - "js-yaml": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" - } - }, - "js2xmlparser": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-1.0.0.tgz", - "integrity": "sha1-WhcPLo1kds5FQF4EgjJCUTeC/jA=", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "jschardet": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.4.2.tgz", - "integrity": "sha1-KqEH8UKvQSHRRWWdRPUIMJYeaZo=", - "dev": true - }, - "jsdoc": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.4.3.tgz", - "integrity": "sha1-5XQNYUXGgfZnnmwXeDqI292XzNM=", - "dev": true, - "requires": { - "bluebird": "3.4.7", - "catharsis": "0.8.8", - "escape-string-regexp": "1.0.5", - "espree": "3.1.7", - "js2xmlparser": "1.0.0", - "klaw": "1.3.1", - "marked": "0.3.6", - "mkdirp": "0.5.1", - "requizzle": "0.2.1", - "strip-json-comments": "2.0.1", - "taffydb": "2.6.2", - "underscore": "1.8.3" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - }, - "espree": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.1.7.tgz", - "integrity": "sha1-/V3ux2qXpRIKnNOnyxF3oJI7EdI=", - "dev": true, - "requires": { - "acorn": "3.3.0", - "acorn-jsx": "3.0.1" - } - } - } - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "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=", - "dev": true - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "jsprim": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "labeled-stream-splicer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz", - "integrity": "sha1-pS4dE4AkwAuGscDJH2d5GLiuClk=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "isarray": "0.0.1", - "stream-splicer": "2.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, - "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" - } - }, - "lexical-scope": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", - "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", - "dev": true, - "requires": { - "astw": "2.2.0" - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - }, - "log-driver": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", - "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.1" - } - }, - "marked": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", - "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.3" - } - }, - "miller-rabin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", - "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "brorand": "1.1.0" - } - }, - "mime-db": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "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" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.4.2.tgz", - "integrity": "sha1-0O9NMyEm2/GNDWQMmzgt1IvpdZQ=", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.0", - "diff": "3.2.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "debug": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", - "integrity": "sha1-vFlryr52F/Edn6FTYe3tVgi4SZs=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "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" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "mocha-lcov-reporter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz", - "integrity": "sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q=", - "dev": true - }, - "module-deps": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz", - "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=", - "dev": true, - "requires": { - "JSONStream": "1.3.1", - "browser-resolve": "1.11.2", - "cached-path-relative": "1.0.1", - "concat-stream": "1.5.2", - "defined": "1.0.0", - "detective": "4.5.0", - "duplexer2": "0.1.4", - "inherits": "2.0.3", - "parents": "1.0.1", - "readable-stream": "2.3.2", - "resolve": "1.3.3", - "stream-combiner2": "1.1.1", - "subarg": "1.0.0", - "through2": "2.0.3", - "xtend": "4.0.1" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=", - "dev": true, - "optional": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1.0.9" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "1.0.2" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "optional": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "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" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.1.0" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - } - }, - "os-browserify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", - "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" - } - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true, - "requires": { - "path-platform": "0.11.15" - } - }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "dev": true, - "requires": { - "asn1.js": "4.9.1", - "browserify-aes": "1.0.6", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.0", - "pbkdf2": "3.0.12" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "optional": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "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 - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", - "dev": true - }, - "pbkdf2": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz", - "integrity": "sha1-vjZ4XFBn6kjYBv+SMojF91C2uKI=", - "dev": true, - "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" - } - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pluralize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-4.0.0.tgz", - "integrity": "sha1-WbcIwcAZCi9pLxx2GMRGsFL9F2I=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true, - "optional": true - }, - "private": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "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=", - "dev": true - }, - "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "dev": true, - "requires": { - "bn.js": "4.11.7", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.5" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "optional": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "randombytes": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true, - "requires": { - "readable-stream": "2.3.2" - } - }, - "readable-stream": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.2.tgz", - "integrity": "sha1-WgTfBeT1f+Pw3Gj90R3FyXx+b00=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.2", - "set-immediate-shim": "1.0.1" - } - }, - "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", - "dev": true - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "regenerator-transform": { - "version": "0.9.11", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", - "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", - "dev": true, - "requires": { - "babel-runtime": "6.23.0", - "babel-types": "6.25.0", - "private": "0.1.7" - } - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true, - "optional": true, - "requires": { - "is-equal-shallow": "0.1.3", - "is-primitive": "2.0.0" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "1.3.2", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", - "dev": true, - "optional": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "requires": { - "aws-sign2": "0.6.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.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - }, - "dependencies": { - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - } - }, - "requizzle": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz", - "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=", - "dev": true, - "requires": { - "underscore": "1.6.0" - }, - "dependencies": { - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - } - } - }, - "resolve": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", - "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "dev": true, - "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "2.1.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "4.0.8" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true, - "optional": true - }, - "sha.js": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", - "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "shasum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", - "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", - "dev": true, - "requires": { - "json-stable-stringify": "0.0.1", - "sha.js": "2.4.8" - } - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "dev": true, - "requires": { - "array-filter": "0.0.1", - "array-map": "0.0.0", - "array-reduce": "0.0.0", - "jsonify": "0.0.0" - } - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "source-map-support": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", - "dev": true, - "requires": { - "source-map": "0.5.6" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "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", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.2" - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "requires": { - "duplexer2": "0.1.4", - "readable-stream": "2.3.2" - } - }, - "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", - "dev": true, - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.2", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - } - }, - "stream-splicer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", - "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.2" - } - }, - "string-width": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "requires": { - "minimist": "1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "syntax-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", - "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", - "dev": true, - "requires": { - "acorn": "4.0.13" - } - }, - "table": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.1.tgz", - "integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=", - "dev": true, - "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.17.4", - "slice-ansi": "0.0.4", - "string-width": "2.0.0" - } - }, - "taffydb": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", - "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "2.3.2", - "xtend": "4.0.1" - } - }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "requires": { - "process": "0.11.10" - } - }, - "tmp": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "tryit": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - }, - "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 - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2" - } - }, - "type-detect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", - "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-es": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.0.20.tgz", - "integrity": "sha512-umLok08LJl/aHzDqJZomUtDPPegw/T7RHkVh+OnZ4fgb5X/LQPqRZcicDJh+s0Tnw8lSB/Lcc1RtZBMVz66eJw==", - "dev": true, - "requires": { - "commander": "2.9.0", - "source-map": "0.5.6" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "umd": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz", - "integrity": "sha1-iuVW4RAR9jwllnCKiDclnwGz1g4=", - "dev": true - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true - }, - "underscore-contrib": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz", - "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=", - "dev": true, - "requires": { - "underscore": "1.6.0" - }, - "dependencies": { - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - } - } - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", - "dev": true - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "1.1.1" - } - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "dev": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "0.5.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } -} diff --git a/package.json b/package.json index 021f72e3..5cc69e70 100644 --- a/package.json +++ b/package.json @@ -2,26 +2,28 @@ "name": "jsonata", "version": "1.5.0", "description": "JSON query and transformation language", - "module": "jsonata.js", - "main": "jsonata-es5.js", - "typings": "jsonata.d.ts", + "module": "es2015/jsonata.js", + "main": "es5/jsonata.js", + "typings": "lib/jsonata.d.ts", "homepage": "http://jsonata.org/", "repository": { "type": "git", "url": "https://github.com/jsonata-js/jsonata.git" }, "scripts": { - "pretest": "npm run lint", "mocha": "node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html ./node_modules/mocha/bin/_mocha -- \"test/**/*.js\"", - "test": "npm run mocha", - "posttest": "npm run check-coverage && npm run minify && npm run babel && npm run browserify && npm run minify-es5", + "jest": "jest", + "test": "npm run jest --coverage", + "posttest": "npm run check-coverage", "check-coverage": "istanbul check-coverage -statement 100 -branch 100 -function 100 -line 100", - "minify": "uglifyjs jsonata.js -o jsonata.min.js --compress --mangle", - "lint": "eslint .", + "minify": "uglifyjs dist/jsonata-browser.js -o dist/jsonata.min.js --compress --mangle", + "compile-es2015": "tsc -p tsconfig-es2015.json", + "compile-es5": "tsc -p tsconfig-es5.json", + "compile": "npm run compile-es2015 && npm run compile-es5", "doc": "jsdoc --configure jsdoc.json .", - "cover": "istanbul cover _mocha", - "coveralls": "npm run cover -- --report lcovonly && cat ./coverage/lcov.info | coveralls", - "babel": "node ./node_modules/babel-cli/bin/babel.js --out-file jsonata-es5.js jsonata.js", + "cover": "jest --coverage", + "bundle": "npm run compile && npm run jest --coverage && npm run check-coverage && rollup -c", + "coveralls": "cat ./coverage/lcov.info | coveralls", "browserify": "node ./node_modules/browserify/bin/cmd.js jsonata-es5.js --outfile jsonata-es5.js --standalone jsonata", "minify-es5": "uglifyjs jsonata-es5.js -o jsonata-es5.min.js --compress --mangle" }, @@ -35,10 +37,7 @@ "path" ], "devDependencies": { - "babel-cli": "^6.24.1", - "babel-plugin-transform-runtime": "^6.23.0", - "babel-preset-env": "^1.5.2", - "babel-runtime": "^6.23.0", + "@types/jest": "^22.0.1", "browserify": "^15.2.0", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", @@ -46,13 +45,48 @@ "eslint": "^4.0.0", "eslint-plugin-ideal": "^0.1.3", "istanbul": "^0.4.5", + "jest": "21.2.1", "jsdoc": "^3.4.0", "mocha": "^5.0.0", "mocha-lcov-reporter": "^1.2.0", "request": "^2.81.0", - "uglify-es": "^3.0.20" + "rollup": "^0.54.1", + "ts-jest": "21.2.3", + "uglify-es": "^3.0.20", + "@types/node": "^9.3.0", + "typescript": "^2.6.2" }, "engines": { "node": ">= 4" + }, + "jest": { + "globals": { + "ts-jest": { + "skipBabel": true + } + }, + "coverageReporters": [ + "json", + "lcov", + "text" + ], + "transform": { + "^.+\\.tsx?$": "ts-jest" + }, + "collectCoverage": true, + "mapCoverage": true, + "testRegex": "/__tests__/.*\\.(ts|tsx)$", + "testPathIgnorePatterns": [ + "/node_modules/", + "/lib/" + ], + "moduleFileExtensions": [ + "ts", + "tsx", + "js", + "jsx", + "json", + "node" + ] } } diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 00000000..518c49f1 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,25 @@ +/** + * © Copyright IBM Corp. 2016, 2017 All Rights Reserved + * Project name: JSONata + * This project is licensed under the MIT License, see LICENSE + */ + +export default [ + // This will convert the ES2015 modules (but not other ES2015 features) to CommonJS modules + { + input: "es2015/jsonata.js", + output: { + format: "cjs", + file: "dist/jsonata-cjs.js", + }, + }, + // This will convert the ES2015 modules (but not other ES2015 features) to a Universal Module Definition + { + input: "es2015/jsonata.js", + output: { + format: "iife", + file: "dist/jsonata-browser.js", + name: "jsonata", + }, + }, +]; diff --git a/src/ast.ts b/src/ast.ts new file mode 100644 index 00000000..70854bb8 --- /dev/null +++ b/src/ast.ts @@ -0,0 +1,206 @@ +import { Token } from "./tokenizer"; +import { Signature } from './signatures'; + +// Potential AST changes +// +// - Make predicate and group into AST nodes instead of optional fields on every node. +// - Change unary operator "[" to a different type...? +// - Get errors? off of BaseNode +// - Rationalize unary nodes + +export interface BaseNode { + type: string; + value: any; + position: number; + // This gets added to nodes to indicate how a value (assuming it is an object) + // should be grouped. + // TODO: Rename lhs...? + group?: { lhs: ASTNode[][], position: number }; + // This gets added to nodes to specify a list of predicates to filter on. + predicate?: ASTNode[]; +} + +export interface WildcardNode extends BaseNode { + type: "wildcard"; +} + +export interface DescendantNode extends BaseNode { + type: "descendant"; +} + +export interface ErrorFields { + code: string; + position?: number; + token?: string; + stack?: string; +} + +export interface ErrorNode extends BaseNode { + type: "error"; + error: ErrorFields; + lhs: ASTNode; + remaining: Token[]; +} + +export interface VariableNode extends BaseNode { + type: "variable"; +} + +export interface NameNode extends BaseNode { + type: "name"; +} +export interface LiteralNode extends BaseNode { + type: "literal"; +} + +export interface RegexNode extends BaseNode { + type: "regex"; +} + +export interface OperatorNode extends BaseNode { + type: "operator"; +} + +export interface EndNode extends BaseNode { + type: "end"; + value: string; +} + +export type TerminalNode = VariableNode | NameNode | LiteralNode | RegexNode | OperatorNode | EndNode; + +export interface UnaryMinusNode extends BaseNode { + type: "unary"; + value: "-"; + expression: ASTNode; +} + +export interface ArrayConstructorNode extends BaseNode { + type: "unary"; + value: "["; + expressions: ASTNode[]; + consarray: boolean; +} + +export interface UnaryObjectNode extends BaseNode { + type: "unary"; + value: "{"; + lhs: ASTNode[][]; +} + +export type UnaryNode = UnaryMinusNode | ArrayConstructorNode | UnaryObjectNode; + +export interface BinaryOperationNode extends BaseNode { + type: "binary"; + value: "+" | "-" | "*" | "/" | "[" | ".." | "." | "[" | ":=" | "~>"; // TODO: There must be more?!? (e.g., comparisons) + lhs: ASTNode; + rhs: ASTNode; // ASTNode if operator is "." | "[" | ":=" | "~>" +} + +export interface BinaryObjectNode extends BaseNode { + type: "binary"; + value: "{"; + lhs: ASTNode; + rhs: ASTNode[]; // ASTNode[] if operator is "{" +} + +export type BinaryNode = BinaryOperationNode | BinaryObjectNode; + +export interface SortTerm { + descending: boolean; + expression: ASTNode; +} + +export interface SortNode extends BaseNode { + type: "sort"; + lhs: ASTNode; + rhs: SortTerm[]; +} + +export interface TernaryNode extends BaseNode { + type: "condition"; + condition: ASTNode; + then: ASTNode; + else: ASTNode; + position: number; +} + +export interface BlockNode extends BaseNode { + type: "block"; + expressions: ASTNode[]; +} + +export interface TransformNode extends BaseNode { + type: "transform"; + pattern: ASTNode; + update: ASTNode; + delete?: ASTNode; +} + +export interface FunctionInvocationNode extends BaseNode { + type: "function" | "partial"; + procedure: ASTNode; + arguments: ASTNode[]; + // This is added when creating PathNodes. + nextFunction?: Function; +} + +export interface LambdaDefinitionNode extends BaseNode { + type: "lambda"; + body: ASTNode; + signature: Signature; + arguments: ASTNode[]; + thunk: boolean; +} + +export interface SingletonArrayDecorator extends BaseNode { + type: "singleton"; + next: ASTNode; +} + +// This type of node only appears after the AST is optimized +export interface PathNode extends BaseNode { + type: "path"; + steps: ASTNode[]; + keepSingletonArray: boolean, +} + +export interface BindNode extends BaseNode { + type: "bind"; + lhs: ASTNode; + rhs: ASTNode; +} + +export interface ApplyNode extends BaseNode { + type: "apply"; + lhs: ASTNode; + rhs: ASTNode; +} + +/** + * These are the AST nodes that come directly out of the parser before + * ast_optimize is called. + */ +export type ASTNode = + | WildcardNode + | DescendantNode + | ErrorNode + | LiteralNode + | NameNode + | VariableNode + | RegexNode + | OperatorNode + | UnaryNode + | BinaryNode + | BinaryObjectNode + | SortNode + | TernaryNode + | BlockNode + | TransformNode + | FunctionInvocationNode + | LambdaDefinitionNode + | PathNode + | BindNode + | ApplyNode + | EndNode + | SingletonArrayDecorator; + diff --git a/src/constants.ts b/src/constants.ts new file mode 100644 index 00000000..2a2a0007 --- /dev/null +++ b/src/constants.ts @@ -0,0 +1,139 @@ +export const operators = { + ".": 75, + "[": 80, + "]": 0, + "{": 70, + "}": 0, + "(": 80, + ")": 0, + ",": 0, + "@": 75, + "#": 70, + ";": 80, + ":": 80, + "?": 20, + "+": 50, + "-": 50, + "*": 60, + "/": 60, + "%": 60, + "|": 20, + "=": 40, + "<": 40, + ">": 40, + "^": 40, + "**": 60, + "..": 20, + ":=": 10, + "!=": 40, + "<=": 40, + ">=": 40, + "~>": 40, + and: 30, + or: 25, + in: 40, + "&": 50, + "!": 0, // not an operator, but needed as a stop character for name tokens + "~": 0, // not an operator, but needed as a stop character for name tokens +}; + +export const escapes = { + // JSON string escape sequences - see json.org + '"': '"', + "\\": "\\", + "/": "/", + b: "\b", + f: "\f", + n: "\n", + r: "\r", + t: "\t", +}; + +/** + * Error codes + * + */ +export const errorCodes = { + S0101: "String literal must be terminated by a matching quote", + S0102: "Number out of range: {{token}}", + S0103: "Unsupported escape sequence: \\{{token}}", + S0104: "The escape sequence \\u must be followed by 4 hex digits", + S0105: "Quoted property name must be terminated with a backquote (`)", + S0201: "Syntax error: {{token}}", + S0202: "Expected {{value}}, got {{token}}", + S0203: "Expected {{value}} before end of expression", + S0204: "Unknown operator: {{token}}", + S0205: "Unexpected token: {{token}}", + S0206: "Unknown expression type: {{token}}", + S0207: "Unexpected end of expression", + S0208: "Parameter {{value}} of function definition must be a variable name (start with $)", + S0209: "A predicate cannot follow a grouping expression in a step", + S0210: "Each step can only have one grouping expression", + S0211: "The symbol {{token}} cannot be used as a unary operator", + S0301: "Empty regular expressions are not allowed", + S0302: "No terminating / in regular expression", + S0402: "Choice groups containing parameterized types are not supported", + S0401: "Type parameters can only be applied to functions and arrays", + S0500: "Attempted to evaluate an expression containing syntax error(s)", + T0410: "Argument {{index}} of function {{token}} does not match function signature", + T0411: "Context value is not a compatible type with argument {{index}} of function {{token}}", + T0412: "Argument {{index}} of function {{token}} must be an array of {{type}}", + D1001: "Number out of range: {{value}}", + D1002: "Cannot negate a non-numeric value: {{value}}", + T1003: "Key in object structure must evaluate to a string; got: {{value}}", + D1004: "Regular expression matches zero length string", + T1005: "Attempted to invoke a non-function. Did you mean ${{{token}}}?", + T1006: "Attempted to invoke a non-function", + T1007: "Attempted to partially apply a non-function. Did you mean ${{{token}}}?", + T1008: "Attempted to partially apply a non-function", + T2001: "The left side of the {{token}} operator must evaluate to a number", + T2002: "The right side of the {{token}} operator must evaluate to a number", + T2003: "The left side of the range operator (..) must evaluate to an integer", + T2004: "The right side of the range operator (..) must evaluate to an integer", + D2005: "The left side of := must be a variable name (start with $)", + T2006: "The right side of the function application operator ~> must be a function", + T2007: "Type mismatch when comparing values {{value}} and {{value2}} in order-by clause", + T2008: "The expressions within an order-by clause must evaluate to numeric or string values", + T2009: "The values {{value}} and {{value2}} either side of operator {{token}} must be of the same data type", + T2010: "The expressions either side of operator {{token}} must evaluate to numeric or string values", + T2011: "The insert/update clause of the transform expression must evaluate to an object: {{value}}", + T2012: "The delete clause of the transform expression must evaluate to a string or array of strings: {{value}}", + T2013: + "The transform expression clones the input object using the $clone() function. This has been overridden in the current scope by a non-function.", + D3001: "Attempting to invoke string function on Infinity or NaN", + D3010: "Second argument of replace function cannot be an empty string", + D3011: "Fourth argument of replace function must evaluate to a positive number", + D3012: "Attempted to replace a matched string with a non-string value", + D3020: "Third argument of split function must evaluate to a positive number", + D3030: "Unable to cast value to a number: {{value}}", + D3040: "Third argument of match function must evaluate to a positive number", + D3050: "First argument of reduce function must be a function with two arguments", + D3060: "The sqrt function cannot be applied to a negative number: {{value}}", + D3061: + "The power function has resulted in a value that cannot be represented as a JSON number: base={{value}}, exponent={{exp}}", + D3070: + "The single argument form of the sort function can only be applied to an array of strings or an array of numbers. Use the second argument to specify a comparison function", + D3080: "The picture string must only contain a maximum of two sub-pictures", + D3081: "The sub-picture must not contain more than one instance of the 'decimal-separator' character", + D3082: "The sub-picture must not contain more than one instance of the 'percent' character", + D3083: "The sub-picture must not contain more than one instance of the 'per-mille' character", + D3084: "The sub-picture must not contain both a 'percent' and a 'per-mille' character", + D3085: + "The mantissa part of a sub-picture must contain at least one character that is either an 'optional digit character' or a member of the 'decimal digit family'", + D3086: + "The sub-picture must not contain a passive character that is preceded by an active character and that is followed by another active character", + D3087: + "The sub-picture must not contain a 'grouping-separator' character that appears adjacent to a 'decimal-separator' character", + D3088: "The sub-picture must not contain a 'grouping-separator' at the end of the integer part", + D3089: "The sub-picture must not contain two adjacent instances of the 'grouping-separator' character", + D3090: + "The integer part of the sub-picture must not contain a member of the 'decimal digit family' that is followed by an instance of the 'optional digit character'", + D3091: + "The fractional part of the sub-picture must not contain an instance of the 'optional digit character' that is followed by a member of the 'decimal digit family'", + D3092: + "A sub-picture that contains a 'percent' or 'per-mille' character must not contain a character treated as an 'exponent-separator'", + D3093: + "The exponent part of the sub-picture must comprise only of one or more characters that are members of the 'decimal digit family'", + D3100: "The radix of the formatBase function must be between 2 and 36. It was given {{value}}", + D3110: "The argument of the toMillis function must be an ISO 8601 formatted timestamp. Given {{value}}", +}; diff --git a/src/evaluate.ts b/src/evaluate.ts new file mode 100644 index 00000000..5834bb3f --- /dev/null +++ b/src/evaluate.ts @@ -0,0 +1,1448 @@ +import { + isNumeric, + isArrayOfNumbers, + flatten, + createFrame, + isFunction, + isGenerator, + isLambda, + isArrayOfStrings, + createSequence, + toSequence, +} from "./utils"; +import { defineFunction } from "./signatures"; +import { parser } from './parser'; +import { functionBoolean, functionAppend, functionString, functionSort, createStandardFrame } from "./functions"; +// import * as ast from "./ast"; + +/** + * Evaluate expression against input data + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {*} Evaluated input data + */ +export function* evaluate(expr, input, environment) { + var result; + + var entryCallback = environment.lookup("__evaluate_entry"); + if (entryCallback) { + entryCallback(expr, input, environment); + } + + switch (expr.type) { + case "path": + result = yield* evaluatePath(expr, input, environment); + break; + case "binary": + result = yield* evaluateBinary(expr, input, environment); + break; + case "unary": + result = yield* evaluateUnary(expr, input, environment); + break; + case "name": + result = evaluateName(expr, input, environment); + break; + case "literal": + result = evaluateLiteral(expr, input, environment); + break; + case "wildcard": + result = evaluateWildcard(expr, input, environment); + break; + case "descendant": + result = evaluateDescendants(expr, input, environment); + break; + case "condition": + result = yield* evaluateCondition(expr, input, environment); + break; + case "block": + result = yield* evaluateBlock(expr, input, environment); + break; + case "bind": + result = yield* evaluateBindExpression(expr, input, environment); + break; + case "regex": + result = evaluateRegex(expr, input, environment); + break; + case "function": + result = yield* evaluateFunction(expr, input, environment); + break; + case "variable": + result = evaluateVariable(expr, input, environment); + break; + case "lambda": + result = evaluateLambda(expr, input, environment); + break; + case "partial": + result = yield* evaluatePartialApplication(expr, input, environment); + break; + case "apply": + result = yield* evaluateApplyExpression(expr, input, environment); + break; + case "sort": + result = yield* evaluateSortExpression(expr, input, environment); + break; + case "transform": + result = evaluateTransformExpression(expr, input, environment); + break; + } + + if ( + environment.lookup("__jsonata_async") && + (typeof result === "undefined" || result === null || typeof result.then !== "function") + ) { + result = Promise.resolve(result); + } + if ( + environment.lookup("__jsonata_async") && + typeof result.then === "function" && + expr.nextFunction && + typeof result[expr.nextFunction] === "function" + ) { + // although this is a 'thenable', it is chaining a different function + // so don't yield since yielding will trigger the .then() + } else { + result = yield result; + } + + if (expr.hasOwnProperty("predicate")) { + result = yield* applyPredicates(expr.predicate, result, environment); + } + if (expr.hasOwnProperty("group")) { + result = yield* evaluateGroupExpression(expr.group, result, environment); + } + + var exitCallback = environment.lookup("__evaluate_exit"); + if (exitCallback) { + exitCallback(expr, input, environment, result); + } + + if (result && result.sequence) { + result = result.value(); + } + + return result; +} + +/** + * Evaluate path expression against input data + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {*} Evaluated input data + */ +function* evaluatePath(expr, input, environment) { + var inputSequence; + // expr is an array of steps + // if the first step is a variable reference ($...), including root reference ($$), + // then the path is absolute rather than relative + if (expr.steps[0].type === "variable") { + inputSequence = createSequence(input); // dummy singleton sequence for first (absolute) step + } else if (Array.isArray(input)) { + inputSequence = input; + } else { + // if input is not an array, make it so + inputSequence = createSequence(input); + } + + var resultSequence; + + // evaluate each step in turn + for (var ii = 0; ii < expr.steps.length; ii++) { + var step = expr.steps[ii]; + + // if the first step is an explicit array constructor, then just evaluate that (i.e. don't iterate over a context array) + if (ii === 0 && step.consarray) { + resultSequence = yield* evaluate(step, inputSequence, environment); + } else { + resultSequence = yield* evaluateStep(step, inputSequence, environment, ii === expr.steps.length - 1); + } + + if (typeof resultSequence === "undefined" || resultSequence.length === 0) { + break; + } + inputSequence = resultSequence; + } + + if (expr.keepSingletonArray) { + resultSequence.keepSingleton = true; + } + + return resultSequence; +} + +/** + * Evaluate a step within a path + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @param {boolean} lastStep - flag the last step in a path + * @returns {*} Evaluated input data + */ +function* evaluateStep(expr, input, environment, lastStep) { + var result = createSequence(); + + for (var ii = 0; ii < input.length; ii++) { + var res = yield* evaluate(expr, input[ii], environment); + if (typeof res !== "undefined") { + result.push(res); + } + } + + var resultSequence = createSequence(); + if (lastStep && result.length === 1 && Array.isArray(result[0]) && !result[0].sequence) { + resultSequence = result[0]; + } else { + // flatten the sequence + result.forEach(function(res) { + // TODO: These any casts are a bit sloppy + if (!Array.isArray(res) || (res as any).cons || (res as any).keepSingleton) { + // it's not an array - just push into the result sequence + resultSequence.push(res); + } else { + // res is a sequence - flatten it into the parent sequence + Array.prototype.push.apply(resultSequence, res); + } + }); + } + + return resultSequence; +} + +/** + * Apply predicates to input data + * @param {Object} predicates - Predicates + * @param {Object} input - Input data to apply predicates against + * @param {Object} environment - Environment + * @returns {*} Result after applying predicates + */ +function* applyPredicates(predicates, input, environment) { + var inputSequence = input; + // lhs potentially holds an array + // we want to iterate over the array, and only keep the items that are + // truthy when applied to the predicate. + // if the predicate evaluates to an integer, then select that index + + var results = createSequence(); + for (var ii = 0; ii < predicates.length; ii++) { + var predicate = predicates[ii]; + // if it's not an array, turn it into one + // since in XPath >= 2.0 an item is equivalent to a singleton sequence of that item + // if input is not an array, make it so + if (!Array.isArray(inputSequence)) { + inputSequence = createSequence(inputSequence); + } + results = createSequence(); + if (predicate.type === "literal" && isNumeric(predicate.value)) { + var index = predicate.value; + if (!Number.isInteger(index)) { + // round it down + index = Math.floor(index); + } + if (index < 0) { + // count in from end of array + index = inputSequence.length + index; + } + results = inputSequence[index]; + } else { + results = yield* evaluateFilter(predicate, inputSequence, environment); + } + inputSequence = results; + } + return results; +} + +/** + * Apply filter predicate to input data + * @param {Object} predicate - filter expression + * @param {Object} input - Input data to apply predicates against + * @param {Object} environment - Environment + * @returns {*} Result after applying predicates + */ +function* evaluateFilter(predicate, input, environment) { + var results = createSequence(); + for (var index = 0; index < input.length; index++) { + var item = input[index]; + var res = yield* evaluate(predicate, item, environment); + if (isNumeric(res)) { + res = [res]; + } + if (isArrayOfNumbers(res)) { + res.forEach(function(ires) { + if (!Number.isInteger(ires)) { + // round it down + ires = Math.floor(ires); + } + if (ires < 0) { + // count in from end of array + ires = input.length + ires; + } + if (ires === index) { + results.push(item); + } + }); + } else if (functionBoolean(res)) { + // truthy + results.push(item); + } + } + return results; +} + +/** + * Evaluate binary expression against input data + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {*} Evaluated input data + */ +function* evaluateBinary(expr, input, environment) { + var result; + var lhs = yield* evaluate(expr.lhs, input, environment); + var rhs = yield* evaluate(expr.rhs, input, environment); + var op = expr.value; + + try { + switch (op) { + case "+": + case "-": + case "*": + case "/": + case "%": + result = evaluateNumericExpression(lhs, rhs, op); + break; + case "=": + case "!=": + case "<": + case "<=": + case ">": + case ">=": + result = evaluateComparisonExpression(lhs, rhs, op); + break; + case "&": + result = evaluateStringConcat(lhs, rhs); + break; + case "and": + case "or": + result = evaluateBooleanExpression(lhs, rhs, op); + break; + case "..": + result = evaluateRangeExpression(lhs, rhs); + break; + case "in": + result = evaluateIncludesExpression(lhs, rhs); + break; + } + } catch (err) { + err.position = expr.position; + err.token = op; + throw err; + } + return result; +} + +/** + * Evaluate unary expression against input data + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {*} Evaluated input data + */ +function* evaluateUnary(expr, input, environment) { + var result; + + switch (expr.value) { + case "-": + result = yield* evaluate(expr.expression, input, environment); + if (typeof result === "undefined") { + result = undefined; + } else if (isNumeric(result)) { + result = -result; + } else { + throw { + code: "D1002", + stack: new Error().stack, + position: expr.position, + token: expr.value, + value: result, + }; + } + break; + case "[": + // array constructor - evaluate each item + result = []; + for (var ii = 0; ii < expr.expressions.length; ii++) { + var item = expr.expressions[ii]; + var value = yield* evaluate(item, input, environment); + if (typeof value !== "undefined") { + if (item.value === "[") { + result.push(value); + } else { + result = functionAppend(result, value); + } + } + } + if (expr.consarray) { + Object.defineProperty(result, "cons", { + enumerable: false, + configurable: false, + value: true, + }); + } + break; + case "{": + // object constructor - apply grouping + result = yield* evaluateGroupExpression(expr, input, environment); + break; + } + return result; +} + +/** + * Evaluate name object against input data + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {*} Evaluated input data + */ +export function evaluateName(expr, input, environment) { + // lookup the 'name' item in the input + var result; + if (Array.isArray(input)) { + result = createSequence(); + for (var ii = 0; ii < input.length; ii++) { + var res = evaluateName(expr, input[ii], environment); + if (typeof res !== "undefined") { + result.push(res); + } + } + } else if (input !== null && typeof input === "object") { + result = input[expr.value]; + } + return result; +} + +/** + * Evaluate literal against input data + * @param {Object} expr - JSONata expression + * @returns {*} Evaluated input data + */ +function evaluateLiteral(expr, input, environment) { + return expr.value; +} + +/** + * Evaluate wildcard against input data + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @returns {*} Evaluated input data + */ +function evaluateWildcard(expr, input, environment) { + var results = createSequence(); + if (input !== null && typeof input === "object") { + Object.keys(input).forEach(function(key) { + var value = input[key]; + if (Array.isArray(value)) { + value = flatten(value); + results = functionAppend(results, value); + } else { + results.push(value); + } + }); + } + + // result = normalizeSequence(results); + return results; +} + +/** + * Evaluate descendants against input data + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @returns {*} Evaluated input data + */ +function evaluateDescendants(expr, input, environment) { + var result; + var resultSequence = createSequence(); + if (typeof input !== "undefined") { + // traverse all descendants of this object/array + recurseDescendants(input, resultSequence); + if (resultSequence.length === 1) { + result = resultSequence[0]; + } else { + result = resultSequence; + } + } + return result; +} + +/** + * Recurse through descendants + * @param {Object} input - Input data + * @param {Object} results - Results + */ +function recurseDescendants(input, results) { + // this is the equivalent of //* in XPath + if (!Array.isArray(input)) { + results.push(input); + } + if (Array.isArray(input)) { + input.forEach(function(member) { + recurseDescendants(member, results); + }); + } else if (input !== null && typeof input === "object") { + Object.keys(input).forEach(function(key) { + recurseDescendants(input[key], results); + }); + } +} + +/** + * Evaluate numeric expression against input data + * @param {Object} lhs - LHS value + * @param {Object} rhs - RHS value + * @param {Object} op - opcode + * @returns {*} Result + */ +function evaluateNumericExpression(lhs, rhs, op) { + var result; + + if (typeof lhs === "undefined" || typeof rhs === "undefined") { + // if either side is undefined, the result is undefined + return result; + } + + if (!isNumeric(lhs)) { + throw { + code: "T2001", + stack: new Error().stack, + value: lhs, + }; + } + if (!isNumeric(rhs)) { + throw { + code: "T2002", + stack: new Error().stack, + value: rhs, + }; + } + + switch (op) { + case "+": + result = lhs + rhs; + break; + case "-": + result = lhs - rhs; + break; + case "*": + result = lhs * rhs; + break; + case "/": + result = lhs / rhs; + break; + case "%": + result = lhs % rhs; + break; + } + return result; +} + +/** + * Evaluate comparison expression against input data + * @param {Object} lhs - LHS value + * @param {Object} rhs - RHS value + * @param {Object} op - opcode + * @returns {*} Result + */ +function evaluateComparisonExpression(lhs, rhs, op) { + var result; + + // type checks + var ltype = typeof lhs; + var rtype = typeof rhs; + + if (ltype === "undefined" || rtype === "undefined") { + // if either side is undefined, the result is false + return false; + } + + var validate = function() { + // if aa or bb are not string or numeric values, then throw an error + if (!(ltype === "string" || ltype === "number") || !(rtype === "string" || rtype === "number")) { + throw { + code: "T2010", + stack: new Error().stack, + value: !(ltype === "string" || ltype === "number") ? lhs : rhs, + }; + } + + //if aa and bb are not of the same type + if (ltype !== rtype) { + throw { + code: "T2009", + stack: new Error().stack, + value: lhs, + value2: rhs, + }; + } + }; + + switch (op) { + case "=": + result = lhs === rhs; + break; + case "!=": + result = lhs !== rhs; + break; + case "<": + validate(); + result = lhs < rhs; + break; + case "<=": + validate(); + result = lhs <= rhs; + break; + case ">": + validate(); + result = lhs > rhs; + break; + case ">=": + validate(); + result = lhs >= rhs; + break; + } + return result; +} + +/** + * Inclusion operator - in + * + * @param {Object} lhs - LHS value + * @param {Object} rhs - RHS value + * @returns {boolean} - true if lhs is a member of rhs + */ +function evaluateIncludesExpression(lhs, rhs) { + var result = false; + + if (typeof lhs === "undefined" || typeof rhs === "undefined") { + // if either side is undefined, the result is false + return false; + } + + if (!Array.isArray(rhs)) { + rhs = [rhs]; + } + + for (var i = 0; i < rhs.length; i++) { + if (rhs[i] === lhs) { + result = true; + break; + } + } + + return result; +} + +/** + * Evaluate boolean expression against input data + * @param {Object} lhs - LHS value + * @param {Object} rhs - RHS value + * @param {Object} op - opcode + * @returns {*} Result + */ +function evaluateBooleanExpression(lhs, rhs, op) { + var result; + + switch (op) { + case "and": + result = functionBoolean(lhs) && functionBoolean(rhs); + break; + case "or": + result = functionBoolean(lhs) || functionBoolean(rhs); + break; + } + return result; +} + +/** + * Evaluate string concatenation against input data + * @param {Object} lhs - LHS value + * @param {Object} rhs - RHS value + * @returns {string|*} Concatenated string + */ +function evaluateStringConcat(lhs, rhs) { + var result; + + var lstr = ""; + var rstr = ""; + if (typeof lhs !== "undefined") { + lstr = functionString(lhs); + } + if (typeof rhs !== "undefined") { + rstr = functionString(rhs); + } + + result = lstr.concat(rstr); + return result; +} + +/** + * Evaluate group expression against input data + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {{}} Evaluated input data + */ +function* evaluateGroupExpression(expr, input, environment) { + var result = {}; + var groups = {}; + // group the input sequence by 'key' expression + if (!Array.isArray(input)) { + input = createSequence(input); + } + for (var itemIndex = 0; itemIndex < input.length; itemIndex++) { + var item = input[itemIndex]; + for (var pairIndex = 0; pairIndex < expr.lhs.length; pairIndex++) { + var pair = expr.lhs[pairIndex]; + var key = yield* evaluate(pair[0], item, environment); + // key has to be a string + if (typeof key !== "string") { + throw { + code: "T1003", + stack: new Error().stack, + position: expr.position, + value: key, + }; + } + var entry = { data: item, expr: pair[1] }; + if (groups.hasOwnProperty(key)) { + // a value already exists in this slot + // append it as an array + groups[key].data = functionAppend(groups[key].data, item); + } else { + groups[key] = entry; + } + } + } + + // iterate over the groups to evaluate the 'value' expression + for (key in groups) { + entry = groups[key]; + var value = yield* evaluate(entry.expr, entry.data, environment); + if (typeof value !== "undefined") { + result[key] = value; + } + } + + return result; +} + +/** + * Evaluate range expression against input data + * @param {Object} lhs - LHS value + * @param {Object} rhs - RHS value + * @returns {Array} Resultant array + */ +function evaluateRangeExpression(lhs, rhs) { + var result; + + if (typeof lhs === "undefined" || typeof rhs === "undefined") { + // if either side is undefined, the result is undefined + return result; + } + + if (lhs > rhs) { + // if the lhs is greater than the rhs, return undefined + return result; + } + + if (!Number.isInteger(lhs)) { + throw { + code: "T2003", + stack: new Error().stack, + value: lhs, + }; + } + if (!Number.isInteger(rhs)) { + throw { + code: "T2004", + stack: new Error().stack, + value: rhs, + }; + } + + result = new Array(rhs - lhs + 1); + for (var item = lhs, index = 0; item <= rhs; item++, index++) { + result[index] = item; + } + return toSequence(result); +} + +/** + * Evaluate bind expression against input data + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {*} Evaluated input data + */ +function* evaluateBindExpression(expr, input, environment) { + // The RHS is the expression to evaluate + // The LHS is the name of the variable to bind to - should be a VARIABLE token + var value = yield* evaluate(expr.rhs, input, environment); + if (expr.lhs.type !== "variable") { + throw { + code: "D2005", + stack: new Error().stack, + position: expr.position, + token: expr.value, + value: expr.lhs.type === "path" ? expr.lhs.steps[0].value : expr.lhs.value, + }; + } + environment.bind(expr.lhs.value, value); + return value; +} + +/** + * Evaluate condition against input data + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {*} Evaluated input data + */ +function* evaluateCondition(expr, input, environment) { + var result; + var condition = yield* evaluate(expr.condition, input, environment); + if (functionBoolean(condition)) { + result = yield* evaluate(expr.then, input, environment); + } else if (typeof expr.else !== "undefined") { + result = yield* evaluate(expr.else, input, environment); + } + return result; +} + +/** + * Evaluate block against input data + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {*} Evaluated input data + */ +function* evaluateBlock(expr, input, environment) { + var result; + // create a new frame to limit the scope of variable assignments + // TODO, only do this if the post-parse stage has flagged this as required + var frame = createFrame(environment); + // invoke each expression in turn + // only return the result of the last one + for (var ii = 0; ii < expr.expressions.length; ii++) { + result = yield* evaluate(expr.expressions[ii], input, frame); + } + + return result; +} + +/** + * Prepare a regex + * @param {Object} expr - expression containing regex + * @returns {Function} Higher order function representing prepared regex + */ +function evaluateRegex(expr, input, environment) { + expr.value.lastIndex = 0; + var closure = function(str) { + var re = expr.value; + var result; + var match = re.exec(str); + if (match !== null) { + result = { + match: match[0], + start: match.index, + end: match.index + match[0].length, + groups: [], + }; + if (match.length > 1) { + for (var i = 1; i < match.length; i++) { + result.groups.push(match[i]); + } + } + result.next = function() { + if (re.lastIndex >= str.length) { + return undefined; + } else { + var next = closure(str); + if (next && next.match === "" && re.lastIndex === expr.value.lastIndex) { + // matches zero length string; this will never progress + throw { + code: "D1004", + stack: new Error().stack, + position: expr.position, + value: expr.value.source, + }; + } + return next; + } + }; + } + + return result; + }; + return closure; +} + +/** + * Evaluate variable against input data + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {*} Evaluated input data + */ +function evaluateVariable(expr, input, environment) { + // lookup the variable value in the environment + var result; + // if the variable name is empty string, then it refers to context value + if (expr.value === "") { + result = input; + } else { + result = environment.lookup(expr.value); + } + return result; +} + +/** + * sort / order-by operator + * @param {Object} expr - AST for operator + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {*} Ordered sequence + */ +function* evaluateSortExpression(expr, input, environment) { + var result; + + // evaluate the lhs, then sort the results in order according to rhs expression + var lhs = yield* evaluate(expr.lhs, input, environment); + + // sort the lhs array + // use comparator function + var comparator = function(a, b) { + // expr.rhs is an array of order-by in priority order + var comp = 0; + for (var index = 0; comp === 0 && index < expr.rhs.length; index++) { + var term = expr.rhs[index]; + //evaluate the rhs expression in the context of a + var aa = driveGenerator(term.expression, a, environment); + //evaluate the rhs expression in the context of b + var bb = driveGenerator(term.expression, b, environment); + + // type checks + var atype = typeof aa; + var btype = typeof bb; + // undefined should be last in sort order + if (atype === "undefined") { + // swap them, unless btype is also undefined + comp = btype === "undefined" ? 0 : 1; + continue; + } + if (btype === "undefined") { + comp = -1; + continue; + } + + // if aa or bb are not string or numeric values, then throw an error + if (!(atype === "string" || atype === "number") || !(btype === "string" || btype === "number")) { + throw { + code: "T2008", + stack: new Error().stack, + position: expr.position, + value: !(atype === "string" || atype === "number") ? aa : bb, + }; + } + + //if aa and bb are not of the same type + if (atype !== btype) { + throw { + code: "T2007", + stack: new Error().stack, + position: expr.position, + value: aa, + value2: bb, + }; + } + if (aa === bb) { + // both the same - move on to next term + continue; + } else if (aa < bb) { + comp = -1; + } else { + comp = 1; + } + if (term.descending === true) { + comp = -comp; + } + } + // only swap a & b if comp equals 1 + return comp === 1; + }; + + result = functionSort(lhs, comparator); + + return result; +} + +/** + * create a transformer function + * @param {Object} expr - AST for operator + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {*} tranformer function + */ +function evaluateTransformExpression(expr, input, environment) { + // create a function to implement the transform definition + var transformer = function*(obj) { + // signature <(oa):o> + // undefined inputs always return undefined + if (typeof obj === "undefined") { + return undefined; + } + + // this function returns a copy of obj with changes specified by the pattern/operation + var cloneFunction = environment.lookup("clone"); + if (!isFunction(cloneFunction)) { + // throw type error + throw { + code: "T2013", + stack: new Error().stack, + position: expr.position, + }; + } + var result = yield* apply(cloneFunction, [obj], environment); + var matches = yield* evaluate(expr.pattern, result, environment); + if (typeof matches !== "undefined") { + if (!Array.isArray(matches)) { + matches = [matches]; + } + for (var ii = 0; ii < matches.length; ii++) { + var match = matches[ii]; + // evaluate the update value for each match + var update = yield* evaluate(expr.update, match, environment); + // update must be an object + var updateType = typeof update; + if (updateType !== "undefined") { + if (updateType !== "object" || update === null) { + // throw type error + throw { + code: "T2011", + stack: new Error().stack, + position: expr.update.position, + value: update, + }; + } + // merge the update + for (var prop in update) { + match[prop] = update[prop]; + } + } + + // delete, if specified, must be an array of strings (or single string) + if (typeof expr.delete !== "undefined") { + var deletions = yield* evaluate(expr.delete, match, environment); + if (typeof deletions !== "undefined") { + var val = deletions; + if (!Array.isArray(deletions)) { + deletions = [deletions]; + } + if (!isArrayOfStrings(deletions)) { + // throw type error + throw { + code: "T2012", + stack: new Error().stack, + position: expr.delete.position, + value: val, + }; + } + for (var jj = 0; jj < deletions.length; jj++) { + delete match[deletions[jj]]; + } + } + } + } + } + + return result; + }; + + return defineFunction(transformer, "<(oa):o>"); +} + +/** + * Evaluate an expression by driving the generator to completion + * Used when it's not possible to yield + * @param {Object} expr - AST + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {*} result + */ +function driveGenerator(expr, input, environment) { + var gen = evaluate(expr, input, environment); + // returns a generator - so iterate over it + var comp = gen.next(); + while (!comp.done) { + comp = gen.next(comp.value); + } + return comp.value; +} + +/** + * Apply the function on the RHS using the sequence on the LHS as the first argument + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {*} Evaluated input data + */ +function* evaluateApplyExpression(expr, input, environment) { + var result; + + const standardFrame = createStandardFrame(); + var chain = driveGenerator(parser("function($f, $g) { function($x){ $g($f($x)) } }"), null, standardFrame); + + if (expr.rhs.type === "function") { + // this is a function _invocation_; invoke it with lhs expression as the first argument + expr.rhs.arguments.unshift(expr.lhs); + result = yield* evaluateFunction(expr.rhs, input, environment); + expr.rhs.arguments.shift(); + } else { + var lhs = yield* evaluate(expr.lhs, input, environment); + var func = yield* evaluate(expr.rhs, input, environment); + + if (!isFunction(func)) { + throw { + code: "T2006", + stack: new Error().stack, + position: expr.position, + value: func, + }; + } + + if (isFunction(lhs)) { + // this is function chaining (func1 ~> func2) + // λ($f, $g) { λ($x){ $g($f($x)) } } + result = yield* apply(chain, [lhs, func], environment); + } else { + result = yield* apply(func, [lhs], environment); + } + } + + return result; +} + +/** + * Evaluate function against input data + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @param {Object} [applyto] - LHS of ~> operator + * @returns {*} Evaluated input data + */ +function* evaluateFunction(expr, input, environment) { + var result; + + // create the procedure + // can't assume that expr.procedure is a lambda type directly + // could be an expression that evaluates to a function (e.g. variable reference, parens expr etc. + // evaluate it generically first, then check that it is a function. Throw error if not. + var proc = yield* evaluate(expr.procedure, input, environment); + + if ( + typeof proc === "undefined" && + expr.procedure.type === "path" && + environment.lookup(expr.procedure.steps[0].value) + ) { + // help the user out here if they simply forgot the leading $ + throw { + code: "T1005", + stack: new Error().stack, + position: expr.position, + token: expr.procedure.steps[0].value, + }; + } + + var evaluatedArgs = []; + // eager evaluation - evaluate the arguments + for (var jj = 0; jj < expr.arguments.length; jj++) { + evaluatedArgs.push(yield* evaluate(expr.arguments[jj], input, environment)); + } + // apply the procedure + try { + result = yield* apply(proc, evaluatedArgs, input); + } catch (err) { + // add the position field to the error + err.position = expr.position; + // and the function identifier + err.token = expr.procedure.type === "path" ? expr.procedure.steps[0].value : expr.procedure.value; + throw err; + } + return result; +} + +/** + * Apply procedure or function + * @param {Object} proc - Procedure + * @param {Array} args - Arguments + * @param {Object} self - Self + * @returns {*} Result of procedure + */ +export function* apply(proc, args, self) { + var result; + result = yield* applyInner(proc, args, self); + while (isLambda(result) && result.thunk === true) { + // trampoline loop - this gets invoked as a result of tail-call optimization + // the function returned a tail-call thunk + // unpack it, evaluate its arguments, and apply the tail call + var next = yield* evaluate(result.body.procedure, result.input, result.environment); + var evaluatedArgs = []; + for (var ii = 0; ii < result.body.arguments.length; ii++) { + evaluatedArgs.push(yield* evaluate(result.body.arguments[ii], result.input, result.environment)); + } + + result = yield* applyInner(next, evaluatedArgs, self); + } + return result; +} + +/** + * Apply procedure or function + * @param {Object} proc - Procedure + * @param {Array} args - Arguments + * @param {Object} self - Self + * @returns {*} Result of procedure + */ +function* applyInner(proc, args, self) { + var result; + var validatedArgs = args; + if (proc) { + validatedArgs = validateArguments(proc.signature, args, self); + } + if (isLambda(proc)) { + result = yield* applyProcedure(proc, validatedArgs); + } else if (proc && proc._jsonata_function === true) { + result = proc.implementation.apply(self, validatedArgs); + // `proc.implementation` might be a generator function + // and `result` might be a generator - if so, yield + if (isGenerator(result)) { + result = yield* result; + } + } else if (typeof proc === "function") { + result = proc.apply(self, validatedArgs); + /* istanbul ignore next */ + if (isGenerator(result)) { + result = yield* result; + } + } else { + throw { + code: "T1006", + stack: new Error().stack, + }; + } + return result; +} + +/** + * Evaluate lambda against input data + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {{lambda: boolean, input: *, environment: *, arguments: *, body: *}} Evaluated input data + */ +function evaluateLambda(expr, input, environment) { + // make a function (closure) + var procedure = { + _jsonata_lambda: true, + input: input, + environment: environment, + arguments: expr.arguments, + signature: expr.signature, + body: expr.body, + thunk: undefined, + }; + if (expr.thunk === true) { + procedure.thunk = true; + } + return procedure; +} + +/** + * Evaluate partial application + * @param {Object} expr - JSONata expression + * @param {Object} input - Input data to evaluate against + * @param {Object} environment - Environment + * @returns {*} Evaluated input data + */ +function* evaluatePartialApplication(expr, input, environment) { + // partially apply a function + var result; + // evaluate the arguments + var evaluatedArgs = []; + for (var ii = 0; ii < expr.arguments.length; ii++) { + var arg = expr.arguments[ii]; + if (arg.type === "operator" && arg.value === "?") { + evaluatedArgs.push(arg); + } else { + evaluatedArgs.push(yield* evaluate(arg, input, environment)); + } + } + // lookup the procedure + var proc = yield* evaluate(expr.procedure, input, environment); + if ( + typeof proc === "undefined" && + expr.procedure.type === "path" && + environment.lookup(expr.procedure.steps[0].value) + ) { + // help the user out here if they simply forgot the leading $ + throw { + code: "T1007", + stack: new Error().stack, + position: expr.position, + token: expr.procedure.steps[0].value, + }; + } + if (isLambda(proc)) { + result = partialApplyProcedure(proc, evaluatedArgs); + } else if (proc && proc._jsonata_function === true) { + result = partialApplyNativeFunction(proc.implementation, evaluatedArgs); + } else if (typeof proc === "function") { + result = partialApplyNativeFunction(proc, evaluatedArgs); + } else { + throw { + code: "T1008", + stack: new Error().stack, + position: expr.position, + token: expr.procedure.type === "path" ? expr.procedure.steps[0].value : expr.procedure.value, + }; + } + return result; +} + +/** + * Partially apply procedure + * @param {Object} proc - Procedure + * @param {Array} args - Arguments + * @returns {{lambda: boolean, input: *, environment: {bind, lookup}, arguments: Array, body: *}} Result of partially applied procedure + */ +function partialApplyProcedure(proc, args) { + // create a closure, bind the supplied parameters and return a function that takes the remaining (?) parameters + var env = createFrame(proc.environment); + var unboundArgs = []; + proc.arguments.forEach(function(param, index) { + var arg = args[index]; + if (arg && arg.type === "operator" && arg.value === "?") { + unboundArgs.push(param); + } else { + env.bind(param.value, arg); + } + }); + var procedure = { + _jsonata_lambda: true, + input: proc.input, + environment: env, + arguments: unboundArgs, + body: proc.body, + }; + return procedure; +} + +/** + * Partially apply native function + * @param {Function} native - Native function + * @param {Array} args - Arguments + * @returns {{lambda: boolean, input: *, environment: {bind, lookup}, arguments: Array, body: *}} Result of partially applying native function + */ +function partialApplyNativeFunction(native, args) { + // create a lambda function that wraps and invokes the native function + // get the list of declared arguments from the native function + // this has to be picked out from the toString() value + var sigArgs = getNativeFunctionArguments(native); + sigArgs = sigArgs.map(function(sigArg) { + return "$" + sigArg.trim(); + }); + var body = "function(" + sigArgs.join(", ") + "){ _ }"; + + var bodyAST = parser(body); + + /* istanbul ignore else */ + if (bodyAST.type==="lambda") { + // TODO: Check node type... + bodyAST.body = native; + } else { + throw new Error("Expected parsing of partially applied native function to return a 'lambda' node"); + } + + var partial = partialApplyProcedure(bodyAST, args); + return partial; +} + +/** + * Apply native function + * @param {Object} proc - Procedure + * @param {Object} env - Environment + * @returns {*} Result of applying native function + */ +function* applyNativeFunction(proc, env) { + var sigArgs = getNativeFunctionArguments(proc); + // generate the array of arguments for invoking the function - look them up in the environment + var args = sigArgs.map(function(sigArg) { + return env.lookup(sigArg.trim()); + }); + + var result = proc.apply(null, args); + if (isGenerator(result)) { + result = yield* result; + } + return result; +} + +/** + * Get native function arguments + * @param {Function} func - Function + * @returns {*|Array} Native function arguments + */ +function getNativeFunctionArguments(func) { + var signature = func.toString(); + var sigParens = /\(([^)]*)\)/.exec(signature)[1]; // the contents of the parens + var sigArgs = sigParens.split(","); + return sigArgs; +} + +/** + * Validate the arguments against the signature validator (if it exists) + * @param {Function} signature - validator function + * @param {Array} args - function arguments + * @param {*} context - context value + * @returns {Array} - validated arguments + */ +function validateArguments(signature, args, context) { + if (typeof signature === "undefined") { + // nothing to validate + return args; + } + var validatedArgs = signature.validate(args, context); + return validatedArgs; +} + +/** + * Apply procedure + * @param {Object} proc - Procedure + * @param {Array} args - Arguments + * @returns {*} Result of procedure + */ +function* applyProcedure(proc, args) { + var result; + var env = createFrame(proc.environment); + proc.arguments.forEach(function(param, index) { + env.bind(param.value, args[index]); + }); + if (typeof proc.body === "function") { + // this is a lambda that wraps a native function - generated by partially evaluating a native + result = yield* applyNativeFunction(proc.body, env); + } else { + result = yield* evaluate(proc.body, proc.input, env); + } + return result; +} diff --git a/src/functions.ts b/src/functions.ts new file mode 100644 index 00000000..d95721d7 --- /dev/null +++ b/src/functions.ts @@ -0,0 +1,1888 @@ +import { isFunction, isNumeric, createSequence, isLambda, isArrayOfNumbers, isArrayOfStrings, createFrame } from './utils'; +import { defineFunction } from './signatures'; +import { apply, evaluateName } from './evaluate'; + +/** + * Sum function + * @param {Object} args - Arguments + * @returns {number} Total value of arguments + */ +export function functionSum(args) { + // undefined inputs always return undefined + if (typeof args === "undefined") { + return undefined; + } + + var total = 0; + args.forEach(function(num) { + total += num; + }); + return total; +} + +/** + * Count function + * @param {Object} args - Arguments + * @returns {number} Number of elements in the array + */ +export function functionCount(args) { + // undefined inputs always return undefined + if (typeof args === "undefined") { + return 0; + } + + return args.length; +} + +/** + * Max function + * @param {Object} args - Arguments + * @returns {number} Max element in the array + */ +export function functionMax(args) { + // undefined inputs always return undefined + if (typeof args === "undefined" || args.length === 0) { + return undefined; + } + + return Math.max.apply(Math, args); +} + +/** + * Min function + * @param {Object} args - Arguments + * @returns {number} Min element in the array + */ +export function functionMin(args) { + // undefined inputs always return undefined + if (typeof args === "undefined" || args.length === 0) { + return undefined; + } + + return Math.min.apply(Math, args); +} + +/** + * Average function + * @param {Object} args - Arguments + * @returns {number} Average element in the array + */ +export function functionAverage(args) { + // undefined inputs always return undefined + if (typeof args === "undefined" || args.length === 0) { + return undefined; + } + + var total = 0; + args.forEach(function(num) { + total += num; + }); + return total / args.length; +} + +/** + * Stingify arguments + * @param {Object} arg - Arguments + * @returns {String} String from arguments + */ +export function functionString(arg) { + // undefined inputs always return undefined + if (typeof arg === "undefined") { + return undefined; + } + + var str; + + if (typeof arg === "string") { + // already a string + str = arg; + } else if (isFunction(arg)) { + // functions (built-in and lambda convert to empty string + str = ""; + } else if (typeof arg === "number" && !isFinite(arg)) { + throw { + code: "D3001", + value: arg, + stack: new Error().stack, + }; + } else + str = JSON.stringify(arg, function(key, val) { + return typeof val !== "undefined" && val !== null && val.toPrecision && isNumeric(val) + ? Number(val.toPrecision(13)) + : val && isFunction(val) ? "" : val; + }); + return str; +} + +/** + * Create substring based on character number and length + * @param {String} str - String to evaluate + * @param {Integer} start - Character number to start substring + * @param {Integer} [length] - Number of characters in substring + * @returns {string|*} Substring + */ +export function functionSubstring(str, start, length) { + // undefined inputs always return undefined + if (typeof str === "undefined") { + return undefined; + } + + return str.substr(start, length); +} + +/** + * Create substring up until a character + * @param {String} str - String to evaluate + * @param {String} chars - Character to define substring boundary + * @returns {*} Substring + */ +export function functionSubstringBefore(str, chars) { + // undefined inputs always return undefined + if (typeof str === "undefined") { + return undefined; + } + + var pos = str.indexOf(chars); + if (pos > -1) { + return str.substr(0, pos); + } else { + return str; + } +} + +/** + * Create substring after a character + * @param {String} str - String to evaluate + * @param {String} chars - Character to define substring boundary + * @returns {*} Substring + */ +export function functionSubstringAfter(str, chars) { + // undefined inputs always return undefined + if (typeof str === "undefined") { + return undefined; + } + + var pos = str.indexOf(chars); + if (pos > -1) { + return str.substr(pos + chars.length); + } else { + return str; + } +} + +/** + * Lowercase a string + * @param {String} str - String to evaluate + * @returns {string} Lowercase string + */ +export function functionLowercase(str) { + // undefined inputs always return undefined + if (typeof str === "undefined") { + return undefined; + } + + return str.toLowerCase(); +} + +/** + * Uppercase a string + * @param {String} str - String to evaluate + * @returns {string} Uppercase string + */ +export function functionUppercase(str) { + // undefined inputs always return undefined + if (typeof str === "undefined") { + return undefined; + } + + return str.toUpperCase(); +} + +/** + * length of a string + * @param {String} str - string + * @returns {Number} The number of characters in the string + */ +export function functionLength(str) { + // undefined inputs always return undefined + if (typeof str === "undefined") { + return undefined; + } + + return str.length; +} + +/** + * Normalize and trim whitespace within a string + * @param {string} str - string to be trimmed + * @returns {string} - trimmed string + */ +export function functionTrim(str) { + // undefined inputs always return undefined + if (typeof str === "undefined") { + return undefined; + } + + // normalize whitespace + var result = str.replace(/[ \t\n\r]+/gm, " "); + if (result.charAt(0) === " ") { + // strip leading space + result = result.substring(1); + } + if (result.charAt(result.length - 1) === " ") { + // strip trailing space + result = result.substring(0, result.length - 1); + } + return result; +} + +/** + * Pad a string to a minimum width by adding characters to the start or end + * @param {string} str - string to be padded + * @param {number} width - the minimum width; +ve pads to the right, -ve pads to the left + * @param {string} [char] - the pad character(s); defaults to ' ' + * @returns {string} - padded string + */ +export function functionPad(str, width, char) { + // undefined inputs always return undefined + if (typeof str === "undefined") { + return undefined; + } + + if (typeof char === "undefined" || char.length === 0) { + char = " "; + } + + var result; + var padLength = Math.abs(width) - str.length; + if (padLength > 0) { + var padding = new Array(padLength + 1).join(char); + if (char.length > 1) { + padding = padding.substring(0, padLength); + } + if (width > 0) { + result = str + padding; + } else { + result = padding + str; + } + } else { + result = str; + } + return result; +} + +/** + * Tests if the str contains the token + * @param {String} str - string to test + * @param {String} token - substring or regex to find + * @returns {Boolean} - true if str contains token + */ +export function functionContains(str, token) { + // undefined inputs always return undefined + if (typeof str === "undefined") { + return undefined; + } + + var result; + + if (typeof token === "string") { + result = str.indexOf(token) !== -1; + } else { + var matches = token(str); + result = typeof matches !== "undefined"; + } + + return result; +} + +/** + * Match a string with a regex returning an array of object containing details of each match + * @param {String} str - string + * @param {String} regex - the regex applied to the string + * @param {Integer} [limit] - max number of matches to return + * @returns {Array} The array of match objects + */ +export function functionMatch(str, regex, limit) { + // undefined inputs always return undefined + if (typeof str === "undefined") { + return undefined; + } + + // limit, if specified, must be a non-negative number + if (limit < 0) { + throw { + stack: new Error().stack, + value: limit, + code: "D3040", + index: 3, + }; + } + + var result = createSequence(); + + if (typeof limit === "undefined" || limit > 0) { + var count = 0; + var matches = regex(str); + if (typeof matches !== "undefined") { + while (typeof matches !== "undefined" && (typeof limit === "undefined" || count < limit)) { + result.push({ + match: matches.match, + index: matches.start, + groups: matches.groups, + }); + matches = matches.next(); + count++; + } + } + } + + return result; +} + +/** + * Match a string with a regex returning an array of object containing details of each match + * @param {String} str - string + * @param {String} pattern - the substring/regex applied to the string + * @param {String} replacement - text to replace the matched substrings + * @param {Integer} [limit] - max number of matches to return + * @returns {Array} The array of match objects + */ +function* functionReplace(str, pattern, replacement, limit) { + // undefined inputs always return undefined + if (typeof str === "undefined") { + return undefined; + } + + // pattern cannot be an empty string + if (pattern === "") { + throw { + code: "D3010", + stack: new Error().stack, + value: pattern, + index: 2, + }; + } + + // limit, if specified, must be a non-negative number + if (limit < 0) { + throw { + code: "D3011", + stack: new Error().stack, + value: limit, + index: 4, + }; + } + + var replacer; + if (typeof replacement === "string") { + replacer = function(regexMatch) { + var substitute = ""; + // scan forward, copying the replacement text into the substitute string + // and replace any occurrence of $n with the values matched by the regex + var position = 0; + var index = replacement.indexOf("$", position); + while (index !== -1 && position < replacement.length) { + substitute += replacement.substring(position, index); + position = index + 1; + var dollarVal = replacement.charAt(position); + if (dollarVal === "$") { + // literal $ + substitute += "$"; + position++; + } else if (dollarVal === "0") { + substitute += regexMatch.match; + position++; + } else { + var maxDigits; + if (regexMatch.groups.length === 0) { + // no sub-matches; any $ followed by a digit will be replaced by an empty string + maxDigits = 1; + } else { + // max number of digits to parse following the $ + maxDigits = Math.floor(Math.log(regexMatch.groups.length) * Math.LOG10E) + 1; + } + index = parseInt(replacement.substring(position, position + maxDigits), 10); + if (maxDigits > 1 && index > regexMatch.groups.length) { + index = parseInt(replacement.substring(position, position + maxDigits - 1), 10); + } + if (!isNaN(index)) { + if (regexMatch.groups.length > 0) { + var submatch = regexMatch.groups[index - 1]; + if (typeof submatch !== "undefined") { + substitute += submatch; + } + } + position += index.toString().length; + } else { + // not a capture group, treat the $ as literal + substitute += "$"; + } + } + index = replacement.indexOf("$", position); + } + substitute += replacement.substring(position); + return substitute; + }; + } else { + replacer = replacement; + } + + var result = ""; + var position = 0; + + if (typeof limit === "undefined" || limit > 0) { + var count = 0; + if (typeof pattern === "string") { + var index = str.indexOf(pattern, position); + while (index !== -1 && (typeof limit === "undefined" || count < limit)) { + result += str.substring(position, index); + result += replacement; + position = index + pattern.length; + count++; + index = str.indexOf(pattern, position); + } + result += str.substring(position); + } else { + var matches = pattern(str); + if (typeof matches !== "undefined") { + while (typeof matches !== "undefined" && (typeof limit === "undefined" || count < limit)) { + result += str.substring(position, matches.start); + var replacedWith = yield* apply(replacer, [matches], null); + // check replacedWith is a string + if (typeof replacedWith === "string") { + result += replacedWith; + } else { + // not a string - throw error + throw { + code: "D3012", + stack: new Error().stack, + value: replacedWith, + }; + } + position = matches.start + matches.match.length; + count++; + matches = matches.next(); + } + result += str.substring(position); + } else { + result = str; + } + } + } else { + result = str; + } + + return result; +} + +/** + * Base64 encode a string + * @param {String} str - string + * @returns {String} Base 64 encoding of the binary data + */ +export function functionBase64encode(str) { + // undefined inputs always return undefined + if (typeof str === "undefined") { + return undefined; + } + // Use btoa in a browser, or Buffer in Node.js + /* istanbul ignore next */ + if (typeof window !== "undefined") { + return window.btoa(str); + } else { + return new global.Buffer(str, "binary").toString("base64"); + } +} + +/** + * Base64 decode a string + * @param {String} str - string + * @returns {String} Base 64 encoding of the binary data + */ +export function functionBase64decode(str) { + // undefined inputs always return undefined + if (typeof str === "undefined") { + return undefined; + } + // Use btoa in a browser, or Buffer in Node.js + /* istanbul ignore next */ + if (typeof window !== "undefined") { + return window.atob(str); + } else { + return new global.Buffer(str, "base64").toString("binary"); + } +} + +/** + * Split a string into an array of substrings + * @param {String} str - string + * @param {String} separator - the token or regex that splits the string + * @param {Integer} [limit] - max number of substrings + * @returns {Array} The array of string + */ +export function functionSplit(str, separator, limit) { + // undefined inputs always return undefined + if (typeof str === "undefined") { + return undefined; + } + + // limit, if specified, must be a non-negative number + if (limit < 0) { + throw { + code: "D3020", + stack: new Error().stack, + value: limit, + index: 3, + }; + } + + var result = []; + + if (typeof limit === "undefined" || limit > 0) { + if (typeof separator === "string") { + result = str.split(separator, limit); + } else { + var count = 0; + var matches = separator(str); + if (typeof matches !== "undefined") { + var start = 0; + while (typeof matches !== "undefined" && (typeof limit === "undefined" || count < limit)) { + result.push(str.substring(start, matches.start)); + start = matches.end; + matches = matches.next(); + count++; + } + if (typeof limit === "undefined" || count < limit) { + result.push(str.substring(start)); + } + } else { + result.push(str); + } + } + } + + return result; +} + +/** + * Join an array of strings + * @param {Array} strs - array of string + * @param {String} [separator] - the token that splits the string + * @returns {String} The concatenated string + */ +export function functionJoin(strs, separator) { + // undefined inputs always return undefined + if (typeof strs === "undefined") { + return undefined; + } + + // if separator is not specified, default to empty string + if (typeof separator === "undefined") { + separator = ""; + } + + return strs.join(separator); +} + +/** + * Formats a number into a decimal string representation using XPath 3.1 F&O fn:format-number spec + * @param {number} value - number to format + * @param {String} picture - picture string definition + * @param {Object} [options] - override locale defaults + * @returns {String} The formatted string + */ +export function functionFormatNumber(value, picture, options) { + var defaults = { + "decimal-separator": ".", + "grouping-separator": ",", + "exponent-separator": "e", + infinity: "Infinity", + "minus-sign": "-", + NaN: "NaN", + percent: "%", + "per-mille": "\u2030", + "zero-digit": "0", + digit: "#", + "pattern-separator": ";", + }; + + // if `options` is specified, then its entries override defaults + var properties = defaults; + if (typeof options !== "undefined") { + Object.keys(options).forEach(function(key) { + properties[key] = options[key]; + }); + } + + var decimalDigitFamily = []; + var zeroCharCode = properties["zero-digit"].charCodeAt(0); + for (var ii = zeroCharCode; ii < zeroCharCode + 10; ii++) { + decimalDigitFamily.push(String.fromCharCode(ii)); + } + + var activeChars = decimalDigitFamily.concat([ + properties["decimal-separator"], + properties["exponent-separator"], + properties["grouping-separator"], + properties.digit, + properties["pattern-separator"], + ]); + + var subPictures = picture.split(properties["pattern-separator"]); + + if (subPictures.length > 2) { + throw { + code: "D3080", + stack: new Error().stack, + }; + } + + var splitParts = function(subpicture) { + var prefix = (function() { + var ch; + for (var ii = 0; ii < subpicture.length; ii++) { + ch = subpicture.charAt(ii); + if (activeChars.indexOf(ch) !== -1 && ch !== properties["exponent-separator"]) { + return subpicture.substring(0, ii); + } + } + })(); + var suffix = (function() { + var ch; + for (var ii = subpicture.length - 1; ii >= 0; ii--) { + ch = subpicture.charAt(ii); + if (activeChars.indexOf(ch) !== -1 && ch !== properties["exponent-separator"]) { + return subpicture.substring(ii + 1); + } + } + })(); + var activePart = subpicture.substring(prefix.length, subpicture.length - suffix.length); + var mantissaPart, exponentPart, integerPart, fractionalPart; + var exponentPosition = subpicture.indexOf(properties["exponent-separator"], prefix.length); + if (exponentPosition === -1 || exponentPosition > subpicture.length - suffix.length) { + mantissaPart = activePart; + exponentPart = undefined; + } else { + mantissaPart = activePart.substring(0, exponentPosition); + exponentPart = activePart.substring(exponentPosition + 1); + } + var decimalPosition = mantissaPart.indexOf(properties["decimal-separator"]); + if (decimalPosition === -1) { + integerPart = mantissaPart; + fractionalPart = suffix; + } else { + integerPart = mantissaPart.substring(0, decimalPosition); + fractionalPart = mantissaPart.substring(decimalPosition + 1); + } + return { + prefix: prefix, + suffix: suffix, + activePart: activePart, + mantissaPart: mantissaPart, + exponentPart: exponentPart, + integerPart: integerPart, + fractionalPart: fractionalPart, + subpicture: subpicture, + }; + }; + + // validate the picture string, F&O 4.7.3 + var validate = function(parts) { + var error; + var ii; + var subpicture = parts.subpicture; + var decimalPos = subpicture.indexOf(properties["decimal-separator"]); + if (decimalPos !== subpicture.lastIndexOf(properties["decimal-separator"])) { + error = "D3081"; + } + if (subpicture.indexOf(properties.percent) !== subpicture.lastIndexOf(properties.percent)) { + error = "D3082"; + } + if (subpicture.indexOf(properties["per-mille"]) !== subpicture.lastIndexOf(properties["per-mille"])) { + error = "D3083"; + } + if (subpicture.indexOf(properties.percent) !== -1 && subpicture.indexOf(properties["per-mille"]) !== -1) { + error = "D3084"; + } + var valid = false; + for (ii = 0; ii < parts.mantissaPart.length; ii++) { + var ch = parts.mantissaPart.charAt(ii); + if (decimalDigitFamily.indexOf(ch) !== -1 || ch === properties.digit) { + valid = true; + break; + } + } + if (!valid) { + error = "D3085"; + } + var charTypes = parts.activePart + .split("") + .map(function(char) { + return activeChars.indexOf(char) === -1 ? "p" : "a"; + }) + .join(""); + if (charTypes.indexOf("p") !== -1) { + error = "D3086"; + } + if (decimalPos !== -1) { + if ( + subpicture.charAt(decimalPos - 1) === properties["grouping-separator"] || + subpicture.charAt(decimalPos + 1) === properties["grouping-separator"] + ) { + error = "D3087"; + } + } else if (parts.integerPart.charAt(parts.integerPart.length - 1) === properties["grouping-separator"]) { + error = "D3088"; + } + if (subpicture.indexOf(properties["grouping-separator"] + properties["grouping-separator"]) !== -1) { + error = "D3089"; + } + var optionalDigitPos = parts.integerPart.indexOf(properties.digit); + if ( + optionalDigitPos !== -1 && + parts.integerPart + .substring(0, optionalDigitPos) + .split("") + .filter(function(char) { + return decimalDigitFamily.indexOf(char) > -1; + }).length > 0 + ) { + error = "D3090"; + } + optionalDigitPos = parts.fractionalPart.lastIndexOf(properties.digit); + if ( + optionalDigitPos !== -1 && + parts.fractionalPart + .substring(optionalDigitPos) + .split("") + .filter(function(char) { + return decimalDigitFamily.indexOf(char) > -1; + }).length > 0 + ) { + error = "D3091"; + } + var exponentExists = typeof parts.exponentPart === "string"; + if ( + exponentExists && + parts.exponentPart.length > 0 && + (subpicture.indexOf(properties.percent) !== -1 || subpicture.indexOf(properties["per-mille"]) !== -1) + ) { + error = "D3092"; + } + if ( + exponentExists && + (parts.exponentPart.length === 0 || + parts.exponentPart.split("").filter(function(char) { + return decimalDigitFamily.indexOf(char) === -1; + }).length > 0) + ) { + error = "D3093"; + } + if (error) { + throw { + code: error, + stack: new Error().stack, + }; + } + }; + + // analyse the picture string, F&O 4.7.4 + var analyse = function(parts) { + var getGroupingPositions = function(part, toLeft?) { + var positions = []; + var groupingPosition = part.indexOf(properties["grouping-separator"]); + while (groupingPosition !== -1) { + var charsToTheRight = (toLeft ? part.substring(0, groupingPosition) : part.substring(groupingPosition)) + .split("") + .filter(function(char) { + return decimalDigitFamily.indexOf(char) !== -1 || char === properties.digit; + }).length; + positions.push(charsToTheRight); + groupingPosition = parts.integerPart.indexOf(properties["grouping-separator"], groupingPosition + 1); + } + return positions; + }; + var integerPartGroupingPositions = getGroupingPositions(parts.integerPart); + var regular = function(indexes) { + // are the grouping positions regular? i.e. same interval between each of them + if (indexes.length === 0) { + return 0; + } + var gcd = function(a, b) { + return b === 0 ? a : gcd(b, a % b); + }; + // find the greatest common divisor of all the positions + var factor = indexes.reduce(gcd); + // is every position separated by this divisor? If so, it's regular + for (var index = 1; index <= indexes.length; index++) { + if (indexes.indexOf(index * factor) === -1) { + return 0; + } + } + return factor; + }; + + var regularGrouping = regular(integerPartGroupingPositions); + var fractionalPartGroupingPositions = getGroupingPositions(parts.fractionalPart, true); + + var minimumIntegerPartSize = parts.integerPart.split("").filter(function(char) { + return decimalDigitFamily.indexOf(char) !== -1; + }).length; + var scalingFactor = minimumIntegerPartSize; + + var fractionalPartArray = parts.fractionalPart.split(""); + var minimumFactionalPartSize = fractionalPartArray.filter(function(char) { + return decimalDigitFamily.indexOf(char) !== -1; + }).length; + var maximumFactionalPartSize = fractionalPartArray.filter(function(char) { + return decimalDigitFamily.indexOf(char) !== -1 || char === properties.digit; + }).length; + var exponentPresent = typeof parts.exponentPart === "string"; + if (minimumIntegerPartSize === 0 && maximumFactionalPartSize === 0) { + if (exponentPresent) { + minimumFactionalPartSize = 1; + maximumFactionalPartSize = 1; + } else { + minimumIntegerPartSize = 1; + } + } + if (exponentPresent && minimumIntegerPartSize === 0 && parts.integerPart.indexOf(properties.digit) !== -1) { + minimumIntegerPartSize = 1; + } + if (minimumIntegerPartSize === 0 && minimumFactionalPartSize === 0) { + minimumFactionalPartSize = 1; + } + var minimumExponentSize = 0; + if (exponentPresent) { + minimumExponentSize = parts.exponentPart.split("").filter(function(char) { + return decimalDigitFamily.indexOf(char) !== -1; + }).length; + } + + return { + integerPartGroupingPositions: integerPartGroupingPositions, + regularGrouping: regularGrouping, + minimumIntegerPartSize: minimumIntegerPartSize, + scalingFactor: scalingFactor, + prefix: parts.prefix, + fractionalPartGroupingPositions: fractionalPartGroupingPositions, + minimumFactionalPartSize: minimumFactionalPartSize, + maximumFactionalPartSize: maximumFactionalPartSize, + minimumExponentSize: minimumExponentSize, + suffix: parts.suffix, + picture: parts.subpicture, + }; + }; + + var parts = subPictures.map(splitParts); + parts.forEach(validate); + + var variables = parts.map(analyse); + + if (variables.length === 1) { + variables.push(JSON.parse(JSON.stringify(variables[0]))); + variables[1].prefix = properties["minus-sign"] + variables[1].prefix; + } + + // TODO cache the result of the analysis + + // format the number + // bullet 1: TODO: NaN - not sure we'd ever get this in JSON + var pic; + // bullet 2: + if (value >= 0) { + pic = variables[0]; + } else { + pic = variables[1]; + } + var adjustedNumber; + // bullet 3: + if (pic.picture.indexOf(properties.percent) !== -1) { + adjustedNumber = value * 100; + } else if (pic.picture.indexOf(properties["per-mille"]) !== -1) { + adjustedNumber = value * 1000; + } else { + adjustedNumber = value; + } + // bullet 4: + // TODO: infinity - not sure we'd ever get this in JSON + // bullet 5: + var mantissa, exponent; + if (pic.minimumExponentSize === 0) { + mantissa = adjustedNumber; + } else { + // mantissa * 10^exponent = adjustedNumber + var maxMantissa = Math.pow(10, pic.scalingFactor); + var minMantissa = Math.pow(10, pic.scalingFactor - 1); + mantissa = adjustedNumber; + exponent = 0; + while (mantissa < minMantissa) { + mantissa *= 10; + exponent -= 1; + } + while (mantissa > maxMantissa) { + mantissa /= 10; + exponent += 1; + } + } + // bullet 6: + var roundedNumber = functionRound(mantissa, pic.maximumFactionalPartSize); + // bullet 7: + var makeString = function(value, dp) { + var str = Math.abs(value).toFixed(dp); + if (properties["zero-digit"] !== "0") { + str = str + .split("") + .map(function(digit) { + if (digit >= "0" && digit <= "9") { + return decimalDigitFamily[digit.charCodeAt(0) - 48]; + } else { + return digit; + } + }) + .join(""); + } + return str; + }; + var stringValue = makeString(roundedNumber, pic.maximumFactionalPartSize); + var decimalPos = stringValue.indexOf("."); + if (decimalPos === -1) { + stringValue = stringValue + properties["decimal-separator"]; + } else { + stringValue = stringValue.replace(".", properties["decimal-separator"]); + } + while (stringValue.charAt(0) === properties["zero-digit"]) { + stringValue = stringValue.substring(1); + } + while (stringValue.charAt(stringValue.length - 1) === properties["zero-digit"]) { + stringValue = stringValue.substring(0, stringValue.length - 1); + } + // bullets 8 & 9: + decimalPos = stringValue.indexOf(properties["decimal-separator"]); + var padLeft = pic.minimumIntegerPartSize - decimalPos; + var padRight = pic.minimumFactionalPartSize - (stringValue.length - decimalPos - 1); + stringValue = (padLeft > 0 ? new Array(padLeft + 1).join("0") : "") + stringValue; + stringValue = stringValue + (padRight > 0 ? new Array(padRight + 1).join("0") : ""); + decimalPos = stringValue.indexOf(properties["decimal-separator"]); + // bullet 10: + if (pic.regularGrouping > 0) { + var groupCount = Math.floor((decimalPos - 1) / pic.regularGrouping); + for (var group = 1; group <= groupCount; group++) { + stringValue = [ + stringValue.slice(0, decimalPos - group * pic.regularGrouping), + properties["grouping-separator"], + stringValue.slice(decimalPos - group * pic.regularGrouping), + ].join(""); + } + } else { + pic.integerPartGroupingPositions.forEach(function(pos) { + stringValue = [ + stringValue.slice(0, decimalPos - pos), + properties["grouping-separator"], + stringValue.slice(decimalPos - pos), + ].join(""); + decimalPos++; + }); + } + // bullet 11: + decimalPos = stringValue.indexOf(properties["decimal-separator"]); + pic.fractionalPartGroupingPositions.forEach(function(pos) { + stringValue = [ + stringValue.slice(0, pos + decimalPos + 1), + properties["grouping-separator"], + stringValue.slice(pos + decimalPos + 1), + ].join(""); + }); + // bullet 12: + decimalPos = stringValue.indexOf(properties["decimal-separator"]); + if (pic.picture.indexOf(properties["decimal-separator"]) === -1 || decimalPos === stringValue.length - 1) { + stringValue = stringValue.substring(0, stringValue.length - 1); + } + // bullet 13: + if (typeof exponent !== "undefined") { + var stringExponent = makeString(exponent, 0); + padLeft = pic.minimumExponentSize - stringExponent.length; + if (padLeft > 0) { + stringExponent = new Array(padLeft + 1).join("0") + stringExponent; + } + stringValue = + stringValue + + properties["exponent-separator"] + + (exponent < 0 ? properties["minus-sign"] : "") + + stringExponent; + } + // bullet 14: + stringValue = pic.prefix + stringValue + pic.suffix; + return stringValue; +} + +/** + * Converts a number to a string using a specified number base + * @param {string} value - the number to convert + * @param {number} [radix] - the number base; must be between 2 and 36. Defaults to 10 + * @returns {string} - the converted string + */ +export function functionFormatBase(value, radix) { + // undefined inputs always return undefined + if (typeof value === "undefined") { + return undefined; + } + + value = functionRound(value); + + if (typeof radix === "undefined") { + radix = 10; + } else { + radix = functionRound(radix); + } + + if (radix < 2 || radix > 36) { + throw { + code: "D3100", + stack: new Error().stack, + value: radix, + }; + } + + var result = value.toString(radix); + + return result; +} + +/** + * Cast argument to number + * @param {Object} arg - Argument + * @returns {Number} numeric value of argument + */ +export function functionNumber(arg) { + var result; + + // undefined inputs always return undefined + if (typeof arg === "undefined") { + return undefined; + } + + if (typeof arg === "number") { + // already a number + result = arg; + } else if ( + typeof arg === "string" && + /^-?(0|([1-9][0-9]*))(\.[0-9]+)?([Ee][-+]?[0-9]+)?$/.test(arg) && + !isNaN(parseFloat(arg)) && + isFinite(parseFloat(arg)) + ) { + result = parseFloat(arg); + } else { + throw { + code: "D3030", + value: arg, + stack: new Error().stack, + index: 1, + }; + } + return result; +} + +/** + * Absolute value of a number + * @param {Number} arg - Argument + * @returns {Number} absolute value of argument + */ +export function functionAbs(arg) { + var result; + + // undefined inputs always return undefined + if (typeof arg === "undefined") { + return undefined; + } + + result = Math.abs(arg); + return result; +} + +/** + * Rounds a number down to integer + * @param {Number} arg - Argument + * @returns {Number} rounded integer + */ +export function functionFloor(arg) { + var result; + + // undefined inputs always return undefined + if (typeof arg === "undefined") { + return undefined; + } + + result = Math.floor(arg); + return result; +} + +/** + * Rounds a number up to integer + * @param {Number} arg - Argument + * @returns {Number} rounded integer + */ +export function functionCeil(arg) { + var result; + + // undefined inputs always return undefined + if (typeof arg === "undefined") { + return undefined; + } + + result = Math.ceil(arg); + return result; +} + +/** + * Round to half even + * @param {Number} arg - Argument + * @param {Number} precision - number of decimal places + * @returns {Number} rounded integer + */ +export function functionRound(arg, precision?) { + var result; + + // undefined inputs always return undefined + if (typeof arg === "undefined") { + return undefined; + } + + if (precision) { + // shift the decimal place - this needs to be done in a string since multiplying + // by a power of ten can introduce floating point precision errors which mess up + // this rounding algorithm - See 'Decimal rounding' in + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round + // Shift + var value = arg.toString().split("e"); + arg = +(value[0] + "e" + (value[1] ? +value[1] + precision : precision)); + } + + // round up to nearest int + result = Math.round(arg); + var diff = result - arg; + if (Math.abs(diff) === 0.5 && Math.abs(result % 2) === 1) { + // rounded the wrong way - adjust to nearest even number + result = result - 1; + } + if (precision) { + // Shift back + value = result.toString().split("e"); + /* istanbul ignore next */ + result = +(value[0] + "e" + (value[1] ? +value[1] - precision : -precision)); + } + if (Object.is(result, -0)) { + // ESLint rule 'no-compare-neg-zero' suggests this way + // JSON doesn't do -0 + result = 0; + } + return result; +} + +/** + * Square root of number + * @param {Number} arg - Argument + * @returns {Number} square root + */ +export function functionSqrt(arg) { + var result; + + // undefined inputs always return undefined + if (typeof arg === "undefined") { + return undefined; + } + + if (arg < 0) { + throw { + stack: new Error().stack, + code: "D3060", + index: 1, + value: arg, + }; + } + + result = Math.sqrt(arg); + + return result; +} + +/** + * Raises number to the power of the second number + * @param {Number} arg - the base + * @param {Number} exp - the exponent + * @returns {Number} rounded integer + */ +export function functionPower(arg, exp) { + var result; + + // undefined inputs always return undefined + if (typeof arg === "undefined") { + return undefined; + } + + result = Math.pow(arg, exp); + + if (!isFinite(result)) { + throw { + stack: new Error().stack, + code: "D3061", + index: 1, + value: arg, + exp: exp, + }; + } + + return result; +} + +/** + * Returns a random number 0 <= n < 1 + * @returns {number} random number + */ +export function functionRandom() { + return Math.random(); +} + +/** + * Evaluate an input and return a boolean + * @param {*} arg - Arguments + * @returns {boolean} Boolean + */ +export function functionBoolean(arg) { + // cast arg to its effective boolean value + // boolean: unchanged + // string: zero-length -> false; otherwise -> true + // number: 0 -> false; otherwise -> true + // null -> false + // array: empty -> false; length > 1 -> true + // object: empty -> false; non-empty -> true + // function -> false + + // undefined inputs always return undefined + if (typeof arg === "undefined") { + return undefined; + } + + var result = false; + if (Array.isArray(arg)) { + if (arg.length === 1) { + result = functionBoolean(arg[0]); + } else if (arg.length > 1) { + var trues = arg.filter(function(val) { + return functionBoolean(val); + }); + result = trues.length > 0; + } + } else if (typeof arg === "string") { + if (arg.length > 0) { + result = true; + } + } else if (isNumeric(arg)) { + if (arg !== 0) { + result = true; + } + } else if (arg !== null && typeof arg === "object") { + if (Object.keys(arg).length > 0) { + // make sure it's not a lambda function + if (!(isLambda(arg) || arg._jsonata_function)) { + result = true; + } + } + } else if (typeof arg === "boolean" && arg === true) { + result = true; + } + return result; +} + +/** + * returns the Boolean NOT of the arg + * @param {*} arg - argument + * @returns {boolean} - NOT arg + */ +export function functionNot(arg) { + return !functionBoolean(arg); +} + +/** + * Create a map from an array of arguments + * @param {Array} [arr] - array to map over + * @param {Function} func - function to apply + * @returns {Array} Map array + */ +function* functionMap(arr, func) { + // undefined inputs always return undefined + if (typeof arr === "undefined") { + return undefined; + } + + var result = createSequence(); + // do the map - iterate over the arrays, and invoke func + for (var i = 0; i < arr.length; i++) { + var func_args = [arr[i]]; // the first arg (value) is required + // the other two are optional - only supply it if the function can take it + var length = + typeof func === "function" + ? func.length + : func._jsonata_function === true ? func.implementation.length : func.arguments.length; + if (length >= 2) { + func_args.push(i); + } + if (length >= 3) { + func_args.push(arr); + } + // invoke func + var res = yield* apply(func, func_args, null); + if (typeof res !== "undefined") { + result.push(res); + } + } + + return result; +} + +// This generator function does not have a yield(), presumably to make it +// consistent with other similar functions. +/** + * Create a map from an array of arguments + * @param {Array} [arr] - array to filter + * @param {Function} func - predicate function + * @returns {Array} Map array + */ +function* functionFilter(arr, func) { + // eslint-disable-line require-yield + // undefined inputs always return undefined + if (typeof arr === "undefined") { + return undefined; + } + + var result = createSequence(); + + var predicate = function(value, index, array) { + var it = apply(func, [value, index, array], null); + // returns a generator - so iterate over it + var res = it.next(); + while (!res.done) { + res = it.next(res.value); + } + return res.value; + }; + + for (var i = 0; i < arr.length; i++) { + var entry = arr[i]; + if (functionBoolean(predicate(entry, i, arr))) { + result.push(entry); + } + } + + return result; +} + +/** + * Convolves (zips) each value from a set of arrays + * @param {Array} [args] - arrays to zip + * @returns {Array} Zipped array + */ +export function functionZip() { + // this can take a variable number of arguments + var result = []; + var args = Array.prototype.slice.call(arguments); + // length of the shortest array + var length = Math.min.apply( + Math, + args.map(function(arg) { + if (Array.isArray(arg)) { + return arg.length; + } + return 0; + }), + ); + for (var i = 0; i < length; i++) { + var tuple = args.map(arg => { + return arg[i]; + }); + result.push(tuple); + } + return result; +} + +/** + * Fold left function + * @param {Array} sequence - Sequence + * @param {Function} func - Function + * @param {Object} init - Initial value + * @returns {*} Result + */ +function* functionFoldLeft(sequence, func, init) { + // undefined inputs always return undefined + if (typeof sequence === "undefined") { + return undefined; + } + + var result; + + if ( + !( + func.length === 2 || + (func._jsonata_function === true && func.implementation.length === 2) || + func.arguments.length === 2 + ) + ) { + throw { + stack: new Error().stack, + code: "D3050", + index: 1, + }; + } + + var index; + if (typeof init === "undefined" && sequence.length > 0) { + result = sequence[0]; + index = 1; + } else { + result = init; + index = 0; + } + + while (index < sequence.length) { + result = yield* apply(func, [result, sequence[index]], null); + index++; + } + + return result; +} + +/** + * Return keys for an object + * @param {Object} arg - Object + * @returns {Array} Array of keys + */ +export function functionKeys(arg) { + var result = createSequence(); + + if (Array.isArray(arg)) { + // merge the keys of all of the items in the array + var merge = {}; + arg.forEach(function(item) { + var keys = functionKeys(item); + if (Array.isArray(keys)) { + keys.forEach(function(key) { + merge[key] = true; + }); + } + }); + result = functionKeys(merge); + } else if (arg !== null && typeof arg === "object" && !isLambda(arg)) { + result = Object.keys(arg); + if (result.length === 0) { + result = undefined; + } + } else { + result = undefined; + } + return result; +} + +/** + * Return value from an object for a given key + * @param {Object} object - Object + * @param {String} key - Key in object + * @returns {*} Value of key in object + */ +export function functionLookup(object, key) { + var result = evaluateName({ value: key }, object, {}); + return result; +} + +/** + * Append second argument to first + * @param {Array|Object} arg1 - First argument + * @param {Array|Object} arg2 - Second argument + * @returns {*} Appended arguments + */ +export function functionAppend(arg1, arg2) { + // disregard undefined args + if (typeof arg1 === "undefined") { + return arg2; + } + if (typeof arg2 === "undefined") { + return arg1; + } + // if either argument is not an array, make it so + if (!Array.isArray(arg1)) { + arg1 = createSequence(arg1); + } + if (!Array.isArray(arg2)) { + arg2 = [arg2]; + } + Array.prototype.push.apply(arg1, arg2); + return arg1; +} + +/** + * Determines if the argument is undefined + * @param {*} arg - argument + * @returns {boolean} False if argument undefined, otherwise true + */ +export function functionExists(arg) { + if (typeof arg === "undefined") { + return false; + } else { + return true; + } +} + +/** + * Splits an object into an array of object with one property each + * @param {*} arg - the object to split + * @returns {*} - the array + */ +export function functionSpread(arg) { + var result = createSequence(); + + if (Array.isArray(arg)) { + // spread all of the items in the array + arg.forEach(function(item) { + result = functionAppend(result, functionSpread(item)); + }); + } else if (arg !== null && typeof arg === "object" && !isLambda(arg)) { + for (var key in arg) { + var obj = {}; + obj[key] = arg[key]; + result.push(obj); + } + } else { + result = arg; + } + return result; +} + +/** + * Merges an array of objects into a single object. Duplicate properties are + * overridden by entries later in the array + * @param {*} arg - the objects to merge + * @returns {*} - the object + */ +export function functionMerge(arg) { + // undefined inputs always return undefined + if (typeof arg === "undefined") { + return undefined; + } + + var result = {}; + + arg.forEach(function(obj) { + for (var prop in obj) { + result[prop] = obj[prop]; + } + }); + return result; +} + +/** + * Reverses the order of items in an array + * @param {Array} arr - the array to reverse + * @returns {Array} - the reversed array + */ +export function functionReverse(arr) { + // undefined inputs always return undefined + if (typeof arr === "undefined") { + return undefined; + } + + if (arr.length <= 1) { + return arr; + } + + var length = arr.length; + var result = new Array(length); + for (var i = 0; i < length; i++) { + result[length - i - 1] = arr[i]; + } + + return result; +} + +/** + * + * @param {*} obj - the input object to iterate over + * @param {*} func - the function to apply to each key/value pair + * @returns {Array} - the resultant array + */ +function* functionEach(obj, func) { + var result = createSequence(); + + for (var key in obj) { + var func_args = [obj[key], key]; + // invoke func + result.push(yield* apply(func, func_args, null)); + } + + return result; +} + +/** + * Implements the merge sort (stable) with optional comparator function + * + * @param {Array} arr - the array to sort + * @param {*} comparator - comparator function + * @returns {Array} - sorted array + */ +export function functionSort(arr, comparator) { + // undefined inputs always return undefined + if (typeof arr === "undefined") { + return undefined; + } + + if (arr.length <= 1) { + return arr; + } + + var comp; + if (typeof comparator === "undefined") { + // inject a default comparator - only works for numeric or string arrays + if (!isArrayOfNumbers(arr) && !isArrayOfStrings(arr)) { + throw { + stack: new Error().stack, + code: "D3070", + index: 1, + }; + } + + comp = function(a, b) { + return a > b; + }; + } else if (typeof comparator === "function") { + // for internal usage of functionSort (i.e. order-by syntax) + comp = comparator; + } else { + comp = function(a, b) { + var it = apply(comparator, [a, b], null); + // returns a generator - so iterate over it + var comp = it.next(); + while (!comp.done) { + comp = it.next(comp.value); + } + return comp.value; + }; + } + + var merge = function(l, r) { + var merge_iter = function(result, left, right) { + if (left.length === 0) { + Array.prototype.push.apply(result, right); + } else if (right.length === 0) { + Array.prototype.push.apply(result, left); + } else if (comp(left[0], right[0])) { + // invoke the comparator function + // if it returns true - swap left and right + result.push(right[0]); + merge_iter(result, left, right.slice(1)); + } else { + // otherwise keep the same order + result.push(left[0]); + merge_iter(result, left.slice(1), right); + } + }; + var merged = []; + merge_iter(merged, l, r); + return merged; + }; + + var sort = function(array) { + if (array.length <= 1) { + return array; + } else { + var middle = Math.floor(array.length / 2); + var left = array.slice(0, middle); + var right = array.slice(middle); + left = sort(left); + right = sort(right); + return merge(left, right); + } + }; + + var result = sort(arr); + + return result; +} + +/** + * Randomly shuffles the contents of an array + * @param {Array} arr - the input array + * @returns {Array} the shuffled array + */ +export function functionShuffle(arr) { + // undefined inputs always return undefined + if (typeof arr === "undefined") { + return undefined; + } + + if (arr.length <= 1) { + return arr; + } + + // shuffle using the 'inside-out' variant of the Fisher-Yates algorithm + var result = new Array(arr.length); + for (var i = 0; i < arr.length; i++) { + var j = Math.floor(Math.random() * (i + 1)); // random integer such that 0 ≤ j ≤ i + if (i !== j) { + result[i] = result[j]; + } + result[j] = arr[i]; + } + + return result; +} + +/** + * Applies a predicate function to each key/value pair in an object, and returns an object containing + * only the key/value pairs that passed the predicate + * + * @param {object} arg - the object to be sifted + * @param {object} func - the predicate function (lambda or native) + * @returns {object} - sifted object + */ +export function functionSift(arg, func) { + var result = {}; + + var predicate = function(value, key, object) { + var it = apply(func, [value, key, object], null); + // returns a generator - so iterate over it + var res = it.next(); + while (!res.done) { + res = it.next(res.value); + } + return res.value; + }; + + for (var item in arg) { + var entry = arg[item]; + if (functionBoolean(predicate(entry, item, arg))) { + result[item] = entry; + } + } + + // empty objects should be changed to undefined + if (Object.keys(result).length === 0) { + result = undefined; + } + + return result; +} + +// Regular expression to match an ISO 8601 formatted timestamp +var iso8601regex = new RegExp("^\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)$"); + +/** + * Converts an ISO 8601 timestamp to milliseconds since the epoch + * + * @param {string} timestamp - the ISO 8601 timestamp to be converted + * @returns {Number} - milliseconds since the epoch + */ +export function functionToMillis(timestamp) { + // undefined inputs always return undefined + if (typeof timestamp === "undefined") { + return undefined; + } + + if (!iso8601regex.test(timestamp)) { + throw { + stack: new Error().stack, + code: "D3110", + value: timestamp, + }; + } + + return Date.parse(timestamp); +} + +/** + * Converts milliseconds since the epoch to an ISO 8601 timestamp + * @param {Number} millis - milliseconds since the epoch to be converted + * @returns {String} - an ISO 8601 formatted timestamp + */ +export function functionFromMillis(millis) { + // undefined inputs always return undefined + if (typeof millis === "undefined") { + return undefined; + } + + return new Date(millis).toISOString(); +} + +/** + * Clones an object + * @param {Object} arg - object to clone (deep copy) + * @returns {*} - the cloned object + */ +export function functionClone(arg) { + // undefined inputs always return undefined + if (typeof arg === "undefined") { + return undefined; + } + + return JSON.parse(functionString(arg)); +} + +export function createStandardFrame() { + const staticFrame = createFrame(null); + bindStandardFunctions(staticFrame); + return staticFrame; +} + +export function bindStandardFunctions(frame) { + // Function registration + frame.bind('sum', defineFunction(functionSum, ':n>')); + frame.bind('count', defineFunction(functionCount, '')); + frame.bind('max', defineFunction(functionMax, ':n>')); + frame.bind('min', defineFunction(functionMin, ':n>')); + frame.bind('average', defineFunction(functionAverage, ':n>')); + frame.bind('string', defineFunction(functionString, '')); + frame.bind('substring', defineFunction(functionSubstring, '')); + frame.bind('substringBefore', defineFunction(functionSubstringBefore, '')); + frame.bind('substringAfter', defineFunction(functionSubstringAfter, '')); + frame.bind('lowercase', defineFunction(functionLowercase, '')); + frame.bind('uppercase', defineFunction(functionUppercase, '')); + frame.bind('length', defineFunction(functionLength, '')); + frame.bind('trim', defineFunction(functionTrim, '')); + frame.bind('pad', defineFunction(functionPad, '')); + frame.bind('match', defineFunction(functionMatch, 'n?:a>')); + frame.bind('contains', defineFunction(functionContains, '')); // TODO ):b> + frame.bind('replace', defineFunction(functionReplace, '')); // TODO )(sf)n?:s> + frame.bind('split', defineFunction(functionSplit, '>')); // TODO )n?:a> + frame.bind('join', defineFunction(functionJoin, 's?:s>')); + frame.bind('formatNumber', defineFunction(functionFormatNumber, '')); + frame.bind('formatBase', defineFunction(functionFormatBase, '')); + frame.bind('number', defineFunction(functionNumber, '<(ns)-:n>')); + frame.bind('floor', defineFunction(functionFloor, '')); + frame.bind('ceil', defineFunction(functionCeil, '')); + frame.bind('round', defineFunction(functionRound, '')); + frame.bind('abs', defineFunction(functionAbs, '')); + frame.bind('sqrt', defineFunction(functionSqrt, '')); + frame.bind('power', defineFunction(functionPower, '')); + frame.bind('random', defineFunction(functionRandom, '<:n>')); + frame.bind('boolean', defineFunction(functionBoolean, '')); + frame.bind('not', defineFunction(functionNot, '')); + frame.bind('map', defineFunction(functionMap, '')); + frame.bind('zip', defineFunction(functionZip, '')); + frame.bind('filter', defineFunction(functionFilter, '')); + frame.bind('reduce', defineFunction(functionFoldLeft, '')); // TODO aj?:j> + frame.bind('sift', defineFunction(functionSift, '')); + frame.bind('keys', defineFunction(functionKeys, '>')); + frame.bind('lookup', defineFunction(functionLookup, '')); + frame.bind('append', defineFunction(functionAppend, '')); + frame.bind('exists', defineFunction(functionExists, '')); + frame.bind('spread', defineFunction(functionSpread, '>')); + frame.bind('merge', defineFunction(functionMerge, ':o>')); + frame.bind('reverse', defineFunction(functionReverse, '')); + frame.bind('each', defineFunction(functionEach, '')); + frame.bind('sort', defineFunction(functionSort, '')); + frame.bind('shuffle', defineFunction(functionShuffle, '')); + frame.bind('base64encode', defineFunction(functionBase64encode, '')); + frame.bind('base64decode', defineFunction(functionBase64decode, '')); + frame.bind('toMillis', defineFunction(functionToMillis, '')); + frame.bind('fromMillis', defineFunction(functionFromMillis, '')); + frame.bind('clone', defineFunction(functionClone, '<(oa)-:o>')); + + +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 00000000..462918a2 --- /dev/null +++ b/src/index.ts @@ -0,0 +1 @@ +export { jsonata } from './jsonata'; \ No newline at end of file diff --git a/src/jsonata.ts b/src/jsonata.ts new file mode 100644 index 00000000..d8210f86 --- /dev/null +++ b/src/jsonata.ts @@ -0,0 +1,135 @@ +import { parser } from './parser'; +import { lookupMessage, createFrame } from './utils'; +import { evaluate } from './evaluate'; +import { defineFunction } from './signatures'; +import { createStandardFrame } from './functions'; +import { ASTNode } from './ast'; + +export interface Options { + recover: boolean; +} + +export type Callback = (err: Error, result: any) => void; + +export interface Expression { + evaluate: (input?: any, bindings?: { [name: string]: any }, callback?: Callback) => any; + assign: (key: string, value: any) => void; + registerFunction: (name: string, implementation: Function, signature?: string) => void; + ast: () => AST; + errors: () => string[]; +} + +export type AST = any; + +/** + * JSONata + * @param {Object} expr - JSONata expression + * @param {boolean} options - recover: attempt to recover on parse error + * @returns {{evaluate: evaluate, assign: assign}} Evaluated expression + */ +export function jsonata(expr: string, options?: Partial): Expression { + let ast: undefined | ASTNode = undefined; + let errors: string[] = []; + try { + ast = parser(expr, errors, options && options.recover); + } catch (err) { + // insert error message into structure + err.message = lookupMessage(err); + throw err; + } + + const staticFrame = createStandardFrame(); + var environment = createFrame(staticFrame); + + var timestamp = new Date(); // will be overridden on each call to evalute() + environment.bind( + "now", + defineFunction(function() { + return timestamp.toJSON(); + }, "<:s>"), + ); + environment.bind( + "millis", + defineFunction(function() { + return timestamp.getTime(); + }, "<:n>"), + ); + + return { + evaluate: function(input, bindings, callback) { + // throw if the expression compiled with syntax errors + if (typeof errors !== "undefined" && errors.length>0) { + var err: any = { + code: "S0500", + position: 0, + }; + err.message = lookupMessage(err); + throw err; + } + + if (typeof bindings !== "undefined") { + var exec_env; + // the variable bindings have been passed in - create a frame to hold these + exec_env = createFrame(environment); + for (var v in bindings) { + exec_env.bind(v, bindings[v]); + } + } else { + exec_env = environment; + } + // put the input document into the environment as the root object + exec_env.bind("$", input); + + // capture the timestamp and put it in the execution environment + // the $now() and $millis() functions will return this value - whenever it is called + timestamp = new Date(); + + var result, it; + // if a callback function is supplied, then drive the generator in a promise chain + if (typeof callback === "function") { + exec_env.bind("__jsonata_async", true); + var thenHandler = function(response) { + result = it.next(response); + if (result.done) { + callback(null, result.value); + } else { + result.value.then(thenHandler).catch(function(err) { + err.message = lookupMessage(err); + callback(err, null); + }); + } + }; + it = evaluate(ast, input, exec_env); + result = it.next(); + result.value.then(thenHandler); + } else { + // no callback function - drive the generator to completion synchronously + try { + it = evaluate(ast, input, exec_env); + result = it.next(); + while (!result.done) { + result = it.next(result.value); + } + return result.value; + } catch (err) { + // insert error message into structure + err.message = lookupMessage(err); + throw err; + } + } + }, + assign: function(name, value) { + environment.bind(name, value); + }, + registerFunction: function(name, implementation, signature) { + var func = defineFunction(implementation, signature); + environment.bind(name, func); + }, + ast: function() { + return ast; + }, + errors: function() { + return errors; + }, + }; +} diff --git a/src/parser/index.ts b/src/parser/index.ts new file mode 100644 index 00000000..4b92480f --- /dev/null +++ b/src/parser/index.ts @@ -0,0 +1 @@ +export { parser } from './parser'; \ No newline at end of file diff --git a/src/parser/leds.ts b/src/parser/leds.ts new file mode 100644 index 00000000..8cd94880 --- /dev/null +++ b/src/parser/leds.ts @@ -0,0 +1,209 @@ +import { LED, ParserState } from "./types"; +import { parseSignature } from "../signatures"; +import * as ast from "../ast"; +import { operators } from "../constants"; + +export const infixDefaultLED = (bindingPower: number): LED => { + return (state: ParserState, left: ast.ASTNode): ast.BinaryNode => { + let initialToken = state.previousToken; + let rhs = state.expression(bindingPower); + return { + value: initialToken.value, + position: initialToken.position, + type: "binary", + lhs: left, + rhs: rhs, + }; + }; +}; + +export const functionLED: LED = ( + state: ParserState, + left: ast.ASTNode, +): ast.FunctionInvocationNode | ast.LambdaDefinitionNode => { + // left is is what we are trying to invoke + let type: "function" | "partial" = "function"; + let args = []; + let initialToken = state.previousToken; + if (state.symbol.id !== ")") { + for (;;) { + if (state.token.type === "operator" && state.symbol.id === "?") { + // partial function application + type = "partial"; + args.push({ + type: "operator", + position: state.token.position, + value: state.token.value, + }); + state.advance("?"); + } else { + args.push(state.expression(0)); + } + if (state.symbol.id !== ",") break; + state.advance(","); + } + } + state.advance(")", true); + + // if the name of the function is 'function' or λ, then this is function definition (lambda function) + let isLambda = left.type === "name" && (left.value === "function" || left.value === "\u03BB"); + + if (!isLambda) { + let alt: ast.FunctionInvocationNode = { + position: initialToken.position, + value: initialToken.value, + type: type, + arguments: args, + procedure: left, + }; + return alt; + } + // all of the args must be VARIABLE tokens + args.forEach((arg, index) => { + if (arg.type !== "variable") { + return state.handleError({ + code: "S0208", + stack: new Error().stack, + position: arg.position, + token: arg.value, + value: index + 1, + }); + } + }); + // is the next token a '<' - if so, parse the function signature + let signature = undefined; + if (state.symbol.id === "<") { + var sigPos = state.token.position; + var depth = 1; + var sig = "<"; + let id = state.symbol.id; + // TODO: Bug in typescript compiler?...doesn't recognize side effects in advance and impact on node value + while (depth > 0 && id !== "{" && id !== "(end)") { + state.advance(); + id = state.symbol.id; + if (id === ">") { + depth--; + } else if (id === "<") { + depth++; + } + sig += state.token.value; + } + state.advance(">"); + try { + signature = parseSignature(sig); + } catch (err) { + // insert the position into this error + err.position = sigPos + err.offset; + // TODO: If recover is true, we need to force the return of an + // error node here. In the tests, recover is never set so this + // always throws. + state.handleError(err); + /* istanbul ignore next */ + throw err; + } + } + // parse the function body + state.advance("{"); + let body = state.expression(0); + state.advance("}"); + return { + value: initialToken.value, + position: initialToken.position, + type: "lambda", + body: body, + signature: signature, + arguments: args, + thunk: false, + }; +}; + +export const filterLED: LED = (state: ParserState, left: ast.ASTNode): ast.ASTNode | ast.BinaryNode => { + let initialToken = state.previousToken; + + // If the next symbol is a "]", then this is an empty predicate. + if (state.symbol.id === "]") { + state.advance("]"); + return { + type: "singleton", + value: left.value, + position: left.position, + next: { ...left }, + } + } else { + let rhs = state.expression(operators["]"]); + state.advance("]", true); + let ret: ast.BinaryNode = { + value: initialToken.value, + position: initialToken.position, + type: "binary", + lhs: left, + rhs: rhs, + }; + return ret; + } +}; + +export const orderByLED: LED = (state: ParserState, left: ast.ASTNode): ast.SortNode => { + let initialToken = state.previousToken; + state.advance("("); + var terms: ast.SortTerm[] = []; + for (;;) { + let descending = false; + if (state.symbol.id === "<") { + // ascending sort + descending = false; + state.advance("<"); + } else if (state.symbol.id === ">") { + // descending sort + descending = true; + state.advance(">"); + } else { + descending = false; + //unspecified - default to ascending + } + let term: ast.SortTerm = { + descending: descending, + expression: state.expression(0), + }; + terms.push(term); + if (state.symbol.id !== ",") { + break; + } + state.advance(","); + } + state.advance(")"); + return { + position: initialToken.position, // REQUIRED?!? + value: initialToken.value, + type: "sort", + lhs: left, + rhs: terms, + }; +}; + +export const objectParserLED: LED = (state: ParserState, left: ast.ASTNode): ast.BinaryObjectNode => { + var a = []; + let initialToken = state.previousToken; + /* istanbul ignore else */ + if (state.symbol.id !== "}") { + for (;;) { + var n = state.expression(0); + state.advance(":"); + var v = state.expression(0); + a.push([n, v]); // holds an array of name/value expression pairs + if (state.symbol.id !== ",") { + break; + } + state.advance(","); + } + } + state.advance("}", true); + // LED - binary infix form + return { + value: "{", + position: initialToken.position, + type: "binary", + lhs: left, + rhs: a, + }; +}; diff --git a/src/parser/nuds.ts b/src/parser/nuds.ts new file mode 100644 index 00000000..0d4c9438 --- /dev/null +++ b/src/parser/nuds.ts @@ -0,0 +1,203 @@ +import { NUD, ParserState } from "./types"; +import { Token } from "../tokenizer"; +import * as ast from "../ast"; + +export const defaultNUD = (recover: boolean, errors: string[], remainingTokens: () => Token[]): NUD => { + return (state: ParserState): ast.ErrorNode => { + // error - symbol has been invoked as a unary operator + var err: any = { + code: "S0211", + // TODO: impacts parser-recovery.js (expects previous token) + token: state.previousToken.value, + position: state.previousToken.position, + }; + + if (recover) { + err.remaining = remainingTokens(); + err.type = "error"; + errors.push(err); + return err; + } else { + err.stack = new Error().stack; + throw err; + } + }; +}; + +export const prefixDefaultNUD = (bindingPower: number): NUD => { + return (state: ParserState): ast.UnaryNode => { + let initialToken = state.previousToken; + let expr = state.expression(bindingPower); + return { + value: initialToken.value, + position: initialToken.position, + type: "unary", + expression: expr, + }; + }; +}; + +export const terminalNUD: NUD = (state: ParserState): ast.TerminalNode => { + let token = state.previousToken; + switch (token.type) { + case "variable": + return { + type: "variable", + value: token.value, + position: token.position, + }; + case "name": + return { + type: "name", + value: token.value, + position: token.position, + }; + case "literal": + return { + type: "literal", + value: token.value, + position: token.position, + }; + case "regex": + return { + type: "regex", + value: token.value, + position: token.position, + }; + case "operator": + return { + type: "operator", + value: token.value, + position: token.position, + }; + default: + /* istanbul ignore next */ + if (state.symbol.id !== "(end)") { + throw new Error("Unexpected terminal: " + JSON.stringify(self)); + } + return { + type: "end", + value: "(end)", + position: token.position, + }; + } +}; + +export const wildcardNUD = (state: ParserState): ast.WildcardNode => { + return { + value: state.previousToken.value, + position: state.previousToken.position, + type: "wildcard", + }; +}; + +export const descendantNUD = (state: ParserState): ast.DescendantNode => { + return { + value: state.previousToken.value, + position: state.previousToken.position, + type: "descendant", + }; +}; + +export const blockNUD = (state: ParserState): ast.BlockNode => { + var expressions = []; + while (state.symbol.id !== ")") { + expressions.push(state.expression(0)); + if (state.symbol.id !== ";") { + break; + } + state.advance(";"); + } + state.advance(")", true); + return { + value: state.token.value, + position: state.token.position, + type: "block", + expressions: expressions, + }; +}; + +export const arrayNUD = (state: ParserState): ast.UnaryNode => { + var a = []; + let initialToken = state.previousToken; + if (state.symbol.id !== "]") { + for (;;) { + var item = state.expression(0); + if (state.symbol.id === "..") { + let position = state.token.position; + let lhs = item; + // range operator + state.advance(".."); + let rhs = state.expression(0); + var range: ast.BinaryNode = { + type: "binary", + value: "..", + position: position, + lhs: lhs, + rhs: rhs, + }; + item = range; + } + a.push(item); + if (state.symbol.id !== ",") { + break; + } + state.advance(","); + } + } + state.advance("]", true); + return { + value: initialToken.value, + position: initialToken.position, + type: "unary", + expressions: a, + consarray: false, + }; +}; + +export const objectParserNUD: NUD = (state: ParserState): ast.UnaryNode => { + var a = []; + let initialToken = state.previousToken; + /* istanbul ignore else */ + if (state.symbol.id !== "}") { + for (;;) { + var n = state.expression(0); + state.advance(":"); + var v = state.expression(0); + a.push([n, v]); // holds an array of name/value expression pairs + if (state.symbol.id !== ",") { + break; + } + state.advance(","); + } + } + state.advance("}", true); + // NUD - unary prefix form + return { + value: initialToken.value, + position: initialToken.position, + type: "unary", + lhs: a, // TODO: use expression + }; +}; + +export const transformerNUD = (state: ParserState): ast.TransformNode => { + let initialToken = state.previousToken; + let expr = state.expression(0); + state.advance("|"); + let update = state.expression(0); + let del = undefined; + if (state.symbol.id === ",") { + state.advance(","); + del = state.expression(0); + } + state.advance("|"); + return { + value: initialToken.value, + position: initialToken.position, + type: "transform", + pattern: expr, + update: update, + delete: del, + }; +}; diff --git a/src/parser/optimize.ts b/src/parser/optimize.ts new file mode 100644 index 00000000..3d89e726 --- /dev/null +++ b/src/parser/optimize.ts @@ -0,0 +1,365 @@ +import { isNumeric } from "../utils"; +import { tail_call_optimize } from "./tail_call"; +import { ErrorCollector } from "./types"; +import * as ast from "../ast"; + +// post-parse stage +// the purpose of this is flatten the parts of the AST representing location paths, +// converting them to arrays of steps which in turn may contain arrays of predicates. +// following this, nodes containing '.' and '[' should be eliminated from the AST. +export function ast_optimize(expr: ast.ASTNode, collect: undefined | ErrorCollector): ast.ASTNode { + switch (expr.type) { + case "binary": { + switch (expr.value) { + case ".": + let lstep = ast_optimize(expr.lhs, collect); + let steps: ast.ASTNode[] = []; + let keepSA: boolean = false; + if (lstep.type === "path") { + steps = lstep.steps; + if (lstep.keepSingletonArray) keepSA = true; + } else { + steps = [lstep]; + } + let rest = ast_optimize(expr.rhs, collect); + let last = steps[steps.length - 1]; + + if ( + rest.type === "function" && + rest.procedure.type === "path" && + rest.procedure.steps.length === 1 && + rest.procedure.steps[0].type === "name" && + last.type === "function" + ) { + // next function in chain of functions - will override a thenable + last.nextFunction = rest.procedure.steps[0].value; + } + + if (rest.type === "path") { + steps = [...steps, ...rest.steps]; + } else { + steps = [...steps, rest]; + } + // any steps within a path that are literals, should be changed to 'name' + steps.filter(step => step.type === "literal").forEach(lit => { + lit.type = "name"; + }); + + /* istanbul ignore else */ + if (steps.length > 0) { + // If I understand the previous comments, if the first "step" is a + // unary node with a value of "[", that indicates it is a path constructor. + // However, if the last step is also a unary node with a value of "[", that makes + // it an array constructor. In either case, our goal here is to set the + // consarray field to be true for either of these if they are unary nodes with + // value of "[" + + // if first step is a path constructor, flag it for special handling + markAsArray(steps[0]); // Check for PATH! + // if last step is an array constructor, flag ti for special handling + markAsArray(steps[steps.length - 1]); + } + + return { + type: "path", + position: expr.position, + value: expr.value, + steps: steps, + keepSingletonArray: keepSA, + }; + case "[": { + // predicated step + // LHS is a step or a predicated step + // RHS is the predicate expr + let node = ast_optimize(expr.lhs, collect); + var step = node; + if (node.type === "path") { + step = node.steps[node.steps.length - 1]; + } + if (typeof step.group !== "undefined") { + throw { + code: "S0209", + stack: new Error().stack, + position: expr.position, + }; + } + // If no predicates are associated with this step, initialize the + // array to be empty. + if (typeof step.predicate === "undefined") { + step.predicate = []; + } + // Add the current RHS to the list of predicates for this step. + // Multiple predicates can accumulate (i.e., step.predicate may + // have already had elements in it before getting here). + step.predicate.push(ast_optimize(expr.rhs, collect)); + return node; + } + case "{": { + // group-by + // LHS is a step or a predicated step + // RHS is the object constructor expr + let node = ast_optimize(expr.lhs, collect); + if (typeof node.group !== "undefined") { + throw { + code: "S0210", + stack: new Error().stack, + position: expr.position, + }; + } + // object constructor - process each pair + node.group = { + lhs: expr.rhs.map(pair => { + return [ast_optimize(pair[0], collect), ast_optimize(pair[1], collect)]; + }), + position: expr.position, + }; + return node; + } + case ":=": { + let lhs = ast_optimize(expr.lhs, collect); + let rhs = ast_optimize(expr.rhs, collect); + return { + type: "bind", + value: expr.value, + position: expr.position, + lhs: lhs, + rhs: rhs, + }; + } + case "~>": { + let lhs = ast_optimize(expr.lhs, collect); + let rhs = ast_optimize(expr.rhs, collect); + return { + type: "apply", + value: expr.value, + position: expr.position, + lhs: lhs, + rhs: rhs, + }; + } + default: + return { + ...expr, + lhs: ast_optimize(expr.lhs, collect), + rhs: ast_optimize(expr.rhs, collect), + }; + } + } + case "sort": + return { + type: "sort", + value: expr.value, + position: expr.position, + lhs: ast_optimize(expr.lhs, collect), + rhs: expr.rhs.map(term => ({ ...term, expression: ast_optimize(term.expression, collect) })), + }; + case "unary": + switch (expr.value) { + case "[": { + let expressions = expr.expressions.map(item => ast_optimize(item, collect)); + return { + ...expr, + expressions: expressions, + }; + } + case "{": { + let lhs = expr.lhs.map(pair => { + return [ast_optimize(pair[0], collect), ast_optimize(pair[1], collect)]; + }); + return { + ...expr, + lhs: lhs, + }; + } + default: { + // all other unary expressions - just process the expression + let expression = ast_optimize(expr.expression, collect); + // if unary minus on a number, then pre-process + if (expr.value === "-" && expression.type === "literal" && isNumeric(expression.value)) { + return { + ...expression, + value: -expression.value, + }; + } + return { + ...expr, + expression: expression, + }; + } + } + case "function": + case "partial": { + let args = expr.arguments.map(arg => { + return ast_optimize(arg, collect); + }); + let procedure = ast_optimize(expr.procedure, collect); + return { + ...expr, + arguments: args, + procedure: procedure, + }; + } + case "lambda": { + let body = ast_optimize(expr.body, collect); + body = tail_call_optimize(body); + // All arguments to a lambda should be variables so running + // ast_optimize should be a NO-OP. But I run it anyway just in case + // those semantics change some day. This keeps things consistent + // and doesn't impact the results. + let args = expr.arguments.map(arg => ast_optimize(arg, collect)); + return { + ...expr, + body: body, + arguments: args, + }; + } + case "condition": { + let condition = ast_optimize(expr.condition, collect); + let then = ast_optimize(expr.then, collect); + let otherwise: undefined | ast.ASTNode = undefined; + if (typeof expr.else !== "undefined") { + otherwise = ast_optimize(expr.else, collect); + } + return { + type: "condition", + position: expr.position, + value: expr.value, + condition: condition, + then: then, + else: otherwise, + }; + } + case "transform": { + let pattern = ast_optimize(expr.pattern, collect); + let update = ast_optimize(expr.update, collect); + let del: undefined | ast.ASTNode = undefined; + if (typeof expr.delete !== "undefined") { + del = ast_optimize(expr.delete, collect); + } + return { + type: "transform", + position: expr.position, + value: expr.value, + pattern: pattern, + update: update, + delete: del, + }; + } + case "block": + // TODO scan the array of expressions to see if any of them assign variables + // if so, need to mark the block as one that needs to create a new frame + let expressions = expr.expressions.map(item => { + return ast_optimize(item, collect); + }); + return { + type: "block", + value: expr.value, + position: expr.position, + expressions: expressions, + }; + case "name": + return { + type: "path", + value: expr.value, + position: expr.position, + keepSingletonArray: false, + steps: [expr], + }; + case "literal": + case "wildcard": + case "descendant": + case "variable": + case "regex": + return expr; + case "singleton": { + // Optimize the AST node wrapped by this singleton decorator + let opt = ast_optimize(expr.next, collect); + + // No matter which branch we take, we replace the singleton with + // a path node with the keepSingleArray flag set. + if (opt.type==="path") { + // If this is a path, then we can simply set the keepSingleArray + // fields on it. + return { + ...opt, + keepSingletonArray: true, + } + } else { + // If this isn't a path, create a length 1 path and mark it as preserving + // singleton arrays. + return { + type: "path", + value: opt.value, + position: opt.position, + steps: [opt], + keepSingletonArray: true, + } + } + } + case "operator": + // the tokens 'and' and 'or' might have been used as a name rather than an operator + if (expr.value === "and" || expr.value === "or" || expr.value === "in") { + return ast_optimize({ ...expr, type: "name" }, collect); + } else { + /* istanbul ignore else */ + if (expr.value === "?") { + // partial application + return { ...expr }; + } else { + throw { + code: "S0201", + stack: new Error().stack, + position: expr.position, + token: expr.value, + }; + } + } + case "error": + if (expr.lhs) { + return ast_optimize(expr.lhs, collect); + } + return expr; + default: + var code = "S0206"; + /* istanbul ignore else */ + if (expr.type == "end") { + code = "S0207"; + } + var err: ast.ErrorFields = { + code: code, + position: expr.position, + token: expr.value, + }; + if (collect) { + collect(err); + return { + type: "error", + error: err, + lhs: expr, + remaining: [], + value: expr.value, + position: expr.position, + }; + } else { + err.stack = new Error().stack; + throw err; + } + } +} + +/** + * This checks a node to see if it is an array constructor. If so, + * it marks it with the `consarray` field which is used to indicate the + * node should not be flattened. (?) + * + * @param node The node to check + */ +function markAsArray(node: ast.ASTNode) { + if (node.type === "unary") { + let unary = node; + if (unary.value === "[") { + let array = unary; + array.consarray = true; + } + } +} diff --git a/src/parser/parser.ts b/src/parser/parser.ts new file mode 100644 index 00000000..580c1c24 --- /dev/null +++ b/src/parser/parser.ts @@ -0,0 +1,189 @@ +import { tokenizer, Tokenizer, Token } from "../tokenizer"; +import { ast_optimize } from "./optimize"; +import { createTable } from "./symbols"; +import * as ast from "../ast"; + +import { Symbol, ParserState, SymbolTable } from "./types"; + +/** + * The parser was made into a class primarily so it was easier to track the state of + * the parser. In version 1.x, the shared state was represented by variables inside + * a closure, but this way it is a bit easier to see the shared state and a bit easier + * to implement the supporting functions (as methods). + */ +class Parser implements ParserState { + // These are used to satisfy the ParserState interface + symbol: Symbol = undefined; + previousToken: Token = undefined; + token: Token = undefined; + error: any = undefined; + + // This is public state information used after parse is called + errors: string[] = []; + + // These are protected elements used by the Parser, but not available to the + // NUD and LED handlers + protected lexer: Tokenizer; + protected symbol_table: SymbolTable; + + constructor(protected source: string, protected recover?: boolean) { + // now invoke the tokenizer and the parser and return the syntax tree + this.lexer = tokenizer(source); + this.symbol_table = createTable(recover, this.errors, () => this.remainingTokens()); + } + parse(): ast.ASTNode { + this.advance(); + // parse the tokens + var expr = this.expression(0); + if (this.symbol.id !== "(end)") { + var err = { + code: "S0201", + position: this.token.position, + token: this.token.value, + }; + this.handleError(err); + } + + // Decide if we want to collect errors and recover, or just throw an error + let collect = this.recover ? err => this.errors.push(err) : undefined; + expr = ast_optimize(expr, collect); + + return expr; + } + + private remainingTokens(): Token[] { + var remaining: Token[] = []; + if (this.symbol.id !== "(end)") { + remaining.push(this.token); + } + var nxt: Token = this.lexer(undefined); + while (nxt !== null) { + remaining.push(nxt); + nxt = this.lexer(undefined); + } + return remaining; + } + + handleError(err: any): void { + if (this.recover) { + // tokenize the rest of the buffer and add it to an error token + err.remaining = this.remainingTokens(); + this.errors.push(err); + var symbol = this.symbol_table["(error)"]; + this.symbol = Object.create(symbol); + this.previousToken = this.token; + this.token = { + type: "(error)", + value: null, + position: this.token.position, + }; + this.error = err; + } else { + err.stack = new Error().stack; + throw err; + } + } + + advance(id?: string, infix?: boolean) { + if (id && this.symbol.id !== id) { + var code; + if (this.symbol.id === "(end)") { + // unexpected end of buffer + code = "S0203"; + } else { + code = "S0202"; + } + var err = { + code: code, + position: this.token.position, + token: this.token.value, + value: id, + }; + return this.handleError(err); + } + var next_token: Token = this.lexer(infix); + if (next_token === null) { + let symbol = this.symbol_table["(end)"]; + this.symbol = Object.create(symbol); + this.previousToken = this.token; + this.token = { + type: "(end)", + value: symbol.value, + position: this.source.length, + }; + this.error = undefined; + return; + } + var value = next_token.value; + var type = next_token.type; + var symbol; + switch (type) { + case "name": + case "variable": + symbol = this.symbol_table["(name)"]; + break; + case "operator": + symbol = this.symbol_table[value]; + if (!symbol) { + return this.handleError({ + code: "S0204", + stack: new Error().stack, + position: next_token.position, + token: value, + }); + } + break; + case "string": + case "number": + case "value": + type = "literal"; + symbol = this.symbol_table["(literal)"]; + break; + case "regex": + type = "regex"; + symbol = this.symbol_table["(regex)"]; + break; + /* istanbul ignore next */ + default: + return this.handleError({ + code: "S0205", + stack: new Error().stack, + position: next_token.position, + token: value, + }); + } + + this.symbol = Object.create(symbol); + this.previousToken = this.token; + this.token = { + value: value, + type: type, + position: next_token.position, + }; + this.error = undefined; + return; + } + + expression(rbp: number): ast.ASTNode { + let symbol = this.symbol; + this.advance(null, true); + var left: ast.ASTNode = symbol.nud(this); + while (rbp < this.symbol.lbp) { + symbol = this.symbol; + this.advance(); + left = symbol.led(this, left); + } + return left; + } +} + +// This parser implements the 'Top down operator precedence' algorithm developed by Vaughan R Pratt; http://dl.acm.org/citation.cfm?id=512931. +// and builds on the Javascript framework described by Douglas Crockford at http://javascript.crockford.com/tdop/tdop.html +// and in 'Beautiful Code', edited by Andy Oram and Greg Wilson, Copyright 2007 O'Reilly Media, Inc. 798-0-596-51004-6 +export function parser(source: string, errors: string[], recover?: boolean): ast.ASTNode { + let p = new Parser(source, recover); + let ast = p.parse(); + p.errors.forEach((err) => errors.push(err)); + return ast; +} + diff --git a/src/parser/symbols.ts b/src/parser/symbols.ts new file mode 100644 index 00000000..763104c4 --- /dev/null +++ b/src/parser/symbols.ts @@ -0,0 +1,167 @@ +import { operators } from "../constants"; +import { Symbol, LED, NUD, ParserState, SymbolTable } from "./types"; +import { Token } from "../tokenizer"; +import * as nuds from "./nuds"; +import * as leds from "./leds"; +import * as ast from "../ast"; + +export function createTable(recover: boolean, errors: string[], remainingTokens: () => Token[]): SymbolTable { + let symbol_table: { [id: string]: Symbol } = {}; + + var getSymbol = (id, bp: number): Symbol => { + bp = bp || 0; + if (symbol_table.hasOwnProperty(id)) { + let s = symbol_table[id]; + // TODO: Should this ever happen?!? Aren't we overwriting something?!? + if (bp >= s.lbp) { + s.lbp = bp; + } + return s; + } else { + let s: Symbol = { + id: id, + lbp: bp, + value: id, + nud: nuds.defaultNUD(recover, errors, remainingTokens), + }; + symbol_table[id] = s; + return s; + } + }; + + // A terminal could be a 'literal', 'variable', 'name' + var terminal = id => { + var s = getSymbol(id, 0); + s.nud = nuds.terminalNUD; + }; + + // match infix operators + // + // left associative + // TODO: Add default values for bp and led + var infix = (id: string, bp?: number, led?: LED) => { + var bindingPower = bp || operators[id]; + var s = getSymbol(id, bindingPower); + let defaultLED: LED = leds.infixDefaultLED(bindingPower); + s.led = led || defaultLED; + return s; + }; + + // match infix operators + // + // right associative + // TODO: Add default values for bp and led + var infixr = (id, bp?, led?: LED) => { + var bindingPower = bp || operators[id]; + var s = getSymbol(id, bindingPower); + let defaultLED: LED = leds.infixDefaultLED(bindingPower - 1); // subtract 1 from bindingPower for right associative operators + s.led = led || defaultLED; + return s; + }; + + // match prefix operators + // + var prefix = (id, nud?: NUD) => { + var s = getSymbol(id, 0); + let defaultNUD: NUD = nuds.prefixDefaultNUD(70); + s.nud = nud || defaultNUD; + return s; + }; + + terminal("(end)"); + terminal("(name)"); + terminal("(literal)"); + terminal("(regex)"); + getSymbol(":", 0); + getSymbol(";", 0); + getSymbol(",", 0); + getSymbol(")", 0); + getSymbol("]", 0); + getSymbol("}", 0); + getSymbol("..", 0); // range operator + infix("."); // field reference + infix("+"); // numeric addition + infix("-"); // numeric subtraction + infix("*"); // numeric multiplication + infix("/"); // numeric division + infix("%"); // numeric modulus + infix("="); // equality + infix("<"); // less than + infix(">"); // greater than + infix("!="); // not equal to + infix("<="); // less than or equal + infix(">="); // greater than or equal + infix("&"); // string concatenation + infix("and"); // Boolean AND + infix("or"); // Boolean OR + infix("in"); // is member of array + terminal("and"); // the 'keywords' can also be used as terminals (field names) + terminal("or"); // + terminal("in"); // + infixr(":="); // bind variable + prefix("-"); // unary numeric negation + infix("~>"); // function application + + infixr("(error)", 10, (state: ParserState, left: ast.ASTNode): ast.ErrorNode => { + return { + value: state.token.value, + position: state.token.position, + lhs: left, + error: state.error, + remaining: remainingTokens(), + type: "error", + }; + }); + + // field wildcard (single level) + prefix("*", nuds.wildcardNUD); + + // descendant wildcard (multi-level) + prefix("**", nuds.descendantNUD); + + // function invocation + infix("(", operators["("], leds.functionLED); + + // parenthesis - block expression + prefix("(", nuds.blockNUD); + + // array constructor + prefix("[", nuds.arrayNUD); + + // filter - predicate or array index + infix("[", operators["["], leds.filterLED); + + // order-by + infix("^", operators["^"], leds.orderByLED); + + // object constructor + prefix("{", nuds.objectParserNUD); + + // object grouping + infix("{", operators["{"], leds.objectParserLED); + + // if/then/else ternary operator ?: + infix("?", operators["?"], (state: ParserState, left): ast.TernaryNode => { + let initialToken = state.previousToken; + let then = state.expression(0); + let otherwise = undefined; + if (state.symbol.id === ":") { + // else condition + state.advance(":"); + otherwise = state.expression(0); + } + return { + value: initialToken.value, + position: initialToken.position, + type: "condition", + condition: left, + then: then, + else: otherwise, + }; + }); + + // object transformer + prefix("|", nuds.transformerNUD); + + return symbol_table; +} diff --git a/src/parser/tail_call.ts b/src/parser/tail_call.ts new file mode 100644 index 00000000..6611890a --- /dev/null +++ b/src/parser/tail_call.ts @@ -0,0 +1,45 @@ +import * as ast from '../ast'; +import { parseSignature } from "../signatures"; + +// tail call optimization +// this is invoked by the post parser to analyse lambda functions to see +// if they make a tail call. If so, it is replaced by a thunk which will +// be invoked by the trampoline loop during function application. +// This enables tail-recursive functions to be written without growing the stack +export function tail_call_optimize(expr: ast.ASTNode): ast.ASTNode { + switch(expr.type) { + case "function": { + return { + type: "lambda", + value: expr.value, + position: expr.position, + body: expr, + // Not in v1.5, but ensures that signature isn't undefined + signature: parseSignature(""), + thunk: true, + arguments: [], + }; + } + case "condition": { + let then = tail_call_optimize(expr.then); + let otherwise: undefined | ast.ASTNode = undefined; + if (typeof expr.else!=="undefined") { + otherwise = tail_call_optimize(expr.else); + } + return { + ...expr, + then: then, + else: otherwise, + } + } + case "block": { + let expressions = expr.expressions.map((e, i) => i==expr.expressions.length-1 ? tail_call_optimize(e) : e); + return { + ...expr, + expressions: expressions, + } + } + default: + return { ...expr }; + } +} diff --git a/src/parser/types.ts b/src/parser/types.ts new file mode 100644 index 00000000..47f5477c --- /dev/null +++ b/src/parser/types.ts @@ -0,0 +1,27 @@ +import * as ast from "../ast"; +import { Token } from "../tokenizer"; +export type NUD = (state: ParserState) => ast.ASTNode; +export type LED = (state: ParserState, left: ast.ASTNode) => ast.ASTNode; + +export interface Symbol { + id: string; + lbp: number; + nud: NUD; + led?: LED; + position?: number; + value: any; +} + +export interface ParserState { + readonly symbol: Symbol; + readonly previousToken: Token; + readonly token: Token; + readonly error: any; + advance: (id?: string, infix?: boolean) => void; + expression: (rbp: number) => ast.ASTNode; + handleError: (err) => void; +} + +export type SymbolTable = { [id: string]: Symbol }; + +export type ErrorCollector = (err: any) => void; \ No newline at end of file diff --git a/src/signatures.ts b/src/signatures.ts new file mode 100644 index 00000000..4312d185 --- /dev/null +++ b/src/signatures.ts @@ -0,0 +1,341 @@ +import { isFunction } from './utils'; + +export interface Signature { + definition: string; + validate: (args: any, context: any) => any[]; +} + +export interface Parameter { + regex: string; + type: string; + array: boolean; + context?: boolean; + contextRegex?: RegExp; + subtype?: string; +} + +/** + * Parses a function signature definition and returns a validation function + * @param {string} signature - the signature between the + * @returns {Function} validation function + */ +export function parseSignature(signature: string): Signature { + // create a Regex that represents this signature and return a function that when invoked, + // returns the validated (possibly fixed-up) arguments, or throws a validation error + // step through the signature, one symbol at a time + var position = 1; + var params: Parameter[] = []; + var prevParam: undefined | Parameter = undefined; + while (position < signature.length) { + var symbol = signature.charAt(position); + if (symbol === ":") { + // TODO figure out what to do with the return type + // ignore it for now + break; + } + + var next = function(param: Parameter) { + params.push(param); + prevParam = param; + }; + + var findClosingBracket = function(str, start, openSymbol, closeSymbol) { + // returns the position of the closing symbol (e.g. bracket) in a string + // that balances the opening symbol at position start + var depth = 1; + var position = start; + while (position < str.length) { + position++; + symbol = str.charAt(position); + if (symbol === closeSymbol) { + depth--; + if (depth === 0) { + // we're done + break; // out of while loop + } + } else if (symbol === openSymbol) { + depth++; + } + } + return position; + }; + + switch (symbol) { + case "s": // string + case "n": // number + case "b": // boolean + case "l": // not so sure about expecting null? + case "o": // object + next({ + regex: "[" + symbol + "m]", + type: symbol, + array: false, + }); + break; + case "a": // array + // normally treat any value as singleton array + next({ + regex: "[asnblfom]", + type: symbol, + array: true, + }); + break; + case "f": // function + next({ + regex: "f", + type: symbol, + array: false, + }); + break; + case "j": // any JSON type + next({ + regex: "[asnblom]", + type: symbol, + array: false, + }); + break; + case "x": // any type + next({ + regex: "[asnblfom]", + type: symbol, + array: false, + }); + break; + case "-": // use context if param not supplied + prevParam.context = true; + prevParam.contextRegex = new RegExp(prevParam.regex); // pre-compiled to test the context type at runtime + prevParam.regex += "?"; + break; + case "?": // optional param + case "+": // one or more + prevParam.regex += symbol; + break; + case "(": // choice of types + // search forward for matching ')' + var endParen = findClosingBracket(signature, position, "(", ")"); + var choice = signature.substring(position + 1, endParen); + if (choice.indexOf("<") !==-1) { + // TODO harder + throw { + code: "S0402", + stack: new Error().stack, + value: choice, + offset: position, + }; + } + position = endParen; + next({ + regex: "[" + choice + "m]", + type: "(" + choice + ")", + array: false, + }); + break; + case "<": // type parameter - can only be applied to 'a' and 'f' + if (prevParam.type === "a" || prevParam.type === "f") { + // search forward for matching '>' + var endPos = findClosingBracket(signature, position, "<", ">"); + prevParam.subtype = signature.substring(position + 1, endPos); + position = endPos; + } else { + throw { + code: "S0401", + stack: new Error().stack, + value: prevParam.type, + offset: position, + }; + } + break; + } + position++; + } + var regexStr = + "^" + + params + .map(function(param) { + return "(" + param.regex + ")"; + }) + .join("") + + "$"; + var regex = new RegExp(regexStr); + var getSymbol = function(value) { + var symbol; + if (isFunction(value)) { + symbol = "f"; + } else { + var type = typeof value; + switch (type) { + case "string": + symbol = "s"; + break; + case "number": + symbol = "n"; + break; + case "boolean": + symbol = "b"; + break; + case "object": + if (value === null) { + symbol = "l"; + } else if (Array.isArray(value)) { + symbol = "a"; + } else { + symbol = "o"; + } + break; + case "undefined": + default: + // any value can be undefined, but should be allowed to match + symbol = "m"; // m for missing + } + } + return symbol; + }; + + var throwValidationError = function(badArgs, badSig): never { + // to figure out where this went wrong we need apply each component of the + // regex to each argument until we get to the one that fails to match + var partialPattern = "^"; + var goodTo = 0; + for (var index = 0; index < params.length; index++) { + partialPattern += params[index].regex; + var match = badSig.match(partialPattern); + if (match === null) { + // failed here + throw { + code: "T0410", + stack: new Error().stack, + value: badArgs[goodTo], + index: goodTo + 1, + }; + } + goodTo = match[0].length; + } + // if it got this far, it's probably because of extraneous arguments (we + // haven't added the trailing '$' in the regex yet. + throw { + code: "T0410", + stack: new Error().stack, + value: badArgs[goodTo], + index: goodTo + 1, + }; + }; + + return { + definition: signature, + validate: function(args, context) { + var suppliedSig = ""; + args.forEach(function(arg) { + suppliedSig += getSymbol(arg); + }); + var isValid = regex.exec(suppliedSig); + if (isValid) { + var validatedArgs = []; + var argIndex = 0; + params.forEach(function(param, index) { + var arg = args[argIndex]; + var match = isValid[index + 1]; + if (match === "") { + if (param.context && param.contextRegex) { + // substitute context value for missing arg + // first check that the context value is the right type + var contextType = getSymbol(context); + // test contextType against the regex for this arg (without the trailing ?) + if (param.contextRegex.test(contextType)) { + validatedArgs.push(context); + } else { + // context value not compatible with this argument + throw { + code: "T0411", + stack: new Error().stack, + value: context, + index: argIndex + 1, + }; + } + } else { + validatedArgs.push(arg); + argIndex++; + } + } else { + // may have matched multiple args (if the regex ends with a '+' + // split into single tokens + match.split("").forEach(function(single) { + if (param.type === "a") { + if (single === "m") { + // missing (undefined) + arg = undefined; + } else { + arg = args[argIndex]; + var arrayOK = true; + // is there type information on the contents of the array? + if (typeof param.subtype !== "undefined") { + if (single !== "a" && match !== param.subtype) { + arrayOK = false; + } else if (single === "a") { + if (arg.length > 0) { + var itemType = getSymbol(arg[0]); + if (itemType !== param.subtype.charAt(0)) { + // TODO recurse further + arrayOK = false; + } else { + // make sure every item in the array is this type + var differentItems = arg.filter(function(val) { + return getSymbol(val) !== itemType; + }); + arrayOK = differentItems.length === 0; + } + } + } + } + if (!arrayOK) { + throw { + code: "T0412", + stack: new Error().stack, + value: arg, + index: argIndex + 1, + type: param.subtype, // TODO translate symbol to type name + }; + } + // the function expects an array. If it's not one, make it so + if (single !== "a") { + arg = [arg]; + } + } + validatedArgs.push(arg); + argIndex++; + } else { + validatedArgs.push(arg); + argIndex++; + } + }); + } + }); + return validatedArgs; + } + return throwValidationError(args, suppliedSig); + }, + }; +} + +export interface FunctionDefinition { + _jsonata_function: boolean; + implementation: Function; + signature?: Signature; +} + +/** + * Creates a function definition + * @param {Function} func - function implementation in Javascript + * @param {string} signature - JSONata function signature definition + * @returns {{implementation: *, signature: *}} function definition + */ +export function defineFunction(func: Function, signature?: string): FunctionDefinition { + var definition: FunctionDefinition = { + _jsonata_function: true, + implementation: func, + signature: undefined, + }; + if (typeof signature !== "undefined") { + definition.signature = parseSignature(signature); + } + return definition; +} diff --git a/src/tokenizer.ts b/src/tokenizer.ts new file mode 100644 index 00000000..0d707c21 --- /dev/null +++ b/src/tokenizer.ts @@ -0,0 +1,253 @@ +import { operators, escapes } from "./constants"; + +export interface Token { + type: string; + value: any; + position: number; +} + +export type Tokenizer = (prefix: boolean) => Token; + +// Tokenizer (lexer) - invoked by the parser to return one token at a time +export function tokenizer(path: string): Tokenizer { + var position = 0; + var length = path.length; + + var create = function(type: string, value: any): Token { + var obj = { type: type, value: value, position: position }; + return obj; + }; + + var scanRegex = function() { + // the prefix '/' will have been previously scanned. Find the end of the regex. + // search for closing '/' ignoring any that are escaped, or within brackets + var start = position; + var depth = 0; + var pattern; + var flags; + while (position < length) { + var currentChar = path.charAt(position); + if (currentChar === "/" && path.charAt(position - 1) !== "\\" && depth === 0) { + // end of regex found + pattern = path.substring(start, position); + if (pattern === "") { + throw { + code: "S0301", + stack: new Error().stack, + position: position, + }; + } + position++; + currentChar = path.charAt(position); + // flags + start = position; + while (currentChar === "i" || currentChar === "m") { + position++; + currentChar = path.charAt(position); + } + flags = path.substring(start, position) + "g"; + return new RegExp(pattern, flags); + } + if ( + (currentChar === "(" || currentChar === "[" || currentChar === "{") && + path.charAt(position - 1) !== "\\" + ) { + depth++; + } + if ( + (currentChar === ")" || currentChar === "]" || currentChar === "}") && + path.charAt(position - 1) !== "\\" + ) { + depth--; + } + + position++; + } + throw { + code: "S0302", + stack: new Error().stack, + position: position, + }; + }; + + var next = (prefix: boolean) => { + if (position >= length) return null; + var currentChar = path.charAt(position); + // skip whitespace + while (position < length && " \t\n\r\v".indexOf(currentChar) > -1) { + position++; + currentChar = path.charAt(position); + } + // test for regex + if (prefix !== true && currentChar === "/") { + position++; + return create("regex", scanRegex()); + } + // handle double-char operators + if (currentChar === "." && path.charAt(position + 1) === ".") { + // double-dot .. range operator + position += 2; + return create("operator", ".."); + } + if (currentChar === ":" && path.charAt(position + 1) === "=") { + // := assignment + position += 2; + return create("operator", ":="); + } + if (currentChar === "!" && path.charAt(position + 1) === "=") { + // != + position += 2; + return create("operator", "!="); + } + if (currentChar === ">" && path.charAt(position + 1) === "=") { + // >= + position += 2; + return create("operator", ">="); + } + if (currentChar === "<" && path.charAt(position + 1) === "=") { + // <= + position += 2; + return create("operator", "<="); + } + if (currentChar === "*" && path.charAt(position + 1) === "*") { + // ** descendant wildcard + position += 2; + return create("operator", "**"); + } + if (currentChar === "~" && path.charAt(position + 1) === ">") { + // ~> chain function + position += 2; + return create("operator", "~>"); + } + // test for single char operators + if (operators.hasOwnProperty(currentChar)) { + position++; + return create("operator", currentChar); + } + // test for string literals + if (currentChar === '"' || currentChar === "'") { + var quoteType = currentChar; + // double quoted string literal - find end of string + position++; + var qstr = ""; + while (position < length) { + currentChar = path.charAt(position); + if (currentChar === "\\") { + // escape sequence + position++; + currentChar = path.charAt(position); + if (escapes.hasOwnProperty(currentChar)) { + qstr += escapes[currentChar]; + } else if (currentChar === "u") { + // \u should be followed by 4 hex digits + var octets = path.substr(position + 1, 4); + if (/^[0-9a-fA-F]+$/.test(octets)) { + var codepoint = parseInt(octets, 16); + qstr += String.fromCharCode(codepoint); + position += 4; + } else { + throw { + code: "S0104", + stack: new Error().stack, + position: position, + }; + } + } else { + // illegal escape sequence + throw { + code: "S0103", + stack: new Error().stack, + position: position, + token: currentChar, + }; + } + } else if (currentChar === quoteType) { + position++; + return create("string", qstr); + } else { + qstr += currentChar; + } + position++; + } + throw { + code: "S0101", + stack: new Error().stack, + position: position, + }; + } + // test for numbers + var numregex = /^-?(0|([1-9][0-9]*))(\.[0-9]+)?([Ee][-+]?[0-9]+)?/; + var match = numregex.exec(path.substring(position)); + if (match !== null) { + var num = parseFloat(match[0]); + if (!isNaN(num) && isFinite(num)) { + position += match[0].length; + return create("number", num); + } else { + throw { + code: "S0102", + stack: new Error().stack, + position: position, + token: match[0], + }; + } + } + // test for quoted names (backticks) + var name; + if (currentChar === "`") { + // scan for closing quote + position++; + var end = path.indexOf("`", position); + if (end !== -1) { + name = path.substring(position, end); + position = end + 1; + return create("name", name); + } + position = length; + throw { + code: "S0105", + stack: new Error().stack, + position: position, + }; + } + // test for names + var i = position; + var ch; + for (;;) { + ch = path.charAt(i); + if (i === length || " \t\n\r\v".indexOf(ch) > -1 || operators.hasOwnProperty(ch)) { + if (path.charAt(position) === "$") { + // variable reference + name = path.substring(position + 1, i); + position = i; + return create("variable", name); + } else { + name = path.substring(position, i); + position = i; + switch (name) { + case "or": + case "in": + case "and": + return create("operator", name); + case "true": + return create("value", true); + case "false": + return create("value", false); + case "null": + return create("value", null); + default: + if (position === length && name === "") { + // whitespace at end of input + return null; + } + return create("name", name); + } + } + } else { + i++; + } + } + }; + + return next; +} diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 00000000..4dead091 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,259 @@ +import { errorCodes } from "./constants"; + +/** + * + * @param {Object} arg - expression to test + * @returns {boolean} - true if it is a function (lambda or built-in) + */ +export function isFunction(arg) { + return (arg && (arg._jsonata_function === true || arg._jsonata_lambda === true)) || typeof arg === "function"; +} + +/** + * Tests whether arg is a lambda function + * @param {*} arg - the value to test + * @returns {boolean} - true if it is a lambda function + */ +export function isLambda(arg) { + return arg && arg._jsonata_lambda === true; +} + +/** + * @param {Object} arg - expression to test + * @returns {boolean} - true if it is a generator i.e. the result from calling a + * generator function + */ +export function isGenerator(arg) { + return ( + typeof arg === "object" && + arg !== null && + Symbol.iterator in arg && + typeof arg[Symbol.iterator] === "function" && + "next" in arg && + typeof arg.next === "function" + ); +} + +/** + * Check if value is a finite number + * @param {float} n - number to evaluate + * @returns {boolean} True if n is a finite number + */ +export function isNumeric(n) { + var isNum = false; + if (typeof n === "number") { + // TODO: This used to be num = parseFloat(n)...but I didn't see the point of that. + var num = n; + isNum = !isNaN(num); + if (isNum && !isFinite(num)) { + throw { + code: "D1001", + value: n, + stack: new Error().stack, + }; + } + } + return isNum; +} + +/** + * Returns true if the arg is an array of strings + * @param {*} arg - the item to test + * @returns {boolean} True if arg is an array of strings + */ +export function isArrayOfStrings(arg) { + var result = false; + /* istanbul ignore else */ + if (Array.isArray(arg)) { + result = + arg.filter(function(item) { + return typeof item !== "string"; + }).length === 0; + } + return result; +} + +/** + * Returns true if the arg is an array of numbers + * @param {*} arg - the item to test + * @returns {boolean} True if arg is an array of numbers + */ +export function isArrayOfNumbers(arg) { + var result = false; + if (Array.isArray(arg)) { + result = + arg.filter(function(item) { + return !isNumeric(item); + }).length === 0; + } + return result; +} + +/** + * Returns a flattened array + * @param {Array} arg - the array to be flatten + * @param {Array} flattened - carries the flattened array - if not defined, will initialize to [] + * @returns {Array} - the flattened array + */ +export function flatten(arg, flattened?) { + if (typeof flattened === "undefined") { + flattened = []; + } + if (Array.isArray(arg)) { + arg.forEach(function(item) { + flatten(item, flattened); + }); + } else { + flattened.push(arg); + } + return flattened; +} + +/** + * Create frame + * @param {Object} enclosingEnvironment - Enclosing environment + * @returns {{bind: bind, lookup: lookup}} Created frame + */ +export function createFrame(enclosingEnvironment) { + var bindings = {}; + return { + bind: function(name, value) { + bindings[name] = value; + }, + lookup: function(name) { + var value; + if (bindings.hasOwnProperty(name)) { + value = bindings[name]; + } else if (enclosingEnvironment) { + value = enclosingEnvironment.lookup(name); + } + return value; + }, + }; +} + +/** + * Create an empty sequence to contain query results + * @returns {Array} - empty sequence + */ +export function createSequence(foo?) { + var sequence = toSequence([]); + if (arguments.length === 1) { + sequence.push(arguments[0]); + } + return sequence; +} + +/** + * Converts an array to a result sequence (by adding special properties) + * @param {Array} arr - the array to convert + * @returns {*} - the sequence + */ +export function toSequence(arr) { + Object.defineProperty(arr, "sequence", { + enumerable: false, + configurable: false, + get: function() { + return true; + }, + }); + Object.defineProperty(arr, "keepSingleton", { + enumerable: false, + configurable: false, + writable: true, + value: false, + }); + Object.defineProperty(arr, "value", { + enumerable: false, + configurable: false, + get: function() { + return function(this: typeof arr) { + switch (this.length) { + case 0: + return undefined; + case 1: + return this.keepSingleton ? this : this[0]; + default: + return this; + } + }; + }, + }); + return arr; +} + +/** + * lookup a message template from the catalog and substitute the inserts + * @param {string} err - error code to lookup + * @returns {string} message + */ +export function lookupMessage(err) { + var message = "Unknown error"; + if (typeof err.message !== "undefined") { + message = err.message; + } + var template = errorCodes[err.code]; + if (typeof template !== "undefined") { + // if there are any handlebars, replace them with the field references + // triple braces - replace with value + // double braces - replace with json stringified value + message = template.replace(/\{\{\{([^}]+)}}}/g, function() { + return err[arguments[1]]; + }); + message = message.replace(/\{\{([^}]+)}}/g, function() { + return JSON.stringify(err[arguments[1]]); + }); + } + return message; +} + +/** + * Protect the process/browser from a runnaway expression + * i.e. Infinite loop (tail recursion), or excessive stack growth + * + * @param {Object} expr - expression to protect + * @param {Number} timeout - max time in ms + * @param {Number} maxDepth - max stack depth + */ +export function timeboxExpression(expr, timeout, maxDepth) { + var depth = 0; + var time = Date.now(); + + var checkRunnaway = function() { + if (depth > maxDepth) { + // stack too deep + throw { + message: + "Stack overflow error: Check for non-terminating recursive function. Consider rewriting as tail-recursive.", + stack: new Error().stack, + code: "U1001" + }; + } + if (Date.now() - time > timeout) { + // expression has run for too long + throw { + message: "Expression evaluation timeout: Check for infinite loop", + stack: new Error().stack, + code: "U1001" + }; + } + }; + + // register callbacks + expr.assign("__evaluate_entry", function() { + depth++; + checkRunnaway(); + }); + expr.assign("__evaluate_exit", function() { + depth--; + checkRunnaway(); + }); +} + +// Polyfill +/* istanbul ignore next */ +Number.isInteger = + Number.isInteger || + function(value) { + return typeof value === "number" && isFinite(value) && Math.floor(value) === value; + }; diff --git a/src/visitor.ts b/src/visitor.ts new file mode 100644 index 00000000..747e3f02 --- /dev/null +++ b/src/visitor.ts @@ -0,0 +1,57 @@ +import * as ast from "./ast"; + +export interface Visitor { + visitWildcard?: (node: ast.WildcardNode) => void; + visitDescendant?: (node: ast.DescendantNode) => void; + visitError?: (node: ast.ErrorNode) => void; + visitVariable?: (node: ast.VariableNode) => void; + visitName?: (node: ast.NameNode) => void; + visitLiteral?: (node: ast.LiteralNode) => void; + visitRegex?: (node: ast.RegexNode) => void; + visitOperator?: (node: ast.OperatorNode) => void; + visitEnd?: (node: ast.EndNode) => void; + enterUnary?: (node: ast.UnaryNode) => void; + exitUnary?: (node: ast.UnaryNode) => void; + enterBinary?: (node: ast.BinaryNode) => void; + exitBinary?: (node: ast.BinaryNode) => void; + enterBinaryObject?: (node: ast.BinaryObjectNode) => void; + exitBinaryObject?: (node: ast.BinaryObjectNode) => void; + enterSort?: (node: ast.BinaryObjectNode) => void; + exitSort?: (node: ast.BinaryObjectNode) => void; + enterTernary?: (node: ast.TernaryNode) => void; + exitTernary?: (node: ast.TernaryNode) => void; + enterBlock?: (node: ast.BlockNode) => void; + exitBlock?: (node: ast.BlockNode) => void; + enterTransform?: (node: ast.TransformNode) => void; + exitTransform?: (node: ast.TransformNode) => void; + enterFunction?: (node: ast.FunctionInvocationNode) => void; + exitFunction?: (node: ast.FunctionInvocationNode) => void; + enterLambda?: (node: ast.LambdaDefinitionNode) => void; + exitLambda?: (node: ast.LambdaDefinitionNode) => void; +} + +export function throwNever(node: ast.ASTNode, x: never): never { + throw new Error("Unhandled node type: " + node.type + ": " + JSON.stringify(node)); +} + +export function walk(node: ast.ASTNode, visitor: Visitor): void { + let visit = (f?: (node: T) => void) => + void { + if(f) { + f(node); + }, + }; + switch (node.type) { + case "wildcard": + return visit(visitor.visitWildcard); + case "descendant": + return visit(visitor.visitDescendant); + case "error": + return visit(visitor.visitError); + case "variable": + return visit(visitor.visitVariable); + case "name": + return visit(visitor.visitName); + } + //return throwNever(node, node); +} diff --git a/test.out b/test.out new file mode 100644 index 00000000..c7309a23 --- /dev/null +++ b/test.out @@ -0,0 +1,21056 @@ +yarn run v1.3.2 +$ jest +PASS __tests__/async-function.ts + ● Console + + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'httpget', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'httpget', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', + value: 'https://api.npmjs.org/downloads/range/2016-09-01:2017-03-31/jsonata', + position: 78 } + console.log src/parser/parser.ts:79 + ret = { value: 'https://api.npmjs.org/downloads/range/2016-09-01:2017-03-31/jsonata', + type: 'literal', + position: 78 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'downloads', position: 89 } + console.log src/parser/parser.ts:79 + ret = { value: 'downloads', type: 'name', position: 89 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 101 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 101 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'day', position: 105 } + console.log src/parser/parser.ts:79 + ret = { value: 'day', type: 'name', position: 105 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 108 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 108 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 7, position: 111 } + console.log src/parser/parser.ts:79 + ret = { value: 7, type: 'literal', position: 111 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 118 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 118 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'downloads', position: 128 } + console.log src/parser/parser.ts:79 + ret = { value: 'downloads', type: 'name', position: 128 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'httpget', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'httpget', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', + value: 'htttttps://api.npmjs.org/downloads/range/2016-09-01:2017-03-31/jsonata', + position: 85 } + console.log src/parser/parser.ts:79 + ret = { value: 'htttttps://api.npmjs.org/downloads/range/2016-09-01:2017-03-31/jsonata', + type: 'literal', + position: 85 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'httpget', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'httpget', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', + value: 'htttttps://api.npmjs.org/downloads/range/2016-09-01:2017-03-31/jsonata', + position: 81 } + console.log src/parser/parser.ts:79 + ret = { value: 'htttttps://api.npmjs.org/downloads/range/2016-09-01:2017-03-31/jsonata', + type: 'literal', + position: 81 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'downloads', position: 92 } + console.log src/parser/parser.ts:79 + ret = { value: 'downloads', type: 'name', position: 92 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 104 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 104 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'day', position: 108 } + console.log src/parser/parser.ts:79 + ret = { value: 'day', type: 'name', position: 108 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 111 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 111 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 7, position: 114 } + console.log src/parser/parser.ts:79 + ret = { value: 7, type: 'literal', position: 114 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 121 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 121 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'downloads', position: 131 } + console.log src/parser/parser.ts:79 + ret = { value: 'downloads', type: 'name', position: 131 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'value', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'value', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'value', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'value', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'value', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'value', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'value', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'value', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'counter', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'counter', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'counter', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'counter', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'inc', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'inc', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'counter', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'counter', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'inc', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'inc', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'inc', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'inc', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'inc', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'inc', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'inc', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'inc', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'counter', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'counter', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'counter', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'counter', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'inc', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'inc', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'inc', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'inc', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'inc', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'inc', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'inc', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'inc', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'counter', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'counter', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'counter', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'counter', type: 'variable', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'inc', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'inc', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'inc', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'inc', type: 'name', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'inc', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'inc', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'counter', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'counter', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'inc', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'inc', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'counter', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'counter', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'inc', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'inc', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 21 } + +PASS __tests__/parser-recovery.ts + ● Console + + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: undefined, value: '(end)', position: 8 } + console.log src/parser/parser.ts:79 + ret = { id: '(end)', + lbp: 0, + value: '(end)', + nud: [Function], + position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: undefined, value: '(end)', position: 8 } + console.log src/parser/parser.ts:79 + ret = { id: '(end)', + lbp: 0, + value: '(end)', + nud: [Function], + position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'equals3lucy', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'equals3lucy', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'UnstructuredAnswers', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'UnstructuredAnswers', type: 'name', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: undefined, value: '(end)', position: 46 } + console.log src/parser/parser.ts:79 + ret = { id: '(end)', + lbp: 0, + value: '(end)', + nud: [Function], + position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: undefined, value: '(end)', position: 8 } + console.log src/parser/parser.ts:79 + ret = { id: '(end)', + lbp: 0, + value: '(end)', + nud: [Function], + position: 8 } + +PASS __tests__/implementation-tests.ts (5.161s) + ● Console + + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'millis', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'millis', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'now', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'now', type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'millis', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'millis', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'delay', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'delay', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10000, position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: 10000, type: 'literal', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'later', position: 53 } + console.log src/parser/parser.ts:79 + ret = { value: 'later', type: 'literal', position: 53 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'millis', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'millis', type: 'variable', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'now', position: 70 } + console.log src/parser/parser.ts:79 + ret = { value: 'now', type: 'name', position: 70 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'later', position: 78 } + console.log src/parser/parser.ts:79 + ret = { value: 'later', type: 'name', position: 78 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10000, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 10000, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'millis', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'millis', type: 'variable', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'now', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'now', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'now', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'now', type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'now', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'now', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'delay', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'delay', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10000, position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 10000, type: 'literal', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'later', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'later', type: 'literal', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'now', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 'now', type: 'variable', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'now', position: 64 } + console.log src/parser/parser.ts:79 + ret = { value: 'now', type: 'name', position: 64 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'later', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'later', type: 'name', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10000, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 10000, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'now', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'now', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'millis', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'millis', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'random', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'random', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'random', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'random', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'random', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'random', type: 'variable', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'blah', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nomatch', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'nomatch', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'now', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'now', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 9, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 9, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 16, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 16, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'squareroot', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'squareroot', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 9, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 9, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 16, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 16, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'squareroot', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'squareroot', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 9, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 9, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 16, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 16, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'squareroot', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'squareroot', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'firstn', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'firstn', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substr', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'substr', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'first5', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'first5', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'firstn', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'firstn', type: 'variable', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'first5', position: 67 } + console.log src/parser/parser.ts:79 + ret = { value: 'first5', type: 'variable', position: 67 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 81 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 81 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'str', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'start', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'start', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'len', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'len', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: '_', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: '_', type: 'name', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /ab/g, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: /ab/g, type: 'regex', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ab', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'ab', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /ab/g, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: /ab/g, type: 'regex', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /ab+/g, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: /ab+/g, type: 'regex', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbabbcc', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbabbcc', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /a(b+)/g, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: /a(b+)/g, type: 'regex', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbabbcc', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbabbcc', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /a(b+)/g, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: /a(b+)/g, type: 'regex', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbabbcc', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbabbcc', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'next', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'next', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /a(b+)/g, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: /a(b+)/g, type: 'regex', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbabbcc', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbabbcc', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'next', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'next', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'next', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'next', type: 'name', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /a(b+)/g, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: /a(b+)/g, type: 'regex', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbabbcc', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbabbcc', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'next', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'next', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'next', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'next', type: 'name', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'next', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'next', type: 'name', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /a(b+)/gi, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: /a(b+)/gi, type: 'regex', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Ababbabbcc', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'Ababbabbcc', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbabbcc', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbabbcc', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /ab/g, position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: /ab/g, type: 'regex', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbabbcc', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbabbcc', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /a(b+)/g, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: /a(b+)/g, type: 'regex', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbabbcc', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbabbcc', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /a(b+)/g, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: /a(b+)/g, type: 'regex', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbabbcc', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbabbcc', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /a(b+)/g, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: /a(b+)/g, type: 'regex', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /a(xb+)/g, position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: /a(xb+)/g, type: 'regex', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbabbcc', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbabbcc', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /a(xb+)/g, position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: /a(xb+)/g, type: 'regex', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a, b, c, d', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a, b, c, d', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /ab/g, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: /ab/g, type: 'regex', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a, b, c, d', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a, b, c, d', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /ab/g, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: /ab/g, type: 'regex', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a, b, c, d', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a, b, c, d', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /ab/g, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: /ab/g, type: 'regex', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '2', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: '2', type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a, b, c, d', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a, b, c, d', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ab', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'ab', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a, b, c, d', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a, b, c, d', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 12345, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 12345, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 12345, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 12345, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sqrt', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sqrt', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 10, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sqrt', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'sqrt', type: 'variable', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 10, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'inf', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'inf', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'inf', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'inf', type: 'variable', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'inf', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'inf', type: 'variable', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'inf', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'inf', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'inf', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'inf', type: 'variable', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'inf', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'inf', type: 'variable', position: 36 } + +PASS __tests__/run-test-suite.ts (9.608s) + ● Console + + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'two', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'three', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'three', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'two', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'three', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'three', type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'four', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'four', type: 'variable', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo.bar', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo.bar', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo.baz', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo.baz', type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'buz', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'buz', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Address', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'Address', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Other', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Other', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Alternative.Address', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'Alternative.Address', type: 'literal', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'City', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: 'City', type: 'name', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Address', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'Address', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Other', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Other', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Alternative.Address', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'Alternative.Address', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'City', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: 'City', type: 'name', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 7, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 7, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 8, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 8, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 9, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 9, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'c', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'c', type: 'variable', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'c', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'c', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'var1', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'var1', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'var2', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'var2', type: 'variable', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'var1', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'var1', type: 'variable', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'var2', position: 70 } + console.log src/parser/parser.ts:79 + ret = { value: 'var2', type: 'variable', position: 70 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'func', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'func', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg', type: 'variable', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 57 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 57 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'func', position: 66 } + console.log src/parser/parser.ts:79 + ret = { value: 'func', type: 'variable', position: 66 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'func', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'func', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg', type: 'variable', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'func', position: 58 } + console.log src/parser/parser.ts:79 + ret = { value: 'func', type: 'variable', position: 58 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 60 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 60 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 69 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 69 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'not', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'not', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'not', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'not', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'operator', value: 'and', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'and', type: 'operator', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'operator', value: 'or', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'or', type: 'operator', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'operator', value: 'and', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'and', type: 'operator', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'operator', value: 'or', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'or', type: 'operator', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'operator', value: 'and', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'and', type: 'operator', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'operator', value: 'or', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'or', type: 'operator', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'operator', value: 'and', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'and', type: 'operator', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'operator', value: 'and', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'and', type: 'operator', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'content', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'content', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'origin', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'origin', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'name', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'name', type: 'name', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'AccName', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'AccName', type: 'variable', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Account Name', position: 52 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account Name', type: 'literal', position: 52 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 70 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 70 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'order104', position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 'order104', type: 'literal', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 92 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 92 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Account', position: 106 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'literal', position: 106 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'AccName', position: 116 } + console.log src/parser/parser.ts:79 + ret = { value: 'AccName', type: 'variable', position: 116 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'SKU-', position: 129 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU-', type: 'literal', position: 129 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 139 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 139 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ProductID', position: 149 } + console.log src/parser/parser.ts:79 + ret = { value: 'ProductID', type: 'name', position: 149 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 153 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 153 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 168 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 168 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'AccName', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'AccName', type: 'variable', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account Name', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account Name', type: 'name', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 60 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 60 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'order104', position: 81 } + console.log src/parser/parser.ts:79 + ret = { value: 'order104', type: 'literal', position: 81 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 90 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 90 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Account', position: 104 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'literal', position: 104 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'AccName', position: 114 } + console.log src/parser/parser.ts:79 + ret = { value: 'AccName', type: 'variable', position: 114 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'SKU-', position: 127 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU-', type: 'literal', position: 127 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 137 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 137 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ProductID', position: 147 } + console.log src/parser/parser.ts:79 + ret = { value: 'ProductID', type: 'name', position: 147 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product Name', position: 164 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'name', position: 164 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '3', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: '3', type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '3', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: '3', type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '3', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: '3', type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'world', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'world', type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'world', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'world', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '32', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: '32', type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 42, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 42, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'world', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'world', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 56, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 56, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 56, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 56, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'world', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'world', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 30, position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 30, type: 'literal', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 35, position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 35, type: 'literal', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Red', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'Red', type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '$', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: '$', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Bus', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Bus', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'White', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'White', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '$', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: '$', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Police Car', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'Police Car', type: 'literal', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Red', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'Red', type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '$', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: '$', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Bus', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Bus', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'White', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'White', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '$', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: '$', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Police Car', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'Police Car', type: 'literal', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Red', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'Red', type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '$', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: '$', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Bus', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Bus', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'White', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'White', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '$', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: '$', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Police Car', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'Police Car', type: 'literal', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lookup', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'lookup', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Bus', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'Bus', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Red', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Red', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Police Car', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'Police Car', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'White', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'White', type: 'literal', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '$', position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: '$', type: 'variable', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lookup', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'lookup', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Bus', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'Bus', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Red', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Red', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Police Car', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'Police Car', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'White', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'White', type: 'literal', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '$', position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: '$', type: 'variable', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lookup', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'lookup', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Bus', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'Bus', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Red', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Red', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Police Car', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'Police Car', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'White', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'White', type: 'literal', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '$', position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: '$', type: 'variable', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 30, position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 30, type: 'literal', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Cheap', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: 'Cheap', type: 'literal', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 30, position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 30, type: 'literal', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Cheap', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: 'Cheap', type: 'literal', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Expensive', position: 57 } + console.log src/parser/parser.ts:79 + ret = { value: 'Expensive', type: 'literal', position: 57 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 30, position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 30, type: 'literal', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Cheap', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: 'Cheap', type: 'literal', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 100, position: 57 } + console.log src/parser/parser.ts:79 + ret = { value: 100, type: 'literal', position: 57 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Expensive', position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: 'Expensive', type: 'literal', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Rip off', position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 'Rip off', type: 'literal', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Item ', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Item ', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 66 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 66 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' ', position: 70 } + console.log src/parser/parser.ts:79 + ret = { value: ' ', type: 'literal', position: 70 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'fud', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'fud', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Colour', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'Colour', type: 'name', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'base64encode', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'base64encode', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello:world', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello:world', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'base64encode', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'base64encode', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'base64decode', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'base64decode', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'aGVsbG86d29ybGQ=', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'aGVsbG86d29ybGQ=', type: 'literal', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'base64decode', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'base64decode', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 's', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 's', type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 's', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 's', type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'unknown', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'unknown', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'sum', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'o, ', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'o, ', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: undefined, value: '(end)', position: 2 } + console.log src/parser/parser.ts:79 + ret = { id: '(end)', + lbp: 0, + value: '(end)', + nud: [Function], + position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'x', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'x', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 55, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 55, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Ssum', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'Ssum', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'num', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'num', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'num', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'num', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'num', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'num', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bazz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bazz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Other', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'Other', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Misc', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'Misc', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bazz', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'bazz', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest2', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest2', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest3', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest3', type: 'name', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'a', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'a', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'a', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'a', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'a', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'a', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'a', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'a', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'b', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'b', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'b', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'literal', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'b', position: 52 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'literal', position: 52 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'a', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'name', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 64 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 64 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'b', position: 67 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'name', position: 67 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'a', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'b', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'name', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'a', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'b', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Phone', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'Phone', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'type', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'type', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'mobile', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'mobile', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'number', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Phone', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'Phone', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'type', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'type', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'mobile', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'mobile', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'number', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'name', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Phone', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'Phone', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'type', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'type', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'mobile', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'mobile', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'number', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'name', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Phone', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'Phone', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'type', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'type', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'office', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'office', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'number', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'name', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Phone', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'Phone', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'type', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'type', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'number', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Phone', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'Phone', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'type', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'type', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'number', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'abs', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'abs', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3.7, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 3.7, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'abs', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'abs', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3.7, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 3.7, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'abs', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'abs', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'abs', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'abs', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'append', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'append', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'append', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'append', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'append', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'append', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'append', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'append', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'notexist', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'notexist', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'append', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'append', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'notexist', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'notexist', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 54 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 54 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppertrim', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppertrim', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'trim', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'trim', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppertrim', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppertrim', type: 'variable', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' Hello World ', position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: ' Hello World ', type: 'literal', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'john@example.com', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'john@example.com', type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '@', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: '@', type: 'literal', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '.', position: 66 } + console.log src/parser/parser.ts:79 + ret = { value: '.', type: 'literal', position: 66 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '', position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '@', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: '@', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '.', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: '.', type: 'literal', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '@', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: '@', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '.', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: '.', type: 'literal', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'domain', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'domain', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '@', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: '@', type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '.', position: 61 } + console.log src/parser/parser.ts:79 + ret = { value: '.', type: 'literal', position: 61 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'domain', position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: 'domain', type: 'variable', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'john@example.com', position: 90 } + console.log src/parser/parser.ts:79 + ret = { value: 'john@example.com', type: 'literal', position: 90 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'str', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'chars', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'chars', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: '_', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: '_', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'str', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'chars', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'chars', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: '_', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: '_', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 65 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 65 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'betweenBackets', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'betweenBackets', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '(', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: '(', type: 'literal', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 63 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 63 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ')', position: 70 } + console.log src/parser/parser.ts:79 + ret = { value: ')', type: 'literal', position: 70 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'betweenBackets', position: 87 } + console.log src/parser/parser.ts:79 + ret = { value: 'betweenBackets', type: 'variable', position: 87 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'test(foo)bar', position: 102 } + console.log src/parser/parser.ts:79 + ret = { value: 'test(foo)bar', type: 'literal', position: 102 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'str', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'chars', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'chars', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: '_', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: '_', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'str', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'chars', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'chars', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: '_', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: '_', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'chain', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'chain', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 53 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 53 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 60 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 60 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 63 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 63 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 66 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 66 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'instructions', position: 84 } + console.log src/parser/parser.ts:79 + ret = { value: 'instructions', type: 'variable', position: 84 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 93 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 93 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 102 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 102 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sumsq', position: 110 } + console.log src/parser/parser.ts:79 + ret = { value: 'sumsq', type: 'variable', position: 110 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'instructions', position: 127 } + console.log src/parser/parser.ts:79 + ret = { value: 'instructions', type: 'variable', position: 127 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reduce', position: 138 } + console.log src/parser/parser.ts:79 + ret = { value: 'reduce', type: 'variable', position: 138 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'chain', position: 145 } + console.log src/parser/parser.ts:79 + ret = { value: 'chain', type: 'variable', position: 145 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 149 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 149 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 152 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 152 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sumsq', position: 163 } + console.log src/parser/parser.ts:79 + ret = { value: 'sumsq', type: 'variable', position: 163 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'chain', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'chain', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 53 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 53 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 61 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 61 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 67 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 67 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 73 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 73 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'instructions', position: 90 } + console.log src/parser/parser.ts:79 + ret = { value: 'instructions', type: 'variable', position: 90 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 99 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 99 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 108 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 108 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 117 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 117 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sumsq', position: 125 } + console.log src/parser/parser.ts:79 + ret = { value: 'sumsq', type: 'variable', position: 125 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'instructions', position: 142 } + console.log src/parser/parser.ts:79 + ret = { value: 'instructions', type: 'variable', position: 142 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reduce', position: 153 } + console.log src/parser/parser.ts:79 + ret = { value: 'reduce', type: 'variable', position: 153 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'chain', position: 160 } + console.log src/parser/parser.ts:79 + ret = { value: 'chain', type: 'variable', position: 160 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 164 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 164 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 167 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 167 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sumsq', position: 178 } + console.log src/parser/parser.ts:79 + ret = { value: 'sumsq', type: 'variable', position: 178 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'instructions', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'instructions', type: 'variable', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 53 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 53 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 64 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 64 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 67 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 67 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 70 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 70 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'instructions', position: 88 } + console.log src/parser/parser.ts:79 + ret = { value: 'instructions', type: 'variable', position: 88 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum_of_squares', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum_of_squares', type: 'variable', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 66 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 66 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 75 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 75 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 78 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 78 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 81 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 81 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum_of_squares', position: 101 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum_of_squares', type: 'variable', position: 101 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'func', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'func', type: 'variable', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: '_', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: '_', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'times', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'times', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'product', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'product', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reduce', position: 52 } + console.log src/parser/parser.ts:79 + ret = { value: 'reduce', type: 'variable', position: 52 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'times', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'times', type: 'variable', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 86 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 86 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 90 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 90 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 93 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 93 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'product_of_squares', position: 114 } + console.log src/parser/parser.ts:79 + ret = { value: 'product_of_squares', type: 'variable', position: 114 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 122 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 122 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 133 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 133 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'product', position: 146 } + console.log src/parser/parser.ts:79 + ret = { value: 'product', type: 'variable', position: 146 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 149 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 149 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 152 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 152 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'product_of_squares', position: 176 } + console.log src/parser/parser.ts:79 + ret = { value: 'product_of_squares', type: 'variable', position: 176 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sequence', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'sequence', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'func', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'func', type: 'variable', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'init', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'init', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: '_', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: '_', type: 'name', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'func', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'func', type: 'variable', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: '_', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: '_', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'square', position: 54 } + console.log src/parser/parser.ts:79 + ret = { value: 'square', type: 'variable', position: 54 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reduce', position: 66 } + console.log src/parser/parser.ts:79 + ret = { value: 'reduce', type: 'variable', position: 66 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 75 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 75 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 81 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 81 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 86 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 86 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'prices', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'prices', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'quantities', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'quantities', type: 'variable', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 76 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 76 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 85 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 85 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'product', position: 94 } + console.log src/parser/parser.ts:79 + ret = { value: 'product', type: 'variable', position: 94 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 99 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 99 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 104 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 104 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 112 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 112 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 114 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 114 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 122 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 122 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 124 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 124 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'zip', position: 132 } + console.log src/parser/parser.ts:79 + ret = { value: 'zip', type: 'variable', position: 132 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'prices', position: 140 } + console.log src/parser/parser.ts:79 + ret = { value: 'prices', type: 'variable', position: 140 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'quantities', position: 153 } + console.log src/parser/parser.ts:79 + ret = { value: 'quantities', type: 'variable', position: 153 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 162 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 162 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'product', position: 171 } + console.log src/parser/parser.ts:79 + ret = { value: 'product', type: 'variable', position: 171 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 180 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 180 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 42, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 42, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /hat/gi, position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: /hat/gi, type: 'regex', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ProductID', position: 59 } + console.log src/parser/parser.ts:79 + ret = { value: 'ProductID', type: 'name', position: 59 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'average', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'average', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'average', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'average', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ': ', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: ': ', type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'average', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'average', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 64 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 64 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'average', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'average', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'average', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'average', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'average', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'average', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '1', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: '1', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '2', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: '2', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '3', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: '3', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'average', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'average', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '1', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: '1', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '2', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: '2', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'average', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'average', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'average', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'average', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'average', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'average', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'average', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'average', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'average', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'average', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'average', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'average', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'undefined', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'undefined', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 10, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.5, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 0.5, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'world', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'world', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'boolean', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'ceil', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'ceil', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3.7, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 3.7, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'ceil', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'ceil', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3.7, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 3.7, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'ceil', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'ceil', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'ceil', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'ceil', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'clone', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'clone', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'clone', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'clone', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'clone', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'clone', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'contains', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'contains', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'lo', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'lo', type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'contains', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'contains', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'World', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'World', type: 'literal', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'contains', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'contains', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'world', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'world', type: 'literal', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'contains', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'contains', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Word', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'Word', type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'contains', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'contains', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'World', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'World', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'contains', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'contains', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 23, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 23, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'contains', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'contains', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '23', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: '23', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ': ', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: ': ', type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 53 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 53 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '1', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: '1', type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '2', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: '2', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '3', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: '3', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '1', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: '1', type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '2', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: '2', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'undefined', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'undefined', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'each', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'each', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Address', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Address', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'k', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'k', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'k', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'k', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ': ', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: ': ', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reverse', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'reverse', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reverse', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'reverse', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reverse', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'reverse', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reverse', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'reverse', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.5, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 0.5, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'world', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'world', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'exists', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'exists', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'floor', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'floor', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3.7, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 3.7, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'floor', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'floor', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3.7, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 3.7, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'floor', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'floor', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'floor', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'floor', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatBase', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatBase', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 100, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 100, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatBase', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatBase', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatBase', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatBase', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 100, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 100, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatBase', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatBase', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 100, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 100, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatBase', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatBase', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 100, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 100, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 36, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 36, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatBase', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatBase', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 99.5, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 99.5, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2.5, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 2.5, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatBase', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatBase', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 100, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 100, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatBase', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatBase', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 100, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 100, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 37, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 37, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 12345.6, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 12345.6, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '#,###.00', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: '#,###.00', type: 'literal', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 12345678.9, position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 12345678.9, type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '9,999.99', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: '9,999.99', type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 123412345678.9, position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 123412345678.9, type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '9,9,99.99', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: '9,9,99.99', type: 'literal', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1234.56789, position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 1234.56789, type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '9,999.999,999', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: '9,999.999,999', type: 'literal', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 123.9, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 123.9, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '9999', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: '9999', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.14, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 0.14, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '01%', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: '01%', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.4857, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 0.4857, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '###.###‰', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: '###.###‰', type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.14, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 0.14, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '###pm', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: '###pm', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'per-mille', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'per-mille', type: 'literal', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'pm', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'pm', type: 'literal', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '000', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: '000', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1234.5678, position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 1234.5678, type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '00.000e0', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: '00.000e0', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1234.5678, position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 1234.5678, type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '00.000e000', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: '00.000e000', type: 'literal', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1234.5678, position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 1234.5678, type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '①①.①①①e①', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: '①①.①①①e①', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'zero-digit', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'zero-digit', type: 'literal', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '⑟', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: '⑟', type: 'literal', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.234, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 0.234, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '0.0e0', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: '0.0e0', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.234, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 0.234, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '#.00e0', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: '#.00e0', type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.123, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 0.123, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '#.e9', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: '#.e9', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.234, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 0.234, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '.00e0', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: '.00e0', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2392.14, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 2392.14, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 36.58, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 36.58, type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', + value: '000,000.000###;###,###.000###', + position: 63 } + console.log src/parser/parser.ts:79 + ret = { value: '000,000.000###;###,###.000###', + type: 'literal', + position: 63 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2.14, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 2.14, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 86.58, position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 86.58, type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', + value: 'PREFIX##00.000###SUFFIX', + position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'PREFIX##00.000###SUFFIX', + type: 'literal', + position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 100000000000000000000, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 100000000000000000000, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '#,######', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: '#,######', type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '#;#;#', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: '#;#;#', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '#.0.0', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: '#.0.0', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '#0%%', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: '#0%%', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '#0‰‰', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: '#0‰‰', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '#0%‰', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: '#0%‰', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '.e0', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: '.e0', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '0+.e0', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: '0+.e0', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '0,.e0', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: '0,.e0', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '0,', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: '0,', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '0,,0', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: '0,,0', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '0#.e0', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: '0#.e0', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '#0.#0e0', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: '#0.#0e0', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '#0.0e0%', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: '#0.0e0%', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'formatNumber', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'formatNumber', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '#0.0e0,0', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: '#0.0e0,0', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'fromMillis', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'fromMillis', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'fromMillis', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'fromMillis', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1509380732935, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 1509380732935, type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'fromMillis', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'fromMillis', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'world', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'world', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'world', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'world', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Colour', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'Colour', type: 'name', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 52 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 52 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Colour', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'Colour', type: 'name', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'no', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'no', type: 'name', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'sep', position: 54 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'name', position: 54 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Colour', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'Colour', type: 'name', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'keys', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'keys', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'keys', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'keys', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'keys', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'keys', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'keys', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'keys', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'keys', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'keys', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'keys', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'keys', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'keys', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'keys', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'bar', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'missing', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'missing', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'λ-calculus', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ-calculus', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '𝄞', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: '𝄞', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '𝄞', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: '𝄞', type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '超明體繁', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: '超明體繁', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '\t', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: '\t', type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '\n', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: '\n', type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1234, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 1234, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'str', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'World', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'World', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lookup', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'lookup', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Account Name', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account Name', type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lookup', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'lookup', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lookup', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'lookup', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ProductID', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'ProductID', type: 'name', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lookup', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'lookup', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '$', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: '$', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'gust', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'gust', type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ': ', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: ': ', type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 53 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 53 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '1', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: '1', type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '2', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: '2', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '3', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: '3', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '1', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: '1', type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '2', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: '2', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'undefined', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'undefined', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'min', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'min', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'min', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'min', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ': ', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: ': ', type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'min', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'min', type: 'variable', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 60 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 60 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'min', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'min', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'min', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'min', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'min', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'min', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '1', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: '1', type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '2', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: '2', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '3', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: '3', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'min', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'min', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '1', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: '1', type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '2', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: '2', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'min', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'min', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'min', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'min', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'min', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'min', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'min', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'min', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'min', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'min', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'min', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'min', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'undefined', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'undefined', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'merge', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'merge', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'merge', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'merge', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'merge', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'merge', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'b', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'merge', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'merge', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'b', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'c', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'c', type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'merge', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'merge', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'b', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 10, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.05, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 0.05, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '0', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: '0', type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '-0.05', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: '-0.05', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '1e2', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: '1e2', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '1.0e-2', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: '1.0e-2', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '1e0', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: '1e0', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '10e500', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: '10e500', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello world', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello world', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '1/2', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: '1/2', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '1234 hello', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: '1234 hello', type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '[1]', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: '[1]', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '2', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: '2', type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'world', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'world', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'pad', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'pad', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'pad', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'pad', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'pad', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'pad', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '#', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: '#', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'pad', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'pad', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'pad', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'pad', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'pad', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'pad', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 8, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 8, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '-+', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: '-+', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'pad', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'pad', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'power', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'power', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'power', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'power', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.5, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 0.5, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'power', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'power', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 10, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'power', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'power', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'power', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'power', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'power', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'power', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'power', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'power', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 100, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 100, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1000, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 1000, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'World', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'World', type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Everyone', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: 'Everyone', type: 'literal', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', + value: 'the cat sat on the mat', + position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'the cat sat on the mat', + type: 'literal', + position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'at', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'at', type: 'literal', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'it', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'it', type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', + value: 'the cat sat on the mat', + position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'the cat sat on the mat', + type: 'literal', + position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'at', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'at', type: 'literal', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'it', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'it', type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', + value: 'the cat sat on the mat', + position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'the cat sat on the mat', + type: 'literal', + position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'at', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'at', type: 'literal', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'it', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'it', type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'at', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'at', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'it', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'it', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'l', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'l', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '1', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: '1', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'l', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'l', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '1', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: '1', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'bye', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'bye', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 123, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 123, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2.3, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 2.3, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2.7, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 2.7, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2.5, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 2.5, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3.5, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 3.5, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.5, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 0.5, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.3, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 0.3, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.5, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 0.5, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 7.5, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 7.5, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 8.5, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 8.5, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4.49, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 4.49, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4.525, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 4.525, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4.515, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 4.515, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 12345, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 12345, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 12450, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 12450, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 12350, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 12350, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6.022e-23, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 6.022e-23, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 24, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 24, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'unknown', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'unknown', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'shuffle', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'shuffle', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10, position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 10, type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sort', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sort', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'shuffle', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'shuffle', type: 'variable', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 10, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'shuffle', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'shuffle', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'shuffle', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'shuffle', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sift', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sift', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Postcode', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'Postcode', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sift', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'sift', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Postcode', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'Postcode', type: 'name', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sift', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sift', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'k', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'k', type: 'variable', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'k', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'k', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /^A/g, position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: /^A/g, type: 'regex', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'toMillis', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'toMillis', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', + value: '1970-01-01T00:00:00.001Z', + position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: '1970-01-01T00:00:00.001Z', + type: 'literal', + position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'toMillis', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'toMillis', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', + value: '2017-10-30T16:25:32.935Z', + position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: '2017-10-30T16:25:32.935Z', + type: 'literal', + position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'toMillis', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'toMillis', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'toMillis', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'toMillis', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'not', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'not', type: 'variable', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'not', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'not', type: 'variable', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'not', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'not', type: 'variable', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Age', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'Age', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'str', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'str', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Colour', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'Colour', type: 'name', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'str', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'variable', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 63 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 63 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'str', position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'variable', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'str', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'prefix', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'prefix', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'prefix', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'prefix', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'str', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'variable', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'World', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'World', type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello ', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello ', type: 'literal', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'FirstName', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'FirstName', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'str', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'prefix', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'prefix', type: 'variable', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'prefix', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'prefix', type: 'variable', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'str', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'variable', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello ', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello ', type: 'literal', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '-', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: '-', type: 'literal', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '-', position: 53 } + console.log src/parser/parser.ts:79 + ret = { value: '-', type: 'literal', position: 53 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'b', position: 52 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'literal', position: 52 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '-', position: 58 } + console.log src/parser/parser.ts:79 + ret = { value: '-', type: 'literal', position: 58 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'literal', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'b', position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'literal', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '-', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: '-', type: 'literal', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '-', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: '-', type: 'literal', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sep', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'sep', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '-', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: '-', type: 'literal', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'obj', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'obj', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'obj', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'obj', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'world', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'world', type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'num', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'num', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'num', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'num', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'num', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'num', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'num', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'num', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '5', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: '5', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'num', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'num', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'num', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'num', type: 'variable', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'twice', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'twice', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 52 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 52 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add2', position: 65 } + console.log src/parser/parser.ts:79 + ret = { value: 'add2', type: 'variable', position: 65 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 77 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 77 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 80 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 80 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 89 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 89 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 91 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 91 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add4', position: 98 } + console.log src/parser/parser.ts:79 + ret = { value: 'add4', type: 'variable', position: 98 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'twice', position: 108 } + console.log src/parser/parser.ts:79 + ret = { value: 'twice', type: 'variable', position: 108 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add2', position: 114 } + console.log src/parser/parser.ts:79 + ret = { value: 'add2', type: 'variable', position: 114 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add4', position: 121 } + console.log src/parser/parser.ts:79 + ret = { value: 'add4', type: 'variable', position: 121 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 123 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 123 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'twice', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'twice', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 59 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 59 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 65 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 65 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add2', position: 75 } + console.log src/parser/parser.ts:79 + ret = { value: 'add2', type: 'variable', position: 75 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 87 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 87 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 90 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 90 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 99 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 99 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 101 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 101 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add4', position: 108 } + console.log src/parser/parser.ts:79 + ret = { value: 'add4', type: 'variable', position: 108 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'twice', position: 118 } + console.log src/parser/parser.ts:79 + ret = { value: 'twice', type: 'variable', position: 118 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add2', position: 124 } + console.log src/parser/parser.ts:79 + ret = { value: 'add2', type: 'variable', position: 124 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add4', position: 131 } + console.log src/parser/parser.ts:79 + ret = { value: 'add4', type: 'variable', position: 131 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 133 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 133 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg1', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg1', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg2', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg2', type: 'variable', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg1', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg1', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg2', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg2', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '2', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: '2', type: 'literal', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg1', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg1', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg2', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg2', type: 'variable', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg1', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg1', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg2', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg2', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '2', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: '2', type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg1', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg1', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg2', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg2', type: 'variable', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg1', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg1', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arg2', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'arg2', type: 'variable', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'g', position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'literal', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '3', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: '3', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '3', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: '3', type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'f', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'fun', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'fun', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'fun', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'fun', type: 'variable', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'f', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'literal', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sort', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sort', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sort', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sort', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sort', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sort', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sort', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sort', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 22, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 22, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 11, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 11, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sort', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'sort', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sort', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sort', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sort', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sort', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sort', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sort', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sort', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sort', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 57 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 57 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 74 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 74 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 81 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 81 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 92 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 92 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 103 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 103 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' x ', position: 111 } + console.log src/parser/parser.ts:79 + ret = { value: ' x ', type: 'literal', position: 111 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 122 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 122 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sort', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sort', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 61 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 61 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 67 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 67 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'SKU', position: 74 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU', type: 'name', position: 74 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sort', position: 66 } + console.log src/parser/parser.ts:79 + ret = { value: 'sort', type: 'variable', position: 66 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 74 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 74 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 78 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 78 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 87 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 87 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 92 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 92 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 101 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 101 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sort', position: 130 } + console.log src/parser/parser.ts:79 + ret = { value: 'sort', type: 'variable', position: 130 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 132 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 132 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 135 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 135 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 138 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 138 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 142 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 142 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 148 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 148 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 153 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 153 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 159 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 159 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'SKU', position: 183 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU', type: 'name', position: 183 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' ', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: ' ', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' ', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: ' ', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' ', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: ' ', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '12345', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: '12345', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a, b, c, d', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a, b, c, d', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a, b, c, d', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a, b, c, d', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a, b, c, d', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a, b, c, d', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2.5, position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 2.5, type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a, b, c, d', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a, b, c, d', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 10, type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a, b, c, d', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a, b, c, d', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' ', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: ' ', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a, b, c, d', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a, b, c, d', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a, b, c, d', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a, b, c, d', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a, b, c, d', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a, b, c, d', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a, b, c, d', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a, b, c, d', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '2', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: '2', type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a, b, c, d', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a, b, c, d', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 12345, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 12345, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 12345, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 12345, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'spread', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'spread', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'spread', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'spread', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'spread', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'spread', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'spread', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'spread', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sqrt', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sqrt', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sqrt', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sqrt', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sqrt', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sqrt', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sqrt', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'sqrt', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 22, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 22, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 7, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 7, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1e+100, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 1e+100, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1e-100, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 1e-100, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.000001, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 0.000001, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1e-7, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 1e-7, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 100000000000000000000, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 100000000000000000000, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1e+21, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 1e+21, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'string', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'string', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'string', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'number', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'literal', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 78.8, position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 78.8, type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'null', position: 58 } + console.log src/parser/parser.ts:79 + ret = { value: 'null', type: 'literal', position: 58 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 63 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 63 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'boolean', position: 75 } + console.log src/parser/parser.ts:79 + ret = { value: 'boolean', type: 'literal', position: 75 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 82 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 82 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'function', position: 95 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'literal', position: 95 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 101 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 101 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'lambda', position: 112 } + console.log src/parser/parser.ts:79 + ret = { value: 'lambda', type: 'literal', position: 112 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 122 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 122 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 129 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 129 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'object', position: 141 } + console.log src/parser/parser.ts:79 + ret = { value: 'object', type: 'literal', position: 141 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'str', position: 153 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'literal', position: 153 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'another', position: 164 } + console.log src/parser/parser.ts:79 + ret = { value: 'another', type: 'literal', position: 164 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'lambda2', position: 178 } + console.log src/parser/parser.ts:79 + ret = { value: 'lambda2', type: 'literal', position: 178 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 188 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 188 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 191 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 191 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 195 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 195 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'array', position: 209 } + console.log src/parser/parser.ts:79 + ret = { value: 'array', type: 'literal', position: 209 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'inf', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'inf', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello world', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello world', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello world', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello world', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello world', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello world', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' ', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: ' ', type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'l', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'l', type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'f', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ld', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'ld', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ld', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'ld', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' ', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: ' ', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'l', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'l', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'f', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'He', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'He', type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'He', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'He', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ': ', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: ': ', type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 60 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 60 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'undefined', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'undefined', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'trim', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'trim', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'trim', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'trim', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', + value: ' Hello \n \t World \t ', + position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: ' Hello \n \t World \t ', + type: 'literal', + position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'trim', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'trim', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'zip', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'zip', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'zip', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'zip', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 7, position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 7, type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 8, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 8, type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 9, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 9, type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'zip', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'zip', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 7, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 7, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 8, position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 8, type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 9, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 9, type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'zip', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'zip', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'zip', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'zip', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'zip', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'zip', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'twice', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'twice', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add3', position: 54 } + console.log src/parser/parser.ts:79 + ret = { value: 'add3', type: 'variable', position: 54 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 64 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 64 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 67 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 67 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 73 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 73 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add6', position: 81 } + console.log src/parser/parser.ts:79 + ret = { value: 'add6', type: 'variable', position: 81 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'twice', position: 89 } + console.log src/parser/parser.ts:79 + ret = { value: 'twice', type: 'variable', position: 89 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add3', position: 95 } + console.log src/parser/parser.ts:79 + ret = { value: 'add3', type: 'variable', position: 95 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add6', position: 103 } + console.log src/parser/parser.ts:79 + ret = { value: 'add6', type: 'variable', position: 103 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 7, position: 105 } + console.log src/parser/parser.ts:79 + ret = { value: 7, type: 'literal', position: 105 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 64 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 64 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 67 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 67 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 75 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 75 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 81 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 81 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 85 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 85 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 89 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 89 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 94 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 94 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 99 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 99 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 102 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 102 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 106 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 106 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 114 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 114 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 64 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 64 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 67 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 67 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 75 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 75 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 81 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 81 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 86 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 86 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 91 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 91 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 96 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 96 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 99 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 99 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 101 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 101 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 107 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 107 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 110 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 110 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 112 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 112 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 120 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 120 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'library', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'library', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'books', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'books', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'filter', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'filter', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'i', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'i', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'price', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'price', type: 'name', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 54 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 54 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 57 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 57 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'price', position: 63 } + console.log src/parser/parser.ts:79 + ret = { value: 'price', type: 'name', position: 63 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'isbn', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'isbn', type: 'name', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'filter', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'filter', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'i', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'i', type: 'variable', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'price', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'price', type: 'name', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'price', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 'price', type: 'name', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'data', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'data', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'one', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'one', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'two', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 53 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 53 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 57 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 57 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add', position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 'add', type: 'variable', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 80 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 80 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 87 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 87 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 90 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 90 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 98 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 98 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'data', position: 104 } + console.log src/parser/parser.ts:79 + ret = { value: 'data', type: 'variable', position: 104 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'one', position: 108 } + console.log src/parser/parser.ts:79 + ret = { value: 'one', type: 'name', position: 108 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add', position: 114 } + console.log src/parser/parser.ts:79 + ret = { value: 'add', type: 'variable', position: 114 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'data', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'data', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'one', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'one', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'two', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 53 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 53 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 57 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 57 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add', position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 'add', type: 'variable', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 80 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 80 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 87 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 87 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 90 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 90 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 98 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 98 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add', position: 103 } + console.log src/parser/parser.ts:79 + ret = { value: 'add', type: 'variable', position: 103 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'prod', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'prod', type: 'variable', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'index', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'index', type: 'variable', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'index', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 'index', type: 'variable', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 57 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 57 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ': ', position: 64 } + console.log src/parser/parser.ts:79 + ret = { value: ': ', type: 'literal', position: 64 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'prod', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'prod', type: 'variable', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 87 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 87 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'prod', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'prod', type: 'variable', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'index', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'index', type: 'variable', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'index', position: 61 } + console.log src/parser/parser.ts:79 + ret = { value: 'index', type: 'variable', position: 61 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 63 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 63 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '/', position: 69 } + console.log src/parser/parser.ts:79 + ret = { value: '/', type: 'literal', position: 69 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 78 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 78 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'arr', position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 'arr', type: 'variable', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ': ', position: 91 } + console.log src/parser/parser.ts:79 + ret = { value: ': ', type: 'literal', position: 91 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'prod', position: 99 } + console.log src/parser/parser.ts:79 + ret = { value: 'prod', type: 'variable', position: 99 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 114 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 114 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Phone', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'Phone', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'i', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'i', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'i', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'i', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'type', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'type', type: 'name', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'office', position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: 'office', type: 'literal', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Phone', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'Phone', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'i', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'i', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'type', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'type', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'office', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'office', type: 'literal', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'i', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'i', type: 'variable', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Phone', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'Phone', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'i', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'i', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'type', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'type', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'office', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'office', type: 'literal', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'i', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'i', type: 'variable', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 57 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 57 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Phone', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'Phone', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'i', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'i', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'type', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'type', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'office', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'office', type: 'literal', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'i', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'i', type: 'variable', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 57 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 57 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'seq', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'seq', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reduce', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'reduce', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'seq', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'seq', type: 'variable', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 54 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 54 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 58 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 58 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 61 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 61 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'concat', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'concat', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 's', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 's', type: 'variable', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 54 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 54 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 's', position: 60 } + console.log src/parser/parser.ts:79 + ret = { value: 's', type: 'variable', position: 60 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 70 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 70 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 73 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 73 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'comma_join', position: 90 } + console.log src/parser/parser.ts:79 + ret = { value: 'comma_join', type: 'variable', position: 90 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'concat', position: 101 } + console.log src/parser/parser.ts:79 + ret = { value: 'concat', type: 'variable', position: 101 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' ... ', position: 109 } + console.log src/parser/parser.ts:79 + ret = { value: ' ... ', type: 'literal', position: 109 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reduce', position: 120 } + console.log src/parser/parser.ts:79 + ret = { value: 'reduce', type: 'variable', position: 120 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 123 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 123 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 125 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 125 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 127 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 127 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 129 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 129 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 131 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 131 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'comma_join', position: 145 } + console.log src/parser/parser.ts:79 + ret = { value: 'comma_join', type: 'variable', position: 145 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'seq', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'seq', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reduce', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'reduce', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'seq', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'seq', type: 'variable', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 54 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 54 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 58 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 58 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 61 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 61 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 65 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 65 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'seq', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'seq', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reduce', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'reduce', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'seq', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'seq', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'seq', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'seq', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reduce', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'reduce', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'seq', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'seq', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reduce', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'reduce', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'append', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'append', type: 'variable', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reduce', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'reduce', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'append', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'append', type: 'variable', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'product', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'product', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'power', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'power', type: 'variable', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 60 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 60 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 63 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 63 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 67 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 67 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 73 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 73 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 77 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 77 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 81 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 81 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reduce', position: 91 } + console.log src/parser/parser.ts:79 + ret = { value: 'reduce', type: 'variable', position: 91 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 94 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 94 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 98 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 98 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 103 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 103 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'product', position: 114 } + console.log src/parser/parser.ts:79 + ret = { value: 'product', type: 'variable', position: 114 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 120 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 120 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 123 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 123 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'power', position: 131 } + console.log src/parser/parser.ts:79 + ret = { value: 'power', type: 'variable', position: 131 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 133 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 133 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 136 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 136 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'seq', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'seq', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'reduce', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'reduce', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'seq', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'seq', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'data', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'data', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'one', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'one', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'two', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 53 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 53 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 57 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 57 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'zip', position: 73 } + console.log src/parser/parser.ts:79 + ret = { value: 'zip', type: 'variable', position: 73 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'data', position: 79 } + console.log src/parser/parser.ts:79 + ret = { value: 'data', type: 'variable', position: 79 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'one', position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 'one', type: 'name', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'data', position: 90 } + console.log src/parser/parser.ts:79 + ret = { value: 'data', type: 'variable', position: 90 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'two', position: 94 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'name', position: 94 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 101 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 101 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'data', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'data', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'one', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'one', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'two', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 53 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 53 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 57 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 57 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'data', position: 69 } + console.log src/parser/parser.ts:79 + ret = { value: 'data', type: 'variable', position: 69 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'zip', position: 74 } + console.log src/parser/parser.ts:79 + ret = { value: 'zip', type: 'variable', position: 74 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'one', position: 78 } + console.log src/parser/parser.ts:79 + ret = { value: 'one', type: 'name', position: 78 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'two', position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'name', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 92 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 92 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 97 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 97 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'data', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'data', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'one', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'one', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'two', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'literal', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'data', position: 53 } + console.log src/parser/parser.ts:79 + ret = { value: 'data', type: 'variable', position: 53 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'zip', position: 60 } + console.log src/parser/parser.ts:79 + ret = { value: 'zip', type: 'variable', position: 60 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'one', position: 64 } + console.log src/parser/parser.ts:79 + ret = { value: 'one', type: 'name', position: 64 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'two', position: 69 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'name', position: 69 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 78 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 78 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'data', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'data', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'one', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'one', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'two', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'data', position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: 'data', type: 'variable', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'zip', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 'zip', type: 'variable', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'one', position: 60 } + console.log src/parser/parser.ts:79 + ret = { value: 'one', type: 'name', position: 60 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'two', position: 65 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'name', position: 65 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'map', position: 74 } + console.log src/parser/parser.ts:79 + ret = { value: 'map', type: 'variable', position: 74 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 79 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 79 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'world', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'world', type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'world', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'world', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'operator', value: 'in', position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 'in', type: 'operator', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'world', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'world', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'world', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'world', type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'operator', value: 'in', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'in', type: 'operator', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'library', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'library', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'books', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'books', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Aho', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Aho', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'authors', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'authors', type: 'name', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'title', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'title', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'content', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'content', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'integration', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'integration', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'name', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'name', type: 'name', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'factorial', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'factorial', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'factorial', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 'factorial', type: 'variable', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 59 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 59 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 61 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 61 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'factorial', position: 75 } + console.log src/parser/parser.ts:79 + ret = { value: 'factorial', type: 'variable', position: 75 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 77 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 77 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'fibonacci', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'fibonacci', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'fibonacci', position: 53 } + console.log src/parser/parser.ts:79 + ret = { value: 'fibonacci', type: 'variable', position: 53 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 58 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 58 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'fibonacci', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'fibonacci', type: 'variable', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 75 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 75 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 77 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 77 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 85 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 85 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 87 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 87 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 89 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 89 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 91 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 91 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 93 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 93 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 7, position: 95 } + console.log src/parser/parser.ts:79 + ret = { value: 7, type: 'literal', position: 95 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 8, position: 97 } + console.log src/parser/parser.ts:79 + ret = { value: 8, type: 'literal', position: 97 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 9, position: 99 } + console.log src/parser/parser.ts:79 + ret = { value: 9, type: 'literal', position: 99 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'fibonacci', position: 111 } + console.log src/parser/parser.ts:79 + ret = { value: 'fibonacci', type: 'variable', position: 111 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 113 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 113 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'nth_price', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'nth_price', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 52 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 52 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 58 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 58 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'nth_price', position: 77 } + console.log src/parser/parser.ts:79 + ret = { value: 'nth_price', type: 'variable', position: 77 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 79 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 79 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'even', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'even', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 53 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 53 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 57 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 57 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 64 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 64 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'odd', position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: 'odd', type: 'variable', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 74 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 74 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 76 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 76 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'odd', position: 98 } + console.log src/parser/parser.ts:79 + ret = { value: 'odd', type: 'variable', position: 98 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 110 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 110 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 113 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 113 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 119 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 119 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 123 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 123 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 131 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 131 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'even', position: 139 } + console.log src/parser/parser.ts:79 + ret = { value: 'even', type: 'variable', position: 139 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 142 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 142 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 144 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 144 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'even', position: 167 } + console.log src/parser/parser.ts:79 + ret = { value: 'even', type: 'variable', position: 167 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 82, position: 170 } + console.log src/parser/parser.ts:79 + ret = { value: 82, type: 'literal', position: 170 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'even', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'even', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 53 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 53 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 57 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 57 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 64 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 64 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'odd', position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: 'odd', type: 'variable', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 74 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 74 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 76 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 76 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'odd', position: 99 } + console.log src/parser/parser.ts:79 + ret = { value: 'odd', type: 'variable', position: 99 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 111 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 111 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 114 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 114 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 120 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 120 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 124 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 124 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 132 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 132 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'even', position: 140 } + console.log src/parser/parser.ts:79 + ret = { value: 'even', type: 'variable', position: 140 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 143 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 143 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 145 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 145 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'even', position: 169 } + console.log src/parser/parser.ts:79 + ret = { value: 'even', type: 'variable', position: 169 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 65, position: 172 } + console.log src/parser/parser.ts:79 + ret = { value: 65, type: 'literal', position: 172 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'even', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'even', type: 'variable', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'odd', position: 63 } + console.log src/parser/parser.ts:79 + ret = { value: 'odd', type: 'variable', position: 63 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 66 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 66 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'odd', position: 87 } + console.log src/parser/parser.ts:79 + ret = { value: 'odd', type: 'variable', position: 87 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 99 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 99 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 102 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 102 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 108 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 108 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 112 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 112 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 120 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 120 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'even', position: 128 } + console.log src/parser/parser.ts:79 + ret = { value: 'even', type: 'variable', position: 128 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 131 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 131 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 133 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 133 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'odd', position: 152 } + console.log src/parser/parser.ts:79 + ret = { value: 'odd', type: 'variable', position: 152 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 65, position: 155 } + console.log src/parser/parser.ts:79 + ret = { value: 65, type: 'literal', position: 155 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'gcd', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'gcd', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'λ', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'gcd', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'gcd', type: 'variable', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'gcd', position: 60 } + console.log src/parser/parser.ts:79 + ret = { value: 'gcd', type: 'variable', position: 60 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 8, position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 8, type: 'literal', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 12, position: 65 } + console.log src/parser/parser.ts:79 + ret = { value: 12, type: 'literal', position: 65 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'gcd', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'gcd', type: 'variable', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 9, position: 74 } + console.log src/parser/parser.ts:79 + ret = { value: 9, type: 'literal', position: 74 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 12, position: 77 } + console.log src/parser/parser.ts:79 + ret = { value: 12, type: 'literal', position: 77 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'range', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'range', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'start', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'start', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'end', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'end', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'step', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'step', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'step', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 'step', type: 'variable', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'step', position: 63 } + console.log src/parser/parser.ts:79 + ret = { value: 'step', type: 'variable', position: 63 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'step', position: 69 } + console.log src/parser/parser.ts:79 + ret = { value: 'step', type: 'variable', position: 69 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'start', position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 'start', type: 'variable', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'step', position: 89 } + console.log src/parser/parser.ts:79 + ret = { value: 'step', type: 'variable', position: 89 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'end', position: 96 } + console.log src/parser/parser.ts:79 + ret = { value: 'end', type: 'variable', position: 96 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'start', position: 105 } + console.log src/parser/parser.ts:79 + ret = { value: 'start', type: 'variable', position: 105 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'append', position: 115 } + console.log src/parser/parser.ts:79 + ret = { value: 'append', type: 'variable', position: 115 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'start', position: 122 } + console.log src/parser/parser.ts:79 + ret = { value: 'start', type: 'variable', position: 122 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'range', position: 130 } + console.log src/parser/parser.ts:79 + ret = { value: 'range', type: 'variable', position: 130 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'start', position: 137 } + console.log src/parser/parser.ts:79 + ret = { value: 'start', type: 'variable', position: 137 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'step', position: 143 } + console.log src/parser/parser.ts:79 + ret = { value: 'step', type: 'variable', position: 143 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'end', position: 149 } + console.log src/parser/parser.ts:79 + ret = { value: 'end', type: 'variable', position: 149 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'step', position: 156 } + console.log src/parser/parser.ts:79 + ret = { value: 'step', type: 'variable', position: 156 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'range', position: 172 } + console.log src/parser/parser.ts:79 + ret = { value: 'range', type: 'variable', position: 172 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 174 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 174 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 15, position: 177 } + console.log src/parser/parser.ts:79 + ret = { value: 15, type: 'literal', position: 177 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'range', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'range', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'start', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'start', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'end', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'end', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'step', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'step', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'step', position: 57 } + console.log src/parser/parser.ts:79 + ret = { value: 'step', type: 'variable', position: 57 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'step', position: 65 } + console.log src/parser/parser.ts:79 + ret = { value: 'step', type: 'variable', position: 65 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'step', position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: 'step', type: 'variable', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 73 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 73 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'start', position: 89 } + console.log src/parser/parser.ts:79 + ret = { value: 'start', type: 'variable', position: 89 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'step', position: 95 } + console.log src/parser/parser.ts:79 + ret = { value: 'step', type: 'variable', position: 95 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'end', position: 102 } + console.log src/parser/parser.ts:79 + ret = { value: 'end', type: 'variable', position: 102 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'start', position: 111 } + console.log src/parser/parser.ts:79 + ret = { value: 'start', type: 'variable', position: 111 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'append', position: 121 } + console.log src/parser/parser.ts:79 + ret = { value: 'append', type: 'variable', position: 121 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'start', position: 128 } + console.log src/parser/parser.ts:79 + ret = { value: 'start', type: 'variable', position: 128 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'range', position: 136 } + console.log src/parser/parser.ts:79 + ret = { value: 'range', type: 'variable', position: 136 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'start', position: 143 } + console.log src/parser/parser.ts:79 + ret = { value: 'start', type: 'variable', position: 143 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'step', position: 149 } + console.log src/parser/parser.ts:79 + ret = { value: 'step', type: 'variable', position: 149 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'end', position: 155 } + console.log src/parser/parser.ts:79 + ret = { value: 'end', type: 'variable', position: 155 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'step', position: 162 } + console.log src/parser/parser.ts:79 + ret = { value: 'step', type: 'variable', position: 162 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'range', position: 178 } + console.log src/parser/parser.ts:79 + ret = { value: 'range', type: 'variable', position: 178 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 180 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 180 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 15, position: 183 } + console.log src/parser/parser.ts:79 + ret = { value: 15, type: 'literal', position: 183 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 185 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 185 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Wayne\'s World', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Wayne\'s World', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 42, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 42, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 42, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 42, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3.14159, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 3.14159, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6.022e+23, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 6.022e+23, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1.602e-19, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1.602e-19, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello\tworld', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello\tworld', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello\nworld', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello\nworld', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello "world"', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello "world"', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'C:\\Test\\test.txt', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'C:\\Test\\test.txt', type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'λ-calculus rocks', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'λ-calculus rocks', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '𝄞', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: '𝄞', type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fdf', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'fdf', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fdf', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'fdf', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ett', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'ett', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fdf', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'fdf', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ett', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'ett', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 10, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fdf', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'fdf', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ett', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'ett', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'vc', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'vc', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 10, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fdf', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'fdf', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ett', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'ett', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 27, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 27, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'fdsd', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'fdsd', type: 'variable', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 10, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 8, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 8, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 10, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 8, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 8, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 10, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 10, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 8, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 8, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'not', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'not', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'true', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'true', type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'false', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'false', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'null', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'null', type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: null, position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: null, type: 'literal', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 24, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 24, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'notexist', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'notexist', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'notexist', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'notexist', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1e+301, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1e+301, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1e+101, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 1e+101, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '5', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: '5', type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '5', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: '5', type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'notexist', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'notexist', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'key', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'key', type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'value', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'value', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'one', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'one', type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'two', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'one', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'one', type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'two', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'two', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'one', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'one', type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'two', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'three', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'three', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'four', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'four', type: 'literal', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '4', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: '4', type: 'literal', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'one', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'one', type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'two', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'two', type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'four', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'four', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'test', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'test', type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ProductID', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'ProductID', type: 'name', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ProductID', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'ProductID', type: 'name', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'string', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'string', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ProductID', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'ProductID', type: 'name', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ProductID', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'ProductID', type: 'name', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ProductID', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'ProductID', type: 'name', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 52 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 52 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 63 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 63 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 70 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 70 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product Name', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'name', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product Name', position: 59 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'name', position: 59 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 66 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 66 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'TotalPrice', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: 'TotalPrice', type: 'literal', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 73 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 73 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Items', position: 87 } + console.log src/parser/parser.ts:79 + ret = { value: 'Items', type: 'literal', position: 87 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 96 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 96 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 111 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 111 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Order', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ID', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'ID', type: 'literal', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'literal', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Name', position: 89 } + console.log src/parser/parser.ts:79 + ret = { value: 'Name', type: 'literal', position: 89 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 92 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 92 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 107 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 107 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'SKU', position: 123 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU', type: 'literal', position: 123 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ProductID', position: 134 } + console.log src/parser/parser.ts:79 + ret = { value: 'ProductID', type: 'name', position: 134 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Details', position: 154 } + console.log src/parser/parser.ts:79 + ret = { value: 'Details', type: 'literal', position: 154 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Weight', position: 177 } + console.log src/parser/parser.ts:79 + ret = { value: 'Weight', type: 'literal', position: 177 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 190 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 190 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Weight', position: 197 } + console.log src/parser/parser.ts:79 + ret = { value: 'Weight', type: 'name', position: 197 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Dimensions', position: 222 } + console.log src/parser/parser.ts:79 + ret = { value: 'Dimensions', type: 'literal', position: 222 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 235 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 235 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Width', position: 242 } + console.log src/parser/parser.ts:79 + ret = { value: 'Width', type: 'name', position: 242 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' x ', position: 250 } + console.log src/parser/parser.ts:79 + ret = { value: ' x ', type: 'literal', position: 250 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Height', position: 259 } + console.log src/parser/parser.ts:79 + ret = { value: 'Height', type: 'name', position: 259 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' x ', position: 267 } + console.log src/parser/parser.ts:79 + ret = { value: ' x ', type: 'literal', position: 267 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Depth', position: 275 } + console.log src/parser/parser.ts:79 + ret = { value: 'Depth', type: 'name', position: 275 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Total Price', position: 316 } + console.log src/parser/parser.ts:79 + ret = { value: 'Total Price', type: 'literal', position: 316 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 322 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 322 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 330 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 330 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 337 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 337 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 348 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 348 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Order', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ID', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'ID', type: 'literal', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'literal', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Name', position: 89 } + console.log src/parser/parser.ts:79 + ret = { value: 'Name', type: 'literal', position: 89 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product Name', position: 105 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'name', position: 105 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'SKU', position: 121 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU', type: 'literal', position: 121 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ProductID', position: 132 } + console.log src/parser/parser.ts:79 + ret = { value: 'ProductID', type: 'name', position: 132 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Details', position: 152 } + console.log src/parser/parser.ts:79 + ret = { value: 'Details', type: 'literal', position: 152 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Weight', position: 175 } + console.log src/parser/parser.ts:79 + ret = { value: 'Weight', type: 'literal', position: 175 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 188 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 188 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Weight', position: 195 } + console.log src/parser/parser.ts:79 + ret = { value: 'Weight', type: 'name', position: 195 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Dimensions', position: 220 } + console.log src/parser/parser.ts:79 + ret = { value: 'Dimensions', type: 'literal', position: 220 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 233 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 233 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Width', position: 240 } + console.log src/parser/parser.ts:79 + ret = { value: 'Width', type: 'name', position: 240 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' x ', position: 248 } + console.log src/parser/parser.ts:79 + ret = { value: ' x ', type: 'literal', position: 248 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Height', position: 257 } + console.log src/parser/parser.ts:79 + ret = { value: 'Height', type: 'name', position: 257 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' x ', position: 265 } + console.log src/parser/parser.ts:79 + ret = { value: ' x ', type: 'literal', position: 265 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Depth', position: 273 } + console.log src/parser/parser.ts:79 + ret = { value: 'Depth', type: 'name', position: 273 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Total Price', position: 314 } + console.log src/parser/parser.ts:79 + ret = { value: 'Total Price', type: 'literal', position: 314 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 320 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 320 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 328 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 328 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 335 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 335 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 346 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 346 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Phone', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'Phone', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'type', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'type', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'join', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'join', type: 'variable', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'number', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ', ', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: ', ', type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'phone', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'phone', type: 'literal', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'number', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'name', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'add', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add2', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: 'add2', type: 'variable', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'add', type: 'variable', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add2', position: 64 } + console.log src/parser/parser.ts:79 + ret = { value: 'add2', type: 'variable', position: 64 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 66 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 66 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'add', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'y', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'variable', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add2', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: 'add2', type: 'variable', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'add', type: 'variable', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 52 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 52 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'add2', position: 64 } + console.log src/parser/parser.ts:79 + ret = { value: 'add2', type: 'variable', position: 64 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 66 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 66 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'firstn', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'firstn', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'first5', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: 'first5', type: 'variable', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'firstn', position: 54 } + console.log src/parser/parser.ts:79 + ret = { value: 'firstn', type: 'variable', position: 54 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 59 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 59 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'first5', position: 70 } + console.log src/parser/parser.ts:79 + ret = { value: 'first5', type: 'variable', position: 70 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 84 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 84 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'str', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'str', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'start', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'start', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'length', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'length', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: '_', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: '_', type: 'name', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'substring', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'unknown', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'unknown', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'x', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'y', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'number', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'clues', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'clues', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'x', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'y', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'number', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'x', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'y', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'y', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'number', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Colour', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'Colour', type: 'name', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'purple', position: 63 } + console.log src/parser/parser.ts:79 + ret = { value: 'purple', type: 'literal', position: 63 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 66 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 66 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 73 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 73 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'blah', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'blah', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'fud', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'blah', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'baz', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'fud', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'blah.baz', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah.baz', type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'fud', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah.baz', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah.baz', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 9, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 9, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 9, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 9, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 9, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 9, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 22, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 22, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1.1, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 1.1, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5.5, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 5.5, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbxabbcc', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbxabbcc', type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /b+/g, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: /b+/g, type: 'regex', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbxabbcc', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbxabbcc', type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /b+/g, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: /b+/g, type: 'regex', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'split', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'split', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbxabbcc', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbxabbcc', type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /d+/g, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: /d+/g, type: 'regex', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'contains', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'contains', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbxabbcc', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbxabbcc', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /ab+/g, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: /ab+/g, type: 'regex', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'contains', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'contains', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbxabbcc', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbxabbcc', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /ax+/g, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: /ax+/g, type: 'regex', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'contains', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'contains', type: 'variable', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /hat/g, position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: /hat/g, type: 'regex', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ProductID', position: 67 } + console.log src/parser/parser.ts:79 + ret = { value: 'ProductID', type: 'name', position: 67 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'contains', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'contains', type: 'variable', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /hat/gi, position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: /hat/gi, type: 'regex', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ProductID', position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 'ProductID', type: 'name', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbxabbcc', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbxabbcc', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /b+/g, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: /b+/g, type: 'regex', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'yy', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'yy', type: 'literal', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbxabbcc', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbxabbcc', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /b+/g, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: /b+/g, type: 'regex', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'yy', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'yy', type: 'literal', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbxabbcc', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbxabbcc', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /b+/g, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: /b+/g, type: 'regex', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'yy', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'yy', type: 'literal', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ababbxabbcc', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'ababbxabbcc', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /d+/g, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: /d+/g, type: 'regex', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'yy', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'yy', type: 'literal', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'John Smith', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'John Smith', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /(\w+)\s(\w+)/g, position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: /(\w+)\s(\w+)/g, type: 'regex', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '$2, $1', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: '$2, $1', type: 'literal', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '265USD', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: '265USD', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /([0-9]+)USD/g, position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: /([0-9]+)USD/g, type: 'regex', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '$$$1', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: '$$$1', type: 'literal', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '265USD', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: '265USD', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /([0-9]+)USD/g, position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: /([0-9]+)USD/g, type: 'regex', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '$w', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: '$w', type: 'literal', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '265USD', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: '265USD', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /([0-9]+)USD/g, position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: /([0-9]+)USD/g, type: 'regex', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '$0 -> $$$1', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: '$0 -> $$$1', type: 'literal', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '265USD', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: '265USD', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /([0-9]+)USD/g, position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: /([0-9]+)USD/g, type: 'regex', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '$0$1$2', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: '$0$1$2', type: 'literal', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'abcd', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'abcd', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /(ab)|(a)/g, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: /(ab)|(a)/g, type: 'regex', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '[1=$1][2=$2]', position: 43 } + console.log src/parser/parser.ts:79 + ret = { value: '[1=$1][2=$2]', type: 'literal', position: 43 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'abracadabra', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'abracadabra', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /bra/g, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: /bra/g, type: 'regex', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '*', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: '*', type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'abracadabra', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'abracadabra', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /a.*a/g, position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: /a.*a/g, type: 'regex', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '*', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: '*', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'abracadabra', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'abracadabra', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /a.*?a/g, position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: /a.*?a/g, type: 'regex', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '*', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: '*', type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'abracadabra', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'abracadabra', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /a/g, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: /a/g, type: 'regex', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'abracadabra', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'abracadabra', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /a(.)/g, position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: /a(.)/g, type: 'regex', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'a$1$1', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'a$1$1', type: 'literal', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'abracadabra', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'abracadabra', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /.*?/g, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: /.*?/g, type: 'regex', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '$1', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: '$1', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'AAAA', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'AAAA', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /A+/g, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: /A+/g, type: 'regex', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'b', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'AAAA', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'AAAA', type: 'literal', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /A+?/g, position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: /A+?/g, type: 'regex', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'b', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'darted', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'darted', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /^(.*?)d(.*)$/g, position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: /^(.*?)d(.*)$/g, type: 'regex', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '$1c$2', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: '$1c$2', type: 'literal', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'abcdefghijklmno', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'abcdefghijklmno', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', + value: /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)/g, + position: 69 } + console.log src/parser/parser.ts:79 + ret = { value: /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)/g, + type: 'regex', + position: 69 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '$8$5$12$12$18$123', position: 90 } + console.log src/parser/parser.ts:79 + ret = { value: '$8$5$12$12$18$123', type: 'literal', position: 90 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'abcdefghijklmno', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'abcdefghijklmno', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /xyz/g, position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: /xyz/g, type: 'regex', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '$8$5$12$12$18$123', position: 54 } + console.log src/parser/parser.ts:79 + ret = { value: '$8$5$12$12$18$123', type: 'literal', position: 54 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'abcdefghijklmno', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'abcdefghijklmno', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /ijk/g, position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: /ijk/g, type: 'regex', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '$8$5$12$12$18$123', position: 54 } + console.log src/parser/parser.ts:79 + ret = { value: '$8$5$12$12$18$123', type: 'literal', position: 54 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'abcdefghijklmno', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'abcdefghijklmno', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /(ijk)/g, position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: /(ijk)/g, type: 'regex', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '$8$5$12$12$18$123', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: '$8$5$12$12$18$123', type: 'literal', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'abcdefghijklmno', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'abcdefghijklmno', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /ijk/g, position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: /ijk/g, type: 'regex', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '$x', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: '$x', type: 'literal', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'abcdefghijklmno', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'abcdefghijklmno', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /(ijk)/g, position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: /(ijk)/g, type: 'regex', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '$x$', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: '$x$', type: 'literal', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /hat/gi, position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: /hat/gi, type: 'regex', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 65 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 65 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 81 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 81 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /(h)(at)/gi, position: 59 } + console.log src/parser/parser.ts:79 + ret = { value: /(h)(at)/gi, type: 'regex', position: 59 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 69 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 69 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 76 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 76 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 90 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 90 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 97 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 97 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'match', position: 103 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'name', position: 103 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', + value: 'temperature = 68F today', + position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'temperature = 68F today', + type: 'literal', + position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /(-?\d+(?:\.\d*)?)F\b/g, position: 58 } + console.log src/parser/parser.ts:79 + ret = { value: /(-?\d+(?:\.\d*)?)F\b/g, type: 'regex', position: 58 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'm', position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: 'm', type: 'variable', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'number', position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 'number', type: 'variable', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'm', position: 86 } + console.log src/parser/parser.ts:79 + ret = { value: 'm', type: 'variable', position: 86 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'groups', position: 93 } + console.log src/parser/parser.ts:79 + ret = { value: 'groups', type: 'name', position: 93 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 95 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 95 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 32, position: 102 } + console.log src/parser/parser.ts:79 + ret = { value: 32, type: 'literal', position: 102 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 107 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 107 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 9, position: 109 } + console.log src/parser/parser.ts:79 + ret = { value: 9, type: 'literal', position: 109 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'C', position: 115 } + console.log src/parser/parser.ts:79 + ret = { value: 'C', type: 'literal', position: 115 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /hat/gi, position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: /hat/gi, type: 'regex', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 65 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 65 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 80 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 80 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'replace', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'replace', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product Name', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product Name', type: 'literal', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'regex', value: /hat/gi, position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: /hat/gi, type: 'regex', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 65 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 65 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'match', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'match', type: 'variable', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 42, position: 78 } + console.log src/parser/parser.ts:79 + ret = { value: 42, type: 'literal', position: 78 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest0', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest0', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nest1', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'nest1', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bazz', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'bazz', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.2, position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 0.2, type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '$', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: '$', type: 'variable', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 30, position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 30, type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1.1, position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 1.1, type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0.9, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 0.9, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Colour', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'Colour', type: 'name', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'SKU', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 52 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 52 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Colour', position: 59 } + console.log src/parser/parser.ts:79 + ret = { value: 'Colour', type: 'name', position: 59 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Colour', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'Colour', type: 'name', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 64 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 64 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Colour', position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: 'Colour', type: 'name', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Colour', position: 52 } + console.log src/parser/parser.ts:79 + ret = { value: 'Colour', type: 'name', position: 52 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 65 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 65 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Colour', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'Colour', type: 'name', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'SKU', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'SKU', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'SKU', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'SKU', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'SKU', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'SKU', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'bar', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'none', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'none', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'none', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'none', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'here', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'here', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'blah', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'fud', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'fud', type: 'name', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'hello', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'hello', type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Prices: ', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'Prices: ', type: 'literal', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 66 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 66 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'factorial', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'factorial', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'factorial', position: 58 } + console.log src/parser/parser.ts:79 + ret = { value: 'factorial', type: 'variable', position: 58 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 61 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 61 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 65 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 65 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'factorial', position: 80 } + console.log src/parser/parser.ts:79 + ret = { value: 'factorial', type: 'variable', position: 80 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 99, position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 99, type: 'literal', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'factorial', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'factorial', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'factorial', position: 58 } + console.log src/parser/parser.ts:79 + ret = { value: 'factorial', type: 'variable', position: 58 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 61 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 61 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 65 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 65 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'factorial', position: 80 } + console.log src/parser/parser.ts:79 + ret = { value: 'factorial', type: 'variable', position: 80 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 100, position: 84 } + console.log src/parser/parser.ts:79 + ret = { value: 100, type: 'literal', position: 84 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'factorial', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'factorial', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'iter', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'iter', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 52 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 52 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'acc', position: 61 } + console.log src/parser/parser.ts:79 + ret = { value: 'acc', type: 'variable', position: 61 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 76 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 76 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'acc', position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 'acc', type: 'variable', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'iter', position: 91 } + console.log src/parser/parser.ts:79 + ret = { value: 'iter', type: 'variable', position: 91 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 94 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 94 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 98 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 98 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 102 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 102 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'acc', position: 109 } + console.log src/parser/parser.ts:79 + ret = { value: 'acc', type: 'variable', position: 109 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'iter', position: 125 } + console.log src/parser/parser.ts:79 + ret = { value: 'iter', type: 'variable', position: 125 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 128 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 128 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 131 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 131 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'factorial', position: 149 } + console.log src/parser/parser.ts:79 + ret = { value: 'factorial', type: 'variable', position: 149 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 151 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 151 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'factorial', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'factorial', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'iter', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'iter', type: 'variable', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 52 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 52 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'acc', position: 61 } + console.log src/parser/parser.ts:79 + ret = { value: 'acc', type: 'variable', position: 61 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 76 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 76 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'acc', position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 'acc', type: 'variable', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'iter', position: 91 } + console.log src/parser/parser.ts:79 + ret = { value: 'iter', type: 'variable', position: 91 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 94 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 94 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 98 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 98 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 102 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 102 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'acc', position: 109 } + console.log src/parser/parser.ts:79 + ret = { value: 'acc', type: 'variable', position: 109 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'iter', position: 125 } + console.log src/parser/parser.ts:79 + ret = { value: 'iter', type: 'variable', position: 125 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 128 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 128 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 131 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 131 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'factorial', position: 149 } + console.log src/parser/parser.ts:79 + ret = { value: 'factorial', type: 'variable', position: 149 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 150, position: 153 } + console.log src/parser/parser.ts:79 + ret = { value: 150, type: 'literal', position: 153 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'inf', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'inf', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'inf', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'inf', type: 'variable', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'inf', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'inf', type: 'variable', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'inf', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'inf', type: 'variable', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'inf', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'inf', type: 'variable', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'inf', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'inf', type: 'variable', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'even', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'even', type: 'variable', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 39 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 39 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: true, position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: true, type: 'literal', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'odd', position: 63 } + console.log src/parser/parser.ts:79 + ret = { value: 'odd', type: 'variable', position: 63 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 66 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 66 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'odd', position: 87 } + console.log src/parser/parser.ts:79 + ret = { value: 'odd', type: 'variable', position: 87 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 99 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 99 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 102 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 102 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 108 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 108 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 112 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 112 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: false, position: 120 } + console.log src/parser/parser.ts:79 + ret = { value: false, type: 'literal', position: 120 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'even', position: 128 } + console.log src/parser/parser.ts:79 + ret = { value: 'even', type: 'variable', position: 128 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'n', position: 131 } + console.log src/parser/parser.ts:79 + ret = { value: 'n', type: 'variable', position: 131 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 133 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 133 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'odd', position: 152 } + console.log src/parser/parser.ts:79 + ret = { value: 'odd', type: 'variable', position: 152 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6555, position: 157 } + console.log src/parser/parser.ts:79 + ret = { value: 6555, type: 'literal', position: 157 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Order', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'literal', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ID', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'ID', type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product', position: 52 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'literal', position: 52 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 61 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 61 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'SKU', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU', type: 'literal', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ProductID', position: 83 } + console.log src/parser/parser.ts:79 + ret = { value: 'ProductID', type: 'name', position: 83 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Details', position: 97 } + console.log src/parser/parser.ts:79 + ret = { value: 'Details', type: 'literal', position: 97 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Weight', position: 114 } + console.log src/parser/parser.ts:79 + ret = { value: 'Weight', type: 'literal', position: 114 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 127 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 127 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Weight', position: 134 } + console.log src/parser/parser.ts:79 + ret = { value: 'Weight', type: 'name', position: 134 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Dimensions', position: 153 } + console.log src/parser/parser.ts:79 + ret = { value: 'Dimensions', type: 'literal', position: 153 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Description', position: 166 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'name', position: 166 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Width', position: 173 } + console.log src/parser/parser.ts:79 + ret = { value: 'Width', type: 'name', position: 173 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' x ', position: 181 } + console.log src/parser/parser.ts:79 + ret = { value: ' x ', type: 'literal', position: 181 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Height', position: 190 } + console.log src/parser/parser.ts:79 + ret = { value: 'Height', type: 'name', position: 190 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' x ', position: 198 } + console.log src/parser/parser.ts:79 + ret = { value: ' x ', type: 'literal', position: 198 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Depth', position: 206 } + console.log src/parser/parser.ts:79 + ret = { value: 'Depth', type: 'name', position: 206 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Total Price', position: 231 } + console.log src/parser/parser.ts:79 + ret = { value: 'Total Price', type: 'literal', position: 231 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 237 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 237 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 245 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 245 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 252 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 252 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 263 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 263 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'tempReadings', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'tempReadings', type: 'variable', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'count', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'count', type: 'variable', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'state', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'state', type: 'name', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'tempReadings', position: 63 } + console.log src/parser/parser.ts:79 + ret = { value: 'tempReadings', type: 'name', position: 63 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'state', position: 91 } + console.log src/parser/parser.ts:79 + ret = { value: 'state', type: 'name', position: 91 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'tempReadings', position: 104 } + console.log src/parser/parser.ts:79 + ret = { value: 'tempReadings', type: 'name', position: 104 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 107 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 107 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 110 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 110 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'event', position: 119 } + console.log src/parser/parser.ts:79 + ret = { value: 'event', type: 'name', position: 119 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 't', position: 121 } + console.log src/parser/parser.ts:79 + ret = { value: 't', type: 'name', position: 121 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'state', position: 145 } + console.log src/parser/parser.ts:79 + ret = { value: 'state', type: 'name', position: 145 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'tempReadings', position: 158 } + console.log src/parser/parser.ts:79 + ret = { value: 'tempReadings', type: 'name', position: 158 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'event', position: 165 } + console.log src/parser/parser.ts:79 + ret = { value: 'event', type: 'name', position: 165 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 't', position: 167 } + console.log src/parser/parser.ts:79 + ret = { value: 't', type: 'name', position: 167 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'tempReadings', position: 217 } + console.log src/parser/parser.ts:79 + ret = { value: 'tempReadings', type: 'literal', position: 217 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'tempReadings', position: 232 } + console.log src/parser/parser.ts:79 + ret = { value: 'tempReadings', type: 'variable', position: 232 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'sumTemperatures', position: 263 } + console.log src/parser/parser.ts:79 + ret = { value: 'sumTemperatures', type: 'literal', position: 263 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'sum', position: 269 } + console.log src/parser/parser.ts:79 + ret = { value: 'sum', type: 'variable', position: 269 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'tempReadings', position: 283 } + console.log src/parser/parser.ts:79 + ret = { value: 'tempReadings', type: 'variable', position: 283 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'avgTemperature', position: 314 } + console.log src/parser/parser.ts:79 + ret = { value: 'avgTemperature', type: 'literal', position: 314 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'average', position: 324 } + console.log src/parser/parser.ts:79 + ret = { value: 'average', type: 'variable', position: 324 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'tempReadings', position: 338 } + console.log src/parser/parser.ts:79 + ret = { value: 'tempReadings', type: 'variable', position: 338 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'round', position: 349 } + console.log src/parser/parser.ts:79 + ret = { value: 'round', type: 'variable', position: 349 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 351 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 351 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'maxTemperature', position: 382 } + console.log src/parser/parser.ts:79 + ret = { value: 'maxTemperature', type: 'literal', position: 382 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'max', position: 388 } + console.log src/parser/parser.ts:79 + ret = { value: 'max', type: 'variable', position: 388 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'tempReadings', position: 402 } + console.log src/parser/parser.ts:79 + ret = { value: 'tempReadings', type: 'variable', position: 402 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'minTemperature', position: 433 } + console.log src/parser/parser.ts:79 + ret = { value: 'minTemperature', type: 'literal', position: 433 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'min', position: 439 } + console.log src/parser/parser.ts:79 + ret = { value: 'min', type: 'variable', position: 439 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'tempReadings', position: 453 } + console.log src/parser/parser.ts:79 + ret = { value: 'tempReadings', type: 'variable', position: 453 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'Foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'food', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'food', type: 'name', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'maz', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'maz', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'rar', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'rar', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'jee', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'jee', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'par', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'par', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'waa', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'waa', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salutation', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salutation', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: '敷', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: '敷', type: 'name', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Español', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'Español', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 12 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 12 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'NI.Number', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'NI.Number', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'COMPENSATION IS : ', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'COMPENSATION IS : ', type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', + value: 'Executive.Compensation', + position: 69 } + console.log src/parser/parser.ts:79 + ret = { value: 'Executive.Compensation', + type: 'literal', + position: 69 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello', type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salutation', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salutation', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '鯵噂ソ竹', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: '鯵噂ソ竹', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Name', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Name', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' is happy', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: ' is happy', type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Name', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Name', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', + value: ' is pleased to employ ', + position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: ' is pleased to employ ', + type: 'literal', + position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salutation', position: 55 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salutation', type: 'name', position: 55 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' ', position: 61 } + console.log src/parser/parser.ts:79 + ret = { value: ' ', type: 'literal', position: 61 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Surname', position: 71 } + console.log src/parser/parser.ts:79 + ret = { value: 'Surname', type: 'name', position: 71 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello ', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello ', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salutation', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salutation', type: 'name', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' ', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: ' ', type: 'literal', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Surname', position: 48 } + console.log src/parser/parser.ts:79 + ret = { value: 'Surname', type: 'name', position: 48 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salutation', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salutation', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' ', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: ' ', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Surname', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'Surname', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' - has ', position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: ' - has ', type: 'literal', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Cars', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 'Cars', type: 'name', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' registered cars', position: 77 } + console.log src/parser/parser.ts:79 + ret = { value: ' registered cars', type: 'literal', position: 77 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'ContractType', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'ContractType', type: 'name', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hola', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hola', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'l', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'l', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hola', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hola', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'l', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'l', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hola', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hola', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Q', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Q', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hola', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hola', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '鯵噂ソ竹', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: '鯵噂ソ竹', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ソ', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'ソ', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Coca', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'Coca', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Cola', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'Cola', type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ca', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'ca', type: 'literal', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salutation', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salutation', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' ', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: ' ', type: 'literal', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'MiddleName', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'MiddleName', type: 'name', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' ', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: ' ', type: 'literal', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Surname', position: 60 } + console.log src/parser/parser.ts:79 + ret = { value: 'Surname', type: 'name', position: 60 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'MiddleName', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'MiddleName', type: 'name', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salutation', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salutation', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' ', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: ' ', type: 'literal', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Role', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'Role', type: 'name', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salutation', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salutation', type: 'name', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hola', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hola', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'l', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'l', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hola', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hola', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Q', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Q', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Role', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'Role', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' (', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: ' (', type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Role', position: 52 } + console.log src/parser/parser.ts:79 + ret = { value: 'Role', type: 'name', position: 52 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ')', position: 58 } + console.log src/parser/parser.ts:79 + ret = { value: ')', type: 'literal', position: 58 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Years', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'Years', type: 'name', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' years of employment', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: ' years of employment', type: 'literal', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salutation', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salutation', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' ', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: ' ', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Surname', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'Surname', type: 'name', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' - has ', position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: ' - has ', type: 'literal', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 62 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 62 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Years', position: 68 } + console.log src/parser/parser.ts:79 + ret = { value: 'Years', type: 'name', position: 68 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: ' years of employment', position: 93 } + console.log src/parser/parser.ts:79 + ret = { value: ' years of employment', type: 'literal', position: 93 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Role', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'Role', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 7, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 7, type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Role', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'Role', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Cars', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'Cars', type: 'name', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', + value: 'Missing close brackets', + position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'Missing close brackets', + type: 'literal', + position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'unknown', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'unknown', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salutation', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salutation', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'decrypt', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'decrypt', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salutation', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salutation', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'authentication', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'authentication', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salutation', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salutation', type: 'name', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Invalid', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'Invalid', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Invalid', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'Invalid', type: 'name', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Coca', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'Coca', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Cola', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'Cola', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salary', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salary', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 20, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20.55, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20.55, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'lowercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'lowercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Qualifications', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'Qualifications', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Coca', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'Coca', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Cola', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'Cola', type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salary', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salary', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 28, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 28, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 20.55, position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 20.55, type: 'literal', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Cars', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'Cars', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'uppercase', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'uppercase', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Qualifications', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'Qualifications', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Coca', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'Coca', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ca', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'ca', type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salary', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salary', type: 'name', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'xx', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'xx', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 22, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 22, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'xx', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'xx', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 22.55, position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 22.55, type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'xx', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'xx', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '22', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: '22', type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '22.55', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: '22.55', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'xx', position: 32 } + console.log src/parser/parser.ts:79 + ret = { value: 'xx', type: 'literal', position: 32 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringBefore', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringBefore', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Qualifications', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'Qualifications', type: 'name', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'xx', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'xx', type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Coca', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'Coca', type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ca', position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 'ca', type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salary', position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salary', type: 'name', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'xx', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'xx', type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 22, position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 22, type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'xx', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'xx', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 22.55, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 22.55, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'xx', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'xx', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '22', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: '22', type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: '22.55', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: '22.55', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'xx', position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 'xx', type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substringAfter', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'substringAfter', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Qualifications', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'Qualifications', type: 'name', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'xx', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'xx', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Coca', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'Coca', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'ca', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'ca', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Coca', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'Coca', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Mr', position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 'Mr', type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Coca', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'Coca', type: 'literal', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Whoops', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'Whoops', type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Salary', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'Salary', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 4, position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 4, type: 'literal', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello', type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'World', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'World', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello', type: 'literal', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'World', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'World', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Hello World', position: 24 } + console.log src/parser/parser.ts:79 + ret = { value: 'Hello World', type: 'literal', position: 24 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5.5, position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 5.5, type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Employment', position: 21 } + console.log src/parser/parser.ts:79 + ret = { value: 'Employment', type: 'name', position: 21 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'xx', position: 26 } + console.log src/parser/parser.ts:79 + ret = { value: 'xx', type: 'literal', position: 26 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'substring', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'substring', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Qualifications', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'Qualifications', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 6, position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 6, type: 'literal', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 29 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 29 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'detail', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'detail', type: 'name', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'contents', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'contents', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'detail', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'detail', type: 'name', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'meta', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'meta', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'detail', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'detail', type: 'name', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'meta', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'meta', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Total', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'Total', type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Description', position: 67 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'literal', position: 67 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'SKU', position: 74 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU', type: 'literal', position: 74 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 25 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 25 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Total', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'Total', type: 'literal', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 40 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 40 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Description', position: 65 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'literal', position: 65 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'SKU', position: 72 } + console.log src/parser/parser.ts:79 + ret = { value: 'SKU', type: 'literal', position: 72 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Total', position: 36 } + console.log src/parser/parser.ts:79 + ret = { value: 'Total', type: 'literal', position: 36 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Quantity', position: 51 } + console.log src/parser/parser.ts:79 + ret = { value: 'Quantity', type: 'name', position: 51 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Price', position: 60 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'literal', position: 60 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 67 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 67 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1.2, position: 73 } + console.log src/parser/parser.ts:79 + ret = { value: 1.2, type: 'literal', position: 73 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Description', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'literal', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nomatch', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'nomatch', type: 'name', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Description', position: 49 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'literal', position: 49 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 20 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 20 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 31 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 31 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Description', position: 47 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'literal', position: 47 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'blah', position: 54 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'literal', position: 54 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Description', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'blah', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'blah', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nomatch', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'nomatch', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Description', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'Description', type: 'literal', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'blah', position: 37 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'literal', position: 37 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 22 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 22 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 17 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 17 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Product', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'literal', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'blah', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'literal', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nomatch', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'nomatch', type: 'name', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'clone', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'clone', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 16 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 16 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 28 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 28 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Order', position: 34 } + console.log src/parser/parser.ts:79 + ret = { value: 'Order', type: 'name', position: 34 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 42 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 42 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'blah', position: 50 } + console.log src/parser/parser.ts:79 + ret = { value: 'blah', type: 'literal', position: 50 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'foo', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'literal', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 11 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 11 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 15 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 15 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'function', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'function', type: 'name', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 30 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 30 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'g', position: 35 } + console.log src/parser/parser.ts:79 + ret = { value: 'g', type: 'variable', position: 35 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'f', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'f', type: 'variable', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'x', position: 41 } + console.log src/parser/parser.ts:79 + ret = { value: 'x', type: 'variable', position: 41 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'price', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'price', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'price', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'price', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'var', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'var', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '', position: 1 } + console.log src/parser/parser.ts:79 + ret = { value: '', type: 'variable', position: 1 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 5 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 5 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bar', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'bar', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 8 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 8 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 14 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 14 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'b', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'b', type: 'variable', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 5, position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 5, type: 'literal', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 23 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 23 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'a', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'a', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 1, position: 2 } + console.log src/parser/parser.ts:79 + ret = { value: 1, type: 'literal', position: 2 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 2, position: 4 } + console.log src/parser/parser.ts:79 + ret = { value: 2, type: 'literal', position: 4 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 3, position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 3, type: 'literal', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'v', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'v', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'foo', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'defined', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'defined', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'foo', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'foo', position: 46 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'variable', position: 46 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'foo', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'variable', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'defined', position: 19 } + console.log src/parser/parser.ts:79 + ret = { value: 'defined', type: 'literal', position: 19 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'foo', position: 27 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'variable', position: 27 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'nothing', position: 38 } + console.log src/parser/parser.ts:79 + ret = { value: 'nothing', type: 'name', position: 38 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: 'foo', position: 44 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'variable', position: 44 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'bazz', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: 'bazz', type: 'name', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'baz', position: 9 } + console.log src/parser/parser.ts:79 + ret = { value: 'baz', type: 'name', position: 9 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'foo', position: 3 } + console.log src/parser/parser.ts:79 + ret = { value: 'foo', type: 'name', position: 3 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 0, position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 0, type: 'literal', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'type', position: 6 } + console.log src/parser/parser.ts:79 + ret = { value: 'type', type: 'name', position: 6 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'home', position: 13 } + console.log src/parser/parser.ts:79 + ret = { value: 'home', type: 'literal', position: 13 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '$', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: '$', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Account Name', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account Name', type: 'literal', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Firefly', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'Firefly', type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'order104', position: 67 } + console.log src/parser/parser.ts:79 + ret = { value: 'order104', type: 'literal', position: 67 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 76 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 76 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 82 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 82 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 7 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 7 } + console.log src/parser/parser.ts:78 + alt = { type: 'variable', value: '$', position: 10 } + console.log src/parser/parser.ts:79 + ret = { value: '$', type: 'variable', position: 10 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account', position: 18 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account', type: 'name', position: 18 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Account Name', position: 33 } + console.log src/parser/parser.ts:79 + ret = { value: 'Account Name', type: 'name', position: 33 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'Firefly', position: 45 } + console.log src/parser/parser.ts:79 + ret = { value: 'Firefly', type: 'literal', position: 45 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'OrderID', position: 56 } + console.log src/parser/parser.ts:79 + ret = { value: 'OrderID', type: 'name', position: 56 } + console.log src/parser/parser.ts:78 + alt = { type: 'literal', value: 'order104', position: 67 } + console.log src/parser/parser.ts:79 + ret = { value: 'order104', type: 'literal', position: 67 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Product', position: 76 } + console.log src/parser/parser.ts:79 + ret = { value: 'Product', type: 'name', position: 76 } + console.log src/parser/parser.ts:78 + alt = { type: 'name', value: 'Price', position: 82 } + console.log src/parser/parser.ts:79 + ret = { value: 'Price', type: 'name', position: 82 } + + +Test Suites: 4 passed, 4 total +Tests: 1094 passed, 1094 total +Snapshots: 0 total +Time: 12.678s +Ran all test suites. +----------------|----------|----------|----------|----------|----------------| +File | % Stmts | % Branch | % Funcs | % Lines |Uncovered Lines | +----------------|----------|----------|----------|----------|----------------| +All files | 100 | 100 | 100 | 100 | | + src | 100 | 100 | 100 | 100 | | + constants.ts | 100 | 100 | 100 | 100 | | + evaluate.ts | 100 | 100 | 100 | 100 | | + functions.ts | 100 | 100 | 100 | 100 | | + index.ts | 100 | 100 | 100 | 100 | | + jsonata.ts | 100 | 100 | 100 | 100 | | + signatures.ts | 100 | 100 | 100 | 100 | | + tokenizer.ts | 100 | 100 | 100 | 100 | | + utils.ts | 100 | 100 | 100 | 100 | | + src/parser | 100 | 100 | 100 | 100 | | + index.ts | 100 | 100 | 100 | 100 | | + optimize.ts | 100 | 100 | 100 | 100 | | + parser.ts | 100 | 100 | 100 | 100 | | + tail_call.ts | 100 | 100 | 100 | 100 | | +----------------|----------|----------|----------|----------|----------------| +Done in 14.90s. diff --git a/test/.eslintrc b/test/.eslintrc deleted file mode 100644 index b921a70d..00000000 --- a/test/.eslintrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - // Rules ammendments - "rules": { - "strict": ["error", "global"], - } -} diff --git a/test/parser-recovery.js b/test/parser-recovery.js deleted file mode 100644 index 53a7be0e..00000000 --- a/test/parser-recovery.js +++ /dev/null @@ -1,448 +0,0 @@ -"use strict"; - -var jsonata = require('../jsonata'); -var assert = require('assert'); -var chai = require("chai"); -var expect = chai.expect; - -describe('Invoke parser with valid expression', function() { - describe('Account.Order[0]', function() { - it('should return ast', function() { - var expr = jsonata('Account.Order[0]', { recover: true }); - var ast = expr.ast(); - var expected_ast = { - "type": "path", - "steps": [ - { - "value": "Account", - "type": "name", - "position": 7 - }, - { - "value": "Order", - "type": "name", - "position": 13, - "predicate": [ - { - "value": 0, - "type": "literal", - "position": 15 - } - ] - } - ] - }; - var errors = expr.errors(); - var expected_errors = undefined; - assert.deepEqual(ast, expected_ast); - assert.deepEqual(errors, expected_errors); - }); - }); -}); - -describe('Invoke parser with incomplete expression', function() { - describe('Account.', function() { - it('should return ast', function() { - var expr = jsonata('Account.', { recover: true }); - var ast = expr.ast(); - var expected_ast = { - "type": "path", - "steps": [ - { - "value": "Account", - "type": "name", - "position": 7 - }, - { - "type": "error", - "error": { - "code": "S0207", - "position": 8, - "token": "(end)" - } - } - ] - }; - var errors = expr.errors(); - var expected_errors = [ - { - "code": "S0207", - "position": 8, - "token": "(end)" - } - ]; - assert.deepEqual(ast, expected_ast); - assert.deepEqual(errors, expected_errors); - }); - }); - - describe('Account[', function() { - it('should return ast', function() { - var expr = jsonata('Account[', { recover: true }); - var ast = expr.ast(); - var expected_ast = { - "type": "path", - "steps": [ - { - "value": "Account", - "type": "name", - "position": 7, - "predicate": [ - { - "type": "error", - "error": { - "code": "S0207", - "position": 8, - "token": "(end)" - } - } - ] - } - ] - }; - var errors = expr.errors(); - var expected_errors = [ - { - "code": "S0203", - "position": 8, - "token": "(end)", - "value": "]", - "remaining": [] - }, - { - "code": "S0207", - "position": 8, - "token": "(end)" - } - ]; - assert.deepEqual(ast, expected_ast); - assert.deepEqual(errors, expected_errors); - }); - }); - - describe('Account.Order[;0].Product', function() { - it('should return ast', function() { - var expr = jsonata('Account.Order[;0].Product', { recover: true }); - var ast = expr.ast(); - var expected_ast = { - "type": "path", - "steps": [ - { - "value": "Account", - "type": "name", - "position": 7 - }, - { - "value": "Order", - "type": "name", - "position": 13, - "predicate": [ - { - "code": "S0211", - "token": ";", - "position": 15, - "remaining": [ - {"value": 0, "type": "literal", "position": 16}, - {"type": "operator", "value": "]", "position": 17}, - {"type": "operator", "value": ".", "position": 18}, - {"type": "name", "value": "Product", "position": 25} - ], - "type": "error" - } - ] - } - ] - }; - var errors = expr.errors(); - var expected_errors = [ - { - "code": "S0211", - "token": ";", - "position": 15, - "remaining": [ - {"value": 0, "type": "literal", "position": 16}, - {"type": "operator", "value": "]", "position": 17}, - {"type": "operator", "value": ".", "position": 18}, - {"type": "name", "value": "Product", "position": 25} - ], - "type": "error" - }, - { - "code": "S0202", - "position": 16, - "token": "0", - "value": "]", - "remaining": [ - { - "value": 0, - "type": "literal", - "position": 16 - } - ] - } - ]; - assert.deepEqual(ast, expected_ast); - assert.deepEqual(errors, expected_errors); - }); - }); - - describe('Account.Order[0;].Product', function() { - it('should return ast', function() { - var expr = jsonata('Account.Order[0;].Product', { recover: true }); - var ast = expr.ast(); - var expected_ast = { - "type": "path", - "steps": [ - { - "value": "Account", - "type": "name", - "position": 7 - }, - { - "value": "Order", - "type": "name", - "position": 13, - "predicate": [ - { - "value": 0, - "type": "literal", - "position": 15 - } - ] - } - ] - }; - var errors = expr.errors(); - var expected_errors = [ - { - "code": "S0202", - "position": 16, - "token": ";", - "value": "]", - "remaining": [ - {"value": ";", "type": "operator", "position": 16}, - {"type": "operator", "value": "]", "position": 17}, - {"type": "operator", "value": ".", "position": 18}, - {"type": "name", "value": "Product", "position": 25} - ] - } - ]; - assert.deepEqual(ast, expected_ast); - assert.deepEqual(errors, expected_errors); - }); - }); - - describe('Account.Order[0].Product;', function() { - it('should return ast', function() { - var expr = jsonata('Account.Order[0].Product;', { recover: true }); - var ast = expr.ast(); - var expected_ast = { - "type": "path", - "steps": [ - { - "value": "Account", - "type": "name", - "position": 7 - }, - { - "value": "Order", - "type": "name", - "position": 13, - "predicate": [ - { - "value": 0, - "type": "literal", - "position": 15 - } - ] - }, - { - "value": "Product", - "type": "name", - "position": 24 - } - ] - }; - var errors = expr.errors(); - var expected_errors = [ - { - "code": "S0201", - "position": 25, - "remaining": [ - { - "position": 25, - "type": "operator", - "value": ";" - } - ], - "token": ";" - } - ]; - assert.deepEqual(ast, expected_ast); - assert.deepEqual(errors, expected_errors); - }); - }); - - describe('$equals3lucy[0].UnstructuredAnswers^()[0].Text', function() { - it('should return ast', function() { - var expr = jsonata('$equals3lucy[0].UnstructuredAnswers^()[0].Text', { recover: true }); - var ast = expr.ast(); - var expected_ast = { - "type": "sort", - "value": "^", - "position": 36, - "lhs": { - "type": "path", - "steps": [ - { - "value": "equals3lucy", - "type": "variable", - "position": 12, - "predicate": [ - { - "value": 0, - "type": "literal", - "position": 14 - } - ] - }, - { - "value": "UnstructuredAnswers", - "type": "name", - "position": 35 - } - ] - }, - "rhs": [ - { - "descending": false, - "expression": { - "code": "S0211", - "token": ")", - "position": 38, - "remaining": [ - { - "type": "operator", - "value": "[", - "position": 39 - }, - { - "type": "number", - "value": 0, - "position": 40 - }, - { - "type": "operator", - "value": "]", - "position": 41 - }, - { - "type": "operator", - "value": ".", - "position": 42 - }, - { - "type": "name", - "value": "Text", - "position": 46 - } - ], - "type": "error", - "predicate": [ - { - "type": "error", - "error": { - "code": "S0207", - "position": 46, - "token": "(end)" - } - } - ] - } - } - ] - }; - var errors = expr.errors(); - var expected_errors = [ - { - "code": "S0211", - "position": 38, - "predicate": [ - { - "error": { - "code": "S0207", - "position": 46, - "token": "(end)" - }, - "type": "error" - } - ], - "remaining": [ - { - "position": 39, - "type": "operator", - "value": "[" - }, - { - "position": 40, - "type": "number", - "value": 0 - }, - { - "position": 41, - "type": "operator", - "value": "]" - }, - { - "position": 42, - "type": "operator", - "value": "." - }, - { - "position": 46, - "type": "name", - "value": "Text" - } - ], - "token": ")", - "type": "error" - }, - { - "code": "S0203", - "position": 46, - "remaining": [], - "token": "(end)", - "value": "]" - }, - { - "code": "S0203", - "position": 46, - "remaining": [], - "token": "(end)", - "value": ")" - }, - { - "code": "S0207", - "position": 46, - "token": "(end)" - } - ]; - assert.deepEqual(ast, expected_ast); - assert.deepEqual(errors, expected_errors); - }); - }); - - describe('An expression with syntax error should not be executable', function() { - describe('Account.', function() { - it('should return ast', function() { - var expr = jsonata('Account.', { recover: true }); - expect(function () { - expr.evaluate({}); - }).to.throw() - .to.deep.contain({position: 0, code: 'S0500'}); - }); - }); - }); - -}); - diff --git a/tsconfig-es2015.json b/tsconfig-es2015.json new file mode 100644 index 00000000..09e75224 --- /dev/null +++ b/tsconfig-es2015.json @@ -0,0 +1,5 @@ +{ + "extends": "./tsconfig", + "compilerOptions": { + } +} \ No newline at end of file diff --git a/tsconfig-es5.json b/tsconfig-es5.json new file mode 100644 index 00000000..52872acb --- /dev/null +++ b/tsconfig-es5.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig", + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "outDir": "./es5", + "downlevelIteration": true + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..77f29ffb --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,66 @@ +{ + "compilerOptions": { + /* Basic Options */ + "target": "es2015", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */ + "module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "lib": [ + "es2015", + "dom" + ], /* Specify library files to be included in the compilation: */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true, /* Generates corresponding '.d.ts' file. */ + "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./es2015", /* Redirect output structure to the directory. */ + "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + "removeComments": false, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + "noImplicitAny": false, /* Raise error on expressions and declarations with an implied 'any' type. */ + "strictNullChecks": false, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + "allowSyntheticDefaultImports": false, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + + /* Source Map Options */ + // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + }, + "exclude": [ + "node_modules", + "lib", + "es2015", + "es5", + "dist", + "__tests__", + ] +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..4dea01ef --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4058 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@browserify/acorn5-object-spread@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@browserify/acorn5-object-spread/-/acorn5-object-spread-5.0.1.tgz#92e9b37f97beac9ec429a3cc479ded380297540c" + dependencies: + acorn "^5.2.1" + +"@types/jest@^22.0.1": + version "22.0.1" + resolved "https://registry.npmjs.org/@types/jest/-/jest-22.0.1.tgz#6370a6d60cce3845e4cd5d00bf65f654264685bc" + +"@types/node@^9.3.0": + version "9.3.0" + resolved "https://registry.npmjs.org/@types/node/-/node-9.3.0.tgz#3a129cda7c4e5df2409702626892cb4b96546dd5" + +JSONStream@^1.0.3: + version "1.3.2" + resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abab@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + +abbrev@1: + version "1.1.1" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +acorn-globals@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + dependencies: + acorn "^4.0.4" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^4.0.3, acorn@^4.0.4: + version "4.0.13" + resolved "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +acorn@^5.2.1: + version "5.3.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" + +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-escapes@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.1.0, ansi-styles@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1.js@^4.0.0: + version "4.9.2" + resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz#8117ef4f7ed87cd8f89044b5bff97ac243a16c9a" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert@^1.4.0: + version "1.4.1" + resolved "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +assertion-error@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + +astw@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917" + dependencies: + acorn "^4.0.3" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@1.x, async@^1.4.0: + version "1.5.2" + resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.4: + version "2.6.0" + resolved "https://registry.npmjs.org/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" + dependencies: + lodash "^4.14.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.0.0, babel-core@^6.24.1, babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" + slash "^1.0.0" + source-map "^0.5.6" + +babel-generator@^6.18.0, babel-generator@^6.26.0: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.6" + trim-right "^1.0.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jest@^21.2.0: + version "21.2.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-21.2.0.tgz#2ce059519a9374a2c46f2455b6fbef5ad75d863e" + dependencies: + babel-plugin-istanbul "^4.0.0" + babel-preset-jest "^21.2.0" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-istanbul@^4.0.0, babel-plugin-istanbul@^4.1.4: + version "4.1.5" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e" + dependencies: + find-up "^2.1.0" + istanbul-lib-instrument "^1.7.5" + test-exclude "^4.1.1" + +babel-plugin-jest-hoist@^21.2.0: + version "21.2.0" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz#2cef637259bd4b628a6cace039de5fcd14dbb006" + +babel-plugin-syntax-object-rest-spread@^6.13.0: + version "6.13.0" + resolved "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-jest@^21.2.0: + version "21.2.0" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz#ff9d2bce08abd98e8a36d9a8a5189b9173b85638" + dependencies: + babel-plugin-jest-hoist "^21.2.0" + babel-plugin-syntax-object-rest-spread "^6.13.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.18.0, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@7.0.0-beta.19: + version "7.0.0-beta.19" + resolved "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz#e928c7e807e970e0536b078ab3e0c48f9e052503" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-js@^1.0.2: + version "1.2.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.11.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + +block-stream@*: + version "0.0.9" + resolved "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@~3.5.0: + version "3.5.1" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + +browser-pack@^6.0.1: + version "6.0.3" + resolved "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.3.tgz#91ca96518583ef580ab063a309de62e407767a39" + dependencies: + JSONStream "^1.0.3" + combine-source-map "~0.8.0" + defined "^1.0.0" + safe-buffer "^5.1.1" + through2 "^2.0.0" + umd "^3.0.0" + +browser-resolve@^1.11.0, browser-resolve@^1.11.2, browser-resolve@^1.7.0: + version "1.11.2" + resolved "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.1.1" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@~0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + dependencies: + pako "~1.0.5" + +browserify@^15.2.0: + version "15.2.0" + resolved "https://registry.npmjs.org/browserify/-/browserify-15.2.0.tgz#1e121ba1fa72cf9fd2d8df002f8674b68b45df89" + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^1.11.0" + browserify-zlib "~0.2.0" + buffer "^5.0.2" + cached-path-relative "^1.0.0" + concat-stream "~1.5.1" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.0" + domain-browser "~1.1.0" + duplexer2 "~0.1.2" + events "~1.1.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.0.0" + labeled-stream-splicer "^2.0.0" + mkdirp "^0.5.0" + module-deps "^5.0.1" + os-browserify "~0.3.0" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^2.0.0" + stream-http "^2.0.0" + string_decoder "~1.0.0" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "~0.0.0" + url "~0.11.0" + util "~0.10.1" + vm-browserify "~0.0.1" + xtend "^4.0.0" + +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + dependencies: + node-int64 "^0.4.0" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^5.0.2: + version "5.0.8" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz#84daa52e7cf2fa8ce4195bc5cf0f7809e0930b24" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + +cached-path-relative@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz#d09c4b52800aa4c078e2dd81a869aac90d2e54e7" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +catharsis@~0.8.9: + version "0.8.9" + resolved "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz#98cc890ca652dd2ef0e70b37925310ff9e90fc8b" + dependencies: + underscore-contrib "~0.3.0" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chai-as-promised@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + dependencies: + check-error "^1.0.2" + +chai@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" + dependencies: + 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" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + +check-error@^1.0.1, check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + +chokidar@^1.6.0: + version "1.7.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +ci-info@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +color-convert@^1.9.0: + version "1.9.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +combine-source-map@~0.7.1: + version "0.7.2" + resolved "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz#0870312856b307a87cc4ac486f3a9a62aeccc09e" + dependencies: + convert-source-map "~1.1.0" + inline-source-map "~0.6.0" + lodash.memoize "~3.0.3" + source-map "~0.5.3" + +combine-source-map@~0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" + dependencies: + convert-source-map "~1.1.0" + inline-source-map "~0.6.0" + lodash.memoize "~3.0.3" + source-map "~0.5.3" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@2.11.0: + version "2.11.0" + resolved "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.6.0, concat-stream@~1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concat-stream@~1.5.1: + version "1.5.2" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +constants-browserify@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +content-type-parser@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" + +convert-source-map@^1.4.0, convert-source-map@^1.5.0: + version "1.5.1" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +convert-source-map@~1.1.0: + version "1.1.3" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.3" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +coveralls@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/coveralls/-/coveralls-3.0.0.tgz#22ef730330538080d29b8c151dc9146afde88a99" + dependencies: + js-yaml "^3.6.1" + lcov-parse "^0.0.10" + log-driver "^1.2.5" + minimist "^1.2.0" + request "^2.79.0" + +cpx@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz#185be018511d87270dedccc293171e37655ab88f" + dependencies: + babel-runtime "^6.9.2" + chokidar "^1.6.0" + duplexer "^0.1.1" + glob "^7.0.5" + glob2base "^0.0.12" + minimatch "^3.0.2" + mkdirp "^0.5.1" + resolve "^1.1.7" + safe-buffer "^5.0.1" + shell-quote "^1.6.1" + subarg "^1.0.0" + +create-ecdh@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + ripemd160 "^2.0.0" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.6" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + +crypto-browserify@^3.0.0: + version "3.12.0" + resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +debug@3.1.0, debug@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +debug@^2.2.0, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0, decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-eql@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + dependencies: + type-detect "^4.0.0" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.npmjs.org/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +deps-sort@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5" + dependencies: + JSONStream "^1.0.3" + shasum "^1.0.0" + subarg "^1.0.0" + through2 "^2.0.0" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +detective@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/detective/-/detective-5.0.2.tgz#84ec2e1c581e74211e2ae4ffce1edf52c3263f84" + dependencies: + "@browserify/acorn5-object-spread" "^5.0.1" + acorn "^5.2.1" + defined "^1.0.0" + +diff@3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" + +diff@^3.2.0: + version "3.4.0" + resolved "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" + +diffie-hellman@^5.0.0: + version "5.0.2" + resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + dependencies: + esutils "^2.0.2" + +domain-browser@~1.1.0: + version "1.1.7" + resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + +duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: + version "0.1.4" + resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + dependencies: + readable-stream "^2.0.2" + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +elliptic@^6.0.0: + version "6.4.0" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +errno@^0.1.4: + version "0.1.6" + resolved "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026" + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5, escape-string-regexp@~1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +escodegen@^1.6.1: + version "1.9.0" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.5.6" + +eslint-plugin-ideal@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/eslint-plugin-ideal/-/eslint-plugin-ideal-0.1.3.tgz#0ce90b99ef0a09a12a741f0d752c18984b455e4c" + +eslint-scope@^3.7.1: + version "3.7.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + +eslint@^4.0.0: + version "4.16.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-4.16.0.tgz#934ada9e98715e1d7bbfd6f6f0519ed2fab35cc1" + dependencies: + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.2" + esquery "^1.0.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + is-resolvable "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "^4.0.1" + text-table "~0.2.0" + +espree@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz#756ada8b979e9dcfcdb30aad8d1a9304a905e1ca" + dependencies: + acorn "^5.2.1" + acorn-jsx "^3.0.0" + +esprima@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esquery@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + dependencies: + estraverse "^4.1.0" + object-assign "^4.0.1" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +events@~1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-sh@^0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + dependencies: + merge "^1.1.3" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + 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" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expect@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/expect/-/expect-21.2.1.tgz#003ac2ac7005c3c29e73b38a272d4afadd6d1d7b" + dependencies: + ansi-styles "^3.2.0" + jest-diff "^21.2.1" + jest-get-type "^21.2.0" + jest-matcher-utils "^21.2.1" + jest-message-util "^21.2.1" + jest-regex-util "^21.2.0" + +extend@~3.0.0, extend@~3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + dependencies: + bser "^2.0.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +form-data@~2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0, fsevents@^1.1.1: + version "1.1.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.39" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + +glob@7.1.2, glob@^7.0.3, glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + 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" + +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.0.1: + version "11.1.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.1.0.tgz#632644457f5f0e3ae711807183700ebf2e4633e4" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +growl@1.10.3: + version "1.10.3" + resolved "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +handlebars@^4.0.1, handlebars@^4.0.3: + version "4.0.11" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +hash-base@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" + dependencies: + inherits "^2.0.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.3" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + +hawk@3.1.3, hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + +he@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +hoek@4.x.x: + version "4.2.0" + resolved "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.5.0" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + +html-encoding-sniffer@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + dependencies: + whatwg-encoding "^1.0.1" + +htmlescape@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + +iconv-lite@0.4.19, iconv-lite@^0.4.17: + version "0.4.19" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +ieee754@^1.1.4: + version "1.1.8" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + +ignore@^3.3.3: + version "3.3.7" + resolved "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +inline-source-map@~0.6.0: + version "0.6.2" + resolved "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" + dependencies: + source-map "~0.5.3" + +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +insert-module-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz#c03bf4e01cb086d5b5e5ace8ad0afe7889d638c3" + dependencies: + JSONStream "^1.0.3" + combine-source-map "~0.7.1" + concat-stream "~1.5.1" + is-buffer "^1.1.0" + lexical-scope "^1.2.0" + process "~0.11.0" + through2 "^2.0.0" + xtend "^4.0.0" + +invariant@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.0, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-ci@^1.0.10: + version "1.1.0" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" + dependencies: + ci-info "^1.0.0" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isarray@~0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul-api@^1.1.1: + version "1.2.1" + resolved "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620" + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.1.1" + istanbul-lib-hook "^1.1.0" + istanbul-lib-instrument "^1.9.1" + istanbul-lib-report "^1.1.2" + istanbul-lib-source-maps "^1.2.2" + istanbul-reports "^1.1.3" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" + +istanbul-lib-hook@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.1.1" + semver "^5.3.0" + +istanbul-lib-report@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz#922be27c13b9511b979bd1587359f69798c1d425" + dependencies: + istanbul-lib-coverage "^1.1.1" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz#750578602435f28a0c04ee6d7d9e0f2960e62c1c" + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.1.1" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-reports@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.3.tgz#3b9e1e8defb6d18b1d425da8e8b32c5a163f2d10" + dependencies: + handlebars "^4.0.3" + +istanbul@^0.4.5: + version "0.4.5" + resolved "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +jest-changed-files@^21.2.0: + version "21.2.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-21.2.0.tgz#5dbeecad42f5d88b482334902ce1cba6d9798d29" + dependencies: + throat "^4.0.0" + +jest-cli@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-21.2.1.tgz#9c528b6629d651911138d228bdb033c157ec8c00" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + istanbul-api "^1.1.1" + istanbul-lib-coverage "^1.0.1" + istanbul-lib-instrument "^1.4.2" + istanbul-lib-source-maps "^1.1.0" + jest-changed-files "^21.2.0" + jest-config "^21.2.1" + jest-environment-jsdom "^21.2.1" + jest-haste-map "^21.2.0" + jest-message-util "^21.2.1" + jest-regex-util "^21.2.0" + jest-resolve-dependencies "^21.2.0" + jest-runner "^21.2.1" + jest-runtime "^21.2.1" + jest-snapshot "^21.2.1" + jest-util "^21.2.1" + micromatch "^2.3.11" + node-notifier "^5.0.2" + pify "^3.0.0" + slash "^1.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" + which "^1.2.12" + worker-farm "^1.3.1" + yargs "^9.0.0" + +jest-config@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-21.2.1.tgz#c7586c79ead0bcc1f38c401e55f964f13bf2a480" + dependencies: + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^21.2.1" + jest-environment-node "^21.2.1" + jest-get-type "^21.2.0" + jest-jasmine2 "^21.2.1" + jest-regex-util "^21.2.0" + jest-resolve "^21.2.0" + jest-util "^21.2.1" + jest-validate "^21.2.1" + pretty-format "^21.2.1" + +jest-diff@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-21.2.1.tgz#46cccb6cab2d02ce98bc314011764bb95b065b4f" + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^21.2.0" + pretty-format "^21.2.1" + +jest-docblock@^21.2.0: + version "21.2.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" + +jest-environment-jsdom@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz#38d9980c8259b2a608ec232deee6289a60d9d5b4" + dependencies: + jest-mock "^21.2.0" + jest-util "^21.2.1" + jsdom "^9.12.0" + +jest-environment-node@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-21.2.1.tgz#98c67df5663c7fbe20f6e792ac2272c740d3b8c8" + dependencies: + jest-mock "^21.2.0" + jest-util "^21.2.1" + +jest-get-type@^21.2.0: + version "21.2.0" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz#f6376ab9db4b60d81e39f30749c6c466f40d4a23" + +jest-haste-map@^21.2.0: + version "21.2.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-21.2.0.tgz#1363f0a8bb4338f24f001806571eff7a4b2ff3d8" + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + jest-docblock "^21.2.0" + micromatch "^2.3.11" + sane "^2.0.0" + worker-farm "^1.3.1" + +jest-jasmine2@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz#9cc6fc108accfa97efebce10c4308548a4ea7592" + dependencies: + chalk "^2.0.1" + expect "^21.2.1" + graceful-fs "^4.1.11" + jest-diff "^21.2.1" + jest-matcher-utils "^21.2.1" + jest-message-util "^21.2.1" + jest-snapshot "^21.2.1" + p-cancelable "^0.3.0" + +jest-matcher-utils@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz#72c826eaba41a093ac2b4565f865eb8475de0f64" + dependencies: + chalk "^2.0.1" + jest-get-type "^21.2.0" + pretty-format "^21.2.1" + +jest-message-util@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-21.2.1.tgz#bfe5d4692c84c827d1dcf41823795558f0a1acbe" + dependencies: + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + +jest-mock@^21.2.0: + version "21.2.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-21.2.0.tgz#7eb0770e7317968165f61ea2a7281131534b3c0f" + +jest-regex-util@^21.2.0: + version "21.2.0" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-21.2.0.tgz#1b1e33e63143babc3e0f2e6c9b5ba1eb34b2d530" + +jest-resolve-dependencies@^21.2.0: + version "21.2.0" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz#9e231e371e1a736a1ad4e4b9a843bc72bfe03d09" + dependencies: + jest-regex-util "^21.2.0" + +jest-resolve@^21.2.0: + version "21.2.0" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-21.2.0.tgz#068913ad2ba6a20218e5fd32471f3874005de3a6" + dependencies: + browser-resolve "^1.11.2" + chalk "^2.0.1" + is-builtin-module "^1.0.0" + +jest-runner@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-21.2.1.tgz#194732e3e518bfb3d7cbfc0fd5871246c7e1a467" + dependencies: + jest-config "^21.2.1" + jest-docblock "^21.2.0" + jest-haste-map "^21.2.0" + jest-jasmine2 "^21.2.1" + jest-message-util "^21.2.1" + jest-runtime "^21.2.1" + jest-util "^21.2.1" + pify "^3.0.0" + throat "^4.0.0" + worker-farm "^1.3.1" + +jest-runtime@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-21.2.1.tgz#99dce15309c670442eee2ebe1ff53a3cbdbbb73e" + dependencies: + babel-core "^6.0.0" + babel-jest "^21.2.0" + babel-plugin-istanbul "^4.0.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + graceful-fs "^4.1.11" + jest-config "^21.2.1" + jest-haste-map "^21.2.0" + jest-regex-util "^21.2.0" + jest-resolve "^21.2.0" + jest-util "^21.2.1" + json-stable-stringify "^1.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + strip-bom "3.0.0" + write-file-atomic "^2.1.0" + yargs "^9.0.0" + +jest-snapshot@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-21.2.1.tgz#29e49f16202416e47343e757e5eff948c07fd7b0" + dependencies: + chalk "^2.0.1" + jest-diff "^21.2.1" + jest-matcher-utils "^21.2.1" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^21.2.1" + +jest-util@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-21.2.1.tgz#a274b2f726b0897494d694a6c3d6a61ab819bb78" + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + jest-message-util "^21.2.1" + jest-mock "^21.2.0" + jest-validate "^21.2.1" + mkdirp "^0.5.1" + +jest-validate@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-21.2.1.tgz#cc0cbca653cd54937ba4f2a111796774530dd3c7" + dependencies: + chalk "^2.0.1" + jest-get-type "^21.2.0" + leven "^2.1.0" + pretty-format "^21.2.1" + +jest@21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest/-/jest-21.2.1.tgz#c964e0b47383768a1438e3ccf3c3d470327604e1" + dependencies: + jest-cli "^21.2.1" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@3.x, js-yaml@^3.6.1, js-yaml@^3.7.0, js-yaml@^3.9.1: + version "3.10.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js2xmlparser@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz#3fb60eaa089c5440f9319f51760ccd07e2499733" + dependencies: + xmlcreate "^1.0.1" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsdoc@^3.4.0: + version "3.5.5" + resolved "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz#484521b126e81904d632ff83ec9aaa096708fa4d" + dependencies: + babylon "7.0.0-beta.19" + bluebird "~3.5.0" + catharsis "~0.8.9" + escape-string-regexp "~1.0.5" + js2xmlparser "~3.0.0" + klaw "~2.0.0" + marked "~0.3.6" + mkdirp "~0.5.1" + requizzle "~0.2.1" + strip-json-comments "~2.0.1" + taffydb "2.6.2" + underscore "~1.8.3" + +jsdom@^9.12.0: + version "9.12.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + dependencies: + abab "^1.0.3" + acorn "^4.0.4" + acorn-globals "^3.1.0" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + nwmatcher ">= 1.3.9 < 2.0.0" + parse5 "^1.5.1" + request "^2.79.0" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.2" + webidl-conversions "^4.0.0" + whatwg-encoding "^1.0.1" + whatwg-url "^4.3.0" + xml-name-validator "^2.0.1" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stable-stringify@~0.0.0: + version "0.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +klaw@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz#59c128e0dc5ce410201151194eeb9cbf858650f6" + dependencies: + graceful-fs "^4.1.9" + +labeled-stream-splicer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59" + dependencies: + inherits "^2.0.1" + isarray "~0.0.1" + stream-splicer "^2.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +lcov-parse@^0.0.10: + version "0.0.10" + resolved "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" + +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lexical-scope@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4" + dependencies: + astw "^2.0.0" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash.memoize@~3.0.3: + version "3.0.4" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" + +lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0: + version "4.17.4" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +log-driver@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +marked@~0.3.6: + version "0.3.12" + resolved "https://registry.npmjs.org/marked/-/marked-0.3.12.tgz#7cf25ff2252632f3fe2406bde258e94eee927519" + +md5.js@^1.3.4: + version "1.3.4" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@~1.30.0: + version "1.30.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: + version "2.1.17" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + dependencies: + mime-db "~1.30.0" + +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +minimalistic-assert@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha-lcov-reporter@^1.2.0: + version "1.3.0" + resolved "https://registry.npmjs.org/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz#469bdef4f8afc9a116056f079df6182d0afb0384" + +mocha@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/mocha/-/mocha-5.0.0.tgz#cccac988b0bc5477119cba0e43de7af6d6ad8f4e" + dependencies: + browser-stdout "1.3.0" + commander "2.11.0" + debug "3.1.0" + diff "3.3.1" + escape-string-regexp "1.0.5" + glob "7.1.2" + growl "1.10.3" + he "1.1.1" + mkdirp "0.5.1" + supports-color "4.4.0" + +module-deps@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/module-deps/-/module-deps-5.0.1.tgz#3bc47c14b0a6d925aff2ec4a177b456a96ae0396" + dependencies: + JSONStream "^1.0.3" + browser-resolve "^1.7.0" + cached-path-relative "^1.0.0" + concat-stream "~1.6.0" + defined "^1.0.0" + detective "^5.0.2" + duplexer2 "^0.1.2" + inherits "^2.0.1" + parents "^1.0.0" + readable-stream "^2.0.2" + resolve "^1.1.3" + stream-combiner2 "^1.1.1" + subarg "^1.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +nan@^2.3.0: + version "2.8.0" + resolved "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-notifier@^5.0.2: + version "5.2.1" + resolved "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" + dependencies: + growly "^1.3.0" + semver "^5.4.1" + shellwords "^0.1.1" + which "^1.3.0" + +node-pre-gyp@^0.6.39: + version "0.6.39" + resolved "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" + dependencies: + detect-libc "^1.0.2" + hawk "3.1.3" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nopt@3.x: + version "3.0.6" + resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2: + version "2.4.0" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +"nwmatcher@>= 1.3.9 < 2.0.0": + version "1.4.3" + resolved "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" + +oauth-sign@~0.8.1, oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +once@1.x, once@^1.3.0, once@^1.3.3, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-browserify@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-cancelable@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +pako@~1.0.5: + version "1.0.6" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + +parents@^1.0.0, parents@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" + dependencies: + path-platform "~0.11.15" + +parse-asn1@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + +path-browserify@~0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-platform@~0.11.15: + version "0.11.15" + resolved "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +pathval@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + +pbkdf2@^3.0.3: + version "3.0.14" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-format@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-21.2.1.tgz#ae5407f3cf21066cd011aa1ba5fce7b6a2eddb36" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + +private@^0.1.7: + version "0.1.8" + resolved "https://registry.npmjs.org/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process@~0.11.0: + version "0.11.10" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +public-encrypt@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@^1.3.2, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +qs@~6.5.1: + version "6.5.1" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +querystring-es3@~0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz#b96b7df587f01dd91726c418f30553b1418e3d62" + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +rc@^1.1.7: + version "1.2.4" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.4.tgz#a0f606caae2a3b862bbd0ef85482c0125b315fa3" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-only-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" + dependencies: + readable-stream "^2.0.2" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readable-stream@~2.0.0: + version "2.0.6" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + 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" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@2.81.0: + version "2.81.0" + resolved "https://registry.npmjs.org/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +request@^2.79.0, request@^2.81.0: + version "2.83.0" + resolved "https://registry.npmjs.org/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + dependencies: + 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" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +requizzle@~0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz#6943c3530c4d9a7e46f1cddd51c158fc670cdbde" + dependencies: + underscore "~1.6.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve@1.1.7, resolve@1.1.x: + version "1.1.7" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.7: + version "1.5.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + dependencies: + path-parse "^1.0.5" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + dependencies: + hash-base "^2.0.0" + inherits "^2.0.1" + +rollup@^0.54.1: + version "0.54.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-0.54.1.tgz#415a5d999421502646cf54b873fc4ce1a7393970" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +sane@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/sane/-/sane-2.3.0.tgz#3f3df584abf69e63d4bb74f0f8c42468e4d7d46b" + dependencies: + anymatch "^1.3.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.1.1" + +sax@^1.2.1: + version "1.2.4" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: + version "5.5.0" + resolved "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: + version "2.4.10" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shasum@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" + dependencies: + json-stable-stringify "~0.0.0" + sha.js "~2.4.4" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shell-quote@^1.6.1: + version "1.6.1" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map-support@^0.5.0: + version "0.5.2" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.2.tgz#1a6297fd5b2e762b39688c7fc91233b60984f0a5" + dependencies: + source-map "^0.6.0" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3, source-map@~0.5.6: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stream-browserify@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-combiner2@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +stream-http@^2.0.0: + version "2.8.0" + resolved "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.3" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-splicer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.2" + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.0, string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4, stringstream@~0.0.5: + version "0.0.5" + resolved "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@3.0.0, strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +subarg@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + dependencies: + minimist "^1.1.0" + +supports-color@4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + dependencies: + has-flag "^2.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.0, supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +supports-color@^4.0.0: + version "4.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + dependencies: + has-flag "^2.0.0" + +symbol-tree@^3.2.1: + version "3.2.2" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +syntax-error@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz#1ed9266c4d40be75dc55bf9bb1cb77062bb96ca1" + dependencies: + acorn "^4.0.3" + +table@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +taffydb@2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268" + +tar-pack@^3.4.0: + version "3.4.1" + resolved "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +test-exclude@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + +through2@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +"through@>=2.2.7 <3", through@^2.3.6: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timers-browserify@^1.0.1: + version "1.4.2" + resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" + dependencies: + process "~0.11.0" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + dependencies: + punycode "^1.4.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +ts-jest@21.2.3: + version "21.2.3" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-21.2.3.tgz#d90cd143c433e8dfd9b8df54921c7f3f1d8b9819" + dependencies: + babel-core "^6.24.1" + babel-plugin-istanbul "^4.1.4" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-preset-jest "^21.2.0" + cpx "^1.5.0" + fs-extra "^4.0.2" + jest-config "^21.2.1" + jest-util "^21.2.1" + pkg-dir "^2.0.0" + source-map-support "^0.5.0" + yargs "^10.0.3" + +tty-browserify@~0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-detect@^4.0.0: + version "4.0.7" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.7.tgz#862bd2cf6058ad92799ff5a5b8cf7b6cec726198" + +typedarray@^0.0.6, typedarray@~0.0.5: + version "0.0.6" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +typescript@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" + +uglify-es@^3.0.20: + version "3.3.8" + resolved "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.8.tgz#f2c68e6cff0d0f9dc9577e4da207151c2e753b7e" + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +uglify-js@^2.6: + version "2.8.29" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +umd@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e" + +underscore-contrib@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz#665b66c24783f8fa2b18c9f8cbb0e2c7d48c26c7" + dependencies: + underscore "1.6.0" + +underscore@1.6.0, underscore@~1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" + +underscore@~1.8.3: + version "1.8.3" + resolved "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" + +universalify@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + +url@~0.11.0: + version "0.11.0" + resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util@0.10.3, util@~0.10.1: + version "0.10.3" + resolved "https://registry.npmjs.org/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +uuid@^3.0.0, uuid@^3.1.0: + version "3.2.1" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@~0.0.1: + version "0.0.4" + resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +webidl-conversions@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + +whatwg-encoding@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + dependencies: + iconv-lite "0.4.19" + +whatwg-url@^4.3.0: + version "4.8.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@^1.1.1, which@^1.2.12, which@^1.2.9, which@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +worker-farm@^1.3.1: + version "1.5.2" + resolved "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.2.tgz#32b312e5dc3d5d45d79ef44acc2587491cd729ae" + dependencies: + errno "^0.1.4" + xtend "^4.0.1" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +xml-name-validator@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + +xmlcreate@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz#fa6bf762a60a413fb3dd8f4b03c5b269238d308f" + +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + +yargs-parser@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + dependencies: + camelcase "^4.1.0" + +yargs@^10.0.3: + version "10.1.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-10.1.1.tgz#5fe1ea306985a099b33492001fa19a1e61efe285" + dependencies: + 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 "^8.1.0" + +yargs@^9.0.0: + version "9.0.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^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 "^7.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0"