From b8ffa2312d78bf174c1b0a5073a981c026291cd5 Mon Sep 17 00:00:00 2001 From: Michael Tiller Date: Mon, 22 Jan 2018 11:52:17 -0500 Subject: [PATCH 1/4] Initial refactoring work Lots of changes here. First and foremost, this organizes the code into es6 modules. I tried to hit the big functional bigs: tokenizer, parser, evaluator, functions and separate them out. The parser was particularly involved so I actually further decomposed that so that files were at least a reasonable size. I don't have particularly strong feelings about the taxonomy withing the parser package, just trying to get things to a manageable state. There are several other big changes worth noting here in the tooling. First, I migrated the code to TypeScript. I think TypeScript is a particularly good fit for AST related work because of the tagged union support. But it also really helps with refactoring so I think it will be pretty useful moving forward. It all compiles out to es6 and es5 and can be bundled with rollup. So it doesn't impact *deployment* at all, just development. I moved the tests to `jest`. I find Jest is a little easier to configure out of the box and things like coverage are well supported. I used `yarn` to create a `yarn.lock` file. We could also use `npm` `v5`, but since `jsonata` currently supports Node `v4`, and `npm` `v5` only ships with Node v7+. Bottom line is that `yarn` (or `npm5`) give much better reproducibility on installs. Even with all these changes, the test suite still passes 100% of tests with 100% coverage! --- .babelrc | 13 - .gitignore | 3 + __tests__/async-function.ts | 184 + __tests__/implementation-tests.ts | 553 + __tests__/parser-recovery.ts | 451 + __tests__/run-test-suite.ts | 150 + __tests__/test-suite/TESTSUITE.md | 39 + __tests__/test-suite/datasets/dataset0.json | 22 + __tests__/test-suite/datasets/dataset1.json | 53 + __tests__/test-suite/datasets/dataset10.json | 22 + __tests__/test-suite/datasets/dataset11.json | 9 + __tests__/test-suite/datasets/dataset12.json | 72 + __tests__/test-suite/datasets/dataset13.json | 72 + __tests__/test-suite/datasets/dataset14.json | 71 + __tests__/test-suite/datasets/dataset15.json | 73 + __tests__/test-suite/datasets/dataset16.json | 73 + __tests__/test-suite/datasets/dataset17.json | 73 + __tests__/test-suite/datasets/dataset18.json | 19 + __tests__/test-suite/datasets/dataset19.json | 9 + __tests__/test-suite/datasets/dataset2.json | 17 + __tests__/test-suite/datasets/dataset20.json | 10 + __tests__/test-suite/datasets/dataset21.json | 22 + __tests__/test-suite/datasets/dataset22.json | 7 + __tests__/test-suite/datasets/dataset23.json | 7 + __tests__/test-suite/datasets/dataset24.json | 52 + __tests__/test-suite/datasets/dataset3.json | 28 + __tests__/test-suite/datasets/dataset4.json | 32 + __tests__/test-suite/datasets/dataset5.json | 73 + __tests__/test-suite/datasets/dataset6.json | 89 + __tests__/test-suite/datasets/dataset7.json | 9 + __tests__/test-suite/datasets/dataset8.json | 68 + __tests__/test-suite/datasets/dataset9.json | 6 + .../groups/array-constructor/case000.json | 6 + .../groups/array-constructor/case001.json | 8 + .../groups/array-constructor/case002.json | 9 + .../groups/array-constructor/case003.json | 10 + .../groups/array-constructor/case004.json | 13 + .../groups/array-constructor/case005.json | 13 + .../groups/array-constructor/case006.json | 16 + .../groups/array-constructor/case007.json | 18 + .../groups/array-constructor/case008.json | 6 + .../groups/array-constructor/case009.json | 9 + .../groups/array-constructor/case010.json | 6 + .../groups/array-constructor/case011.json | 15 + .../groups/array-constructor/case012.json | 19 + .../groups/array-constructor/case013.json | 6 + .../groups/array-constructor/case014.json | 9 + .../groups/array-constructor/case015.json | 9 + .../groups/array-constructor/case016.json | 9 + .../groups/array-constructor/case017.json | 12 + .../groups/array-constructor/case018.json | 10 + .../groups/array-constructor/case019.json | 10 + .../groups/array-constructor/case020.json | 14 + .../test-suite/groups/blocks/case000.json | 6 + .../test-suite/groups/blocks/case001.json | 6 + .../test-suite/groups/blocks/case002.json | 6 + .../test-suite/groups/blocks/case003.json | 6 + .../test-suite/groups/blocks/case004.json | 11 + .../test-suite/groups/blocks/case005.json | 6 + .../test-suite/groups/blocks/case006.json | 6 + .../groups/boolean-expresssions/case000.json | 6 + .../groups/boolean-expresssions/case001.json | 6 + .../groups/boolean-expresssions/case002.json | 6 + .../groups/boolean-expresssions/case003.json | 6 + .../groups/boolean-expresssions/case004.json | 6 + .../groups/boolean-expresssions/case005.json | 6 + .../groups/boolean-expresssions/case006.json | 6 + .../groups/boolean-expresssions/case007.json | 6 + .../groups/boolean-expresssions/case008.json | 6 + .../groups/boolean-expresssions/case009.json | 6 + .../groups/boolean-expresssions/case010.json | 6 + .../groups/boolean-expresssions/case011.json | 6 + .../groups/boolean-expresssions/case012.json | 9 + .../groups/boolean-expresssions/case013.json | 9 + .../groups/boolean-expresssions/case014.json | 9 + .../groups/boolean-expresssions/case015.json | 9 + .../groups/boolean-expresssions/case016.json | 8 + .../test-suite/groups/closures/case000.json | 10 + .../test-suite/groups/closures/case001.json | 10 + .../groups/comparison-operators/case000.json | 6 + .../groups/comparison-operators/case001.json | 6 + .../groups/comparison-operators/case002.json | 6 + .../groups/comparison-operators/case003.json | 6 + .../groups/comparison-operators/case004.json | 6 + .../groups/comparison-operators/case005.json | 6 + .../groups/comparison-operators/case006.json | 6 + .../groups/comparison-operators/case007.json | 6 + .../groups/comparison-operators/case008.json | 6 + .../groups/comparison-operators/case009.json | 6 + .../groups/comparison-operators/case010.json | 6 + .../groups/comparison-operators/case011.json | 6 + .../groups/comparison-operators/case012.json | 6 + .../groups/comparison-operators/case013.json | 6 + .../groups/comparison-operators/case014.json | 6 + .../groups/comparison-operators/case015.json | 6 + .../groups/comparison-operators/case016.json | 6 + .../groups/comparison-operators/case017.json | 6 + .../groups/comparison-operators/case018.json | 6 + .../groups/comparison-operators/case019.json | 6 + .../groups/comparison-operators/case020.json | 6 + .../groups/comparison-operators/case021.json | 8 + .../groups/comparison-operators/case022.json | 8 + .../groups/comparison-operators/case023.json | 10 + .../groups/comparison-operators/case024.json | 10 + .../groups/conditionals/case000.json | 6 + .../groups/conditionals/case001.json | 6 + .../groups/conditionals/case002.json | 6 + .../groups/conditionals/case003.json | 6 + .../groups/conditionals/case004.json | 6 + .../groups/conditionals/case005.json | 6 + .../groups/conditionals/case006.json | 6 + .../groups/conditionals/case007.json | 11 + .../groups/conditionals/case008.json | 11 + .../test-suite/groups/context/case000.json | 6 + .../test-suite/groups/context/case001.json | 12 + .../test-suite/groups/context/case002.json | 12 + .../test-suite/groups/context/case003.json | 11 + .../groups/descendent-operator/case000.json | 20 + .../groups/descendent-operator/case001.json | 13 + .../groups/descendent-operator/case002.json | 9 + .../groups/descendent-operator/case003.json | 9 + .../groups/descendent-operator/case004.json | 9 + .../groups/descendent-operator/case005.json | 9 + .../groups/descendent-operator/case006.json | 9 + .../groups/descendent-operator/case007.json | 9 + .../groups/descendent-operator/case008.json | 11 + .../groups/descendent-operator/case009.json | 9 + .../groups/descendent-operator/case010.json | 6 + .../groups/descendent-operator/case011.json | 6 + .../groups/descendent-operator/case012.json | 11 + .../groups/descendent-operator/case013.json | 11 + .../groups/descendent-operator/case014.json | 6 + .../groups/descendent-operator/case015.json | 6 + .../groups/descendent-operator/case016.json | 6 + .../groups/descendent-operator/case017.json | 6 + .../test-suite/groups/encoding/case000.json | 6 + .../test-suite/groups/encoding/case001.json | 6 + .../test-suite/groups/encoding/case002.json | 6 + .../test-suite/groups/encoding/case003.json | 6 + .../test-suite/groups/errors/case000.json | 6 + .../test-suite/groups/errors/case001.json | 6 + .../test-suite/groups/errors/case002.json | 6 + .../test-suite/groups/errors/case003.json | 6 + .../test-suite/groups/errors/case004.json | 6 + .../test-suite/groups/errors/case005.json | 6 + .../test-suite/groups/errors/case006.json | 6 + .../test-suite/groups/errors/case007.json | 6 + .../test-suite/groups/errors/case008.json | 6 + .../test-suite/groups/errors/case009.json | 6 + .../test-suite/groups/errors/case010.json | 6 + .../test-suite/groups/errors/case011.json | 6 + .../test-suite/groups/errors/case012.json | 6 + .../test-suite/groups/errors/case013.json | 6 + .../test-suite/groups/errors/case014.json | 6 + .../test-suite/groups/errors/case015.json | 6 + .../test-suite/groups/errors/case016.json | 6 + .../test-suite/groups/errors/case017.json | 6 + .../test-suite/groups/errors/case018.json | 6 + .../test-suite/groups/errors/case019.json | 6 + .../test-suite/groups/errors/case020.json | 6 + .../test-suite/groups/errors/case021.json | 6 + .../test-suite/groups/errors/case022.json | 6 + .../test-suite/groups/errors/case023.json | 6 + .../test-suite/groups/errors/case024.json | 6 + .../test-suite/groups/fields/case000.json | 6 + .../test-suite/groups/fields/case001.json | 20 + .../test-suite/groups/fields/case002.json | 6 + .../test-suite/groups/fields/case003.json | 13 + .../test-suite/groups/fields/case004.json | 9 + .../test-suite/groups/fields/case005.json | 6 + .../test-suite/groups/fields/case006.json | 6 + .../test-suite/groups/fields/case007.json | 9 + .../test-suite/groups/flattening/case000.json | 15 + .../test-suite/groups/flattening/case001.json | 24 + .../test-suite/groups/flattening/case002.json | 24 + .../test-suite/groups/flattening/case003.json | 24 + .../test-suite/groups/flattening/case004.json | 24 + .../test-suite/groups/flattening/case005.json | 24 + .../test-suite/groups/flattening/case006.json | 22 + .../test-suite/groups/flattening/case007.json | 22 + .../test-suite/groups/flattening/case008.json | 19 + .../test-suite/groups/flattening/case009.json | 43 + .../test-suite/groups/flattening/case010.json | 39 + .../test-suite/groups/flattening/case011.json | 35 + .../test-suite/groups/flattening/case012.json | 27 + .../test-suite/groups/flattening/case013.json | 19 + .../test-suite/groups/flattening/case014.json | 23 + .../test-suite/groups/flattening/case015.json | 31 + .../test-suite/groups/flattening/case016.json | 15 + .../test-suite/groups/flattening/case017.json | 43 + .../test-suite/groups/flattening/case018.json | 39 + .../test-suite/groups/flattening/case019.json | 35 + .../test-suite/groups/flattening/case020.json | 27 + .../test-suite/groups/flattening/case021.json | 19 + .../test-suite/groups/flattening/case022.json | 23 + .../test-suite/groups/flattening/case023.json | 31 + .../test-suite/groups/flattening/case024.json | 15 + .../test-suite/groups/flattening/case025.json | 5 + .../test-suite/groups/flattening/case026.json | 7 + .../test-suite/groups/flattening/case027.json | 7 + .../test-suite/groups/flattening/case028.json | 11 + .../test-suite/groups/flattening/case029.json | 9 + .../test-suite/groups/flattening/case030.json | 15 + .../test-suite/groups/flattening/case031.json | 9 + .../test-suite/groups/flattening/case032.json | 21 + .../test-suite/groups/flattening/case033.json | 8 + .../test-suite/groups/flattening/case034.json | 37 + .../test-suite/groups/flattening/case035.json | 39 + .../test-suite/groups/flattening/case036.json | 6 + .../test-suite/groups/flattening/case037.json | 8 + .../test-suite/groups/flattening/case038.json | 8 + .../test-suite/groups/flattening/case039.json | 9 + .../test-suite/groups/flattening/case040.json | 13 + .../test-suite/groups/flattening/case041.json | 17 + .../groups/function-abs/case000.json | 6 + .../groups/function-abs/case001.json | 6 + .../groups/function-abs/case002.json | 6 + .../groups/function-abs/case003.json | 6 + .../groups/function-append/case000.json | 11 + .../groups/function-append/case001.json | 10 + .../groups/function-append/case002.json | 9 + .../groups/function-append/case003.json | 6 + .../groups/function-append/case004.json | 10 + .../groups/function-applications/case000.json | 6 + .../groups/function-applications/case001.json | 6 + .../groups/function-applications/case002.json | 6 + .../groups/function-applications/case003.json | 6 + .../groups/function-applications/case004.json | 6 + .../groups/function-applications/case005.json | 6 + .../groups/function-applications/case006.json | 6 + .../groups/function-applications/case007.json | 6 + .../groups/function-applications/case008.json | 6 + .../groups/function-applications/case009.json | 6 + .../groups/function-applications/case010.json | 12 + .../groups/function-applications/case011.json | 6 + .../groups/function-applications/case012.json | 6 + .../groups/function-applications/case013.json | 6 + .../groups/function-applications/case014.json | 6 + .../groups/function-applications/case015.json | 6 + .../groups/function-applications/case016.json | 6 + .../groups/function-applications/case017.json | 6 + .../groups/function-applications/case018.json | 6 + .../groups/function-applications/case019.json | 6 + .../groups/function-applications/case020.json | 6 + .../groups/function-applications/case021.json | 10 + .../groups/function-average/case000.json | 6 + .../groups/function-average/case001.json | 9 + .../groups/function-average/case002.json | 9 + .../groups/function-average/case003.json | 6 + .../groups/function-average/case004.json | 6 + .../groups/function-average/case005.json | 6 + .../groups/function-average/case006.json | 6 + .../groups/function-average/case007.json | 6 + .../groups/function-average/case008.json | 6 + .../groups/function-average/case009.json | 6 + .../groups/function-average/case010.json | 6 + .../groups/function-average/case011.json | 6 + .../groups/function-average/case012.json | 6 + .../groups/function-boolean/case000.json | 6 + .../groups/function-boolean/case001.json | 6 + .../groups/function-boolean/case002.json | 6 + .../groups/function-boolean/case003.json | 6 + .../groups/function-boolean/case004.json | 6 + .../groups/function-boolean/case005.json | 6 + .../groups/function-boolean/case006.json | 6 + .../groups/function-boolean/case007.json | 6 + .../groups/function-boolean/case008.json | 6 + .../groups/function-boolean/case009.json | 6 + .../groups/function-boolean/case010.json | 6 + .../groups/function-boolean/case011.json | 6 + .../groups/function-boolean/case012.json | 6 + .../groups/function-boolean/case013.json | 6 + .../groups/function-boolean/case014.json | 6 + .../groups/function-boolean/case015.json | 6 + .../groups/function-boolean/case016.json | 6 + .../groups/function-boolean/case017.json | 6 + .../groups/function-boolean/case018.json | 6 + .../groups/function-boolean/case019.json | 6 + .../groups/function-boolean/case020.json | 6 + .../groups/function-boolean/case021.json | 6 + .../groups/function-boolean/case022.json | 6 + .../groups/function-boolean/case023.json | 6 + .../groups/function-ceil/case000.json | 6 + .../groups/function-ceil/case001.json | 6 + .../groups/function-ceil/case002.json | 6 + .../groups/function-ceil/case003.json | 6 + .../groups/function-clone/case000.json | 6 + .../groups/function-clone/case001.json | 6 + .../groups/function-clone/case002.json | 8 + .../groups/function-contains/case000.json | 6 + .../groups/function-contains/case001.json | 6 + .../groups/function-contains/case002.json | 6 + .../groups/function-contains/case003.json | 6 + .../groups/function-contains/case004.json | 6 + .../groups/function-contains/case005.json | 6 + .../groups/function-contains/case006.json | 6 + .../groups/function-count/case000.json | 6 + .../groups/function-count/case001.json | 9 + .../groups/function-count/case002.json | 9 + .../groups/function-count/case003.json | 6 + .../groups/function-count/case004.json | 6 + .../groups/function-count/case005.json | 6 + .../groups/function-count/case006.json | 6 + .../groups/function-count/case007.json | 6 + .../groups/function-count/case008.json | 6 + .../groups/function-count/case009.json | 6 + .../groups/function-count/case010.json | 6 + .../groups/function-count/case011.json | 6 + .../groups/function-count/case012.json | 6 + .../groups/function-count/case013.json | 6 + .../groups/function-each/case000.json | 10 + .../groups/function-each/case001.json | 12 + .../groups/function-each/case002.json | 26 + .../groups/function-each/case003.json | 6 + .../groups/function-each/case004.json | 8 + .../groups/function-exists/case000.json | 6 + .../groups/function-exists/case001.json | 6 + .../groups/function-exists/case002.json | 6 + .../groups/function-exists/case003.json | 6 + .../groups/function-exists/case004.json | 6 + .../groups/function-exists/case005.json | 6 + .../groups/function-exists/case006.json | 6 + .../groups/function-exists/case007.json | 6 + .../groups/function-exists/case008.json | 6 + .../groups/function-exists/case009.json | 6 + .../groups/function-exists/case010.json | 6 + .../groups/function-exists/case011.json | 6 + .../groups/function-exists/case012.json | 6 + .../groups/function-exists/case013.json | 6 + .../groups/function-exists/case014.json | 6 + .../groups/function-exists/case015.json | 6 + .../groups/function-exists/case016.json | 6 + .../groups/function-exists/case017.json | 6 + .../groups/function-exists/case018.json | 6 + .../groups/function-exists/case019.json | 6 + .../groups/function-exists/case020.json | 6 + .../groups/function-exists/case021.json | 6 + .../groups/function-exists/case022.json | 6 + .../groups/function-exists/case023.json | 6 + .../groups/function-exists/case024.json | 6 + .../groups/function-floor/case000.json | 6 + .../groups/function-floor/case001.json | 6 + .../groups/function-floor/case002.json | 6 + .../groups/function-floor/case003.json | 6 + .../groups/function-formatBase/case000.json | 6 + .../groups/function-formatBase/case001.json | 6 + .../groups/function-formatBase/case002.json | 6 + .../groups/function-formatBase/case003.json | 6 + .../groups/function-formatBase/case004.json | 6 + .../groups/function-formatBase/case005.json | 6 + .../groups/function-formatBase/case006.json | 6 + .../groups/function-formatBase/case007.json | 6 + .../groups/function-formatNumber/case000.json | 6 + .../groups/function-formatNumber/case001.json | 6 + .../groups/function-formatNumber/case002.json | 6 + .../groups/function-formatNumber/case003.json | 6 + .../groups/function-formatNumber/case004.json | 6 + .../groups/function-formatNumber/case005.json | 6 + .../groups/function-formatNumber/case006.json | 6 + .../groups/function-formatNumber/case007.json | 6 + .../groups/function-formatNumber/case008.json | 6 + .../groups/function-formatNumber/case009.json | 6 + .../groups/function-formatNumber/case010.json | 6 + .../groups/function-formatNumber/case011.json | 6 + .../groups/function-formatNumber/case012.json | 6 + .../groups/function-formatNumber/case013.json | 6 + .../groups/function-formatNumber/case014.json | 6 + .../groups/function-formatNumber/case015.json | 6 + .../groups/function-formatNumber/case016.json | 6 + .../groups/function-formatNumber/case017.json | 6 + .../groups/function-formatNumber/case018.json | 6 + .../groups/function-formatNumber/case019.json | 6 + .../groups/function-formatNumber/case020.json | 6 + .../groups/function-formatNumber/case021.json | 6 + .../groups/function-formatNumber/case022.json | 6 + .../groups/function-formatNumber/case023.json | 6 + .../groups/function-formatNumber/case024.json | 6 + .../groups/function-formatNumber/case025.json | 6 + .../groups/function-formatNumber/case026.json | 6 + .../groups/function-formatNumber/case027.json | 6 + .../groups/function-formatNumber/case028.json | 6 + .../groups/function-formatNumber/case029.json | 6 + .../groups/function-formatNumber/case030.json | 6 + .../groups/function-formatNumber/case031.json | 6 + .../groups/function-formatNumber/case032.json | 6 + .../groups/function-fromMillis/case000.json | 6 + .../groups/function-fromMillis/case001.json | 6 + .../groups/function-fromMillis/case002.json | 6 + .../groups/function-join/case000.json | 6 + .../groups/function-join/case001.json | 6 + .../groups/function-join/case002.json | 6 + .../groups/function-join/case003.json | 6 + .../groups/function-join/case004.json | 6 + .../groups/function-join/case005.json | 6 + .../groups/function-join/case006.json | 6 + .../groups/function-join/case007.json | 6 + .../groups/function-join/case008.json | 6 + .../groups/function-join/case009.json | 6 + .../groups/function-join/case010.json | 6 + .../groups/function-join/case011.json | 6 + .../groups/function-keys/case000.json | 9 + .../groups/function-keys/case001.json | 13 + .../groups/function-keys/case002.json | 6 + .../groups/function-keys/case003.json | 8 + .../groups/function-keys/case004.json | 6 + .../groups/function-keys/case005.json | 6 + .../groups/function-keys/case006.json | 6 + .../groups/function-length/case000.json | 6 + .../groups/function-length/case001.json | 6 + .../groups/function-length/case002.json | 6 + .../groups/function-length/case003.json | 6 + .../groups/function-length/case004.json | 6 + .../groups/function-length/case005.json | 6 + .../groups/function-length/case006.json | 6 + .../groups/function-length/case007.json | 6 + .../groups/function-length/case008.json | 6 + .../groups/function-length/case009.json | 6 + .../groups/function-length/case010.json | 6 + .../groups/function-length/case011.json | 6 + .../groups/function-length/case012.json | 6 + .../groups/function-length/case013.json | 6 + .../groups/function-length/case014.json | 6 + .../groups/function-length/case015.json | 6 + .../groups/function-lookup/case000.json | 6 + .../groups/function-lookup/case001.json | 11 + .../groups/function-lookup/case002.json | 6 + .../groups/function-lookup/case003.json | 6 + .../groups/function-lowercase/case000.json | 6 + .../groups/function-lowercase/case001.json | 6 + .../groups/function-max/case000.json | 6 + .../groups/function-max/case001.json | 9 + .../groups/function-max/case002.json | 9 + .../groups/function-max/case003.json | 6 + .../groups/function-max/case004.json | 6 + .../groups/function-max/case005.json | 6 + .../groups/function-max/case006.json | 6 + .../groups/function-max/case007.json | 6 + .../groups/function-max/case008.json | 6 + .../groups/function-max/case009.json | 6 + .../groups/function-max/case010.json | 6 + .../groups/function-max/case011.json | 6 + .../groups/function-max/case012.json | 6 + .../groups/function-max/case013.json | 6 + .../groups/function-max/case014.json | 6 + .../groups/function-max/case015.json | 9 + .../groups/function-max/case016.json | 9 + .../groups/function-max/case017.json | 6 + .../groups/function-max/case018.json | 6 + .../groups/function-max/case019.json | 6 + .../groups/function-max/case020.json | 6 + .../groups/function-max/case021.json | 6 + .../groups/function-max/case022.json | 6 + .../groups/function-max/case023.json | 6 + .../groups/function-max/case024.json | 6 + .../groups/function-max/case025.json | 6 + .../groups/function-max/case026.json | 6 + .../groups/function-merge/case000.json | 6 + .../groups/function-merge/case001.json | 8 + .../groups/function-merge/case002.json | 9 + .../groups/function-merge/case003.json | 10 + .../groups/function-merge/case004.json | 9 + .../groups/function-number/case000.json | 6 + .../groups/function-number/case001.json | 6 + .../groups/function-number/case002.json | 6 + .../groups/function-number/case003.json | 6 + .../groups/function-number/case004.json | 6 + .../groups/function-number/case005.json | 6 + .../groups/function-number/case006.json | 6 + .../groups/function-number/case007.json | 6 + .../groups/function-number/case008.json | 6 + .../groups/function-number/case009.json | 6 + .../groups/function-number/case010.json | 6 + .../groups/function-number/case011.json | 6 + .../groups/function-number/case012.json | 6 + .../groups/function-number/case013.json | 6 + .../groups/function-number/case014.json | 6 + .../groups/function-number/case015.json | 6 + .../groups/function-number/case016.json | 6 + .../groups/function-number/case017.json | 6 + .../groups/function-number/case018.json | 6 + .../groups/function-number/case019.json | 6 + .../groups/function-number/case020.json | 6 + .../groups/function-number/case021.json | 6 + .../groups/function-number/case022.json | 6 + .../groups/function-number/case023.json | 6 + .../groups/function-number/case024.json | 6 + .../groups/function-number/case025.json | 6 + .../groups/function-number/case026.json | 6 + .../groups/function-pad/case000.json | 6 + .../groups/function-pad/case001.json | 6 + .../groups/function-pad/case002.json | 6 + .../groups/function-pad/case003.json | 6 + .../groups/function-pad/case004.json | 6 + .../groups/function-pad/case005.json | 6 + .../groups/function-pad/case006.json | 6 + .../groups/function-power/case000.json | 6 + .../groups/function-power/case001.json | 6 + .../groups/function-power/case002.json | 6 + .../groups/function-power/case003.json | 6 + .../groups/function-power/case004.json | 6 + .../groups/function-power/case005.json | 6 + .../groups/function-power/case006.json | 6 + .../groups/function-replace/case000.json | 6 + .../groups/function-replace/case001.json | 6 + .../groups/function-replace/case002.json | 6 + .../groups/function-replace/case003.json | 6 + .../groups/function-replace/case004.json | 6 + .../groups/function-replace/case005.json | 6 + .../groups/function-replace/case006.json | 6 + .../groups/function-replace/case007.json | 6 + .../groups/function-replace/case008.json | 6 + .../groups/function-replace/case009.json | 6 + .../groups/function-replace/case010.json | 6 + .../groups/function-replace/case011.json | 6 + .../groups/function-round/case000.json | 6 + .../groups/function-round/case001.json | 6 + .../groups/function-round/case002.json | 6 + .../groups/function-round/case003.json | 6 + .../groups/function-round/case004.json | 6 + .../groups/function-round/case005.json | 6 + .../groups/function-round/case006.json | 6 + .../groups/function-round/case007.json | 6 + .../groups/function-round/case008.json | 6 + .../groups/function-round/case009.json | 6 + .../groups/function-round/case010.json | 6 + .../groups/function-round/case011.json | 6 + .../groups/function-round/case012.json | 6 + .../groups/function-round/case013.json | 6 + .../groups/function-round/case014.json | 6 + .../groups/function-round/case015.json | 6 + .../groups/function-round/case016.json | 6 + .../groups/function-round/case017.json | 6 + .../groups/function-shuffle/case000.json | 6 + .../groups/function-shuffle/case001.json | 17 + .../groups/function-shuffle/case002.json | 6 + .../groups/function-shuffle/case003.json | 8 + .../groups/function-sift/case000.json | 21 + .../groups/function-sift/case001.json | 21 + .../groups/function-sift/case002.json | 13 + .../groups/function-sift/case003.json | 6 + .../groups/function-sift/case004.json | 6 + .../groups/function-sift/case005.json | 6 + .../groups/function-sift/case006.json | 6 + .../groups/function-signatures/case000.json | 6 + .../groups/function-signatures/case001.json | 6 + .../groups/function-signatures/case002.json | 6 + .../groups/function-signatures/case003.json | 6 + .../groups/function-signatures/case004.json | 12 + .../groups/function-signatures/case005.json | 12 + .../groups/function-signatures/case006.json | 6 + .../groups/function-signatures/case007.json | 6 + .../groups/function-signatures/case008.json | 11 + .../groups/function-signatures/case009.json | 6 + .../groups/function-signatures/case010.json | 6 + .../groups/function-signatures/case011.json | 6 + .../groups/function-signatures/case012.json | 6 + .../groups/function-signatures/case013.json | 6 + .../groups/function-signatures/case014.json | 6 + .../groups/function-signatures/case015.json | 6 + .../groups/function-signatures/case016.json | 6 + .../groups/function-signatures/case017.json | 6 + .../groups/function-signatures/case018.json | 6 + .../groups/function-signatures/case019.json | 8 + .../groups/function-signatures/case020.json | 10 + .../groups/function-signatures/case021.json | 6 + .../groups/function-signatures/case022.json | 6 + .../groups/function-signatures/case023.json | 12 + .../groups/function-signatures/case024.json | 6 + .../groups/function-signatures/case025.json | 6 + .../groups/function-signatures/case026.json | 6 + .../groups/function-signatures/case027.json | 6 + .../groups/function-signatures/case028.json | 6 + .../groups/function-signatures/case029.json | 6 + .../groups/function-signatures/case030.json | 6 + .../groups/function-signatures/case031.json | 6 + .../groups/function-signatures/case032.json | 6 + .../groups/function-signatures/case033.json | 6 + .../groups/function-signatures/case034.json | 6 + .../groups/function-sort/case000.json | 6 + .../groups/function-sort/case001.json | 8 + .../groups/function-sort/case002.json | 10 + .../groups/function-sort/case003.json | 11 + .../groups/function-sort/case004.json | 26 + .../groups/function-sort/case005.json | 11 + .../groups/function-sort/case006.json | 11 + .../groups/function-sort/case007.json | 6 + .../groups/function-sort/case008.json | 11 + .../groups/function-sort/case009.json | 11 + .../groups/function-sort/case010.json | 11 + .../groups/function-split/case000.json | 9 + .../groups/function-split/case001.json | 8 + .../groups/function-split/case002.json | 10 + .../groups/function-split/case003.json | 12 + .../groups/function-split/case004.json | 6 + .../groups/function-split/case005.json | 11 + .../groups/function-split/case006.json | 9 + .../groups/function-split/case007.json | 9 + .../groups/function-split/case008.json | 11 + .../groups/function-split/case009.json | 6 + .../groups/function-split/case010.json | 6 + .../groups/function-split/case011.json | 6 + .../groups/function-split/case012.json | 6 + .../groups/function-split/case013.json | 6 + .../groups/function-split/case014.json | 6 + .../groups/function-split/case015.json | 6 + .../groups/function-split/case016.json | 6 + .../groups/function-split/case017.json | 6 + .../groups/function-spread/case000.json | 6 + .../groups/function-spread/case001.json | 67 + .../groups/function-spread/case002.json | 6 + .../groups/function-spread/case003.json | 6 + .../groups/function-sqrt/case000.json | 6 + .../groups/function-sqrt/case001.json | 6 + .../groups/function-sqrt/case002.json | 6 + .../groups/function-sqrt/case003.json | 6 + .../groups/function-string/case000.json | 6 + .../groups/function-string/case001.json | 6 + .../groups/function-string/case002.json | 6 + .../groups/function-string/case003.json | 6 + .../groups/function-string/case004.json | 6 + .../groups/function-string/case005.json | 6 + .../groups/function-string/case006.json | 6 + .../groups/function-string/case007.json | 6 + .../groups/function-string/case008.json | 9 + .../groups/function-string/case009.json | 6 + .../groups/function-string/case010.json | 6 + .../groups/function-string/case011.json | 6 + .../groups/function-string/case012.json | 6 + .../groups/function-string/case013.json | 6 + .../groups/function-string/case014.json | 6 + .../groups/function-string/case015.json | 6 + .../groups/function-string/case016.json | 6 + .../groups/function-string/case017.json | 6 + .../groups/function-string/case018.json | 6 + .../groups/function-string/case019.json | 6 + .../groups/function-string/case020.json | 6 + .../groups/function-string/case021.json | 6 + .../groups/function-string/case022.json | 6 + .../groups/function-substring/case000.json | 6 + .../groups/function-substring/case001.json | 6 + .../groups/function-substring/case002.json | 6 + .../groups/function-substring/case003.json | 6 + .../function-substringAfter/case000.json | 6 + .../function-substringAfter/case001.json | 6 + .../function-substringAfter/case002.json | 6 + .../function-substringAfter/case003.json | 6 + .../function-substringAfter/case004.json | 6 + .../function-substringBefore/case000.json | 6 + .../function-substringBefore/case001.json | 6 + .../function-substringBefore/case002.json | 6 + .../function-substringBefore/case003.json | 6 + .../function-substringBefore/case004.json | 6 + .../groups/function-sum/case000.json | 6 + .../groups/function-sum/case001.json | 9 + .../groups/function-sum/case002.json | 9 + .../groups/function-sum/case003.json | 6 + .../groups/function-sum/case004.json | 6 + .../groups/function-sum/case005.json | 6 + .../groups/function-sum/case006.json | 6 + .../groups/function-trim/case000.json | 6 + .../groups/function-trim/case001.json | 6 + .../groups/function-trim/case002.json | 6 + .../groups/function-uppercase/case000.json | 6 + .../groups/function-uppercase/case001.json | 6 + .../groups/function-zip/case000.json | 19 + .../groups/function-zip/case001.json | 22 + .../groups/function-zip/case002.json | 17 + .../groups/function-zip/case003.json | 16 + .../groups/function-zip/case004.json | 12 + .../groups/function-zip/case005.json | 6 + .../higher-order-functions/case000.json | 6 + .../higher-order-functions/case001.json | 6 + .../higher-order-functions/case002.json | 6 + .../test-suite/groups/hof-filter/case000.json | 6 + .../test-suite/groups/hof-filter/case001.json | 6 + .../test-suite/groups/hof-map/case000.json | 12 + .../test-suite/groups/hof-map/case001.json | 6 + .../test-suite/groups/hof-map/case002.json | 10 + .../test-suite/groups/hof-map/case003.json | 11 + .../test-suite/groups/hof-map/case004.json | 11 + .../test-suite/groups/hof-map/case005.json | 9 + .../test-suite/groups/hof-map/case006.json | 9 + .../test-suite/groups/hof-map/case007.json | 11 + .../test-suite/groups/hof-map/case008.json | 6 + .../test-suite/groups/hof-reduce/case000.json | 6 + .../test-suite/groups/hof-reduce/case001.json | 6 + .../test-suite/groups/hof-reduce/case002.json | 6 + .../test-suite/groups/hof-reduce/case003.json | 6 + .../test-suite/groups/hof-reduce/case004.json | 6 + .../test-suite/groups/hof-reduce/case005.json | 11 + .../test-suite/groups/hof-reduce/case006.json | 6 + .../test-suite/groups/hof-reduce/case007.json | 13 + .../test-suite/groups/hof-reduce/case008.json | 6 + .../groups/hof-zip-map/case000.json | 12 + .../groups/hof-zip-map/case001.json | 12 + .../groups/hof-zip-map/case002.json | 6 + .../groups/hof-zip-map/case003.json | 6 + .../groups/inclusion-operator/case000.json | 6 + .../groups/inclusion-operator/case001.json | 6 + .../groups/inclusion-operator/case002.json | 6 + .../groups/inclusion-operator/case003.json | 6 + .../groups/inclusion-operator/case004.json | 6 + .../groups/inclusion-operator/case005.json | 6 + .../groups/inclusion-operator/case006.json | 6 + .../groups/inclusion-operator/case007.json | 9 + .../groups/inclusion-operator/case008.json | 6 + .../test-suite/groups/lambdas/case000.json | 6 + .../test-suite/groups/lambdas/case001.json | 6 + .../test-suite/groups/lambdas/case002.json | 6 + .../test-suite/groups/lambdas/case003.json | 6 + .../test-suite/groups/lambdas/case004.json | 16 + .../test-suite/groups/lambdas/case005.json | 6 + .../test-suite/groups/lambdas/case006.json | 6 + .../test-suite/groups/lambdas/case007.json | 6 + .../test-suite/groups/lambdas/case008.json | 6 + .../test-suite/groups/lambdas/case009.json | 9 + .../test-suite/groups/lambdas/case010.json | 23 + .../test-suite/groups/lambdas/case011.json | 15 + .../test-suite/groups/literals/case000.json | 6 + .../test-suite/groups/literals/case001.json | 6 + .../test-suite/groups/literals/case002.json | 6 + .../test-suite/groups/literals/case003.json | 6 + .../test-suite/groups/literals/case004.json | 6 + .../test-suite/groups/literals/case005.json | 6 + .../test-suite/groups/literals/case006.json | 6 + .../test-suite/groups/literals/case007.json | 6 + .../test-suite/groups/literals/case008.json | 6 + .../test-suite/groups/literals/case009.json | 6 + .../test-suite/groups/literals/case010.json | 6 + .../test-suite/groups/literals/case011.json | 6 + .../test-suite/groups/literals/case012.json | 6 + .../test-suite/groups/literals/case013.json | 6 + .../test-suite/groups/literals/case014.json | 6 + .../test-suite/groups/literals/case015.json | 6 + .../test-suite/groups/literals/case016.json | 6 + .../test-suite/groups/literals/case017.json | 6 + .../groups/missing-paths/case000.json | 6 + .../groups/missing-paths/case001.json | 6 + .../groups/missing-paths/case002.json | 6 + .../groups/missing-paths/case003.json | 6 + .../groups/missing-paths/case004.json | 6 + .../groups/missing-paths/case005.json | 6 + .../multiple-array-selectors/case000.json | 12 + .../multiple-array-selectors/case001.json | 12 + .../multiple-array-selectors/case002.json | 17 + __tests__/test-suite/groups/null/case000.json | 6 + __tests__/test-suite/groups/null/case001.json | 8 + __tests__/test-suite/groups/null/case002.json | 9 + __tests__/test-suite/groups/null/case003.json | 6 + __tests__/test-suite/groups/null/case004.json | 6 + __tests__/test-suite/groups/null/case005.json | 6 + __tests__/test-suite/groups/null/case006.json | 10 + .../groups/numeric-operators/case000.json | 6 + .../groups/numeric-operators/case001.json | 6 + .../groups/numeric-operators/case002.json | 6 + .../groups/numeric-operators/case003.json | 6 + .../groups/numeric-operators/case004.json | 6 + .../groups/numeric-operators/case005.json | 6 + .../groups/numeric-operators/case006.json | 6 + .../groups/numeric-operators/case007.json | 6 + .../groups/numeric-operators/case008.json | 6 + .../groups/numeric-operators/case009.json | 6 + .../groups/numeric-operators/case010.json | 6 + .../groups/numeric-operators/case011.json | 6 + .../groups/numeric-operators/case012.json | 6 + .../groups/numeric-operators/case013.json | 6 + .../groups/numeric-operators/case014.json | 6 + .../groups/numeric-operators/case015.json | 6 + .../groups/numeric-operators/case016.json | 6 + .../groups/object-constructor/case000.json | 6 + .../groups/object-constructor/case001.json | 8 + .../groups/object-constructor/case002.json | 9 + .../groups/object-constructor/case003.json | 6 + .../groups/object-constructor/case004.json | 12 + .../groups/object-constructor/case005.json | 12 + .../groups/object-constructor/case006.json | 6 + .../groups/object-constructor/case007.json | 6 + .../groups/object-constructor/case008.json | 15 + .../groups/object-constructor/case009.json | 19 + .../groups/object-constructor/case010.json | 13 + .../groups/object-constructor/case011.json | 10 + .../groups/object-constructor/case012.json | 19 + .../groups/object-constructor/case013.json | 6 + .../groups/object-constructor/case014.json | 6 + .../groups/object-constructor/case015.json | 9 + .../groups/object-constructor/case016.json | 13 + .../groups/object-constructor/case017.json | 21 + .../groups/object-constructor/case018.json | 21 + .../groups/object-constructor/case019.json | 21 + .../groups/object-constructor/case020.json | 53 + .../groups/object-constructor/case021.json | 53 + .../groups/object-constructor/case022.json | 16 + .../groups/parentheses/case000.json | 9 + .../groups/parentheses/case001.json | 9 + .../groups/parentheses/case002.json | 9 + .../groups/parentheses/case003.json | 9 + .../groups/parentheses/case004.json | 9 + .../groups/parentheses/case005.json | 9 + .../groups/parentheses/case006.json | 9 + .../groups/parentheses/case007.json | 6 + .../groups/partial-application/case000.json | 6 + .../groups/partial-application/case001.json | 6 + .../groups/partial-application/case002.json | 6 + .../groups/partial-application/case003.json | 6 + .../groups/partial-application/case004.json | 6 + .../test-suite/groups/predicates/case000.json | 6 + .../test-suite/groups/predicates/case001.json | 14 + .../test-suite/groups/predicates/case002.json | 12 + .../test-suite/groups/predicates/case003.json | 9 + .../groups/quoted-selectors/case000.json | 20 + .../groups/quoted-selectors/case001.json | 9 + .../groups/quoted-selectors/case002.json | 9 + .../groups/quoted-selectors/case003.json | 6 + .../groups/quoted-selectors/case004.json | 20 + .../groups/quoted-selectors/case005.json | 9 + .../groups/quoted-selectors/case006.json | 9 + .../groups/quoted-selectors/case007.json | 6 + .../groups/range-operator/case000.json | 17 + .../groups/range-operator/case001.json | 12 + .../groups/range-operator/case002.json | 16 + .../groups/range-operator/case003.json | 6 + .../groups/range-operator/case004.json | 11 + .../groups/range-operator/case005.json | 12 + .../groups/range-operator/case006.json | 12 + .../groups/range-operator/case007.json | 6 + .../groups/range-operator/case008.json | 8 + .../groups/range-operator/case009.json | 6 + .../groups/range-operator/case010.json | 6 + .../test-suite/groups/regex/case000.json | 11 + .../test-suite/groups/regex/case001.json | 9 + .../test-suite/groups/regex/case002.json | 8 + .../test-suite/groups/regex/case003.json | 6 + .../test-suite/groups/regex/case004.json | 6 + .../test-suite/groups/regex/case005.json | 6 + .../test-suite/groups/regex/case006.json | 10 + .../test-suite/groups/regex/case007.json | 6 + .../test-suite/groups/regex/case008.json | 6 + .../test-suite/groups/regex/case009.json | 6 + .../test-suite/groups/regex/case010.json | 6 + .../test-suite/groups/regex/case011.json | 6 + .../test-suite/groups/regex/case012.json | 6 + .../test-suite/groups/regex/case013.json | 6 + .../test-suite/groups/regex/case014.json | 6 + .../test-suite/groups/regex/case015.json | 6 + .../test-suite/groups/regex/case016.json | 6 + .../test-suite/groups/regex/case017.json | 6 + .../test-suite/groups/regex/case018.json | 6 + .../test-suite/groups/regex/case019.json | 6 + .../test-suite/groups/regex/case020.json | 6 + .../test-suite/groups/regex/case021.json | 6 + .../test-suite/groups/regex/case022.json | 6 + .../test-suite/groups/regex/case023.json | 6 + .../test-suite/groups/regex/case024.json | 6 + .../test-suite/groups/regex/case025.json | 6 + .../test-suite/groups/regex/case026.json | 6 + .../test-suite/groups/regex/case027.json | 6 + .../test-suite/groups/regex/case028.json | 6 + .../test-suite/groups/regex/case029.json | 6 + .../test-suite/groups/regex/case030.json | 6 + .../test-suite/groups/regex/case031.json | 6 + .../test-suite/groups/regex/case032.json | 11 + .../test-suite/groups/regex/case033.json | 11 + .../test-suite/groups/regex/case034.json | 6 + .../test-suite/groups/regex/case035.json | 6 + .../test-suite/groups/regex/case036.json | 6 + .../simple-array-selectors/case000.json | 11 + .../simple-array-selectors/case001.json | 6 + .../simple-array-selectors/case002.json | 6 + .../simple-array-selectors/case003.json | 6 + .../simple-array-selectors/case004.json | 6 + .../simple-array-selectors/case005.json | 9 + .../simple-array-selectors/case006.json | 9 + .../simple-array-selectors/case007.json | 6 + .../simple-array-selectors/case008.json | 6 + .../simple-array-selectors/case009.json | 6 + .../simple-array-selectors/case010.json | 6 + .../simple-array-selectors/case011.json | 6 + .../simple-array-selectors/case012.json | 6 + .../simple-array-selectors/case013.json | 6 + .../simple-array-selectors/case014.json | 6 + .../simple-array-selectors/case015.json | 8 + .../simple-array-selectors/case016.json | 13 + .../simple-array-selectors/case017.json | 8 + .../simple-array-selectors/case018.json | 18 + .../simple-array-selectors/case019.json | 18 + .../simple-array-selectors/case020.json | 18 + .../simple-array-selectors/case021.json | 15 + .../simple-array-selectors/case022.json | 15 + .../test-suite/groups/sorting/case000.json | 11 + .../test-suite/groups/sorting/case001.json | 11 + .../test-suite/groups/sorting/case002.json | 11 + .../test-suite/groups/sorting/case003.json | 11 + .../test-suite/groups/sorting/case004.json | 11 + .../test-suite/groups/sorting/case005.json | 11 + .../test-suite/groups/sorting/case006.json | 11 + .../test-suite/groups/sorting/case007.json | 11 + .../test-suite/groups/sorting/case008.json | 11 + .../test-suite/groups/sorting/case009.json | 11 + .../test-suite/groups/sorting/case010.json | 11 + .../test-suite/groups/sorting/case011.json | 6 + .../test-suite/groups/sorting/case012.json | 6 + .../test-suite/groups/sorting/case013.json | 6 + .../groups/string-concat/case000.json | 6 + .../groups/string-concat/case001.json | 6 + .../groups/string-concat/case002.json | 6 + .../groups/string-concat/case003.json | 6 + .../groups/string-concat/case004.json | 6 + .../groups/string-concat/case005.json | 6 + .../groups/string-concat/case006.json | 6 + .../groups/string-concat/case007.json | 6 + .../groups/string-concat/case008.json | 6 + .../groups/string-concat/case009.json | 6 + .../groups/string-concat/case010.json | 6 + .../groups/string-concat/case011.json | 6 + .../groups/tail-recursion/case000.json | 6 + .../groups/tail-recursion/case001.json | 8 + .../groups/tail-recursion/case002.json | 8 + .../groups/tail-recursion/case003.json | 6 + .../groups/tail-recursion/case004.json | 6 + .../groups/tail-recursion/case005.json | 8 + .../groups/tail-recursion/case006.json | 8 + .../groups/tail-recursion/case007.json | 8 + .../test-suite/groups/transform/case000.json | 49 + .../test-suite/groups/transform/case001.json | 18 + .../test-suite/groups/transform/case002.json | 14 + .../test-suite/groups/transform/case003.json | 12 + .../test-suite/groups/transform/case004.json | 15 + .../test-suite/groups/transform/case005.json | 15 + .../test-suite/groups/transform/case006.json | 15 + .../test-suite/groups/transform/case007.json | 10 + .../test-suite/groups/transform/case008.json | 8 + .../test-suite/groups/transform/case009.json | 8 + .../test-suite/groups/transform/case010.json | 8 + .../test-suite/groups/transform/case011.json | 6 + .../test-suite/groups/transform/case012.json | 8 + .../test-suite/groups/transform/case013.json | 6 + .../test-suite/groups/transform/case014.json | 6 + .../test-suite/groups/transform/case015.json | 6 + .../test-suite/groups/transform/case016.json | 8 + .../test-suite/groups/transform/case017.json | 6 + .../test-suite/groups/transform/case018.json | 8 + .../test-suite/groups/transform/case019.json | 6 + .../test-suite/groups/transform/case020.json | 8 + .../test-suite/groups/transform/case021.json | 6 + .../test-suite/groups/transform/case022.json | 6 + .../test-suite/groups/transform/case023.json | 8 + .../test-suite/groups/transform/case024.json | 6 + .../test-suite/groups/transform/case025.json | 8 + .../test-suite/groups/transform/case026.json | 6 + .../test-suite/groups/transform/case027.json | 6 + .../test-suite/groups/transform/case028.json | 6 + .../test-suite/groups/transform/case029.json | 6 + .../test-suite/groups/transform/case030.json | 6 + .../test-suite/groups/transform/case031.json | 6 + .../test-suite/groups/transform/case032.json | 6 + .../test-suite/groups/transform/case033.json | 6 + .../test-suite/groups/transform/case034.json | 6 + .../test-suite/groups/transform/case035.json | 6 + .../test-suite/groups/transform/case036.json | 6 + .../test-suite/groups/transform/case037.json | 6 + .../test-suite/groups/transform/case038.json | 6 + .../test-suite/groups/transform/case039.json | 6 + .../test-suite/groups/transform/case040.json | 6 + .../test-suite/groups/transform/case041.json | 6 + .../test-suite/groups/transform/case042.json | 6 + .../test-suite/groups/transform/case043.json | 6 + .../test-suite/groups/transform/case044.json | 6 + .../test-suite/groups/transform/case045.json | 6 + .../test-suite/groups/transform/case046.json | 6 + .../test-suite/groups/transform/case047.json | 6 + .../test-suite/groups/transform/case048.json | 6 + .../test-suite/groups/transform/case049.json | 6 + .../test-suite/groups/transform/case050.json | 6 + .../test-suite/groups/transform/case051.json | 6 + .../test-suite/groups/transform/case052.json | 6 + .../test-suite/groups/transform/case053.json | 6 + .../test-suite/groups/transform/case054.json | 6 + .../test-suite/groups/transform/case055.json | 6 + .../test-suite/groups/transform/case056.json | 6 + .../test-suite/groups/transform/case057.json | 6 + .../test-suite/groups/transform/case058.json | 6 + .../test-suite/groups/transform/case059.json | 6 + .../test-suite/groups/transform/case060.json | 6 + .../test-suite/groups/transform/case061.json | 6 + .../test-suite/groups/transform/case062.json | 6 + .../test-suite/groups/transform/case063.json | 6 + .../test-suite/groups/transform/case064.json | 6 + .../test-suite/groups/transform/case065.json | 6 + .../test-suite/groups/transform/case066.json | 6 + .../test-suite/groups/transform/case067.json | 6 + .../test-suite/groups/transform/case068.json | 6 + .../test-suite/groups/transform/case069.json | 6 + .../test-suite/groups/transform/case070.json | 6 + .../test-suite/groups/transform/case071.json | 6 + .../test-suite/groups/transform/case072.json | 6 + .../test-suite/groups/transform/case073.json | 6 + .../test-suite/groups/transform/case074.json | 6 + .../test-suite/groups/transform/case075.json | 6 + .../test-suite/groups/transform/case076.json | 6 + .../test-suite/groups/transform/case077.json | 6 + .../test-suite/groups/transform/case078.json | 6 + .../test-suite/groups/transform/case079.json | 6 + .../test-suite/groups/transform/case080.json | 6 + .../test-suite/groups/transform/case081.json | 6 + .../test-suite/groups/transform/case082.json | 6 + .../test-suite/groups/transform/case083.json | 6 + .../test-suite/groups/transform/case084.json | 6 + .../test-suite/groups/transform/case085.json | 6 + .../test-suite/groups/transform/case086.json | 6 + .../test-suite/groups/transform/case087.json | 6 + .../test-suite/groups/transform/case088.json | 6 + .../test-suite/groups/transform/case089.json | 6 + .../test-suite/groups/transform/case090.json | 6 + .../test-suite/groups/transform/case091.json | 6 + .../test-suite/groups/transform/case092.json | 6 + .../test-suite/groups/transform/case093.json | 6 + .../test-suite/groups/transform/case094.json | 6 + .../test-suite/groups/transform/case095.json | 6 + .../test-suite/groups/transform/case096.json | 6 + .../test-suite/groups/transform/case097.json | 6 + .../test-suite/groups/transform/case098.json | 6 + .../test-suite/groups/transform/case099.json | 6 + .../test-suite/groups/transform/case100.json | 6 + .../test-suite/groups/transform/case101.json | 6 + .../test-suite/groups/transform/case102.json | 6 + .../test-suite/groups/transform/case103.json | 6 + .../test-suite/groups/transforms/case000.json | 50 + .../test-suite/groups/transforms/case001.json | 45 + .../test-suite/groups/transforms/case002.json | 82 + .../test-suite/groups/transforms/case003.json | 50 + .../test-suite/groups/transforms/case004.json | 50 + .../test-suite/groups/transforms/case005.json | 72 + .../test-suite/groups/transforms/case006.json | 78 + .../test-suite/groups/transforms/case007.json | 18 + .../test-suite/groups/transforms/case008.json | 6 + .../test-suite/groups/transforms/case009.json | 6 + .../test-suite/groups/transforms/case010.json | 6 + .../test-suite/groups/transforms/case011.json | 18 + .../test-suite/groups/transforms/case012.json | 6 + .../test-suite/groups/variables/case000.json | 12 + .../test-suite/groups/variables/case001.json | 12 + .../test-suite/groups/variables/case002.json | 12 + .../test-suite/groups/variables/case003.json | 12 + .../test-suite/groups/variables/case004.json | 6 + .../test-suite/groups/variables/case005.json | 6 + .../test-suite/groups/variables/case006.json | 6 + .../test-suite/groups/variables/case007.json | 6 + .../test-suite/groups/variables/case008.json | 6 + .../test-suite/groups/variables/case009.json | 8 + .../test-suite/groups/variables/case010.json | 6 + .../test-suite/groups/variables/case011.json | 6 + .../test-suite/groups/wildcards/case000.json | 22 + .../test-suite/groups/wildcards/case001.json | 13 + .../test-suite/groups/wildcards/case002.json | 6 + .../test-suite/groups/wildcards/case003.json | 9 + .../test-suite/groups/wildcards/case004.json | 9 + .../test-suite/groups/wildcards/case005.json | 9 + .../test-suite/groups/wildcards/case006.json | 6 + .../test-suite/groups/wildcards/case007.json | 18 + .../test-suite/groups/wildcards/case008.json | 9 + .../test-suite/groups/wildcards/case009.json | 9 + jsonata.d.ts | 20 - jsonata.js | 5008 ---- package-lock.json | 5441 ---- package.json | 62 +- rollup.config.js | 25 + src/constants.ts | 139 + src/evaluate.ts | 1447 ++ src/functions.ts | 1888 ++ src/index.ts | 1 + src/jsonata.ts | 136 + src/parser/ast.ts | 130 + src/parser/index.ts | 1 + src/parser/leds.ts | 203 + src/parser/nuds.ts | 196 + src/parser/optimize.ts | 261 + src/parser/parser.ts | 185 + src/parser/symbols.ts | 165 + src/parser/tail_call.ts | 29 + src/parser/types.ts | 27 + src/signatures.ts | 341 + src/tokenizer.ts | 253 + src/utils.ts | 259 + test.out | 21056 ++++++++++++++++ test/async-function.js | 2 +- test/implementation-tests.js | 47 +- test/parser-recovery.js | 2 +- test/run-test-suite.js | 2 +- .../groups/tail-recursion/case001.json | 2 +- tsconfig-es2015.json | 6 + tsconfig-es5.json | 9 + tsconfig.json | 66 + yarn.lock | 4161 +++ 1093 files changed, 42118 insertions(+), 10545 deletions(-) delete mode 100644 .babelrc create mode 100644 __tests__/async-function.ts create mode 100644 __tests__/implementation-tests.ts create mode 100644 __tests__/parser-recovery.ts create mode 100644 __tests__/run-test-suite.ts create mode 100644 __tests__/test-suite/TESTSUITE.md create mode 100644 __tests__/test-suite/datasets/dataset0.json create mode 100644 __tests__/test-suite/datasets/dataset1.json create mode 100644 __tests__/test-suite/datasets/dataset10.json create mode 100644 __tests__/test-suite/datasets/dataset11.json create mode 100644 __tests__/test-suite/datasets/dataset12.json create mode 100644 __tests__/test-suite/datasets/dataset13.json create mode 100644 __tests__/test-suite/datasets/dataset14.json create mode 100644 __tests__/test-suite/datasets/dataset15.json create mode 100644 __tests__/test-suite/datasets/dataset16.json create mode 100644 __tests__/test-suite/datasets/dataset17.json create mode 100644 __tests__/test-suite/datasets/dataset18.json create mode 100644 __tests__/test-suite/datasets/dataset19.json create mode 100644 __tests__/test-suite/datasets/dataset2.json create mode 100644 __tests__/test-suite/datasets/dataset20.json create mode 100644 __tests__/test-suite/datasets/dataset21.json create mode 100644 __tests__/test-suite/datasets/dataset22.json create mode 100644 __tests__/test-suite/datasets/dataset23.json create mode 100644 __tests__/test-suite/datasets/dataset24.json create mode 100644 __tests__/test-suite/datasets/dataset3.json create mode 100644 __tests__/test-suite/datasets/dataset4.json create mode 100644 __tests__/test-suite/datasets/dataset5.json create mode 100644 __tests__/test-suite/datasets/dataset6.json create mode 100644 __tests__/test-suite/datasets/dataset7.json create mode 100644 __tests__/test-suite/datasets/dataset8.json create mode 100644 __tests__/test-suite/datasets/dataset9.json create mode 100644 __tests__/test-suite/groups/array-constructor/case000.json create mode 100644 __tests__/test-suite/groups/array-constructor/case001.json create mode 100644 __tests__/test-suite/groups/array-constructor/case002.json create mode 100644 __tests__/test-suite/groups/array-constructor/case003.json create mode 100644 __tests__/test-suite/groups/array-constructor/case004.json create mode 100644 __tests__/test-suite/groups/array-constructor/case005.json create mode 100644 __tests__/test-suite/groups/array-constructor/case006.json create mode 100644 __tests__/test-suite/groups/array-constructor/case007.json create mode 100644 __tests__/test-suite/groups/array-constructor/case008.json create mode 100644 __tests__/test-suite/groups/array-constructor/case009.json create mode 100644 __tests__/test-suite/groups/array-constructor/case010.json create mode 100644 __tests__/test-suite/groups/array-constructor/case011.json create mode 100644 __tests__/test-suite/groups/array-constructor/case012.json create mode 100644 __tests__/test-suite/groups/array-constructor/case013.json create mode 100644 __tests__/test-suite/groups/array-constructor/case014.json create mode 100644 __tests__/test-suite/groups/array-constructor/case015.json create mode 100644 __tests__/test-suite/groups/array-constructor/case016.json create mode 100644 __tests__/test-suite/groups/array-constructor/case017.json create mode 100644 __tests__/test-suite/groups/array-constructor/case018.json create mode 100644 __tests__/test-suite/groups/array-constructor/case019.json create mode 100644 __tests__/test-suite/groups/array-constructor/case020.json create mode 100644 __tests__/test-suite/groups/blocks/case000.json create mode 100644 __tests__/test-suite/groups/blocks/case001.json create mode 100644 __tests__/test-suite/groups/blocks/case002.json create mode 100644 __tests__/test-suite/groups/blocks/case003.json create mode 100644 __tests__/test-suite/groups/blocks/case004.json create mode 100644 __tests__/test-suite/groups/blocks/case005.json create mode 100644 __tests__/test-suite/groups/blocks/case006.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case000.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case001.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case002.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case003.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case004.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case005.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case006.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case007.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case008.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case009.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case010.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case011.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case012.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case013.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case014.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case015.json create mode 100644 __tests__/test-suite/groups/boolean-expresssions/case016.json create mode 100644 __tests__/test-suite/groups/closures/case000.json create mode 100644 __tests__/test-suite/groups/closures/case001.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case000.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case001.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case002.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case003.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case004.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case005.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case006.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case007.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case008.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case009.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case010.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case011.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case012.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case013.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case014.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case015.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case016.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case017.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case018.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case019.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case020.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case021.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case022.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case023.json create mode 100644 __tests__/test-suite/groups/comparison-operators/case024.json create mode 100644 __tests__/test-suite/groups/conditionals/case000.json create mode 100644 __tests__/test-suite/groups/conditionals/case001.json create mode 100644 __tests__/test-suite/groups/conditionals/case002.json create mode 100644 __tests__/test-suite/groups/conditionals/case003.json create mode 100644 __tests__/test-suite/groups/conditionals/case004.json create mode 100644 __tests__/test-suite/groups/conditionals/case005.json create mode 100644 __tests__/test-suite/groups/conditionals/case006.json create mode 100644 __tests__/test-suite/groups/conditionals/case007.json create mode 100644 __tests__/test-suite/groups/conditionals/case008.json create mode 100644 __tests__/test-suite/groups/context/case000.json create mode 100644 __tests__/test-suite/groups/context/case001.json create mode 100644 __tests__/test-suite/groups/context/case002.json create mode 100644 __tests__/test-suite/groups/context/case003.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case000.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case001.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case002.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case003.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case004.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case005.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case006.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case007.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case008.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case009.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case010.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case011.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case012.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case013.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case014.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case015.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case016.json create mode 100644 __tests__/test-suite/groups/descendent-operator/case017.json create mode 100644 __tests__/test-suite/groups/encoding/case000.json create mode 100644 __tests__/test-suite/groups/encoding/case001.json create mode 100644 __tests__/test-suite/groups/encoding/case002.json create mode 100644 __tests__/test-suite/groups/encoding/case003.json create mode 100644 __tests__/test-suite/groups/errors/case000.json create mode 100644 __tests__/test-suite/groups/errors/case001.json create mode 100644 __tests__/test-suite/groups/errors/case002.json create mode 100644 __tests__/test-suite/groups/errors/case003.json create mode 100644 __tests__/test-suite/groups/errors/case004.json create mode 100644 __tests__/test-suite/groups/errors/case005.json create mode 100644 __tests__/test-suite/groups/errors/case006.json create mode 100644 __tests__/test-suite/groups/errors/case007.json create mode 100644 __tests__/test-suite/groups/errors/case008.json create mode 100644 __tests__/test-suite/groups/errors/case009.json create mode 100644 __tests__/test-suite/groups/errors/case010.json create mode 100644 __tests__/test-suite/groups/errors/case011.json create mode 100644 __tests__/test-suite/groups/errors/case012.json create mode 100644 __tests__/test-suite/groups/errors/case013.json create mode 100644 __tests__/test-suite/groups/errors/case014.json create mode 100644 __tests__/test-suite/groups/errors/case015.json create mode 100644 __tests__/test-suite/groups/errors/case016.json create mode 100644 __tests__/test-suite/groups/errors/case017.json create mode 100644 __tests__/test-suite/groups/errors/case018.json create mode 100644 __tests__/test-suite/groups/errors/case019.json create mode 100644 __tests__/test-suite/groups/errors/case020.json create mode 100644 __tests__/test-suite/groups/errors/case021.json create mode 100644 __tests__/test-suite/groups/errors/case022.json create mode 100644 __tests__/test-suite/groups/errors/case023.json create mode 100644 __tests__/test-suite/groups/errors/case024.json create mode 100644 __tests__/test-suite/groups/fields/case000.json create mode 100644 __tests__/test-suite/groups/fields/case001.json create mode 100644 __tests__/test-suite/groups/fields/case002.json create mode 100644 __tests__/test-suite/groups/fields/case003.json create mode 100644 __tests__/test-suite/groups/fields/case004.json create mode 100644 __tests__/test-suite/groups/fields/case005.json create mode 100644 __tests__/test-suite/groups/fields/case006.json create mode 100644 __tests__/test-suite/groups/fields/case007.json create mode 100644 __tests__/test-suite/groups/flattening/case000.json create mode 100644 __tests__/test-suite/groups/flattening/case001.json create mode 100644 __tests__/test-suite/groups/flattening/case002.json create mode 100644 __tests__/test-suite/groups/flattening/case003.json create mode 100644 __tests__/test-suite/groups/flattening/case004.json create mode 100644 __tests__/test-suite/groups/flattening/case005.json create mode 100644 __tests__/test-suite/groups/flattening/case006.json create mode 100644 __tests__/test-suite/groups/flattening/case007.json create mode 100644 __tests__/test-suite/groups/flattening/case008.json create mode 100644 __tests__/test-suite/groups/flattening/case009.json create mode 100644 __tests__/test-suite/groups/flattening/case010.json create mode 100644 __tests__/test-suite/groups/flattening/case011.json create mode 100644 __tests__/test-suite/groups/flattening/case012.json create mode 100644 __tests__/test-suite/groups/flattening/case013.json create mode 100644 __tests__/test-suite/groups/flattening/case014.json create mode 100644 __tests__/test-suite/groups/flattening/case015.json create mode 100644 __tests__/test-suite/groups/flattening/case016.json create mode 100644 __tests__/test-suite/groups/flattening/case017.json create mode 100644 __tests__/test-suite/groups/flattening/case018.json create mode 100644 __tests__/test-suite/groups/flattening/case019.json create mode 100644 __tests__/test-suite/groups/flattening/case020.json create mode 100644 __tests__/test-suite/groups/flattening/case021.json create mode 100644 __tests__/test-suite/groups/flattening/case022.json create mode 100644 __tests__/test-suite/groups/flattening/case023.json create mode 100644 __tests__/test-suite/groups/flattening/case024.json create mode 100644 __tests__/test-suite/groups/flattening/case025.json create mode 100644 __tests__/test-suite/groups/flattening/case026.json create mode 100644 __tests__/test-suite/groups/flattening/case027.json create mode 100644 __tests__/test-suite/groups/flattening/case028.json create mode 100644 __tests__/test-suite/groups/flattening/case029.json create mode 100644 __tests__/test-suite/groups/flattening/case030.json create mode 100644 __tests__/test-suite/groups/flattening/case031.json create mode 100644 __tests__/test-suite/groups/flattening/case032.json create mode 100644 __tests__/test-suite/groups/flattening/case033.json create mode 100644 __tests__/test-suite/groups/flattening/case034.json create mode 100644 __tests__/test-suite/groups/flattening/case035.json create mode 100644 __tests__/test-suite/groups/flattening/case036.json create mode 100644 __tests__/test-suite/groups/flattening/case037.json create mode 100644 __tests__/test-suite/groups/flattening/case038.json create mode 100644 __tests__/test-suite/groups/flattening/case039.json create mode 100644 __tests__/test-suite/groups/flattening/case040.json create mode 100644 __tests__/test-suite/groups/flattening/case041.json create mode 100644 __tests__/test-suite/groups/function-abs/case000.json create mode 100644 __tests__/test-suite/groups/function-abs/case001.json create mode 100644 __tests__/test-suite/groups/function-abs/case002.json create mode 100644 __tests__/test-suite/groups/function-abs/case003.json create mode 100644 __tests__/test-suite/groups/function-append/case000.json create mode 100644 __tests__/test-suite/groups/function-append/case001.json create mode 100644 __tests__/test-suite/groups/function-append/case002.json create mode 100644 __tests__/test-suite/groups/function-append/case003.json create mode 100644 __tests__/test-suite/groups/function-append/case004.json create mode 100644 __tests__/test-suite/groups/function-applications/case000.json create mode 100644 __tests__/test-suite/groups/function-applications/case001.json create mode 100644 __tests__/test-suite/groups/function-applications/case002.json create mode 100644 __tests__/test-suite/groups/function-applications/case003.json create mode 100644 __tests__/test-suite/groups/function-applications/case004.json create mode 100644 __tests__/test-suite/groups/function-applications/case005.json create mode 100644 __tests__/test-suite/groups/function-applications/case006.json create mode 100644 __tests__/test-suite/groups/function-applications/case007.json create mode 100644 __tests__/test-suite/groups/function-applications/case008.json create mode 100644 __tests__/test-suite/groups/function-applications/case009.json create mode 100644 __tests__/test-suite/groups/function-applications/case010.json create mode 100644 __tests__/test-suite/groups/function-applications/case011.json create mode 100644 __tests__/test-suite/groups/function-applications/case012.json create mode 100644 __tests__/test-suite/groups/function-applications/case013.json create mode 100644 __tests__/test-suite/groups/function-applications/case014.json create mode 100644 __tests__/test-suite/groups/function-applications/case015.json create mode 100644 __tests__/test-suite/groups/function-applications/case016.json create mode 100644 __tests__/test-suite/groups/function-applications/case017.json create mode 100644 __tests__/test-suite/groups/function-applications/case018.json create mode 100644 __tests__/test-suite/groups/function-applications/case019.json create mode 100644 __tests__/test-suite/groups/function-applications/case020.json create mode 100644 __tests__/test-suite/groups/function-applications/case021.json create mode 100644 __tests__/test-suite/groups/function-average/case000.json create mode 100644 __tests__/test-suite/groups/function-average/case001.json create mode 100644 __tests__/test-suite/groups/function-average/case002.json create mode 100644 __tests__/test-suite/groups/function-average/case003.json create mode 100644 __tests__/test-suite/groups/function-average/case004.json create mode 100644 __tests__/test-suite/groups/function-average/case005.json create mode 100644 __tests__/test-suite/groups/function-average/case006.json create mode 100644 __tests__/test-suite/groups/function-average/case007.json create mode 100644 __tests__/test-suite/groups/function-average/case008.json create mode 100644 __tests__/test-suite/groups/function-average/case009.json create mode 100644 __tests__/test-suite/groups/function-average/case010.json create mode 100644 __tests__/test-suite/groups/function-average/case011.json create mode 100644 __tests__/test-suite/groups/function-average/case012.json create mode 100644 __tests__/test-suite/groups/function-boolean/case000.json create mode 100644 __tests__/test-suite/groups/function-boolean/case001.json create mode 100644 __tests__/test-suite/groups/function-boolean/case002.json create mode 100644 __tests__/test-suite/groups/function-boolean/case003.json create mode 100644 __tests__/test-suite/groups/function-boolean/case004.json create mode 100644 __tests__/test-suite/groups/function-boolean/case005.json create mode 100644 __tests__/test-suite/groups/function-boolean/case006.json create mode 100644 __tests__/test-suite/groups/function-boolean/case007.json create mode 100644 __tests__/test-suite/groups/function-boolean/case008.json create mode 100644 __tests__/test-suite/groups/function-boolean/case009.json create mode 100644 __tests__/test-suite/groups/function-boolean/case010.json create mode 100644 __tests__/test-suite/groups/function-boolean/case011.json create mode 100644 __tests__/test-suite/groups/function-boolean/case012.json create mode 100644 __tests__/test-suite/groups/function-boolean/case013.json create mode 100644 __tests__/test-suite/groups/function-boolean/case014.json create mode 100644 __tests__/test-suite/groups/function-boolean/case015.json create mode 100644 __tests__/test-suite/groups/function-boolean/case016.json create mode 100644 __tests__/test-suite/groups/function-boolean/case017.json create mode 100644 __tests__/test-suite/groups/function-boolean/case018.json create mode 100644 __tests__/test-suite/groups/function-boolean/case019.json create mode 100644 __tests__/test-suite/groups/function-boolean/case020.json create mode 100644 __tests__/test-suite/groups/function-boolean/case021.json create mode 100644 __tests__/test-suite/groups/function-boolean/case022.json create mode 100644 __tests__/test-suite/groups/function-boolean/case023.json create mode 100644 __tests__/test-suite/groups/function-ceil/case000.json create mode 100644 __tests__/test-suite/groups/function-ceil/case001.json create mode 100644 __tests__/test-suite/groups/function-ceil/case002.json create mode 100644 __tests__/test-suite/groups/function-ceil/case003.json create mode 100644 __tests__/test-suite/groups/function-clone/case000.json create mode 100644 __tests__/test-suite/groups/function-clone/case001.json create mode 100644 __tests__/test-suite/groups/function-clone/case002.json create mode 100644 __tests__/test-suite/groups/function-contains/case000.json create mode 100644 __tests__/test-suite/groups/function-contains/case001.json create mode 100644 __tests__/test-suite/groups/function-contains/case002.json create mode 100644 __tests__/test-suite/groups/function-contains/case003.json create mode 100644 __tests__/test-suite/groups/function-contains/case004.json create mode 100644 __tests__/test-suite/groups/function-contains/case005.json create mode 100644 __tests__/test-suite/groups/function-contains/case006.json create mode 100644 __tests__/test-suite/groups/function-count/case000.json create mode 100644 __tests__/test-suite/groups/function-count/case001.json create mode 100644 __tests__/test-suite/groups/function-count/case002.json create mode 100644 __tests__/test-suite/groups/function-count/case003.json create mode 100644 __tests__/test-suite/groups/function-count/case004.json create mode 100644 __tests__/test-suite/groups/function-count/case005.json create mode 100644 __tests__/test-suite/groups/function-count/case006.json create mode 100644 __tests__/test-suite/groups/function-count/case007.json create mode 100644 __tests__/test-suite/groups/function-count/case008.json create mode 100644 __tests__/test-suite/groups/function-count/case009.json create mode 100644 __tests__/test-suite/groups/function-count/case010.json create mode 100644 __tests__/test-suite/groups/function-count/case011.json create mode 100644 __tests__/test-suite/groups/function-count/case012.json create mode 100644 __tests__/test-suite/groups/function-count/case013.json create mode 100644 __tests__/test-suite/groups/function-each/case000.json create mode 100644 __tests__/test-suite/groups/function-each/case001.json create mode 100644 __tests__/test-suite/groups/function-each/case002.json create mode 100644 __tests__/test-suite/groups/function-each/case003.json create mode 100644 __tests__/test-suite/groups/function-each/case004.json create mode 100644 __tests__/test-suite/groups/function-exists/case000.json create mode 100644 __tests__/test-suite/groups/function-exists/case001.json create mode 100644 __tests__/test-suite/groups/function-exists/case002.json create mode 100644 __tests__/test-suite/groups/function-exists/case003.json create mode 100644 __tests__/test-suite/groups/function-exists/case004.json create mode 100644 __tests__/test-suite/groups/function-exists/case005.json create mode 100644 __tests__/test-suite/groups/function-exists/case006.json create mode 100644 __tests__/test-suite/groups/function-exists/case007.json create mode 100644 __tests__/test-suite/groups/function-exists/case008.json create mode 100644 __tests__/test-suite/groups/function-exists/case009.json create mode 100644 __tests__/test-suite/groups/function-exists/case010.json create mode 100644 __tests__/test-suite/groups/function-exists/case011.json create mode 100644 __tests__/test-suite/groups/function-exists/case012.json create mode 100644 __tests__/test-suite/groups/function-exists/case013.json create mode 100644 __tests__/test-suite/groups/function-exists/case014.json create mode 100644 __tests__/test-suite/groups/function-exists/case015.json create mode 100644 __tests__/test-suite/groups/function-exists/case016.json create mode 100644 __tests__/test-suite/groups/function-exists/case017.json create mode 100644 __tests__/test-suite/groups/function-exists/case018.json create mode 100644 __tests__/test-suite/groups/function-exists/case019.json create mode 100644 __tests__/test-suite/groups/function-exists/case020.json create mode 100644 __tests__/test-suite/groups/function-exists/case021.json create mode 100644 __tests__/test-suite/groups/function-exists/case022.json create mode 100644 __tests__/test-suite/groups/function-exists/case023.json create mode 100644 __tests__/test-suite/groups/function-exists/case024.json create mode 100644 __tests__/test-suite/groups/function-floor/case000.json create mode 100644 __tests__/test-suite/groups/function-floor/case001.json create mode 100644 __tests__/test-suite/groups/function-floor/case002.json create mode 100644 __tests__/test-suite/groups/function-floor/case003.json create mode 100644 __tests__/test-suite/groups/function-formatBase/case000.json create mode 100644 __tests__/test-suite/groups/function-formatBase/case001.json create mode 100644 __tests__/test-suite/groups/function-formatBase/case002.json create mode 100644 __tests__/test-suite/groups/function-formatBase/case003.json create mode 100644 __tests__/test-suite/groups/function-formatBase/case004.json create mode 100644 __tests__/test-suite/groups/function-formatBase/case005.json create mode 100644 __tests__/test-suite/groups/function-formatBase/case006.json create mode 100644 __tests__/test-suite/groups/function-formatBase/case007.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case000.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case001.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case002.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case003.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case004.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case005.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case006.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case007.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case008.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case009.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case010.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case011.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case012.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case013.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case014.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case015.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case016.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case017.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case018.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case019.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case020.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case021.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case022.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case023.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case024.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case025.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case026.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case027.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case028.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case029.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case030.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case031.json create mode 100644 __tests__/test-suite/groups/function-formatNumber/case032.json create mode 100644 __tests__/test-suite/groups/function-fromMillis/case000.json create mode 100644 __tests__/test-suite/groups/function-fromMillis/case001.json create mode 100644 __tests__/test-suite/groups/function-fromMillis/case002.json create mode 100644 __tests__/test-suite/groups/function-join/case000.json create mode 100644 __tests__/test-suite/groups/function-join/case001.json create mode 100644 __tests__/test-suite/groups/function-join/case002.json create mode 100644 __tests__/test-suite/groups/function-join/case003.json create mode 100644 __tests__/test-suite/groups/function-join/case004.json create mode 100644 __tests__/test-suite/groups/function-join/case005.json create mode 100644 __tests__/test-suite/groups/function-join/case006.json create mode 100644 __tests__/test-suite/groups/function-join/case007.json create mode 100644 __tests__/test-suite/groups/function-join/case008.json create mode 100644 __tests__/test-suite/groups/function-join/case009.json create mode 100644 __tests__/test-suite/groups/function-join/case010.json create mode 100644 __tests__/test-suite/groups/function-join/case011.json create mode 100644 __tests__/test-suite/groups/function-keys/case000.json create mode 100644 __tests__/test-suite/groups/function-keys/case001.json create mode 100644 __tests__/test-suite/groups/function-keys/case002.json create mode 100644 __tests__/test-suite/groups/function-keys/case003.json create mode 100644 __tests__/test-suite/groups/function-keys/case004.json create mode 100644 __tests__/test-suite/groups/function-keys/case005.json create mode 100644 __tests__/test-suite/groups/function-keys/case006.json create mode 100644 __tests__/test-suite/groups/function-length/case000.json create mode 100644 __tests__/test-suite/groups/function-length/case001.json create mode 100644 __tests__/test-suite/groups/function-length/case002.json create mode 100644 __tests__/test-suite/groups/function-length/case003.json create mode 100644 __tests__/test-suite/groups/function-length/case004.json create mode 100644 __tests__/test-suite/groups/function-length/case005.json create mode 100644 __tests__/test-suite/groups/function-length/case006.json create mode 100644 __tests__/test-suite/groups/function-length/case007.json create mode 100644 __tests__/test-suite/groups/function-length/case008.json create mode 100644 __tests__/test-suite/groups/function-length/case009.json create mode 100644 __tests__/test-suite/groups/function-length/case010.json create mode 100644 __tests__/test-suite/groups/function-length/case011.json create mode 100644 __tests__/test-suite/groups/function-length/case012.json create mode 100644 __tests__/test-suite/groups/function-length/case013.json create mode 100644 __tests__/test-suite/groups/function-length/case014.json create mode 100644 __tests__/test-suite/groups/function-length/case015.json create mode 100644 __tests__/test-suite/groups/function-lookup/case000.json create mode 100644 __tests__/test-suite/groups/function-lookup/case001.json create mode 100644 __tests__/test-suite/groups/function-lookup/case002.json create mode 100644 __tests__/test-suite/groups/function-lookup/case003.json create mode 100644 __tests__/test-suite/groups/function-lowercase/case000.json create mode 100644 __tests__/test-suite/groups/function-lowercase/case001.json create mode 100644 __tests__/test-suite/groups/function-max/case000.json create mode 100644 __tests__/test-suite/groups/function-max/case001.json create mode 100644 __tests__/test-suite/groups/function-max/case002.json create mode 100644 __tests__/test-suite/groups/function-max/case003.json create mode 100644 __tests__/test-suite/groups/function-max/case004.json create mode 100644 __tests__/test-suite/groups/function-max/case005.json create mode 100644 __tests__/test-suite/groups/function-max/case006.json create mode 100644 __tests__/test-suite/groups/function-max/case007.json create mode 100644 __tests__/test-suite/groups/function-max/case008.json create mode 100644 __tests__/test-suite/groups/function-max/case009.json create mode 100644 __tests__/test-suite/groups/function-max/case010.json create mode 100644 __tests__/test-suite/groups/function-max/case011.json create mode 100644 __tests__/test-suite/groups/function-max/case012.json create mode 100644 __tests__/test-suite/groups/function-max/case013.json create mode 100644 __tests__/test-suite/groups/function-max/case014.json create mode 100644 __tests__/test-suite/groups/function-max/case015.json create mode 100644 __tests__/test-suite/groups/function-max/case016.json create mode 100644 __tests__/test-suite/groups/function-max/case017.json create mode 100644 __tests__/test-suite/groups/function-max/case018.json create mode 100644 __tests__/test-suite/groups/function-max/case019.json create mode 100644 __tests__/test-suite/groups/function-max/case020.json create mode 100644 __tests__/test-suite/groups/function-max/case021.json create mode 100644 __tests__/test-suite/groups/function-max/case022.json create mode 100644 __tests__/test-suite/groups/function-max/case023.json create mode 100644 __tests__/test-suite/groups/function-max/case024.json create mode 100644 __tests__/test-suite/groups/function-max/case025.json create mode 100644 __tests__/test-suite/groups/function-max/case026.json create mode 100644 __tests__/test-suite/groups/function-merge/case000.json create mode 100644 __tests__/test-suite/groups/function-merge/case001.json create mode 100644 __tests__/test-suite/groups/function-merge/case002.json create mode 100644 __tests__/test-suite/groups/function-merge/case003.json create mode 100644 __tests__/test-suite/groups/function-merge/case004.json create mode 100644 __tests__/test-suite/groups/function-number/case000.json create mode 100644 __tests__/test-suite/groups/function-number/case001.json create mode 100644 __tests__/test-suite/groups/function-number/case002.json create mode 100644 __tests__/test-suite/groups/function-number/case003.json create mode 100644 __tests__/test-suite/groups/function-number/case004.json create mode 100644 __tests__/test-suite/groups/function-number/case005.json create mode 100644 __tests__/test-suite/groups/function-number/case006.json create mode 100644 __tests__/test-suite/groups/function-number/case007.json create mode 100644 __tests__/test-suite/groups/function-number/case008.json create mode 100644 __tests__/test-suite/groups/function-number/case009.json create mode 100644 __tests__/test-suite/groups/function-number/case010.json create mode 100644 __tests__/test-suite/groups/function-number/case011.json create mode 100644 __tests__/test-suite/groups/function-number/case012.json create mode 100644 __tests__/test-suite/groups/function-number/case013.json create mode 100644 __tests__/test-suite/groups/function-number/case014.json create mode 100644 __tests__/test-suite/groups/function-number/case015.json create mode 100644 __tests__/test-suite/groups/function-number/case016.json create mode 100644 __tests__/test-suite/groups/function-number/case017.json create mode 100644 __tests__/test-suite/groups/function-number/case018.json create mode 100644 __tests__/test-suite/groups/function-number/case019.json create mode 100644 __tests__/test-suite/groups/function-number/case020.json create mode 100644 __tests__/test-suite/groups/function-number/case021.json create mode 100644 __tests__/test-suite/groups/function-number/case022.json create mode 100644 __tests__/test-suite/groups/function-number/case023.json create mode 100644 __tests__/test-suite/groups/function-number/case024.json create mode 100644 __tests__/test-suite/groups/function-number/case025.json create mode 100644 __tests__/test-suite/groups/function-number/case026.json create mode 100644 __tests__/test-suite/groups/function-pad/case000.json create mode 100644 __tests__/test-suite/groups/function-pad/case001.json create mode 100644 __tests__/test-suite/groups/function-pad/case002.json create mode 100644 __tests__/test-suite/groups/function-pad/case003.json create mode 100644 __tests__/test-suite/groups/function-pad/case004.json create mode 100644 __tests__/test-suite/groups/function-pad/case005.json create mode 100644 __tests__/test-suite/groups/function-pad/case006.json create mode 100644 __tests__/test-suite/groups/function-power/case000.json create mode 100644 __tests__/test-suite/groups/function-power/case001.json create mode 100644 __tests__/test-suite/groups/function-power/case002.json create mode 100644 __tests__/test-suite/groups/function-power/case003.json create mode 100644 __tests__/test-suite/groups/function-power/case004.json create mode 100644 __tests__/test-suite/groups/function-power/case005.json create mode 100644 __tests__/test-suite/groups/function-power/case006.json create mode 100644 __tests__/test-suite/groups/function-replace/case000.json create mode 100644 __tests__/test-suite/groups/function-replace/case001.json create mode 100644 __tests__/test-suite/groups/function-replace/case002.json create mode 100644 __tests__/test-suite/groups/function-replace/case003.json create mode 100644 __tests__/test-suite/groups/function-replace/case004.json create mode 100644 __tests__/test-suite/groups/function-replace/case005.json create mode 100644 __tests__/test-suite/groups/function-replace/case006.json create mode 100644 __tests__/test-suite/groups/function-replace/case007.json create mode 100644 __tests__/test-suite/groups/function-replace/case008.json create mode 100644 __tests__/test-suite/groups/function-replace/case009.json create mode 100644 __tests__/test-suite/groups/function-replace/case010.json create mode 100644 __tests__/test-suite/groups/function-replace/case011.json create mode 100644 __tests__/test-suite/groups/function-round/case000.json create mode 100644 __tests__/test-suite/groups/function-round/case001.json create mode 100644 __tests__/test-suite/groups/function-round/case002.json create mode 100644 __tests__/test-suite/groups/function-round/case003.json create mode 100644 __tests__/test-suite/groups/function-round/case004.json create mode 100644 __tests__/test-suite/groups/function-round/case005.json create mode 100644 __tests__/test-suite/groups/function-round/case006.json create mode 100644 __tests__/test-suite/groups/function-round/case007.json create mode 100644 __tests__/test-suite/groups/function-round/case008.json create mode 100644 __tests__/test-suite/groups/function-round/case009.json create mode 100644 __tests__/test-suite/groups/function-round/case010.json create mode 100644 __tests__/test-suite/groups/function-round/case011.json create mode 100644 __tests__/test-suite/groups/function-round/case012.json create mode 100644 __tests__/test-suite/groups/function-round/case013.json create mode 100644 __tests__/test-suite/groups/function-round/case014.json create mode 100644 __tests__/test-suite/groups/function-round/case015.json create mode 100644 __tests__/test-suite/groups/function-round/case016.json create mode 100644 __tests__/test-suite/groups/function-round/case017.json create mode 100644 __tests__/test-suite/groups/function-shuffle/case000.json create mode 100644 __tests__/test-suite/groups/function-shuffle/case001.json create mode 100644 __tests__/test-suite/groups/function-shuffle/case002.json create mode 100644 __tests__/test-suite/groups/function-shuffle/case003.json create mode 100644 __tests__/test-suite/groups/function-sift/case000.json create mode 100644 __tests__/test-suite/groups/function-sift/case001.json create mode 100644 __tests__/test-suite/groups/function-sift/case002.json create mode 100644 __tests__/test-suite/groups/function-sift/case003.json create mode 100644 __tests__/test-suite/groups/function-sift/case004.json create mode 100644 __tests__/test-suite/groups/function-sift/case005.json create mode 100644 __tests__/test-suite/groups/function-sift/case006.json create mode 100644 __tests__/test-suite/groups/function-signatures/case000.json create mode 100644 __tests__/test-suite/groups/function-signatures/case001.json create mode 100644 __tests__/test-suite/groups/function-signatures/case002.json create mode 100644 __tests__/test-suite/groups/function-signatures/case003.json create mode 100644 __tests__/test-suite/groups/function-signatures/case004.json create mode 100644 __tests__/test-suite/groups/function-signatures/case005.json create mode 100644 __tests__/test-suite/groups/function-signatures/case006.json create mode 100644 __tests__/test-suite/groups/function-signatures/case007.json create mode 100644 __tests__/test-suite/groups/function-signatures/case008.json create mode 100644 __tests__/test-suite/groups/function-signatures/case009.json create mode 100644 __tests__/test-suite/groups/function-signatures/case010.json create mode 100644 __tests__/test-suite/groups/function-signatures/case011.json create mode 100644 __tests__/test-suite/groups/function-signatures/case012.json create mode 100644 __tests__/test-suite/groups/function-signatures/case013.json create mode 100644 __tests__/test-suite/groups/function-signatures/case014.json create mode 100644 __tests__/test-suite/groups/function-signatures/case015.json create mode 100644 __tests__/test-suite/groups/function-signatures/case016.json create mode 100644 __tests__/test-suite/groups/function-signatures/case017.json create mode 100644 __tests__/test-suite/groups/function-signatures/case018.json create mode 100644 __tests__/test-suite/groups/function-signatures/case019.json create mode 100644 __tests__/test-suite/groups/function-signatures/case020.json create mode 100644 __tests__/test-suite/groups/function-signatures/case021.json create mode 100644 __tests__/test-suite/groups/function-signatures/case022.json create mode 100644 __tests__/test-suite/groups/function-signatures/case023.json create mode 100644 __tests__/test-suite/groups/function-signatures/case024.json create mode 100644 __tests__/test-suite/groups/function-signatures/case025.json create mode 100644 __tests__/test-suite/groups/function-signatures/case026.json create mode 100644 __tests__/test-suite/groups/function-signatures/case027.json create mode 100644 __tests__/test-suite/groups/function-signatures/case028.json create mode 100644 __tests__/test-suite/groups/function-signatures/case029.json create mode 100644 __tests__/test-suite/groups/function-signatures/case030.json create mode 100644 __tests__/test-suite/groups/function-signatures/case031.json create mode 100644 __tests__/test-suite/groups/function-signatures/case032.json create mode 100644 __tests__/test-suite/groups/function-signatures/case033.json create mode 100644 __tests__/test-suite/groups/function-signatures/case034.json create mode 100644 __tests__/test-suite/groups/function-sort/case000.json create mode 100644 __tests__/test-suite/groups/function-sort/case001.json create mode 100644 __tests__/test-suite/groups/function-sort/case002.json create mode 100644 __tests__/test-suite/groups/function-sort/case003.json create mode 100644 __tests__/test-suite/groups/function-sort/case004.json create mode 100644 __tests__/test-suite/groups/function-sort/case005.json create mode 100644 __tests__/test-suite/groups/function-sort/case006.json create mode 100644 __tests__/test-suite/groups/function-sort/case007.json create mode 100644 __tests__/test-suite/groups/function-sort/case008.json create mode 100644 __tests__/test-suite/groups/function-sort/case009.json create mode 100644 __tests__/test-suite/groups/function-sort/case010.json create mode 100644 __tests__/test-suite/groups/function-split/case000.json create mode 100644 __tests__/test-suite/groups/function-split/case001.json create mode 100644 __tests__/test-suite/groups/function-split/case002.json create mode 100644 __tests__/test-suite/groups/function-split/case003.json create mode 100644 __tests__/test-suite/groups/function-split/case004.json create mode 100644 __tests__/test-suite/groups/function-split/case005.json create mode 100644 __tests__/test-suite/groups/function-split/case006.json create mode 100644 __tests__/test-suite/groups/function-split/case007.json create mode 100644 __tests__/test-suite/groups/function-split/case008.json create mode 100644 __tests__/test-suite/groups/function-split/case009.json create mode 100644 __tests__/test-suite/groups/function-split/case010.json create mode 100644 __tests__/test-suite/groups/function-split/case011.json create mode 100644 __tests__/test-suite/groups/function-split/case012.json create mode 100644 __tests__/test-suite/groups/function-split/case013.json create mode 100644 __tests__/test-suite/groups/function-split/case014.json create mode 100644 __tests__/test-suite/groups/function-split/case015.json create mode 100644 __tests__/test-suite/groups/function-split/case016.json create mode 100644 __tests__/test-suite/groups/function-split/case017.json create mode 100644 __tests__/test-suite/groups/function-spread/case000.json create mode 100644 __tests__/test-suite/groups/function-spread/case001.json create mode 100644 __tests__/test-suite/groups/function-spread/case002.json create mode 100644 __tests__/test-suite/groups/function-spread/case003.json create mode 100644 __tests__/test-suite/groups/function-sqrt/case000.json create mode 100644 __tests__/test-suite/groups/function-sqrt/case001.json create mode 100644 __tests__/test-suite/groups/function-sqrt/case002.json create mode 100644 __tests__/test-suite/groups/function-sqrt/case003.json create mode 100644 __tests__/test-suite/groups/function-string/case000.json create mode 100644 __tests__/test-suite/groups/function-string/case001.json create mode 100644 __tests__/test-suite/groups/function-string/case002.json create mode 100644 __tests__/test-suite/groups/function-string/case003.json create mode 100644 __tests__/test-suite/groups/function-string/case004.json create mode 100644 __tests__/test-suite/groups/function-string/case005.json create mode 100644 __tests__/test-suite/groups/function-string/case006.json create mode 100644 __tests__/test-suite/groups/function-string/case007.json create mode 100644 __tests__/test-suite/groups/function-string/case008.json create mode 100644 __tests__/test-suite/groups/function-string/case009.json create mode 100644 __tests__/test-suite/groups/function-string/case010.json create mode 100644 __tests__/test-suite/groups/function-string/case011.json create mode 100644 __tests__/test-suite/groups/function-string/case012.json create mode 100644 __tests__/test-suite/groups/function-string/case013.json create mode 100644 __tests__/test-suite/groups/function-string/case014.json create mode 100644 __tests__/test-suite/groups/function-string/case015.json create mode 100644 __tests__/test-suite/groups/function-string/case016.json create mode 100644 __tests__/test-suite/groups/function-string/case017.json create mode 100644 __tests__/test-suite/groups/function-string/case018.json create mode 100644 __tests__/test-suite/groups/function-string/case019.json create mode 100644 __tests__/test-suite/groups/function-string/case020.json create mode 100644 __tests__/test-suite/groups/function-string/case021.json create mode 100644 __tests__/test-suite/groups/function-string/case022.json create mode 100644 __tests__/test-suite/groups/function-substring/case000.json create mode 100644 __tests__/test-suite/groups/function-substring/case001.json create mode 100644 __tests__/test-suite/groups/function-substring/case002.json create mode 100644 __tests__/test-suite/groups/function-substring/case003.json create mode 100644 __tests__/test-suite/groups/function-substringAfter/case000.json create mode 100644 __tests__/test-suite/groups/function-substringAfter/case001.json create mode 100644 __tests__/test-suite/groups/function-substringAfter/case002.json create mode 100644 __tests__/test-suite/groups/function-substringAfter/case003.json create mode 100644 __tests__/test-suite/groups/function-substringAfter/case004.json create mode 100644 __tests__/test-suite/groups/function-substringBefore/case000.json create mode 100644 __tests__/test-suite/groups/function-substringBefore/case001.json create mode 100644 __tests__/test-suite/groups/function-substringBefore/case002.json create mode 100644 __tests__/test-suite/groups/function-substringBefore/case003.json create mode 100644 __tests__/test-suite/groups/function-substringBefore/case004.json create mode 100644 __tests__/test-suite/groups/function-sum/case000.json create mode 100644 __tests__/test-suite/groups/function-sum/case001.json create mode 100644 __tests__/test-suite/groups/function-sum/case002.json create mode 100644 __tests__/test-suite/groups/function-sum/case003.json create mode 100644 __tests__/test-suite/groups/function-sum/case004.json create mode 100644 __tests__/test-suite/groups/function-sum/case005.json create mode 100644 __tests__/test-suite/groups/function-sum/case006.json create mode 100644 __tests__/test-suite/groups/function-trim/case000.json create mode 100644 __tests__/test-suite/groups/function-trim/case001.json create mode 100644 __tests__/test-suite/groups/function-trim/case002.json create mode 100644 __tests__/test-suite/groups/function-uppercase/case000.json create mode 100644 __tests__/test-suite/groups/function-uppercase/case001.json create mode 100644 __tests__/test-suite/groups/function-zip/case000.json create mode 100644 __tests__/test-suite/groups/function-zip/case001.json create mode 100644 __tests__/test-suite/groups/function-zip/case002.json create mode 100644 __tests__/test-suite/groups/function-zip/case003.json create mode 100644 __tests__/test-suite/groups/function-zip/case004.json create mode 100644 __tests__/test-suite/groups/function-zip/case005.json create mode 100644 __tests__/test-suite/groups/higher-order-functions/case000.json create mode 100644 __tests__/test-suite/groups/higher-order-functions/case001.json create mode 100644 __tests__/test-suite/groups/higher-order-functions/case002.json create mode 100644 __tests__/test-suite/groups/hof-filter/case000.json create mode 100644 __tests__/test-suite/groups/hof-filter/case001.json create mode 100644 __tests__/test-suite/groups/hof-map/case000.json create mode 100644 __tests__/test-suite/groups/hof-map/case001.json create mode 100644 __tests__/test-suite/groups/hof-map/case002.json create mode 100644 __tests__/test-suite/groups/hof-map/case003.json create mode 100644 __tests__/test-suite/groups/hof-map/case004.json create mode 100644 __tests__/test-suite/groups/hof-map/case005.json create mode 100644 __tests__/test-suite/groups/hof-map/case006.json create mode 100644 __tests__/test-suite/groups/hof-map/case007.json create mode 100644 __tests__/test-suite/groups/hof-map/case008.json create mode 100644 __tests__/test-suite/groups/hof-reduce/case000.json create mode 100644 __tests__/test-suite/groups/hof-reduce/case001.json create mode 100644 __tests__/test-suite/groups/hof-reduce/case002.json create mode 100644 __tests__/test-suite/groups/hof-reduce/case003.json create mode 100644 __tests__/test-suite/groups/hof-reduce/case004.json create mode 100644 __tests__/test-suite/groups/hof-reduce/case005.json create mode 100644 __tests__/test-suite/groups/hof-reduce/case006.json create mode 100644 __tests__/test-suite/groups/hof-reduce/case007.json create mode 100644 __tests__/test-suite/groups/hof-reduce/case008.json create mode 100644 __tests__/test-suite/groups/hof-zip-map/case000.json create mode 100644 __tests__/test-suite/groups/hof-zip-map/case001.json create mode 100644 __tests__/test-suite/groups/hof-zip-map/case002.json create mode 100644 __tests__/test-suite/groups/hof-zip-map/case003.json create mode 100644 __tests__/test-suite/groups/inclusion-operator/case000.json create mode 100644 __tests__/test-suite/groups/inclusion-operator/case001.json create mode 100644 __tests__/test-suite/groups/inclusion-operator/case002.json create mode 100644 __tests__/test-suite/groups/inclusion-operator/case003.json create mode 100644 __tests__/test-suite/groups/inclusion-operator/case004.json create mode 100644 __tests__/test-suite/groups/inclusion-operator/case005.json create mode 100644 __tests__/test-suite/groups/inclusion-operator/case006.json create mode 100644 __tests__/test-suite/groups/inclusion-operator/case007.json create mode 100644 __tests__/test-suite/groups/inclusion-operator/case008.json create mode 100644 __tests__/test-suite/groups/lambdas/case000.json create mode 100644 __tests__/test-suite/groups/lambdas/case001.json create mode 100644 __tests__/test-suite/groups/lambdas/case002.json create mode 100644 __tests__/test-suite/groups/lambdas/case003.json create mode 100644 __tests__/test-suite/groups/lambdas/case004.json create mode 100644 __tests__/test-suite/groups/lambdas/case005.json create mode 100644 __tests__/test-suite/groups/lambdas/case006.json create mode 100644 __tests__/test-suite/groups/lambdas/case007.json create mode 100644 __tests__/test-suite/groups/lambdas/case008.json create mode 100644 __tests__/test-suite/groups/lambdas/case009.json create mode 100644 __tests__/test-suite/groups/lambdas/case010.json create mode 100644 __tests__/test-suite/groups/lambdas/case011.json create mode 100644 __tests__/test-suite/groups/literals/case000.json create mode 100644 __tests__/test-suite/groups/literals/case001.json create mode 100644 __tests__/test-suite/groups/literals/case002.json create mode 100644 __tests__/test-suite/groups/literals/case003.json create mode 100644 __tests__/test-suite/groups/literals/case004.json create mode 100644 __tests__/test-suite/groups/literals/case005.json create mode 100644 __tests__/test-suite/groups/literals/case006.json create mode 100644 __tests__/test-suite/groups/literals/case007.json create mode 100644 __tests__/test-suite/groups/literals/case008.json create mode 100644 __tests__/test-suite/groups/literals/case009.json create mode 100644 __tests__/test-suite/groups/literals/case010.json create mode 100644 __tests__/test-suite/groups/literals/case011.json create mode 100644 __tests__/test-suite/groups/literals/case012.json create mode 100644 __tests__/test-suite/groups/literals/case013.json create mode 100644 __tests__/test-suite/groups/literals/case014.json create mode 100644 __tests__/test-suite/groups/literals/case015.json create mode 100644 __tests__/test-suite/groups/literals/case016.json create mode 100644 __tests__/test-suite/groups/literals/case017.json create mode 100644 __tests__/test-suite/groups/missing-paths/case000.json create mode 100644 __tests__/test-suite/groups/missing-paths/case001.json create mode 100644 __tests__/test-suite/groups/missing-paths/case002.json create mode 100644 __tests__/test-suite/groups/missing-paths/case003.json create mode 100644 __tests__/test-suite/groups/missing-paths/case004.json create mode 100644 __tests__/test-suite/groups/missing-paths/case005.json create mode 100644 __tests__/test-suite/groups/multiple-array-selectors/case000.json create mode 100644 __tests__/test-suite/groups/multiple-array-selectors/case001.json create mode 100644 __tests__/test-suite/groups/multiple-array-selectors/case002.json create mode 100644 __tests__/test-suite/groups/null/case000.json create mode 100644 __tests__/test-suite/groups/null/case001.json create mode 100644 __tests__/test-suite/groups/null/case002.json create mode 100644 __tests__/test-suite/groups/null/case003.json create mode 100644 __tests__/test-suite/groups/null/case004.json create mode 100644 __tests__/test-suite/groups/null/case005.json create mode 100644 __tests__/test-suite/groups/null/case006.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case000.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case001.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case002.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case003.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case004.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case005.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case006.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case007.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case008.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case009.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case010.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case011.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case012.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case013.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case014.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case015.json create mode 100644 __tests__/test-suite/groups/numeric-operators/case016.json create mode 100644 __tests__/test-suite/groups/object-constructor/case000.json create mode 100644 __tests__/test-suite/groups/object-constructor/case001.json create mode 100644 __tests__/test-suite/groups/object-constructor/case002.json create mode 100644 __tests__/test-suite/groups/object-constructor/case003.json create mode 100644 __tests__/test-suite/groups/object-constructor/case004.json create mode 100644 __tests__/test-suite/groups/object-constructor/case005.json create mode 100644 __tests__/test-suite/groups/object-constructor/case006.json create mode 100644 __tests__/test-suite/groups/object-constructor/case007.json create mode 100644 __tests__/test-suite/groups/object-constructor/case008.json create mode 100644 __tests__/test-suite/groups/object-constructor/case009.json create mode 100644 __tests__/test-suite/groups/object-constructor/case010.json create mode 100644 __tests__/test-suite/groups/object-constructor/case011.json create mode 100644 __tests__/test-suite/groups/object-constructor/case012.json create mode 100644 __tests__/test-suite/groups/object-constructor/case013.json create mode 100644 __tests__/test-suite/groups/object-constructor/case014.json create mode 100644 __tests__/test-suite/groups/object-constructor/case015.json create mode 100644 __tests__/test-suite/groups/object-constructor/case016.json create mode 100644 __tests__/test-suite/groups/object-constructor/case017.json create mode 100644 __tests__/test-suite/groups/object-constructor/case018.json create mode 100644 __tests__/test-suite/groups/object-constructor/case019.json create mode 100644 __tests__/test-suite/groups/object-constructor/case020.json create mode 100644 __tests__/test-suite/groups/object-constructor/case021.json create mode 100644 __tests__/test-suite/groups/object-constructor/case022.json create mode 100644 __tests__/test-suite/groups/parentheses/case000.json create mode 100644 __tests__/test-suite/groups/parentheses/case001.json create mode 100644 __tests__/test-suite/groups/parentheses/case002.json create mode 100644 __tests__/test-suite/groups/parentheses/case003.json create mode 100644 __tests__/test-suite/groups/parentheses/case004.json create mode 100644 __tests__/test-suite/groups/parentheses/case005.json create mode 100644 __tests__/test-suite/groups/parentheses/case006.json create mode 100644 __tests__/test-suite/groups/parentheses/case007.json create mode 100644 __tests__/test-suite/groups/partial-application/case000.json create mode 100644 __tests__/test-suite/groups/partial-application/case001.json create mode 100644 __tests__/test-suite/groups/partial-application/case002.json create mode 100644 __tests__/test-suite/groups/partial-application/case003.json create mode 100644 __tests__/test-suite/groups/partial-application/case004.json create mode 100644 __tests__/test-suite/groups/predicates/case000.json create mode 100644 __tests__/test-suite/groups/predicates/case001.json create mode 100644 __tests__/test-suite/groups/predicates/case002.json create mode 100644 __tests__/test-suite/groups/predicates/case003.json create mode 100644 __tests__/test-suite/groups/quoted-selectors/case000.json create mode 100644 __tests__/test-suite/groups/quoted-selectors/case001.json create mode 100644 __tests__/test-suite/groups/quoted-selectors/case002.json create mode 100644 __tests__/test-suite/groups/quoted-selectors/case003.json create mode 100644 __tests__/test-suite/groups/quoted-selectors/case004.json create mode 100644 __tests__/test-suite/groups/quoted-selectors/case005.json create mode 100644 __tests__/test-suite/groups/quoted-selectors/case006.json create mode 100644 __tests__/test-suite/groups/quoted-selectors/case007.json create mode 100644 __tests__/test-suite/groups/range-operator/case000.json create mode 100644 __tests__/test-suite/groups/range-operator/case001.json create mode 100644 __tests__/test-suite/groups/range-operator/case002.json create mode 100644 __tests__/test-suite/groups/range-operator/case003.json create mode 100644 __tests__/test-suite/groups/range-operator/case004.json create mode 100644 __tests__/test-suite/groups/range-operator/case005.json create mode 100644 __tests__/test-suite/groups/range-operator/case006.json create mode 100644 __tests__/test-suite/groups/range-operator/case007.json create mode 100644 __tests__/test-suite/groups/range-operator/case008.json create mode 100644 __tests__/test-suite/groups/range-operator/case009.json create mode 100644 __tests__/test-suite/groups/range-operator/case010.json create mode 100644 __tests__/test-suite/groups/regex/case000.json create mode 100644 __tests__/test-suite/groups/regex/case001.json create mode 100644 __tests__/test-suite/groups/regex/case002.json create mode 100644 __tests__/test-suite/groups/regex/case003.json create mode 100644 __tests__/test-suite/groups/regex/case004.json create mode 100644 __tests__/test-suite/groups/regex/case005.json create mode 100644 __tests__/test-suite/groups/regex/case006.json create mode 100644 __tests__/test-suite/groups/regex/case007.json create mode 100644 __tests__/test-suite/groups/regex/case008.json create mode 100644 __tests__/test-suite/groups/regex/case009.json create mode 100644 __tests__/test-suite/groups/regex/case010.json create mode 100644 __tests__/test-suite/groups/regex/case011.json create mode 100644 __tests__/test-suite/groups/regex/case012.json create mode 100644 __tests__/test-suite/groups/regex/case013.json create mode 100644 __tests__/test-suite/groups/regex/case014.json create mode 100644 __tests__/test-suite/groups/regex/case015.json create mode 100644 __tests__/test-suite/groups/regex/case016.json create mode 100644 __tests__/test-suite/groups/regex/case017.json create mode 100644 __tests__/test-suite/groups/regex/case018.json create mode 100644 __tests__/test-suite/groups/regex/case019.json create mode 100644 __tests__/test-suite/groups/regex/case020.json create mode 100644 __tests__/test-suite/groups/regex/case021.json create mode 100644 __tests__/test-suite/groups/regex/case022.json create mode 100644 __tests__/test-suite/groups/regex/case023.json create mode 100644 __tests__/test-suite/groups/regex/case024.json create mode 100644 __tests__/test-suite/groups/regex/case025.json create mode 100644 __tests__/test-suite/groups/regex/case026.json create mode 100644 __tests__/test-suite/groups/regex/case027.json create mode 100644 __tests__/test-suite/groups/regex/case028.json create mode 100644 __tests__/test-suite/groups/regex/case029.json create mode 100644 __tests__/test-suite/groups/regex/case030.json create mode 100644 __tests__/test-suite/groups/regex/case031.json create mode 100644 __tests__/test-suite/groups/regex/case032.json create mode 100644 __tests__/test-suite/groups/regex/case033.json create mode 100644 __tests__/test-suite/groups/regex/case034.json create mode 100644 __tests__/test-suite/groups/regex/case035.json create mode 100644 __tests__/test-suite/groups/regex/case036.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case000.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case001.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case002.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case003.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case004.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case005.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case006.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case007.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case008.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case009.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case010.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case011.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case012.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case013.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case014.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case015.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case016.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case017.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case018.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case019.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case020.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case021.json create mode 100644 __tests__/test-suite/groups/simple-array-selectors/case022.json create mode 100644 __tests__/test-suite/groups/sorting/case000.json create mode 100644 __tests__/test-suite/groups/sorting/case001.json create mode 100644 __tests__/test-suite/groups/sorting/case002.json create mode 100644 __tests__/test-suite/groups/sorting/case003.json create mode 100644 __tests__/test-suite/groups/sorting/case004.json create mode 100644 __tests__/test-suite/groups/sorting/case005.json create mode 100644 __tests__/test-suite/groups/sorting/case006.json create mode 100644 __tests__/test-suite/groups/sorting/case007.json create mode 100644 __tests__/test-suite/groups/sorting/case008.json create mode 100644 __tests__/test-suite/groups/sorting/case009.json create mode 100644 __tests__/test-suite/groups/sorting/case010.json create mode 100644 __tests__/test-suite/groups/sorting/case011.json create mode 100644 __tests__/test-suite/groups/sorting/case012.json create mode 100644 __tests__/test-suite/groups/sorting/case013.json create mode 100644 __tests__/test-suite/groups/string-concat/case000.json create mode 100644 __tests__/test-suite/groups/string-concat/case001.json create mode 100644 __tests__/test-suite/groups/string-concat/case002.json create mode 100644 __tests__/test-suite/groups/string-concat/case003.json create mode 100644 __tests__/test-suite/groups/string-concat/case004.json create mode 100644 __tests__/test-suite/groups/string-concat/case005.json create mode 100644 __tests__/test-suite/groups/string-concat/case006.json create mode 100644 __tests__/test-suite/groups/string-concat/case007.json create mode 100644 __tests__/test-suite/groups/string-concat/case008.json create mode 100644 __tests__/test-suite/groups/string-concat/case009.json create mode 100644 __tests__/test-suite/groups/string-concat/case010.json create mode 100644 __tests__/test-suite/groups/string-concat/case011.json create mode 100644 __tests__/test-suite/groups/tail-recursion/case000.json create mode 100644 __tests__/test-suite/groups/tail-recursion/case001.json create mode 100644 __tests__/test-suite/groups/tail-recursion/case002.json create mode 100644 __tests__/test-suite/groups/tail-recursion/case003.json create mode 100644 __tests__/test-suite/groups/tail-recursion/case004.json create mode 100644 __tests__/test-suite/groups/tail-recursion/case005.json create mode 100644 __tests__/test-suite/groups/tail-recursion/case006.json create mode 100644 __tests__/test-suite/groups/tail-recursion/case007.json create mode 100644 __tests__/test-suite/groups/transform/case000.json create mode 100644 __tests__/test-suite/groups/transform/case001.json create mode 100644 __tests__/test-suite/groups/transform/case002.json create mode 100644 __tests__/test-suite/groups/transform/case003.json create mode 100644 __tests__/test-suite/groups/transform/case004.json create mode 100644 __tests__/test-suite/groups/transform/case005.json create mode 100644 __tests__/test-suite/groups/transform/case006.json create mode 100644 __tests__/test-suite/groups/transform/case007.json create mode 100644 __tests__/test-suite/groups/transform/case008.json create mode 100644 __tests__/test-suite/groups/transform/case009.json create mode 100644 __tests__/test-suite/groups/transform/case010.json create mode 100644 __tests__/test-suite/groups/transform/case011.json create mode 100644 __tests__/test-suite/groups/transform/case012.json create mode 100644 __tests__/test-suite/groups/transform/case013.json create mode 100644 __tests__/test-suite/groups/transform/case014.json create mode 100644 __tests__/test-suite/groups/transform/case015.json create mode 100644 __tests__/test-suite/groups/transform/case016.json create mode 100644 __tests__/test-suite/groups/transform/case017.json create mode 100644 __tests__/test-suite/groups/transform/case018.json create mode 100644 __tests__/test-suite/groups/transform/case019.json create mode 100644 __tests__/test-suite/groups/transform/case020.json create mode 100644 __tests__/test-suite/groups/transform/case021.json create mode 100644 __tests__/test-suite/groups/transform/case022.json create mode 100644 __tests__/test-suite/groups/transform/case023.json create mode 100644 __tests__/test-suite/groups/transform/case024.json create mode 100644 __tests__/test-suite/groups/transform/case025.json create mode 100644 __tests__/test-suite/groups/transform/case026.json create mode 100644 __tests__/test-suite/groups/transform/case027.json create mode 100644 __tests__/test-suite/groups/transform/case028.json create mode 100644 __tests__/test-suite/groups/transform/case029.json create mode 100644 __tests__/test-suite/groups/transform/case030.json create mode 100644 __tests__/test-suite/groups/transform/case031.json create mode 100644 __tests__/test-suite/groups/transform/case032.json create mode 100644 __tests__/test-suite/groups/transform/case033.json create mode 100644 __tests__/test-suite/groups/transform/case034.json create mode 100644 __tests__/test-suite/groups/transform/case035.json create mode 100644 __tests__/test-suite/groups/transform/case036.json create mode 100644 __tests__/test-suite/groups/transform/case037.json create mode 100644 __tests__/test-suite/groups/transform/case038.json create mode 100644 __tests__/test-suite/groups/transform/case039.json create mode 100644 __tests__/test-suite/groups/transform/case040.json create mode 100644 __tests__/test-suite/groups/transform/case041.json create mode 100644 __tests__/test-suite/groups/transform/case042.json create mode 100644 __tests__/test-suite/groups/transform/case043.json create mode 100644 __tests__/test-suite/groups/transform/case044.json create mode 100644 __tests__/test-suite/groups/transform/case045.json create mode 100644 __tests__/test-suite/groups/transform/case046.json create mode 100644 __tests__/test-suite/groups/transform/case047.json create mode 100644 __tests__/test-suite/groups/transform/case048.json create mode 100644 __tests__/test-suite/groups/transform/case049.json create mode 100644 __tests__/test-suite/groups/transform/case050.json create mode 100644 __tests__/test-suite/groups/transform/case051.json create mode 100644 __tests__/test-suite/groups/transform/case052.json create mode 100644 __tests__/test-suite/groups/transform/case053.json create mode 100644 __tests__/test-suite/groups/transform/case054.json create mode 100644 __tests__/test-suite/groups/transform/case055.json create mode 100644 __tests__/test-suite/groups/transform/case056.json create mode 100644 __tests__/test-suite/groups/transform/case057.json create mode 100644 __tests__/test-suite/groups/transform/case058.json create mode 100644 __tests__/test-suite/groups/transform/case059.json create mode 100644 __tests__/test-suite/groups/transform/case060.json create mode 100644 __tests__/test-suite/groups/transform/case061.json create mode 100644 __tests__/test-suite/groups/transform/case062.json create mode 100644 __tests__/test-suite/groups/transform/case063.json create mode 100644 __tests__/test-suite/groups/transform/case064.json create mode 100644 __tests__/test-suite/groups/transform/case065.json create mode 100644 __tests__/test-suite/groups/transform/case066.json create mode 100644 __tests__/test-suite/groups/transform/case067.json create mode 100644 __tests__/test-suite/groups/transform/case068.json create mode 100644 __tests__/test-suite/groups/transform/case069.json create mode 100644 __tests__/test-suite/groups/transform/case070.json create mode 100644 __tests__/test-suite/groups/transform/case071.json create mode 100644 __tests__/test-suite/groups/transform/case072.json create mode 100644 __tests__/test-suite/groups/transform/case073.json create mode 100644 __tests__/test-suite/groups/transform/case074.json create mode 100644 __tests__/test-suite/groups/transform/case075.json create mode 100644 __tests__/test-suite/groups/transform/case076.json create mode 100644 __tests__/test-suite/groups/transform/case077.json create mode 100644 __tests__/test-suite/groups/transform/case078.json create mode 100644 __tests__/test-suite/groups/transform/case079.json create mode 100644 __tests__/test-suite/groups/transform/case080.json create mode 100644 __tests__/test-suite/groups/transform/case081.json create mode 100644 __tests__/test-suite/groups/transform/case082.json create mode 100644 __tests__/test-suite/groups/transform/case083.json create mode 100644 __tests__/test-suite/groups/transform/case084.json create mode 100644 __tests__/test-suite/groups/transform/case085.json create mode 100644 __tests__/test-suite/groups/transform/case086.json create mode 100644 __tests__/test-suite/groups/transform/case087.json create mode 100644 __tests__/test-suite/groups/transform/case088.json create mode 100644 __tests__/test-suite/groups/transform/case089.json create mode 100644 __tests__/test-suite/groups/transform/case090.json create mode 100644 __tests__/test-suite/groups/transform/case091.json create mode 100644 __tests__/test-suite/groups/transform/case092.json create mode 100644 __tests__/test-suite/groups/transform/case093.json create mode 100644 __tests__/test-suite/groups/transform/case094.json create mode 100644 __tests__/test-suite/groups/transform/case095.json create mode 100644 __tests__/test-suite/groups/transform/case096.json create mode 100644 __tests__/test-suite/groups/transform/case097.json create mode 100644 __tests__/test-suite/groups/transform/case098.json create mode 100644 __tests__/test-suite/groups/transform/case099.json create mode 100644 __tests__/test-suite/groups/transform/case100.json create mode 100644 __tests__/test-suite/groups/transform/case101.json create mode 100644 __tests__/test-suite/groups/transform/case102.json create mode 100644 __tests__/test-suite/groups/transform/case103.json create mode 100644 __tests__/test-suite/groups/transforms/case000.json create mode 100644 __tests__/test-suite/groups/transforms/case001.json create mode 100644 __tests__/test-suite/groups/transforms/case002.json create mode 100644 __tests__/test-suite/groups/transforms/case003.json create mode 100644 __tests__/test-suite/groups/transforms/case004.json create mode 100644 __tests__/test-suite/groups/transforms/case005.json create mode 100644 __tests__/test-suite/groups/transforms/case006.json create mode 100644 __tests__/test-suite/groups/transforms/case007.json create mode 100644 __tests__/test-suite/groups/transforms/case008.json create mode 100644 __tests__/test-suite/groups/transforms/case009.json create mode 100644 __tests__/test-suite/groups/transforms/case010.json create mode 100644 __tests__/test-suite/groups/transforms/case011.json create mode 100644 __tests__/test-suite/groups/transforms/case012.json create mode 100644 __tests__/test-suite/groups/variables/case000.json create mode 100644 __tests__/test-suite/groups/variables/case001.json create mode 100644 __tests__/test-suite/groups/variables/case002.json create mode 100644 __tests__/test-suite/groups/variables/case003.json create mode 100644 __tests__/test-suite/groups/variables/case004.json create mode 100644 __tests__/test-suite/groups/variables/case005.json create mode 100644 __tests__/test-suite/groups/variables/case006.json create mode 100644 __tests__/test-suite/groups/variables/case007.json create mode 100644 __tests__/test-suite/groups/variables/case008.json create mode 100644 __tests__/test-suite/groups/variables/case009.json create mode 100644 __tests__/test-suite/groups/variables/case010.json create mode 100644 __tests__/test-suite/groups/variables/case011.json create mode 100644 __tests__/test-suite/groups/wildcards/case000.json create mode 100644 __tests__/test-suite/groups/wildcards/case001.json create mode 100644 __tests__/test-suite/groups/wildcards/case002.json create mode 100644 __tests__/test-suite/groups/wildcards/case003.json create mode 100644 __tests__/test-suite/groups/wildcards/case004.json create mode 100644 __tests__/test-suite/groups/wildcards/case005.json create mode 100644 __tests__/test-suite/groups/wildcards/case006.json create mode 100644 __tests__/test-suite/groups/wildcards/case007.json create mode 100644 __tests__/test-suite/groups/wildcards/case008.json create mode 100644 __tests__/test-suite/groups/wildcards/case009.json delete mode 100644 jsonata.d.ts delete mode 100644 jsonata.js delete mode 100644 package-lock.json create mode 100644 rollup.config.js create mode 100644 src/constants.ts create mode 100644 src/evaluate.ts create mode 100644 src/functions.ts create mode 100644 src/index.ts create mode 100644 src/jsonata.ts create mode 100644 src/parser/ast.ts create mode 100644 src/parser/index.ts create mode 100644 src/parser/leds.ts create mode 100644 src/parser/nuds.ts create mode 100644 src/parser/optimize.ts create mode 100644 src/parser/parser.ts create mode 100644 src/parser/symbols.ts create mode 100644 src/parser/tail_call.ts create mode 100644 src/parser/types.ts create mode 100644 src/signatures.ts create mode 100644 src/tokenizer.ts create mode 100644 src/utils.ts create mode 100644 test.out create mode 100644 tsconfig-es2015.json create mode 100644 tsconfig-es5.json create mode 100644 tsconfig.json create mode 100644 yarn.lock 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/__tests__/async-function.ts b/__tests__/async-function.ts new file mode 100644 index 00000000..60518661 --- /dev/null +++ b/__tests__/async-function.ts @@ -0,0 +1,184 @@ +"use strict"; + +var jsonata = require('../src').jsonata; +var request = require('request'); + +var jsonataPromise = function(expr, data?, bindings?) { + return new Promise(function(resolve, reject) { + expr.evaluate(data, bindings, function(error, response) { + if(error) reject(error); + resolve(response); + }); + }); +}; + +var httpget = function(url) { + return new Promise(function(resolve, reject) { + request(url, function(error, response, body) { + if(error) { + reject(error); + return; + } + resolve(JSON.parse(body)); + }); + }); +}; + +describe('Invoke JSONata with callback', function() { + describe('Make HTTP request', 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); + let result = await jsonataPromise(expr); + + expect(result).toEqual({ + '2016-09': 205, + '2016-10': 1266, + '2016-11': 2783, + '2016-12': 2158, + '2017-01': 22977, + '2017-02': 37728, + '2017-03': 46460 }); + }); + + }); +}); + +describe('Invoke JSONata with callback - errors', function() { + describe('type error', 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); + + try { + await jsonataPromise(expr); + expect(undefined).toBeDefined(); + } catch(e) { + // Expected outcome + } + }); + }); + + describe('Make HTTP request with dodgy url', 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); + 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', async () => { + var data = { value: undefined }; + var expr = jsonata('value'); + let result = await jsonataPromise(expr, data); + expect(result).toEqual(undefined); + }); + it('should handle a null value', async() => { + var data = { value: null }; + var expr = jsonata('value'); + let result = await jsonataPromise(expr, data); + return expect(result).toEqual(null); + }); + it('should handle a value', async() => { + var data = { value: 'hello' }; + var expr = jsonata('value'); + let result = await jsonataPromise(expr, data); + return expect(result).toEqual('hello'); + }); + it('should handle a promise', async() => { + var data = { value: Promise.resolve('hello') }; + var expr = jsonata('value'); + let result = await jsonataPromise(expr, data); + return expect(result).toEqual('hello'); + }); +}); + +describe('Handle chained functions that end in promises', function() { + + var counter = function(count) { + return { + inc: function() { + return counter(count + 1); + }, + then: function(onFulfilled) { + setImmediate(function(){ + onFulfilled(count); + }); + return Promise.resolve(count); + } + }; + }; + + var bindings = { + counter: counter + }; + + it('basic function that returns a thenable', async() => { + var data = {}; + var expr = jsonata('$counter(5)'); + let result = await jsonataPromise(expr, data, bindings); + expect(result).toEqual(5); + }); + + it('basic function that returns a thenable, but invokes another function', async() => { + var data = {}; + var expr = jsonata('$counter(0).inc()'); + 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', async() => { + var data = {}; + var expr = jsonata('$counter(0).inc().inc().inc().inc()'); + 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', async() => { + var data = {}; + var expr = jsonata('$counter(3) + 5'); + 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', async() => { + var data = {}; + var expr = jsonata('$counter(0).inc().inc().inc().inc() + 3'); + let result = await jsonataPromise(expr, data, bindings); + + return expect(result).toEqual(7); + }); + + it('basic function that returns a thenable, but invokes another function - nested', async() => { + var data = {}; + var expr = jsonata('$counter($counter(3).inc().inc()).inc()'); + 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', async() => { + var data = {}; + var expr = jsonata('$counter(3).inc().$string()'); + 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', async() => { + var data = {}; + var expr = jsonata('$counter(2).inc().foo()'); + + try { + await jsonataPromise(expr, data, bindings); + expect(undefined).toBeDefined(); + } catch(e) { + // Expected outcome + } + }); +}); \ No newline at end of file diff --git a/__tests__/implementation-tests.ts b/__tests__/implementation-tests.ts new file mode 100644 index 00000000..74bb7c79 --- /dev/null +++ b/__tests__/implementation-tests.ts @@ -0,0 +1,553 @@ +/** + * © Copyright IBM Corp. 2016 All Rights Reserved + * Project name: JSONata + * This project is licensed under the MIT License, see LICENSE + * + * The files in this directory are tests that aren't really portable + * to other implementations for various reasons but they are included + * in order to achieve 100% coverage for this implementation. + */ + +"use strict"; + +var jsonata = require('../src').jsonata; +import { timeboxExpression } from '../src/utils'; + +var testdata2 = { + Account: { + "Account Name": "Firefly", + Order: [ + { + OrderID: "order103", + Product: [ + { + "Product Name": "Bowler Hat", + ProductID: 858383, + SKU: "0406654608", + Description: { + Colour: "Purple", + Width: 300, + Height: 200, + Depth: 210, + Weight: 0.75 + }, + Price: 34.45, + Quantity: 2 + }, + { + "Product Name": "Trilby hat", + ProductID: 858236, + SKU: "0406634348", + Description: { + Colour: "Orange", + Width: 300, + Height: 200, + Depth: 210, + Weight: 0.6 + }, + Price: 21.67, + Quantity: 1 + } + ] + }, + { + OrderID: "order104", + Product: [ + { + "Product Name": "Bowler Hat", + ProductID: 858383, + SKU: "040657863", + Description: { + Colour: "Purple", + Width: 300, + Height: 200, + Depth: 210, + Weight: 0.75 + }, + Price: 34.45, + Quantity: 4 + }, + { + ProductID: 345664, + SKU: "0406654603", + "Product Name": "Cloak", + Description: { + Colour: "Black", + Width: 30, + Height: 20, + Depth: 210, + Weight: 2.0 + }, + Price: 107.99, + Quantity: 1 + } + ] + } + ] + } +}; + +describe("Functions with side-effects", () => { + describe("Evaluator - function: millis", function() { + describe("$millis() returns milliseconds since the epoch", function() { + it("should return result object", function() { + var expr = jsonata("$millis()"); + var result = expr.evaluate(testdata2); + // number between 1502264152715 and 2000000000000 (18 May 2033) + var expected = result > 1502264152715 && result < 2000000000000; + expect(expected).toEqual(true); + }); + }); + + describe("$millis() always returns same value within an expression", function() { + it("should return result object", function() { + var expr = jsonata('{"now": $millis(), "delay": $sum([1..10000]), "later": $millis()}.(now = later)'); + var result = expr.evaluate(testdata2); + var expected = true; + expect(result).toEqual(expected); + }); + }); + + describe("$millis() returns different timestamp for subsequent evaluate() calls", function() { + it("should return result object", function() { + var expr = jsonata("($sum([1..10000]); $millis())"); + var result = expr.evaluate(testdata2); + var result2 = expr.evaluate(testdata2); + expect(result).not.toEqual(result2); + }); + }); + }); + + describe("$now() returns timestamp", function() { + it("should return result object", function() { + var expr = jsonata("$now()"); + var result = expr.evaluate(testdata2); + // follows this pattern - "2017-05-09T10:10:16.918Z" + 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).toEqual(true); + }); + }); + + describe("$now() always returns same value within an expression", function() { + it("should return result object", function() { + var expr = jsonata('{"now": $now(), "delay": $sum([1..10000]), "later": $now()}.(now = later)'); + var result = expr.evaluate(testdata2); + var expected = true; + expect(result).toEqual(expected); + }); + }); + + describe("$now() returns different timestamp for subsequent evaluate() calls", function() { + it("should return result object", function() { + var expr = jsonata("($sum([1..10000]); $now())"); + var result = expr.evaluate(testdata2); + var result2 = expr.evaluate(testdata2); + expect(result).not.toEqual(result2); + }); + }); + + describe("$millis() returns milliseconds since the epoch", function() { + it("should return result object", function() { + var expr = jsonata("$millis()"); + var result = expr.evaluate(testdata2); + // number between 1502264152715 and 2000000000000 (18 May 2033) + var expected = result > 1502264152715 && result < 2000000000000; + expect(expected).toEqual(true); + }); + }); + + describe("Evaluator - functions: random", function() { + describe('random number")', function() { + it("should return result object", function() { + var expr = jsonata("$random()"); + var result = expr.evaluate(); + var expected = result >= 0 && result < 1; + expect(true).toEqual(expected); + }); + }); + + describe('consequetive random numbers should be different")', function() { + it("should return result object", function() { + var expr = jsonata("$random() = $random()"); + var result = expr.evaluate(); + var expected = false; + expect(result).toEqual(expected); + }); + }); + }); +}); + +describe("Tests that bind Javascript functions", () => { + describe("transform expression with overridden $clone function", function() { + it("should return result object", function() { + var expr = jsonata('Account ~> |Order|{"Product":"blah"},nomatch|'); + var count = 0; + expr.registerFunction("clone", function(arg) { + count++; + return JSON.parse(JSON.stringify(arg)); + }); + var result = expr.evaluate(testdata2); + var expected = { + "Account Name": "Firefly", + Order: [ + { + OrderID: "order103", + Product: "blah" + }, + { + OrderID: "order104", + Product: "blah" + } + ] + }; + expect(result).toEqual(expected); + expect(count).toEqual(1); + }); + }); + + // These involve binding of functions + describe("Override implementation of $now()", function() { + it("should return result object", function() { + var expr = jsonata("$now()"); + expr.registerFunction("now", function() { + return "time for tea"; + }); + var result = expr.evaluate(testdata2); + expect(result).toEqual("time for tea"); + }); + }); + + describe("map a user-defined Javascript function with signature", function() { + it("should return result object", function() { + var expr = jsonata("$map([1,4,9,16], $squareroot)"); + expr.registerFunction( + "squareroot", + function(num) { + return Math.sqrt(num); + }, + "" + ); + var result = expr.evaluate(testdata2); + var expected = [1, 2, 3, 4]; + expect(result).toEqual(expected); + }); + }); + describe("map a user-defined Javascript function with undefined signature", function() { + it("should return result object", function() { + var expr = jsonata("$map([1,4,9,16], $squareroot)"); + expr.registerFunction("squareroot", function(num) { + return Math.sqrt(num); + }); + var result = expr.evaluate(testdata2); + var expected = [1, 2, 3, 4]; + expect(result).toEqual(expected); + }); + }); + + describe("map a user-defined Javascript function", function() { + it("should return result object", function() { + var expr = jsonata("$map([1,4,9,16], $squareroot)"); + expr.assign("squareroot", function(num) { + return Math.sqrt(num); + }); + var result = expr.evaluate(testdata2); + var expected = [1, 2, 3, 4]; + expect(result).toEqual(expected); + }); + }); + describe("Partially apply user-defined Javascript function", function() { + it("should return result object", function() { + var expr = jsonata( + "(" + + " $firstn := $substr(?, 0, ?);" + + " $first5 := $firstn(?, 5);" + + ' $first5("Hello World")' + + ")" + ); + expr.assign("substr", function(str, start, len) { + return str.substr(start, len); + }); + var result = expr.evaluate(testdata2); + var expected = "Hello"; + expect(result).toEqual(expected); + }); + }); +}); + +describe("Tests that are specific to a Javascript runtime", () => { + // Javascript specific + describe('/ab/ ("ab")', function() { + it("should return result object", function() { + var expr = jsonata('/ab/ ("ab")'); + var result = expr.evaluate(); + var expected = { match: "ab", start: 0, end: 2, groups: [] }; + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); + }); + }); + + describe("/ab/ ()", function() { + it("should return result object", function() { + var expr = jsonata("/ab/ ()"); + var result = expr.evaluate(); + var expected = undefined; + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); + }); + }); + + describe('/ab+/ ("ababbabbcc")', function() { + it("should return result object", function() { + var expr = jsonata('/ab+/ ("ababbabbcc")'); + var result = expr.evaluate(); + var expected = { match: "ab", start: 0, end: 2, groups: [] }; + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); + }); + }); + + describe('/a(b+)/ ("ababbabbcc")', function() { + it("should return result object", function() { + var expr = jsonata('/a(b+)/ ("ababbabbcc")'); + var result = expr.evaluate(); + var expected = { match: "ab", start: 0, end: 2, groups: ["b"] }; + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); + }); + }); + + describe('/a(b+)/ ("ababbabbcc").next()', function() { + it("should return result object", function() { + 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)).toEqual(JSON.stringify(expected)); + }); + }); + + describe('/a(b+)/ ("ababbabbcc").next().next()', function() { + it("should return result object", function() { + 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)).toEqual(JSON.stringify(expected)); + }); + }); + + describe('/a(b+)/ ("ababbabbcc").next().next().next()', function() { + it("should return result object", function() { + var expr = jsonata('/a(b+)/ ("ababbabbcc").next().next().next()'); + var result = expr.evaluate(); + var expected = undefined; + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); + }); + }); + + describe('/a(b+)/i ("Ababbabbcc")', function() { + it("should return result object", function() { + 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)).toEqual(JSON.stringify(expected)); + }); + }); + + describe("empty regex", function() { + it("should throw error", function() { + expectError(() => { + var expr = jsonata("//"); + expr.evaluate(); + }, {position: 1, code: "S0301"}); + }); + }); + + describe("incomplete regex", function() { + it("should throw error", function() { + expectError(() => { + var expr = jsonata("/"); + expr.evaluate(); + }, {position: 1, code: "S0302"}); + }); + }); + + describe("Functions - $match", function() { + describe('$match("ababbabbcc",/ab/)', function() { + it("should return result object", function() { + var expr = jsonata('$match("ababbabbcc",/ab/)'); + var result = expr.evaluate(); + var expected = [ + { match: "ab", index: 0, groups: [] }, + { + match: "ab", + index: 2, + groups: [] + }, + { match: "ab", index: 5, groups: [] } + ]; + expect(result).toEqual(expected); + }); + }); + + describe('$match("ababbabbcc",/a(b+)/)', function() { + it("should return result object", function() { + var expr = jsonata('$match("ababbabbcc",/a(b+)/)'); + var result = expr.evaluate(); + var expected = [ + { match: "ab", index: 0, groups: ["b"] }, + { + match: "abb", + index: 2, + groups: ["bb"] + }, + { match: "abb", index: 5, groups: ["bb"] } + ]; + expect(result).toEqual(expected); + }); + }); + + describe('$match("ababbabbcc",/a(b+)/, 1)', function() { + it("should return result object", function() { + var expr = jsonata('$match("ababbabbcc",/a(b+)/, 1)'); + var result = expr.evaluate(); + var expected = { match: "ab", index: 0, groups: ["b"] }; + expect(result).toEqual(expected); + }); + }); + + describe('$match("ababbabbcc",/a(b+)/, 0)', function() { + it("should return result object", function() { + var expr = jsonata('$match("ababbabbcc",/a(b+)/, 0)'); + var result = expr.evaluate(); + var expected = undefined; + expect(result).toEqual(expected); + }); + }); + + describe("$match(nothing,/a(xb+)/)", function() { + it("should return result object", function() { + var expr = jsonata("$match(nothing,/a(xb+)/)"); + var result = expr.evaluate(); + var expected = undefined; + expect(result).toEqual(expected); + }); + }); + + describe('$match("ababbabbcc",/a(xb+)/)', function() { + it("should return result object", function() { + var expr = jsonata('$match("ababbabbcc",/a(xb+)/)'); + var result = expr.evaluate(); + var expected = undefined; + 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)'); + expectError(() => { + expr.evaluate(); + }, { 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)'); + expectError(() => { + expr.evaluate(); + }, { 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")'); + expectError(() => { + expr.evaluate(); + }, { 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")'); + expectError(() => { + expr.evaluate(); + }, { 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)'); + expectError(() => { + expr.evaluate(); + }, { 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)"); + expectError(() => { + expr.evaluate(); + }, { position: 7, code: "T0410", token: "match", index: 1, value: 12345 }); + }); + }); + + describe("$match(12345)", function() { + it("should throw error", function() { + var expr = jsonata("$match(12345)"); + expectError(() => { + expr.evaluate(); + }, { position: 7, code: "T0410", token: "match", index: 1 }); + }); + }); + }); +}); + +describe("Test that yield platform specific results", () => { + // Platform specific + describe("$sqrt(10) * $sqrt(10)", function() { + it("should return result object", function() { + var expr = jsonata("$sqrt(10) * $sqrt(10)"); + var result = expr.evaluate(); + var expected = 10; + expect(result).toBeCloseTo(expected); + }); + }); +}); + +describe("Tests that include infinite recursion", () => { + describe("stack overflow - infinite recursive function - non-tail call", function() { + it("should throw error", function() { + expectError(() => { + var expr = jsonata("(" + " $inf := function($n){$n+$inf($n-1)};" + " $inf(5)" + ")"); + timeboxExpression(expr, 1000, 300); + expr.evaluate(); + }, { position: 46, code: "U1001" }); + }); + }); + + describe("stack overflow - infinite recursive function - tail call", function() { + jest.setTimeout(5000); + it("should throw error", function() { + expectError(() => { + var expr = jsonata("(" + " $inf := function(){$inf()};" + " $inf()" + ")"); + timeboxExpression(expr, 1000, 500); + expr.evaluate(); + }, { position: 37, code: "U1001" }); + }); + }); +}); + + +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..b498e992 --- /dev/null +++ b/__tests__/parser-recovery.ts @@ -0,0 +1,451 @@ +"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", + "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 }); + 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/__tests__/run-test-suite.ts b/__tests__/run-test-suite.ts new file mode 100644 index 00000000..d17e82f1 --- /dev/null +++ b/__tests__/run-test-suite.ts @@ -0,0 +1,150 @@ +/** + * © Copyright IBM Corp. 2016 All Rights Reserved + * Project name: JSONata + * This project is licensed under the MIT License, see LICENSE + */ + +"use strict"; + +var fs = require("fs"); +var path = require("path"); +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")); + +/** + * Simple function to read in JSON + * @param {string} dir - Directory containing JSON file + * @param {string} file - Name of JSON file (relative to directory) + * @returns {Object} Parsed JSON object + */ +function readJSON(dir, file) { + try { + return JSON.parse(fs.readFileSync(path.join(__dirname, dir, file)).toString()); + } catch(e) { + throw new Error("Error reading "+file+" in "+dir+": "+e.message); + } +} + +let datasets = {}; +let datasetnames = fs.readdirSync(path.join(__dirname, "test-suite", "datasets")); + +datasetnames.forEach((name) => { + datasets[name.replace(".json", "")] = readJSON(path.join("test-suite", "datasets"), name); +}); + +// This is the start of the set of tests associated with the test cases +// found in the test-suite directory. +describe("JSONata Test Suite", () => { + // Iterate over all groups of tests + groups.forEach(group => { + let casenames = fs.readdirSync(path.join(__dirname, "test-suite", "groups", group)); + // Read JSON file containing all cases for this group + let cases = casenames.map((name) => readJSON(path.join("test-suite", "groups", group), name)); + describe("Group: " + group, () => { + // Iterate over all cases + for (let i = 0; i < cases.length; i++) { + // Extract the current test case of interest + let testcase = cases[i]; + + // Create a test based on the data in this testcase + it(casenames[i]+": "+testcase.expr, function() { + var expr; + // Start by trying to compile the expression associated with this test case + try { + expr = jsonata(testcase.expr); + // 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) { + jest.setTimeout(testcase.timelimit*2); + timeboxExpression(expr, testcase.timelimit, testcase.depth); + } + } catch (e) { + // If we get here, an error was thrown. So check to see if this particular + // testcase expects an exception (as indicated by the presence of the + // `code` field in the testcase) + if (testcase.code) { + // See if we go the code we expected + expect(e.code).toEqual(testcase.code); + // If a token was specified, check for that too + if (testcase.hasOwnProperty("token")) { + expect(e.code).toEqual(testcase.token); + } + } else { + // If we get here, something went wrong because an exception + // was thrown when we didn't expect one to be thrown. + throw new Error("Got an unexpected exception: " + e.message); + } + } + // If we managed to compile the expression... + if (expr) { + // Load the input data set. First, check to see if the test case defines its own input + // data (testcase.data). If not, then look for a dataset number. If it is -1, then that + // means there is no data (so use undefined). If there is a dataset number, look up the + // input data in the datasets array. + let dataset = resolveDataset(datasets, testcase); + + // Test cases have three possible outcomes from evaluation... + if ("undefinedResult" in testcase) { + // 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).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).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. + 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. + throw new Error("Nothing to test in this test case"); + } + } + }); + } + }); + }); +}); + +/** + * 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). + * + * @param {Object} datasets Object mapping dataset names to JS values + * @param {Object} testcase Testcase data read from testcase file + * @returns {any} The input data to use when evaluating the jsonata expression + */ +function resolveDataset(datasets, testcase) { + if ("data" in testcase) { + return testcase.data; + } + if (testcase.dataset===null) { + return undefined; + } + if (datasets.hasOwnProperty(testcase.dataset)) { + 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?"); +} + +describe("This is a jest test", () => { + test("An actual test", async () => { + return 5; + }) +}) \ No newline at end of file diff --git a/__tests__/test-suite/TESTSUITE.md b/__tests__/test-suite/TESTSUITE.md new file mode 100644 index 00000000..62f33637 --- /dev/null +++ b/__tests__/test-suite/TESTSUITE.md @@ -0,0 +1,39 @@ +# Jsonata Test Suite + +The data contained in this directory is an attempt at a language neutral +test suite for `jsonata`. The original test suite (written in Javascript) +was transformed into a series of JSON files. + +## `datasets` directory + +The `datasets` directory contains a set of JSON files. Each file represents +potential input data to a `jsonata` test. The point of putting this input in +named files is so that it can be re-used (rather than repeated) by different +test cases. + +## `groups//case###.json` + +Each `` directory is a bundle of test cases related to a given +topic. Inside each of those directories are JSON files that represent +individual test cases. Each JSON file contains a test case and each test +case includes the following fields: + +* `expr`: The `jsonata` expression to be evaluated. +* `data` or `dataset`: If `data` is defined, use the value of the `data` field + as the input data for the test case. Otherwise, the `dataset` field contains + the name of the dataset (in the `datasets` directory) to use as input data. + If value of the `dataset` field is `null`, then use `undefined` as the input + data when evaluating the `jsonata` expression. +* `timelimit`: If a timelimit should be imposed on the test, this specifies the + timelimit in milliseconds. +* `depth`: If the depth of evaluation should be limited, this specifies the depth. +* `bindings`: Any variable bindings to be applied when evaluating the expression. + +In addition, (exactly) one of the following fields is specified for each test case: + +* `result`: The expected result of evaluation (if defined) +* `undefinedResult`: A flag indicating the expected result of evaluation will be `undefined` +* `code`: The code associated with the exception that is expected to be thrown when either compiling the expression or evaluating it + +If the `code` field is present, an optional `token` field may also be present indicating which token token the exception +should be associated with. diff --git a/__tests__/test-suite/datasets/dataset0.json b/__tests__/test-suite/datasets/dataset0.json new file mode 100644 index 00000000..f9564da4 --- /dev/null +++ b/__tests__/test-suite/datasets/dataset0.json @@ -0,0 +1,22 @@ +{ + "foo": { + "bar": 42, + "blah": [ + { + "baz": { + "fud": "hello" + } + }, + { + "baz": { + "fud": "world" + } + }, + { + "bazz": "gotcha" + } + ], + "blah.baz": "here" + }, + "bar": 98 +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset1.json b/__tests__/test-suite/datasets/dataset1.json new file mode 100644 index 00000000..fda49015 --- /dev/null +++ b/__tests__/test-suite/datasets/dataset1.json @@ -0,0 +1,53 @@ +{ + "FirstName": "Fred", + "Surname": "Smith", + "Age": 28, + "Address": { + "Street": "Hursley Park", + "City": "Winchester", + "Postcode": "SO21 2JN" + }, + "Phone": [ + { + "type": "home", + "number": "0203 544 1234" + }, + { + "type": "office", + "number": "01962 001234" + }, + { + "type": "office", + "number": "01962 001235" + }, + { + "type": "mobile", + "number": "077 7700 1234" + } + ], + "Email": [ + { + "type": "work", + "address": [ + "fred.smith@my-work.com", + "fsmith@my-work.com" + ] + }, + { + "type": "home", + "address": [ + "freddy@my-social.com", + "frederic.smith@very-serious.com" + ] + } + ], + "Other": { + "Over 18 ?": true, + "Misc": null, + "Alternative.Address": { + "Street": "Brick Lane", + "City": "London", + "Postcode": "E1 6RF" + } + } +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset10.json b/__tests__/test-suite/datasets/dataset10.json new file mode 100644 index 00000000..ccc412b3 --- /dev/null +++ b/__tests__/test-suite/datasets/dataset10.json @@ -0,0 +1,22 @@ +{ + "foo": { + "bar": 42, + "blah": [ + { + "baz": { + "fud": "hello" + } + }, + { + "buz": { + "fud": "world" + } + }, + { + "bazz": "gotcha" + } + ], + "blah.baz": "here" + }, + "bar": 98 +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset11.json b/__tests__/test-suite/datasets/dataset11.json new file mode 100644 index 00000000..b7fb9b2e --- /dev/null +++ b/__tests__/test-suite/datasets/dataset11.json @@ -0,0 +1,9 @@ +[ + { + "content": { + "origin": { + "name": "fakeIntegrationName" + } + } + } +] \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset12.json b/__tests__/test-suite/datasets/dataset12.json new file mode 100644 index 00000000..18a092c6 --- /dev/null +++ b/__tests__/test-suite/datasets/dataset12.json @@ -0,0 +1,72 @@ +{ + "Account": { + "Account Name": "Firefly", + "Order": [ + { + "OrderID": "order103", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "0406654608", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Quantity": 2 + }, + { + "Product Name": "Trilby hat", + "ProductID": 858236, + "SKU": "0406634348", + "Description": { + "Colour": "Orange", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.6 + }, + "Price": 21.67, + "Quantity": 1 + } + ] + }, + { + "OrderID": "order104", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "040657863", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": 34.45, + "Quantity": 4 + }, + { + "ProductID": 345664, + "SKU": "0406654603", + "Product Name": "Cloak", + "Description": { + "Colour": "Black", + "Width": 30, + "Height": 20, + "Depth": 210, + "Weight": 2 + }, + "Price": 107.99, + "Quantity": 1 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset13.json b/__tests__/test-suite/datasets/dataset13.json new file mode 100644 index 00000000..476c95bd --- /dev/null +++ b/__tests__/test-suite/datasets/dataset13.json @@ -0,0 +1,72 @@ +{ + "Account": { + "Account Name": "Firefly", + "Order": [ + { + "OrderID": "order103", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "0406654608", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": 34.45, + "Quantity": 2 + }, + { + "Product Name": "Trilby hat", + "ProductID": 858236, + "SKU": "0406634348", + "Description": { + "Colour": "Orange", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.6 + }, + "Quantity": 1 + } + ] + }, + { + "OrderID": "order104", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "040657863", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": 34.45, + "Quantity": 4 + }, + { + "ProductID": 345664, + "SKU": "0406654603", + "Product Name": "Cloak", + "Description": { + "Colour": "Black", + "Width": 30, + "Height": 20, + "Depth": 210, + "Weight": 2 + }, + "Price": 107.99, + "Quantity": 1 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset14.json b/__tests__/test-suite/datasets/dataset14.json new file mode 100644 index 00000000..999236ed --- /dev/null +++ b/__tests__/test-suite/datasets/dataset14.json @@ -0,0 +1,71 @@ +{ + "Account": { + "Account Name": "Firefly", + "Order": [ + { + "OrderID": "order103", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "0406654608", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Quantity": 2 + }, + { + "Product Name": "Trilby hat", + "ProductID": 858236, + "SKU": "0406634348", + "Description": { + "Colour": "Orange", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.6 + }, + "Quantity": 1 + } + ] + }, + { + "OrderID": "order104", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "040657863", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": 34.45, + "Quantity": 4 + }, + { + "ProductID": 345664, + "SKU": "0406654603", + "Product Name": "Cloak", + "Description": { + "Colour": "Black", + "Width": 30, + "Height": 20, + "Depth": 210, + "Weight": 2 + }, + "Price": 107.99, + "Quantity": 1 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset15.json b/__tests__/test-suite/datasets/dataset15.json new file mode 100644 index 00000000..68f4916a --- /dev/null +++ b/__tests__/test-suite/datasets/dataset15.json @@ -0,0 +1,73 @@ +{ + "Account": { + "Account Name": "Firefly", + "Order": [ + { + "OrderID": "order103", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "0406654608", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": "foo", + "Quantity": 2 + }, + { + "Product Name": "Trilby hat", + "ProductID": 858236, + "SKU": "0406634348", + "Description": { + "Colour": "Orange", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.6 + }, + "Price": 21.67, + "Quantity": 1 + } + ] + }, + { + "OrderID": "order104", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "040657863", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": 34.45, + "Quantity": 4 + }, + { + "ProductID": 345664, + "SKU": "0406654603", + "Product Name": "Cloak", + "Description": { + "Colour": "Black", + "Width": 30, + "Height": 20, + "Depth": 210, + "Weight": 2 + }, + "Price": 107.99, + "Quantity": 1 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset16.json b/__tests__/test-suite/datasets/dataset16.json new file mode 100644 index 00000000..ac8e5d4a --- /dev/null +++ b/__tests__/test-suite/datasets/dataset16.json @@ -0,0 +1,73 @@ +{ + "Account": { + "Account Name": "Firefly", + "Order": [ + { + "OrderID": "order103", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "0406654608", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": true, + "Quantity": 2 + }, + { + "Product Name": "Trilby hat", + "ProductID": 858236, + "SKU": "0406634348", + "Description": { + "Colour": "Orange", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.6 + }, + "Price": 21.67, + "Quantity": 1 + } + ] + }, + { + "OrderID": "order104", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "040657863", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": 34.45, + "Quantity": 4 + }, + { + "ProductID": 345664, + "SKU": "0406654603", + "Product Name": "Cloak", + "Description": { + "Colour": "Black", + "Width": 30, + "Height": 20, + "Depth": 210, + "Weight": 2 + }, + "Price": 107.99, + "Quantity": 1 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset17.json b/__tests__/test-suite/datasets/dataset17.json new file mode 100644 index 00000000..5d3452f6 --- /dev/null +++ b/__tests__/test-suite/datasets/dataset17.json @@ -0,0 +1,73 @@ +{ + "Account": { + "Account Name": "Firefly", + "Order": [ + { + "OrderID": "order103", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "0406654608", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": 34.45, + "Quantity": 2 + }, + { + "Product Name": "Trilby hat", + "ProductID": 858236, + "SKU": "0406634348", + "Description": { + "Colour": "Orange", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.6 + }, + "Price": null, + "Quantity": 1 + } + ] + }, + { + "OrderID": "order104", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "040657863", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": 34.45, + "Quantity": 4 + }, + { + "ProductID": 345664, + "SKU": "0406654603", + "Product Name": "Cloak", + "Description": { + "Colour": "Black", + "Width": 30, + "Height": 20, + "Depth": 210, + "Weight": 2 + }, + "Price": 107.99, + "Quantity": 1 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset18.json b/__tests__/test-suite/datasets/dataset18.json new file mode 100644 index 00000000..f5ffd328 --- /dev/null +++ b/__tests__/test-suite/datasets/dataset18.json @@ -0,0 +1,19 @@ +{ + "state": { + "tempReadings": [ + 27.2, + 28.9, + 28, + 28.2, + 28.4 + ], + "readingsCount": 5, + "sumTemperatures": 140.7, + "avgTemperature": 28.14, + "maxTemperature": 28.9, + "minTemperature": 27.2 + }, + "event": { + "t": 28.4 + } +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset19.json b/__tests__/test-suite/datasets/dataset19.json new file mode 100644 index 00000000..803a1e7b --- /dev/null +++ b/__tests__/test-suite/datasets/dataset19.json @@ -0,0 +1,9 @@ +{ + "output": { + "is": { + "same": { + "as": "input" + } + } + } +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset2.json b/__tests__/test-suite/datasets/dataset2.json new file mode 100644 index 00000000..cba1ae28 --- /dev/null +++ b/__tests__/test-suite/datasets/dataset2.json @@ -0,0 +1,17 @@ +[ + [ + { + "baz": { + "fud": "hello" + } + }, + { + "baz": { + "fud": "world" + } + }, + { + "bazz": "gotcha" + } + ] +] \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset20.json b/__tests__/test-suite/datasets/dataset20.json new file mode 100644 index 00000000..11d5c9f3 --- /dev/null +++ b/__tests__/test-suite/datasets/dataset20.json @@ -0,0 +1,10 @@ +{ + "moo": 4, + "jee": { + "par": { + "waa": { + "bar": 87 + } + } + } +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset21.json b/__tests__/test-suite/datasets/dataset21.json new file mode 100644 index 00000000..b863ac5c --- /dev/null +++ b/__tests__/test-suite/datasets/dataset21.json @@ -0,0 +1,22 @@ +{ + "Salutation": "Mr", + "Name": "Alexander", + "MiddleName": "John", + "Surname": "Smith", + "Cars": 3, + "Employment": { + "Name": "IBM UK", + "ContractType": "permanent", + "Role": "Senior Physician", + "Years": 12, + "Executive.Compensation": 1400000 + }, + "Qualifications": [ + "GP", + "Consultant Opthalmologist" + ], + "Salary": null, + "NI.Number": "NO10FURBZNESS", + "敷": "Steve", + "Español": "/ˈspænɪʃ/" +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset22.json b/__tests__/test-suite/datasets/dataset22.json new file mode 100644 index 00000000..8ff6f5bc --- /dev/null +++ b/__tests__/test-suite/datasets/dataset22.json @@ -0,0 +1,7 @@ +{ + "doc": 23, + "detail": { + "contents": "stuff", + "meta": 5 + } +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset23.json b/__tests__/test-suite/datasets/dataset23.json new file mode 100644 index 00000000..cd6b95d8 --- /dev/null +++ b/__tests__/test-suite/datasets/dataset23.json @@ -0,0 +1,7 @@ +{ + "doc": 89, + "detail": { + "contents": "some more stuff", + "meta": "boo" + } +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset24.json b/__tests__/test-suite/datasets/dataset24.json new file mode 100644 index 00000000..dc860859 --- /dev/null +++ b/__tests__/test-suite/datasets/dataset24.json @@ -0,0 +1,52 @@ +{ + "nest0": [ + { + "nest1": [ + { + "nest2": [ + { + "nest3": 1 + }, + { + "nest3": 2 + } + ] + }, + { + "nest2": [ + { + "nest3": 3 + }, + { + "nest3": 4 + } + ] + } + ] + }, + { + "nest1": [ + { + "nest2": [ + { + "nest3": 5 + }, + { + "nest3": 6 + } + ] + }, + { + "nest2": [ + { + "nest3": 7 + }, + { + "nest3": 8 + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset3.json b/__tests__/test-suite/datasets/dataset3.json new file mode 100644 index 00000000..106da97f --- /dev/null +++ b/__tests__/test-suite/datasets/dataset3.json @@ -0,0 +1,28 @@ +[ + 42, + [ + { + "baz": { + "fud": "hello" + } + }, + { + "baz": { + "fud": "world" + } + }, + { + "bazz": "gotcha" + } + ], + "here", + { + "fud": "hello" + }, + "hello", + { + "fud": "world" + }, + "world", + "gotcha" +] \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset4.json b/__tests__/test-suite/datasets/dataset4.json new file mode 100644 index 00000000..ee9426d2 --- /dev/null +++ b/__tests__/test-suite/datasets/dataset4.json @@ -0,0 +1,32 @@ +[ + { + "nest0": [ + { + "nest1": [ + 1, + 2 + ] + }, + { + "nest1": [ + 3, + 4 + ] + } + ] + }, + { + "nest0": [ + { + "nest1": [ + 5 + ] + }, + { + "nest1": [ + 6 + ] + } + ] + } +] \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset5.json b/__tests__/test-suite/datasets/dataset5.json new file mode 100644 index 00000000..3c37583a --- /dev/null +++ b/__tests__/test-suite/datasets/dataset5.json @@ -0,0 +1,73 @@ +{ + "Account": { + "Account Name": "Firefly", + "Order": [ + { + "OrderID": "order103", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "0406654608", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": 34.45, + "Quantity": 2 + }, + { + "Product Name": "Trilby hat", + "ProductID": 858236, + "SKU": "0406634348", + "Description": { + "Colour": "Orange", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.6 + }, + "Price": 21.67, + "Quantity": 1 + } + ] + }, + { + "OrderID": "order104", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "040657863", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": 34.45, + "Quantity": 4 + }, + { + "ProductID": 345664, + "SKU": "0406654603", + "Product Name": "Cloak", + "Description": { + "Colour": "Black", + "Width": 30, + "Height": 20, + "Depth": 210, + "Weight": 2 + }, + "Price": 107.99, + "Quantity": 1 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset6.json b/__tests__/test-suite/datasets/dataset6.json new file mode 100644 index 00000000..44328747 --- /dev/null +++ b/__tests__/test-suite/datasets/dataset6.json @@ -0,0 +1,89 @@ +{ + "library": { + "books": [ + { + "title": "Structure and Interpretation of Computer Programs", + "authors": [ + "Abelson", + "Sussman" + ], + "isbn": "9780262510875", + "price": 38.9, + "copies": 2 + }, + { + "title": "The C Programming Language", + "authors": [ + "Kernighan", + "Richie" + ], + "isbn": "9780131103627", + "price": 33.59, + "copies": 3 + }, + { + "title": "The AWK Programming Language", + "authors": [ + "Aho", + "Kernighan", + "Weinberger" + ], + "isbn": "9780201079814", + "copies": 1 + }, + { + "title": "Compilers: Principles, Techniques, and Tools", + "authors": [ + "Aho", + "Lam", + "Sethi", + "Ullman" + ], + "isbn": "9780201100884", + "price": 23.38, + "copies": 1 + } + ], + "loans": [ + { + "customer": "10001", + "isbn": "9780262510875", + "return": "2016-12-05" + }, + { + "customer": "10003", + "isbn": "9780201100884", + "return": "2016-10-22" + } + ], + "customers": [ + { + "id": "10001", + "name": "Joe Doe", + "address": { + "street": "2 Long Road", + "city": "Winchester", + "postcode": "SO22 5PU" + } + }, + { + "id": "10002", + "name": "Fred Bloggs", + "address": { + "street": "56 Letsby Avenue", + "city": "Winchester", + "postcode": "SO22 4WD" + } + }, + { + "id": "10003", + "name": "Jason Arthur", + "address": { + "street": "1 Preddy Gate", + "city": "Southampton", + "postcode": "SO14 0MG" + } + } + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset7.json b/__tests__/test-suite/datasets/dataset7.json new file mode 100644 index 00000000..4c5d9555 --- /dev/null +++ b/__tests__/test-suite/datasets/dataset7.json @@ -0,0 +1,9 @@ +[ + { + "content": { + "integration": { + "name": "fakeIntegrationName" + } + } + } +] \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset8.json b/__tests__/test-suite/datasets/dataset8.json new file mode 100644 index 00000000..35891253 --- /dev/null +++ b/__tests__/test-suite/datasets/dataset8.json @@ -0,0 +1,68 @@ +{ + "nest0": [ + { + "nest1": [ + { + "nest2": [ + { + "nest3": [ + 1 + ] + }, + { + "nest3": [ + 2 + ] + } + ] + }, + { + "nest2": [ + { + "nest3": [ + 3 + ] + }, + { + "nest3": [ + 4 + ] + } + ] + } + ] + }, + { + "nest1": [ + { + "nest2": [ + { + "nest3": [ + 5 + ] + }, + { + "nest3": [ + 6 + ] + } + ] + }, + { + "nest2": [ + { + "nest3": [ + 7 + ] + }, + { + "nest3": [ + 8 + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/datasets/dataset9.json b/__tests__/test-suite/datasets/dataset9.json new file mode 100644 index 00000000..3f904f2e --- /dev/null +++ b/__tests__/test-suite/datasets/dataset9.json @@ -0,0 +1,6 @@ +{ + "temp": 22.7, + "wind": 7, + "gust": null, + "timestamp": 1508971317377 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case000.json b/__tests__/test-suite/groups/array-constructor/case000.json new file mode 100644 index 00000000..99ef395b --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "[]", + "dataset": "dataset5", + "bindings": {}, + "result": [] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case001.json b/__tests__/test-suite/groups/array-constructor/case001.json new file mode 100644 index 00000000..48ea84d8 --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case001.json @@ -0,0 +1,8 @@ +{ + "expr": "[1]", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 1 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case002.json b/__tests__/test-suite/groups/array-constructor/case002.json new file mode 100644 index 00000000..99d2e0d4 --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case002.json @@ -0,0 +1,9 @@ +{ + "expr": "[1, 2]", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 1, + 2 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case003.json b/__tests__/test-suite/groups/array-constructor/case003.json new file mode 100644 index 00000000..3fa18a1f --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case003.json @@ -0,0 +1,10 @@ +{ + "expr": "[1, 2,3]", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 1, + 2, + 3 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case004.json b/__tests__/test-suite/groups/array-constructor/case004.json new file mode 100644 index 00000000..75dd2755 --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case004.json @@ -0,0 +1,13 @@ +{ + "expr": "[1, 2, [3, 4]]", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 1, + 2, + [ + 3, + 4 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case005.json b/__tests__/test-suite/groups/array-constructor/case005.json new file mode 100644 index 00000000..769703df --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case005.json @@ -0,0 +1,13 @@ +{ + "expr": "[1, \"two\", [\"three\", 4]]", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 1, + "two", + [ + "three", + 4 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case006.json b/__tests__/test-suite/groups/array-constructor/case006.json new file mode 100644 index 00000000..b50548b1 --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case006.json @@ -0,0 +1,16 @@ +{ + "expr": "[1, $two, [\"three\", $four]]", + "dataset": "dataset5", + "bindings": { + "two": 2, + "four": "four" + }, + "result": [ + 1, + 2, + [ + "three", + "four" + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case007.json b/__tests__/test-suite/groups/array-constructor/case007.json new file mode 100644 index 00000000..40c8efd3 --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case007.json @@ -0,0 +1,18 @@ +{ + "expr": "[\"foo.bar\", foo.bar, [\"foo.baz\", foo.blah.baz]]", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "foo.bar", + 42, + [ + "foo.baz", + { + "fud": "hello" + }, + { + "fud": "world" + } + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case008.json b/__tests__/test-suite/groups/array-constructor/case008.json new file mode 100644 index 00000000..09e842d9 --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "[1, 2, 3][0]", + "dataset": "dataset5", + "bindings": {}, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case009.json b/__tests__/test-suite/groups/array-constructor/case009.json new file mode 100644 index 00000000..1ddea286 --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case009.json @@ -0,0 +1,9 @@ +{ + "expr": "[1, 2, [3, 4]][-1]", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 3, + 4 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case010.json b/__tests__/test-suite/groups/array-constructor/case010.json new file mode 100644 index 00000000..a8241a3d --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "[1, 2, [3, 4]][-1][-1]", + "dataset": "dataset5", + "bindings": {}, + "result": 4 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case011.json b/__tests__/test-suite/groups/array-constructor/case011.json new file mode 100644 index 00000000..5e1aa487 --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case011.json @@ -0,0 +1,15 @@ +{ + "expr": "foo.blah.baz.[fud, fud]", + "dataset": "dataset0", + "bindings": {}, + "result": [ + [ + "hello", + "hello" + ], + [ + "world", + "world" + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case012.json b/__tests__/test-suite/groups/array-constructor/case012.json new file mode 100644 index 00000000..96d80da0 --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case012.json @@ -0,0 +1,19 @@ +{ + "expr": "foo.blah.baz.[[fud, fud]]", + "dataset": "dataset0", + "bindings": {}, + "result": [ + [ + [ + "hello", + "hello" + ] + ], + [ + [ + "world", + "world" + ] + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case013.json b/__tests__/test-suite/groups/array-constructor/case013.json new file mode 100644 index 00000000..8eb1f61f --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.blah.[baz].fud", + "dataset": "dataset10", + "bindings": {}, + "result": "hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case014.json b/__tests__/test-suite/groups/array-constructor/case014.json new file mode 100644 index 00000000..3a583617 --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case014.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.blah.[baz, buz].fud", + "dataset": "dataset10", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case015.json b/__tests__/test-suite/groups/array-constructor/case015.json new file mode 100644 index 00000000..0066062f --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case015.json @@ -0,0 +1,9 @@ +{ + "expr": "[Address, Other.\"Alternative.Address\"].City", + "dataset": "dataset1", + "bindings": {}, + "result": [ + "Winchester", + "London" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case016.json b/__tests__/test-suite/groups/array-constructor/case016.json new file mode 100644 index 00000000..3ddbd390 --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case016.json @@ -0,0 +1,9 @@ +{ + "expr": "[Address, Other.`Alternative.Address`].City", + "dataset": "dataset1", + "bindings": {}, + "result": [ + "Winchester", + "London" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case017.json b/__tests__/test-suite/groups/array-constructor/case017.json new file mode 100644 index 00000000..f7dbcdc8 --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case017.json @@ -0,0 +1,12 @@ +{ + "expr": "[0,1,2,3,4,5,6,7,8,9][$ % 2 = 0]", + "data": null, + "bindings": {}, + "result": [ + 0, + 2, + 4, + 6, + 8 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case018.json b/__tests__/test-suite/groups/array-constructor/case018.json new file mode 100644 index 00000000..39afc146 --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case018.json @@ -0,0 +1,10 @@ +{ + "expr": "[1, 2, 3].$", + "dataset": null, + "bindings": {}, + "result": [ + 1, + 2, + 3 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case019.json b/__tests__/test-suite/groups/array-constructor/case019.json new file mode 100644 index 00000000..e34dfbf4 --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case019.json @@ -0,0 +1,10 @@ +{ + "expr": "[1, 2, 3].$", + "data": [], + "bindings": {}, + "result": [ + 1, + 2, + 3 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/array-constructor/case020.json b/__tests__/test-suite/groups/array-constructor/case020.json new file mode 100644 index 00000000..7bbd6c7e --- /dev/null +++ b/__tests__/test-suite/groups/array-constructor/case020.json @@ -0,0 +1,14 @@ +{ + "expr": "[1, 2, 3].$", + "data": [ + 4, + 5, + 6 + ], + "bindings": {}, + "result": [ + 1, + 2, + 3 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/blocks/case000.json b/__tests__/test-suite/groups/blocks/case000.json new file mode 100644 index 00000000..5df04548 --- /dev/null +++ b/__tests__/test-suite/groups/blocks/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "()", + "data": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/blocks/case001.json b/__tests__/test-suite/groups/blocks/case001.json new file mode 100644 index 00000000..9eb5c521 --- /dev/null +++ b/__tests__/test-suite/groups/blocks/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "(1; 2; 3)", + "data": null, + "bindings": {}, + "result": 3 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/blocks/case002.json b/__tests__/test-suite/groups/blocks/case002.json new file mode 100644 index 00000000..f62f0b7f --- /dev/null +++ b/__tests__/test-suite/groups/blocks/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "(1; 2; 3;)", + "data": null, + "bindings": {}, + "result": 3 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/blocks/case003.json b/__tests__/test-suite/groups/blocks/case003.json new file mode 100644 index 00000000..d526f9f0 --- /dev/null +++ b/__tests__/test-suite/groups/blocks/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "($a:=1; $b:=2; $c:=($a:=4; $a+$b); $a+$c)", + "data": null, + "bindings": {}, + "result": 7 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/blocks/case004.json b/__tests__/test-suite/groups/blocks/case004.json new file mode 100644 index 00000000..a0d609c2 --- /dev/null +++ b/__tests__/test-suite/groups/blocks/case004.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product.($var1 := Price ; $var2:=Quantity; $var1 * $var2)", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 68.9, + 21.67, + 137.8, + 107.99 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/blocks/case005.json b/__tests__/test-suite/groups/blocks/case005.json new file mode 100644 index 00000000..13606e62 --- /dev/null +++ b/__tests__/test-suite/groups/blocks/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "( $func := function($arg) {$arg.Account.Order[0].OrderID}; $func($))", + "dataset": "dataset5", + "bindings": {}, + "result": "order103" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/blocks/case006.json b/__tests__/test-suite/groups/blocks/case006.json new file mode 100644 index 00000000..965a244f --- /dev/null +++ b/__tests__/test-suite/groups/blocks/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "( $func := function($arg) {$arg.Account.Order[0]}; $func($).OrderID)", + "dataset": "dataset5", + "bindings": {}, + "result": "order103" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case000.json b/__tests__/test-suite/groups/boolean-expresssions/case000.json new file mode 100644 index 00000000..0a6bd70d --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "true", + "dataset": "dataset0", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case001.json b/__tests__/test-suite/groups/boolean-expresssions/case001.json new file mode 100644 index 00000000..da9d4a3b --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "false", + "dataset": "dataset0", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case002.json b/__tests__/test-suite/groups/boolean-expresssions/case002.json new file mode 100644 index 00000000..b6733de0 --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "false or false", + "dataset": "dataset0", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case003.json b/__tests__/test-suite/groups/boolean-expresssions/case003.json new file mode 100644 index 00000000..fc182c69 --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "false or true", + "dataset": "dataset0", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case004.json b/__tests__/test-suite/groups/boolean-expresssions/case004.json new file mode 100644 index 00000000..6f9132a7 --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "true or false", + "dataset": "dataset0", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case005.json b/__tests__/test-suite/groups/boolean-expresssions/case005.json new file mode 100644 index 00000000..421e501f --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "true or true", + "dataset": "dataset0", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case006.json b/__tests__/test-suite/groups/boolean-expresssions/case006.json new file mode 100644 index 00000000..63ac5b71 --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "false and false", + "dataset": "dataset0", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case007.json b/__tests__/test-suite/groups/boolean-expresssions/case007.json new file mode 100644 index 00000000..a39f56f6 --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "false and true", + "dataset": "dataset0", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case008.json b/__tests__/test-suite/groups/boolean-expresssions/case008.json new file mode 100644 index 00000000..b024fdde --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "true and false", + "dataset": "dataset0", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case009.json b/__tests__/test-suite/groups/boolean-expresssions/case009.json new file mode 100644 index 00000000..fc02ebae --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "true and true", + "dataset": "dataset0", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case010.json b/__tests__/test-suite/groups/boolean-expresssions/case010.json new file mode 100644 index 00000000..223246b9 --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "$not(false)", + "dataset": "dataset0", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case011.json b/__tests__/test-suite/groups/boolean-expresssions/case011.json new file mode 100644 index 00000000..7b9c611c --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$not(true)", + "dataset": "dataset0", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case012.json b/__tests__/test-suite/groups/boolean-expresssions/case012.json new file mode 100644 index 00000000..c48fdb44 --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case012.json @@ -0,0 +1,9 @@ +{ + "expr": "and=1 and or=2", + "data": { + "and": 1, + "or": 2 + }, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case013.json b/__tests__/test-suite/groups/boolean-expresssions/case013.json new file mode 100644 index 00000000..e668d273 --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case013.json @@ -0,0 +1,9 @@ +{ + "expr": "and>1 or or<=2", + "data": { + "and": 1, + "or": 2 + }, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case014.json b/__tests__/test-suite/groups/boolean-expresssions/case014.json new file mode 100644 index 00000000..b71e2f01 --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case014.json @@ -0,0 +1,9 @@ +{ + "expr": "and>1 or or!=2", + "data": { + "and": 1, + "or": 2 + }, + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case015.json b/__tests__/test-suite/groups/boolean-expresssions/case015.json new file mode 100644 index 00000000..8188b72f --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case015.json @@ -0,0 +1,9 @@ +{ + "expr": "and and and", + "data": { + "and": 1, + "or": 2 + }, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/boolean-expresssions/case016.json b/__tests__/test-suite/groups/boolean-expresssions/case016.json new file mode 100644 index 00000000..2aab8bfb --- /dev/null +++ b/__tests__/test-suite/groups/boolean-expresssions/case016.json @@ -0,0 +1,8 @@ +{ + "expr": "$[].content.origin.$lowercase(name)", + "dataset": "dataset11", + "bindings": {}, + "result": [ + "fakeintegrationname" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/closures/case000.json b/__tests__/test-suite/groups/closures/case000.json new file mode 100644 index 00000000..105d8829 --- /dev/null +++ b/__tests__/test-suite/groups/closures/case000.json @@ -0,0 +1,10 @@ +{ + "expr": "Account.( $AccName := function() { $.\"Account Name\" }; Order[OrderID = \"order104\"].Product{ \"Account\": $AccName(), \"SKU-\" & $string(ProductID): $.\"Product Name\" } )", + "dataset": "dataset5", + "bindings": {}, + "result": { + "Account": "Firefly", + "SKU-858383": "Bowler Hat", + "SKU-345664": "Cloak" + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/closures/case001.json b/__tests__/test-suite/groups/closures/case001.json new file mode 100644 index 00000000..5cb1c225 --- /dev/null +++ b/__tests__/test-suite/groups/closures/case001.json @@ -0,0 +1,10 @@ +{ + "expr": "Account.( $AccName := function() { `Account Name` }; Order[OrderID = \"order104\"].Product{ \"Account\": $AccName(), \"SKU-\" & $string(ProductID): `Product Name` } )", + "dataset": "dataset5", + "bindings": {}, + "result": { + "Account": "Firefly", + "SKU-858383": "Bowler Hat", + "SKU-345664": "Cloak" + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case000.json b/__tests__/test-suite/groups/comparison-operators/case000.json new file mode 100644 index 00000000..3df6398d --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "3>-3", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case001.json b/__tests__/test-suite/groups/comparison-operators/case001.json new file mode 100644 index 00000000..acb4e627 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "3>3", + "dataset": null, + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case002.json b/__tests__/test-suite/groups/comparison-operators/case002.json new file mode 100644 index 00000000..4e4607a7 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "3=3", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case003.json b/__tests__/test-suite/groups/comparison-operators/case003.json new file mode 100644 index 00000000..7fe0c0e6 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "\"3\"=\"3\"", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case004.json b/__tests__/test-suite/groups/comparison-operators/case004.json new file mode 100644 index 00000000..046a44e9 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "\"3\"=3", + "dataset": null, + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case005.json b/__tests__/test-suite/groups/comparison-operators/case005.json new file mode 100644 index 00000000..c749368a --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "\"hello\" = \"hello\"", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case006.json b/__tests__/test-suite/groups/comparison-operators/case006.json new file mode 100644 index 00000000..c4833a90 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "\"hello\" != \"world\"", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case007.json b/__tests__/test-suite/groups/comparison-operators/case007.json new file mode 100644 index 00000000..f676b386 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "\"hello\" < \"world\"", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case008.json b/__tests__/test-suite/groups/comparison-operators/case008.json new file mode 100644 index 00000000..d4013b25 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "\"32\" < 42", + "dataset": null, + "bindings": {}, + "code": "T2009" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case009.json b/__tests__/test-suite/groups/comparison-operators/case009.json new file mode 100644 index 00000000..2b795f31 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "null <= \"world\"", + "dataset": null, + "bindings": {}, + "code": "T2010" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case010.json b/__tests__/test-suite/groups/comparison-operators/case010.json new file mode 100644 index 00000000..a5d247a9 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "3 >= true", + "dataset": null, + "bindings": {}, + "code": "T2010" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case011.json b/__tests__/test-suite/groups/comparison-operators/case011.json new file mode 100644 index 00000000..a6713d19 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.bar > bar", + "dataset": "dataset0", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case012.json b/__tests__/test-suite/groups/comparison-operators/case012.json new file mode 100644 index 00000000..d26994fa --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.bar >= bar", + "dataset": "dataset0", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case013.json b/__tests__/test-suite/groups/comparison-operators/case013.json new file mode 100644 index 00000000..202c44f2 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.barfoo.bar", + "dataset": "dataset0", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case016.json b/__tests__/test-suite/groups/comparison-operators/case016.json new file mode 100644 index 00000000..dbdb9102 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case016.json @@ -0,0 +1,6 @@ +{ + "expr": "bar < foo.bar", + "dataset": "dataset0", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case017.json b/__tests__/test-suite/groups/comparison-operators/case017.json new file mode 100644 index 00000000..d5bd5184 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.bar = bar", + "dataset": "dataset0", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case018.json b/__tests__/test-suite/groups/comparison-operators/case018.json new file mode 100644 index 00000000..59d39f37 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case018.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.bar!= bar", + "dataset": "dataset0", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case019.json b/__tests__/test-suite/groups/comparison-operators/case019.json new file mode 100644 index 00000000..4b4293c5 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case019.json @@ -0,0 +1,6 @@ +{ + "expr": "bar = foo.bar + 56", + "dataset": "dataset0", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case020.json b/__tests__/test-suite/groups/comparison-operators/case020.json new file mode 100644 index 00000000..f793fb09 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case020.json @@ -0,0 +1,6 @@ +{ + "expr": "bar !=foo.bar + 56", + "dataset": "dataset0", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case021.json b/__tests__/test-suite/groups/comparison-operators/case021.json new file mode 100644 index 00000000..204eee59 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case021.json @@ -0,0 +1,8 @@ +{ + "expr": "foo.blah.baz[fud = \"hello\"]", + "dataset": "dataset0", + "bindings": {}, + "result": { + "fud": "hello" + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case022.json b/__tests__/test-suite/groups/comparison-operators/case022.json new file mode 100644 index 00000000..9c3bf138 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case022.json @@ -0,0 +1,8 @@ +{ + "expr": "foo.blah.baz[fud != \"world\"]", + "dataset": "dataset0", + "bindings": {}, + "result": { + "fud": "hello" + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case023.json b/__tests__/test-suite/groups/comparison-operators/case023.json new file mode 100644 index 00000000..b83f0a32 --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case023.json @@ -0,0 +1,10 @@ +{ + "expr": "Account.Order.Product[Price > 30].Price", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 34.45, + 34.45, + 107.99 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/comparison-operators/case024.json b/__tests__/test-suite/groups/comparison-operators/case024.json new file mode 100644 index 00000000..43d8a23b --- /dev/null +++ b/__tests__/test-suite/groups/comparison-operators/case024.json @@ -0,0 +1,10 @@ +{ + "expr": "Account.Order.Product.Price[$<=35]", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 34.45, + 21.67, + 34.45 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/conditionals/case000.json b/__tests__/test-suite/groups/conditionals/case000.json new file mode 100644 index 00000000..1e94cde7 --- /dev/null +++ b/__tests__/test-suite/groups/conditionals/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "[\"Red\"[$$=\"Bus\"], \"White\"[$$=\"Police Car\"]][0]", + "data": "Bus", + "bindings": {}, + "result": "Red" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/conditionals/case001.json b/__tests__/test-suite/groups/conditionals/case001.json new file mode 100644 index 00000000..bd643e90 --- /dev/null +++ b/__tests__/test-suite/groups/conditionals/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "[\"Red\"[$$=\"Bus\"], \"White\"[$$=\"Police Car\"]][0]", + "data": "Police Car", + "bindings": {}, + "result": "White" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/conditionals/case002.json b/__tests__/test-suite/groups/conditionals/case002.json new file mode 100644 index 00000000..d263776e --- /dev/null +++ b/__tests__/test-suite/groups/conditionals/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "[\"Red\"[$$=\"Bus\"], \"White\"[$$=\"Police Car\"]][0]", + "data": "Tuk tuk", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/conditionals/case003.json b/__tests__/test-suite/groups/conditionals/case003.json new file mode 100644 index 00000000..4e88489f --- /dev/null +++ b/__tests__/test-suite/groups/conditionals/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$lookup({\"Bus\": \"Red\", \"Police Car\": \"White\"}, $$)", + "data": "Bus", + "bindings": {}, + "result": "Red" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/conditionals/case004.json b/__tests__/test-suite/groups/conditionals/case004.json new file mode 100644 index 00000000..c40de4dd --- /dev/null +++ b/__tests__/test-suite/groups/conditionals/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$lookup({\"Bus\": \"Red\", \"Police Car\": \"White\"}, $$)", + "data": "Police Car", + "bindings": {}, + "result": "White" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/conditionals/case005.json b/__tests__/test-suite/groups/conditionals/case005.json new file mode 100644 index 00000000..8fb3c288 --- /dev/null +++ b/__tests__/test-suite/groups/conditionals/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$lookup({\"Bus\": \"Red\", \"Police Car\": \"White\"}, $$)", + "data": "Tuk tuk", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/conditionals/case006.json b/__tests__/test-suite/groups/conditionals/case006.json new file mode 100644 index 00000000..f7278804 --- /dev/null +++ b/__tests__/test-suite/groups/conditionals/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order.Product.(Price < 30 ? \"Cheap\")", + "dataset": "dataset5", + "bindings": {}, + "result": "Cheap" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/conditionals/case007.json b/__tests__/test-suite/groups/conditionals/case007.json new file mode 100644 index 00000000..287f4088 --- /dev/null +++ b/__tests__/test-suite/groups/conditionals/case007.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product.(Price < 30 ? \"Cheap\" : \"Expensive\")", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "Expensive", + "Cheap", + "Expensive", + "Expensive" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/conditionals/case008.json b/__tests__/test-suite/groups/conditionals/case008.json new file mode 100644 index 00000000..32a3be90 --- /dev/null +++ b/__tests__/test-suite/groups/conditionals/case008.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product.(Price < 30 ? \"Cheap\" : Price < 100 ? \"Expensive\" : \"Rip off\")", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "Expensive", + "Cheap", + "Expensive", + "Rip off" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/context/case000.json b/__tests__/test-suite/groups/context/case000.json new file mode 100644 index 00000000..269fa629 --- /dev/null +++ b/__tests__/test-suite/groups/context/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$number()", + "data": "5", + "bindings": {}, + "result": 5 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/context/case001.json b/__tests__/test-suite/groups/context/case001.json new file mode 100644 index 00000000..48034b3b --- /dev/null +++ b/__tests__/test-suite/groups/context/case001.json @@ -0,0 +1,12 @@ +{ + "expr": "[1..5].$string()", + "dataset": null, + "bindings": {}, + "result": [ + "1", + "2", + "3", + "4", + "5" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/context/case002.json b/__tests__/test-suite/groups/context/case002.json new file mode 100644 index 00000000..e555ae6a --- /dev/null +++ b/__tests__/test-suite/groups/context/case002.json @@ -0,0 +1,12 @@ +{ + "expr": "[1..5].(\"Item \" & $string())", + "dataset": null, + "bindings": {}, + "result": [ + "Item 1", + "Item 2", + "Item 3", + "Item 4", + "Item 5" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/context/case003.json b/__tests__/test-suite/groups/context/case003.json new file mode 100644 index 00000000..5a15fd7f --- /dev/null +++ b/__tests__/test-suite/groups/context/case003.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product.\"Product Name\".$uppercase().$substringBefore(\" \")", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "BOWLER", + "TRILBY", + "BOWLER", + "CLOAK" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case000.json b/__tests__/test-suite/groups/descendent-operator/case000.json new file mode 100644 index 00000000..7f7497bc --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case000.json @@ -0,0 +1,20 @@ +{ + "expr": "foo.**.blah", + "dataset": "dataset0", + "bindings": {}, + "result": [ + { + "baz": { + "fud": "hello" + } + }, + { + "baz": { + "fud": "world" + } + }, + { + "bazz": "gotcha" + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case001.json b/__tests__/test-suite/groups/descendent-operator/case001.json new file mode 100644 index 00000000..096c880b --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case001.json @@ -0,0 +1,13 @@ +{ + "expr": "foo.**.baz", + "dataset": "dataset0", + "bindings": {}, + "result": [ + { + "fud": "hello" + }, + { + "fud": "world" + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case002.json b/__tests__/test-suite/groups/descendent-operator/case002.json new file mode 100644 index 00000000..a1f78079 --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case002.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.**.fud", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case003.json b/__tests__/test-suite/groups/descendent-operator/case003.json new file mode 100644 index 00000000..b12d7fa6 --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case003.json @@ -0,0 +1,9 @@ +{ + "expr": "\"foo\".**.fud", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case004.json b/__tests__/test-suite/groups/descendent-operator/case004.json new file mode 100644 index 00000000..69b56532 --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case004.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.**.\"fud\"", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case005.json b/__tests__/test-suite/groups/descendent-operator/case005.json new file mode 100644 index 00000000..f686c6bd --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case005.json @@ -0,0 +1,9 @@ +{ + "expr": "\"foo\".**.\"fud\"", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case006.json b/__tests__/test-suite/groups/descendent-operator/case006.json new file mode 100644 index 00000000..e22f0bdd --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case006.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.*.**.fud", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case007.json b/__tests__/test-suite/groups/descendent-operator/case007.json new file mode 100644 index 00000000..606706f0 --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case007.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.**.*.fud", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case008.json b/__tests__/test-suite/groups/descendent-operator/case008.json new file mode 100644 index 00000000..4d93f1bc --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case008.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.**.Colour", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "Purple", + "Orange", + "Purple", + "Black" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case009.json b/__tests__/test-suite/groups/descendent-operator/case009.json new file mode 100644 index 00000000..2f2e551b --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case009.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.**.fud[0]", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case010.json b/__tests__/test-suite/groups/descendent-operator/case010.json new file mode 100644 index 00000000..e892a141 --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "(foo.**.fud)[0]", + "dataset": "dataset0", + "bindings": {}, + "result": "hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case011.json b/__tests__/test-suite/groups/descendent-operator/case011.json new file mode 100644 index 00000000..4cc02167 --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "(**.fud)[0]", + "dataset": "dataset0", + "bindings": {}, + "result": "hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case012.json b/__tests__/test-suite/groups/descendent-operator/case012.json new file mode 100644 index 00000000..e548946f --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case012.json @@ -0,0 +1,11 @@ +{ + "expr": "**.Price", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 34.45, + 21.67, + 34.45, + 107.99 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case013.json b/__tests__/test-suite/groups/descendent-operator/case013.json new file mode 100644 index 00000000..7d6ba049 --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case013.json @@ -0,0 +1,11 @@ +{ + "expr": "**.Price[0]", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 34.45, + 21.67, + 34.45, + 107.99 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case014.json b/__tests__/test-suite/groups/descendent-operator/case014.json new file mode 100644 index 00000000..e29d5521 --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "(**.Price)[0]", + "dataset": "dataset5", + "bindings": {}, + "result": 34.45 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case015.json b/__tests__/test-suite/groups/descendent-operator/case015.json new file mode 100644 index 00000000..9ba73fd5 --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "**[2]", + "dataset": "dataset5", + "bindings": {}, + "result": "Firefly" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case016.json b/__tests__/test-suite/groups/descendent-operator/case016.json new file mode 100644 index 00000000..8198a9fa --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case016.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order.blah.**", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/descendent-operator/case017.json b/__tests__/test-suite/groups/descendent-operator/case017.json new file mode 100644 index 00000000..9f862356 --- /dev/null +++ b/__tests__/test-suite/groups/descendent-operator/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "**", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/encoding/case000.json b/__tests__/test-suite/groups/encoding/case000.json new file mode 100644 index 00000000..97048b15 --- /dev/null +++ b/__tests__/test-suite/groups/encoding/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$base64encode(\"hello:world\")", + "dataset": null, + "bindings": {}, + "result": "aGVsbG86d29ybGQ=" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/encoding/case001.json b/__tests__/test-suite/groups/encoding/case001.json new file mode 100644 index 00000000..4cdefa61 --- /dev/null +++ b/__tests__/test-suite/groups/encoding/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$base64encode()", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/encoding/case002.json b/__tests__/test-suite/groups/encoding/case002.json new file mode 100644 index 00000000..d50d59a1 --- /dev/null +++ b/__tests__/test-suite/groups/encoding/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$base64decode(\"aGVsbG86d29ybGQ=\")", + "dataset": null, + "bindings": {}, + "result": "hello:world" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/encoding/case003.json b/__tests__/test-suite/groups/encoding/case003.json new file mode 100644 index 00000000..4d41ba57 --- /dev/null +++ b/__tests__/test-suite/groups/encoding/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$base64decode()", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case000.json b/__tests__/test-suite/groups/errors/case000.json new file mode 100644 index 00000000..2d3a45a2 --- /dev/null +++ b/__tests__/test-suite/groups/errors/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "\"s\" - 1", + "dataset": "dataset5", + "bindings": {}, + "code": "T2001" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case001.json b/__tests__/test-suite/groups/errors/case001.json new file mode 100644 index 00000000..7c86c92d --- /dev/null +++ b/__tests__/test-suite/groups/errors/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "1 + null", + "dataset": "dataset5", + "bindings": {}, + "code": "T2002" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case002.json b/__tests__/test-suite/groups/errors/case002.json new file mode 100644 index 00000000..5204467a --- /dev/null +++ b/__tests__/test-suite/groups/errors/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "\"no closing quote", + "dataset": "dataset5", + "bindings": {}, + "code": "S0101" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case003.json b/__tests__/test-suite/groups/errors/case003.json new file mode 100644 index 00000000..a3686193 --- /dev/null +++ b/__tests__/test-suite/groups/errors/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "`no closing backtick", + "dataset": "dataset5", + "bindings": {}, + "code": "S0105" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case004.json b/__tests__/test-suite/groups/errors/case004.json new file mode 100644 index 00000000..82b7bde3 --- /dev/null +++ b/__tests__/test-suite/groups/errors/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "- \"s\"", + "dataset": "dataset5", + "bindings": {}, + "code": "D1002" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case005.json b/__tests__/test-suite/groups/errors/case005.json new file mode 100644 index 00000000..c2b542ac --- /dev/null +++ b/__tests__/test-suite/groups/errors/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "unknown(function)", + "dataset": "dataset5", + "bindings": {}, + "code": "T1006" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case006.json b/__tests__/test-suite/groups/errors/case006.json new file mode 100644 index 00000000..e050281d --- /dev/null +++ b/__tests__/test-suite/groups/errors/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "sum(Account.Order.OrderID)", + "dataset": "dataset5", + "bindings": {}, + "code": "T1005" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case007.json b/__tests__/test-suite/groups/errors/case007.json new file mode 100644 index 00000000..6da5e7e8 --- /dev/null +++ b/__tests__/test-suite/groups/errors/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "[1,2)", + "data": {}, + "bindings": {}, + "code": "S0202" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case008.json b/__tests__/test-suite/groups/errors/case008.json new file mode 100644 index 00000000..b4a368f7 --- /dev/null +++ b/__tests__/test-suite/groups/errors/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "[1:2]", + "data": {}, + "bindings": {}, + "code": "S0202" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case009.json b/__tests__/test-suite/groups/errors/case009.json new file mode 100644 index 00000000..e284c4ee --- /dev/null +++ b/__tests__/test-suite/groups/errors/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"foo\", \"o, \"rr\")", + "data": {}, + "bindings": {}, + "code": "S0202" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case010.json b/__tests__/test-suite/groups/errors/case010.json new file mode 100644 index 00000000..463b3e5f --- /dev/null +++ b/__tests__/test-suite/groups/errors/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "[1!2]", + "data": {}, + "bindings": {}, + "code": "S0204" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case011.json b/__tests__/test-suite/groups/errors/case011.json new file mode 100644 index 00000000..f72a2921 --- /dev/null +++ b/__tests__/test-suite/groups/errors/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "@ bar", + "data": {}, + "bindings": {}, + "code": "S0204" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case012.json b/__tests__/test-suite/groups/errors/case012.json new file mode 100644 index 00000000..59afe122 --- /dev/null +++ b/__tests__/test-suite/groups/errors/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "2(blah)", + "dataset": null, + "bindings": {}, + "code": "T1006" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case013.json b/__tests__/test-suite/groups/errors/case013.json new file mode 100644 index 00000000..6fbf5db7 --- /dev/null +++ b/__tests__/test-suite/groups/errors/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "2()", + "dataset": null, + "bindings": {}, + "code": "T1006" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case014.json b/__tests__/test-suite/groups/errors/case014.json new file mode 100644 index 00000000..69c3acfa --- /dev/null +++ b/__tests__/test-suite/groups/errors/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "3(?)", + "dataset": null, + "bindings": {}, + "code": "T1008" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case015.json b/__tests__/test-suite/groups/errors/case015.json new file mode 100644 index 00000000..f9b525b9 --- /dev/null +++ b/__tests__/test-suite/groups/errors/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "1=", + "data": {}, + "bindings": {}, + "code": "S0207" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case016.json b/__tests__/test-suite/groups/errors/case016.json new file mode 100644 index 00000000..a5dcaac0 --- /dev/null +++ b/__tests__/test-suite/groups/errors/case016.json @@ -0,0 +1,6 @@ +{ + "expr": "function(x){$x}(3)", + "data": {}, + "bindings": {}, + "code": "S0208" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case017.json b/__tests__/test-suite/groups/errors/case017.json new file mode 100644 index 00000000..ffbe4d03 --- /dev/null +++ b/__tests__/test-suite/groups/errors/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "x:=1", + "dataset": null, + "bindings": {}, + "code": "D2005" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case018.json b/__tests__/test-suite/groups/errors/case018.json new file mode 100644 index 00000000..247ae999 --- /dev/null +++ b/__tests__/test-suite/groups/errors/case018.json @@ -0,0 +1,6 @@ +{ + "expr": "2:=1", + "dataset": null, + "bindings": {}, + "code": "D2005" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case019.json b/__tests__/test-suite/groups/errors/case019.json new file mode 100644 index 00000000..43dd4c08 --- /dev/null +++ b/__tests__/test-suite/groups/errors/case019.json @@ -0,0 +1,6 @@ +{ + "expr": "$foo()", + "dataset": null, + "bindings": {}, + "code": "T1006" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case020.json b/__tests__/test-suite/groups/errors/case020.json new file mode 100644 index 00000000..f793ad9d --- /dev/null +++ b/__tests__/test-suite/groups/errors/case020.json @@ -0,0 +1,6 @@ +{ + "expr": "55=>5", + "dataset": null, + "bindings": {}, + "code": "S0211" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case021.json b/__tests__/test-suite/groups/errors/case021.json new file mode 100644 index 00000000..7bd14cf7 --- /dev/null +++ b/__tests__/test-suite/groups/errors/case021.json @@ -0,0 +1,6 @@ +{ + "expr": "Ssum(:)", + "dataset": null, + "bindings": {}, + "code": "S0211" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case022.json b/__tests__/test-suite/groups/errors/case022.json new file mode 100644 index 00000000..aa68e24c --- /dev/null +++ b/__tests__/test-suite/groups/errors/case022.json @@ -0,0 +1,6 @@ +{ + "expr": "[1,2,3]{\"num\": $}[true]", + "dataset": null, + "bindings": {}, + "code": "S0209" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case023.json b/__tests__/test-suite/groups/errors/case023.json new file mode 100644 index 00000000..d4c9bacd --- /dev/null +++ b/__tests__/test-suite/groups/errors/case023.json @@ -0,0 +1,6 @@ +{ + "expr": "[1,2,3]{\"num\": $}{\"num\": $}", + "dataset": null, + "bindings": {}, + "code": "S0210" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/errors/case024.json b/__tests__/test-suite/groups/errors/case024.json new file mode 100644 index 00000000..da477475 --- /dev/null +++ b/__tests__/test-suite/groups/errors/case024.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order[0].Product;", + "dataset": null, + "bindings": {}, + "code": "S0201" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/fields/case000.json b/__tests__/test-suite/groups/fields/case000.json new file mode 100644 index 00000000..b5a81dcc --- /dev/null +++ b/__tests__/test-suite/groups/fields/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.bar", + "dataset": "dataset0", + "bindings": {}, + "result": 42 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/fields/case001.json b/__tests__/test-suite/groups/fields/case001.json new file mode 100644 index 00000000..8f8dbec8 --- /dev/null +++ b/__tests__/test-suite/groups/fields/case001.json @@ -0,0 +1,20 @@ +{ + "expr": "foo.blah", + "dataset": "dataset0", + "bindings": {}, + "result": [ + { + "baz": { + "fud": "hello" + } + }, + { + "baz": { + "fud": "world" + } + }, + { + "bazz": "gotcha" + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/fields/case002.json b/__tests__/test-suite/groups/fields/case002.json new file mode 100644 index 00000000..c456bfac --- /dev/null +++ b/__tests__/test-suite/groups/fields/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.blah.bazz", + "dataset": "dataset0", + "bindings": {}, + "result": "gotcha" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/fields/case003.json b/__tests__/test-suite/groups/fields/case003.json new file mode 100644 index 00000000..414b5f19 --- /dev/null +++ b/__tests__/test-suite/groups/fields/case003.json @@ -0,0 +1,13 @@ +{ + "expr": "foo.blah.baz", + "dataset": "dataset0", + "bindings": {}, + "result": [ + { + "fud": "hello" + }, + { + "fud": "world" + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/fields/case004.json b/__tests__/test-suite/groups/fields/case004.json new file mode 100644 index 00000000..aced61f5 --- /dev/null +++ b/__tests__/test-suite/groups/fields/case004.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.blah.baz.fud", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/fields/case005.json b/__tests__/test-suite/groups/fields/case005.json new file mode 100644 index 00000000..1fbc91c1 --- /dev/null +++ b/__tests__/test-suite/groups/fields/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "Other.Misc", + "dataset": "dataset1", + "bindings": {}, + "result": null +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/fields/case006.json b/__tests__/test-suite/groups/fields/case006.json new file mode 100644 index 00000000..a793dd3c --- /dev/null +++ b/__tests__/test-suite/groups/fields/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "bazz", + "dataset": "dataset2", + "bindings": {}, + "result": "gotcha" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/fields/case007.json b/__tests__/test-suite/groups/fields/case007.json new file mode 100644 index 00000000..e2789348 --- /dev/null +++ b/__tests__/test-suite/groups/fields/case007.json @@ -0,0 +1,9 @@ +{ + "expr": "fud", + "dataset": "dataset3", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case000.json b/__tests__/test-suite/groups/flattening/case000.json new file mode 100644 index 00000000..dde9f488 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case000.json @@ -0,0 +1,15 @@ +{ + "expr": "Account.Order.[Product.Price]", + "dataset": "dataset5", + "bindings": {}, + "result": [ + [ + 34.45, + 21.67 + ], + [ + 34.45, + 107.99 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case001.json b/__tests__/test-suite/groups/flattening/case001.json new file mode 100644 index 00000000..673a995c --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case001.json @@ -0,0 +1,24 @@ +{ + "expr": "$.nest0", + "data": [ + { + "nest0": [ + 1, + 2 + ] + }, + { + "nest0": [ + 3, + 4 + ] + } + ], + "bindings": {}, + "result": [ + 1, + 2, + 3, + 4 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case002.json b/__tests__/test-suite/groups/flattening/case002.json new file mode 100644 index 00000000..515d8ed5 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case002.json @@ -0,0 +1,24 @@ +{ + "expr": "nest0", + "data": [ + { + "nest0": [ + 1, + 2 + ] + }, + { + "nest0": [ + 3, + 4 + ] + } + ], + "bindings": {}, + "result": [ + 1, + 2, + 3, + 4 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case003.json b/__tests__/test-suite/groups/flattening/case003.json new file mode 100644 index 00000000..5ce282b2 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case003.json @@ -0,0 +1,24 @@ +{ + "expr": "$[0]", + "data": [ + { + "nest0": [ + 1, + 2 + ] + }, + { + "nest0": [ + 3, + 4 + ] + } + ], + "bindings": {}, + "result": { + "nest0": [ + 1, + 2 + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case004.json b/__tests__/test-suite/groups/flattening/case004.json new file mode 100644 index 00000000..87bfaf01 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case004.json @@ -0,0 +1,24 @@ +{ + "expr": "$[1]", + "data": [ + { + "nest0": [ + 1, + 2 + ] + }, + { + "nest0": [ + 3, + 4 + ] + } + ], + "bindings": {}, + "result": { + "nest0": [ + 3, + 4 + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case005.json b/__tests__/test-suite/groups/flattening/case005.json new file mode 100644 index 00000000..c7c99722 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case005.json @@ -0,0 +1,24 @@ +{ + "expr": "$[-1]", + "data": [ + { + "nest0": [ + 1, + 2 + ] + }, + { + "nest0": [ + 3, + 4 + ] + } + ], + "bindings": {}, + "result": { + "nest0": [ + 3, + 4 + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case006.json b/__tests__/test-suite/groups/flattening/case006.json new file mode 100644 index 00000000..04152479 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case006.json @@ -0,0 +1,22 @@ +{ + "expr": "$[0].nest0", + "data": [ + { + "nest0": [ + 1, + 2 + ] + }, + { + "nest0": [ + 3, + 4 + ] + } + ], + "bindings": {}, + "result": [ + 1, + 2 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case007.json b/__tests__/test-suite/groups/flattening/case007.json new file mode 100644 index 00000000..5d3c541d --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case007.json @@ -0,0 +1,22 @@ +{ + "expr": "$[1].nest0", + "data": [ + { + "nest0": [ + 1, + 2 + ] + }, + { + "nest0": [ + 3, + 4 + ] + } + ], + "bindings": {}, + "result": [ + 3, + 4 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case008.json b/__tests__/test-suite/groups/flattening/case008.json new file mode 100644 index 00000000..c29941da --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case008.json @@ -0,0 +1,19 @@ +{ + "expr": "$[0].nest0[0]", + "data": [ + { + "nest0": [ + 1, + 2 + ] + }, + { + "nest0": [ + 3, + 4 + ] + } + ], + "bindings": {}, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case009.json b/__tests__/test-suite/groups/flattening/case009.json new file mode 100644 index 00000000..13711805 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case009.json @@ -0,0 +1,43 @@ +{ + "expr": "nest0.[nest1.[nest2.[nest3]]]", + "dataset": "dataset8", + "bindings": {}, + "result": [ + [ + [ + [ + 1 + ], + [ + 2 + ] + ], + [ + [ + 3 + ], + [ + 4 + ] + ] + ], + [ + [ + [ + 5 + ], + [ + 6 + ] + ], + [ + [ + 7 + ], + [ + 8 + ] + ] + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case010.json b/__tests__/test-suite/groups/flattening/case010.json new file mode 100644 index 00000000..bc80e3db --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case010.json @@ -0,0 +1,39 @@ +{ + "expr": "nest0.nest1.[nest2.[nest3]]", + "dataset": "dataset8", + "bindings": {}, + "result": [ + [ + [ + 1 + ], + [ + 2 + ] + ], + [ + [ + 3 + ], + [ + 4 + ] + ], + [ + [ + 5 + ], + [ + 6 + ] + ], + [ + [ + 7 + ], + [ + 8 + ] + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case011.json b/__tests__/test-suite/groups/flattening/case011.json new file mode 100644 index 00000000..b346bf97 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case011.json @@ -0,0 +1,35 @@ +{ + "expr": "nest0.[nest1.nest2.[nest3]]", + "dataset": "dataset8", + "bindings": {}, + "result": [ + [ + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ] + ], + [ + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ] + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case012.json b/__tests__/test-suite/groups/flattening/case012.json new file mode 100644 index 00000000..e9077d46 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case012.json @@ -0,0 +1,27 @@ +{ + "expr": "nest0.[nest1.[nest2.nest3]]", + "dataset": "dataset8", + "bindings": {}, + "result": [ + [ + [ + 1, + 2 + ], + [ + 3, + 4 + ] + ], + [ + [ + 5, + 6 + ], + [ + 7, + 8 + ] + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case013.json b/__tests__/test-suite/groups/flattening/case013.json new file mode 100644 index 00000000..a63b4a6f --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case013.json @@ -0,0 +1,19 @@ +{ + "expr": "nest0.[nest1.nest2.nest3]", + "dataset": "dataset8", + "bindings": {}, + "result": [ + [ + 1, + 2, + 3, + 4 + ], + [ + 5, + 6, + 7, + 8 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case014.json b/__tests__/test-suite/groups/flattening/case014.json new file mode 100644 index 00000000..5d9d4026 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case014.json @@ -0,0 +1,23 @@ +{ + "expr": "nest0.nest1.[nest2.nest3]", + "dataset": "dataset8", + "bindings": {}, + "result": [ + [ + 1, + 2 + ], + [ + 3, + 4 + ], + [ + 5, + 6 + ], + [ + 7, + 8 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case015.json b/__tests__/test-suite/groups/flattening/case015.json new file mode 100644 index 00000000..fb3f8b29 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case015.json @@ -0,0 +1,31 @@ +{ + "expr": "nest0.nest1.nest2.[nest3]", + "dataset": "dataset8", + "bindings": {}, + "result": [ + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ], + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case016.json b/__tests__/test-suite/groups/flattening/case016.json new file mode 100644 index 00000000..a570b110 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case016.json @@ -0,0 +1,15 @@ +{ + "expr": "nest0.nest1.nest2.nest3", + "dataset": "dataset8", + "bindings": {}, + "result": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case017.json b/__tests__/test-suite/groups/flattening/case017.json new file mode 100644 index 00000000..456a55e9 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case017.json @@ -0,0 +1,43 @@ +{ + "expr": "nest0.[nest1.[nest2.[nest3]]]", + "dataset": "dataset24", + "bindings": {}, + "result": [ + [ + [ + [ + 1 + ], + [ + 2 + ] + ], + [ + [ + 3 + ], + [ + 4 + ] + ] + ], + [ + [ + [ + 5 + ], + [ + 6 + ] + ], + [ + [ + 7 + ], + [ + 8 + ] + ] + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case018.json b/__tests__/test-suite/groups/flattening/case018.json new file mode 100644 index 00000000..070df6ae --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case018.json @@ -0,0 +1,39 @@ +{ + "expr": "nest0.nest1.[nest2.[nest3]]", + "dataset": "dataset24", + "bindings": {}, + "result": [ + [ + [ + 1 + ], + [ + 2 + ] + ], + [ + [ + 3 + ], + [ + 4 + ] + ], + [ + [ + 5 + ], + [ + 6 + ] + ], + [ + [ + 7 + ], + [ + 8 + ] + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case019.json b/__tests__/test-suite/groups/flattening/case019.json new file mode 100644 index 00000000..615c645e --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case019.json @@ -0,0 +1,35 @@ +{ + "expr": "nest0.[nest1.nest2.[nest3]]", + "dataset": "dataset24", + "bindings": {}, + "result": [ + [ + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ] + ], + [ + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ] + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case020.json b/__tests__/test-suite/groups/flattening/case020.json new file mode 100644 index 00000000..ff13168e --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case020.json @@ -0,0 +1,27 @@ +{ + "expr": "nest0.[nest1.[nest2.nest3]]", + "dataset": "dataset24", + "bindings": {}, + "result": [ + [ + [ + 1, + 2 + ], + [ + 3, + 4 + ] + ], + [ + [ + 5, + 6 + ], + [ + 7, + 8 + ] + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case021.json b/__tests__/test-suite/groups/flattening/case021.json new file mode 100644 index 00000000..3967a137 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case021.json @@ -0,0 +1,19 @@ +{ + "expr": "nest0.[nest1.nest2.nest3]", + "dataset": "dataset24", + "bindings": {}, + "result": [ + [ + 1, + 2, + 3, + 4 + ], + [ + 5, + 6, + 7, + 8 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case022.json b/__tests__/test-suite/groups/flattening/case022.json new file mode 100644 index 00000000..73de95a7 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case022.json @@ -0,0 +1,23 @@ +{ + "expr": "nest0.nest1.[nest2.nest3]", + "dataset": "dataset24", + "bindings": {}, + "result": [ + [ + 1, + 2 + ], + [ + 3, + 4 + ], + [ + 5, + 6 + ], + [ + 7, + 8 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case023.json b/__tests__/test-suite/groups/flattening/case023.json new file mode 100644 index 00000000..c0bce282 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case023.json @@ -0,0 +1,31 @@ +{ + "expr": "nest0.nest1.nest2.[nest3]", + "dataset": "dataset24", + "bindings": {}, + "result": [ + [ + 1 + ], + [ + 2 + ], + [ + 3 + ], + [ + 4 + ], + [ + 5 + ], + [ + 6 + ], + [ + 7 + ], + [ + 8 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case024.json b/__tests__/test-suite/groups/flattening/case024.json new file mode 100644 index 00000000..bd6a781c --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case024.json @@ -0,0 +1,15 @@ +{ + "expr": "nest0.nest1.nest2.nest3", + "dataset": "dataset24", + "bindings": {}, + "result": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case025.json b/__tests__/test-suite/groups/flattening/case025.json new file mode 100644 index 00000000..12305ff1 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case025.json @@ -0,0 +1,5 @@ +{ + "expr": "{\"a\": 1 }.a", + "dataset": null, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case026.json b/__tests__/test-suite/groups/flattening/case026.json new file mode 100644 index 00000000..f94f8596 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case026.json @@ -0,0 +1,7 @@ +{ + "expr": "a", + "data": { + "a": 1 + }, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case027.json b/__tests__/test-suite/groups/flattening/case027.json new file mode 100644 index 00000000..f2c16168 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case027.json @@ -0,0 +1,7 @@ +{ + "expr": "{\"a\": [1] }.a", + "dataset": null, + "result": [ + 1 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case028.json b/__tests__/test-suite/groups/flattening/case028.json new file mode 100644 index 00000000..ed37e221 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case028.json @@ -0,0 +1,11 @@ +{ + "expr": "a", + "data": { + "a": [ + 1 + ] + }, + "result": [ + 1 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case029.json b/__tests__/test-suite/groups/flattening/case029.json new file mode 100644 index 00000000..b963e4ed --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case029.json @@ -0,0 +1,9 @@ +{ + "expr": "{\"a\": [[1]] }.a", + "dataset": null, + "result": [ + [ + 1 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case030.json b/__tests__/test-suite/groups/flattening/case030.json new file mode 100644 index 00000000..0bfdcc02 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case030.json @@ -0,0 +1,15 @@ +{ + "expr": "a", + "data": { + "a": [ + [ + 1 + ] + ] + }, + "result": [ + [ + 1 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case031.json b/__tests__/test-suite/groups/flattening/case031.json new file mode 100644 index 00000000..6e3dc72a --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case031.json @@ -0,0 +1,9 @@ +{ + "expr": "[{\"a\":[1,2]}, {\"a\":[3]}].a", + "dataset": null, + "result": [ + 1, + 2, + 3 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case032.json b/__tests__/test-suite/groups/flattening/case032.json new file mode 100644 index 00000000..df002d28 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case032.json @@ -0,0 +1,21 @@ +{ + "expr": "a", + "data": [ + { + "a": [ + 1, + 2 + ] + }, + { + "a": [ + 3 + ] + } + ], + "result": [ + 1, + 2, + 3 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case033.json b/__tests__/test-suite/groups/flattening/case033.json new file mode 100644 index 00000000..1626496b --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case033.json @@ -0,0 +1,8 @@ +{ + "expr": "[{\"a\":[{\"b\":[1]}, {\"b\":[2]}]}, {\"a\":[{\"b\":[3]}, {\"b\":[4]}]}].a[0].b", + "dataset": null, + "result": [ + 1, + 3 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case034.json b/__tests__/test-suite/groups/flattening/case034.json new file mode 100644 index 00000000..5557f6d9 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case034.json @@ -0,0 +1,37 @@ +{ + "expr": "a[0].b", + "data": [ + { + "a": [ + { + "b": [ + 1 + ] + }, + { + "b": [ + 2 + ] + } + ] + }, + { + "a": [ + { + "b": [ + 3 + ] + }, + { + "b": [ + 4 + ] + } + ] + } + ], + "result": [ + 1, + 3 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case035.json b/__tests__/test-suite/groups/flattening/case035.json new file mode 100644 index 00000000..f0165bf6 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case035.json @@ -0,0 +1,39 @@ +{ + "expr": "a.b[0]", + "data": [ + { + "a": [ + { + "b": [ + 1 + ] + }, + { + "b": [ + 2 + ] + } + ] + }, + { + "a": [ + { + "b": [ + 3 + ] + }, + { + "b": [ + 4 + ] + } + ] + } + ], + "result": [ + 1, + 2, + 3, + 4 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case036.json b/__tests__/test-suite/groups/flattening/case036.json new file mode 100644 index 00000000..04401be5 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case036.json @@ -0,0 +1,6 @@ +{ + "expr": "Phone[type=\"mobile\"].number", + "dataset": "dataset1", + "bindings": {}, + "result": "077 7700 1234" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case037.json b/__tests__/test-suite/groups/flattening/case037.json new file mode 100644 index 00000000..7a688cac --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case037.json @@ -0,0 +1,8 @@ +{ + "expr": "Phone[type=\"mobile\"][].number", + "dataset": "dataset1", + "bindings": {}, + "result": [ + "077 7700 1234" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case038.json b/__tests__/test-suite/groups/flattening/case038.json new file mode 100644 index 00000000..6436f632 --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case038.json @@ -0,0 +1,8 @@ +{ + "expr": "Phone[][type=\"mobile\"].number", + "dataset": "dataset1", + "bindings": {}, + "result": [ + "077 7700 1234" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case039.json b/__tests__/test-suite/groups/flattening/case039.json new file mode 100644 index 00000000..04a0b10f --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case039.json @@ -0,0 +1,9 @@ +{ + "expr": "Phone[type=\"office\"][].number", + "dataset": "dataset1", + "bindings": {}, + "result": [ + "01962 001234", + "01962 001235" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case040.json b/__tests__/test-suite/groups/flattening/case040.json new file mode 100644 index 00000000..59d99cee --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case040.json @@ -0,0 +1,13 @@ +{ + "expr": "Phone{type: number}", + "dataset": "dataset1", + "bindings": {}, + "result": { + "home": "0203 544 1234", + "office": [ + "01962 001234", + "01962 001235" + ], + "mobile": "077 7700 1234" + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/flattening/case041.json b/__tests__/test-suite/groups/flattening/case041.json new file mode 100644 index 00000000..c331d01d --- /dev/null +++ b/__tests__/test-suite/groups/flattening/case041.json @@ -0,0 +1,17 @@ +{ + "expr": "Phone{type: number[]}", + "dataset": "dataset1", + "bindings": {}, + "result": { + "home": [ + "0203 544 1234" + ], + "office": [ + "01962 001234", + "01962 001235" + ], + "mobile": [ + "077 7700 1234" + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-abs/case000.json b/__tests__/test-suite/groups/function-abs/case000.json new file mode 100644 index 00000000..16f91690 --- /dev/null +++ b/__tests__/test-suite/groups/function-abs/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$abs(3.7)", + "dataset": null, + "bindings": {}, + "result": 3.7 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-abs/case001.json b/__tests__/test-suite/groups/function-abs/case001.json new file mode 100644 index 00000000..86e6ab5c --- /dev/null +++ b/__tests__/test-suite/groups/function-abs/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$abs(-3.7)", + "dataset": null, + "bindings": {}, + "result": 3.7 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-abs/case002.json b/__tests__/test-suite/groups/function-abs/case002.json new file mode 100644 index 00000000..29153ed7 --- /dev/null +++ b/__tests__/test-suite/groups/function-abs/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$abs(0)", + "dataset": null, + "bindings": {}, + "result": 0 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-abs/case003.json b/__tests__/test-suite/groups/function-abs/case003.json new file mode 100644 index 00000000..0ad8ef0a --- /dev/null +++ b/__tests__/test-suite/groups/function-abs/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$abs(nothing)", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-append/case000.json b/__tests__/test-suite/groups/function-append/case000.json new file mode 100644 index 00000000..ab552cc7 --- /dev/null +++ b/__tests__/test-suite/groups/function-append/case000.json @@ -0,0 +1,11 @@ +{ + "expr": "$append([1,2], [3,4])", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 1, + 2, + 3, + 4 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-append/case001.json b/__tests__/test-suite/groups/function-append/case001.json new file mode 100644 index 00000000..6f105951 --- /dev/null +++ b/__tests__/test-suite/groups/function-append/case001.json @@ -0,0 +1,10 @@ +{ + "expr": "$append(1, [3,4])", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 1, + 3, + 4 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-append/case002.json b/__tests__/test-suite/groups/function-append/case002.json new file mode 100644 index 00000000..eb23f9a2 --- /dev/null +++ b/__tests__/test-suite/groups/function-append/case002.json @@ -0,0 +1,9 @@ +{ + "expr": "$append(1,2)", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 1, + 2 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-append/case003.json b/__tests__/test-suite/groups/function-append/case003.json new file mode 100644 index 00000000..c4d550d1 --- /dev/null +++ b/__tests__/test-suite/groups/function-append/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$append(1,notexist)", + "dataset": "dataset5", + "bindings": {}, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-append/case004.json b/__tests__/test-suite/groups/function-append/case004.json new file mode 100644 index 00000000..9a1a3608 --- /dev/null +++ b/__tests__/test-suite/groups/function-append/case004.json @@ -0,0 +1,10 @@ +{ + "expr": "$append(notexist, [2,3,4])", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 2, + 3, + 4 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case000.json b/__tests__/test-suite/groups/function-applications/case000.json new file mode 100644 index 00000000..4a5e0c8c --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order[0].OrderID ~> $uppercase()", + "dataset": "dataset5", + "bindings": {}, + "result": "ORDER103" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case001.json b/__tests__/test-suite/groups/function-applications/case001.json new file mode 100644 index 00000000..3604b641 --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order[0].OrderID ~> $uppercase() ~> $lowercase()", + "dataset": "dataset5", + "bindings": {}, + "result": "order103" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case002.json b/__tests__/test-suite/groups/function-applications/case002.json new file mode 100644 index 00000000..60672a28 --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order.OrderID ~> $join()", + "dataset": "dataset5", + "bindings": {}, + "result": "order103order104" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case003.json b/__tests__/test-suite/groups/function-applications/case003.json new file mode 100644 index 00000000..c45e765f --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order.OrderID ~> $join(\", \")", + "dataset": "dataset5", + "bindings": {}, + "result": "order103, order104" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case004.json b/__tests__/test-suite/groups/function-applications/case004.json new file mode 100644 index 00000000..5b7b175a --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order.Product.(Price * Quantity) ~> $sum()", + "dataset": "dataset5", + "bindings": {}, + "result": 336.36 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case005.json b/__tests__/test-suite/groups/function-applications/case005.json new file mode 100644 index 00000000..1f011be6 --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "( $uppertrim := $trim ~> $uppercase; $uppertrim(\" Hello World \") )", + "dataset": null, + "bindings": {}, + "result": "HELLO WORLD" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case006.json b/__tests__/test-suite/groups/function-applications/case006.json new file mode 100644 index 00000000..4027d07e --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "\"john@example.com\" ~> $substringAfter(\"@\") ~> $substringBefore(\".\") ", + "dataset": null, + "bindings": {}, + "result": "example" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case007.json b/__tests__/test-suite/groups/function-applications/case007.json new file mode 100644 index 00000000..a9063d05 --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "\"\" ~> $substringAfter(\"@\") ~> $substringBefore(\".\") ", + "data": "test", + "bindings": {}, + "result": "" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case008.json b/__tests__/test-suite/groups/function-applications/case008.json new file mode 100644 index 00000000..ec33446f --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "foo ~> $substringAfter(\"@\") ~> $substringBefore(\".\") ", + "data": "test", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case009.json b/__tests__/test-suite/groups/function-applications/case009.json new file mode 100644 index 00000000..1bbdc173 --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "( $domain := $substringAfter(?,\"@\") ~> $substringBefore(?,\".\"); $domain(\"john@example.com\") )", + "dataset": null, + "bindings": {}, + "result": "example" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case010.json b/__tests__/test-suite/groups/function-applications/case010.json new file mode 100644 index 00000000..436fa531 --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case010.json @@ -0,0 +1,12 @@ +{ + "expr": "( $square := function($x){$x*$x}; [1..5] ~> $map($square) ) ", + "dataset": null, + "bindings": {}, + "result": [ + 1, + 4, + 9, + 16, + 25 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case011.json b/__tests__/test-suite/groups/function-applications/case011.json new file mode 100644 index 00000000..657b9ecd --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "( $square := function($x){$x*$x}; [1..5] ~> $map($square) ~> $sum() ) ", + "dataset": null, + "bindings": {}, + "result": 55 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case012.json b/__tests__/test-suite/groups/function-applications/case012.json new file mode 100644 index 00000000..754ec004 --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "($betweenBackets := $substringAfter(?, \"(\") ~> $substringBefore(?, \")\");$betweenBackets(\"test(foo)bar\")) ", + "dataset": null, + "bindings": {}, + "result": "foo" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case013.json b/__tests__/test-suite/groups/function-applications/case013.json new file mode 100644 index 00000000..669ff4cc --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "($square := function($x){$x*$x};$chain := λ($f, $g){λ($x){$g($f($x))}};$instructions := [$sum, $square];$sumsq := $instructions ~> $reduce($chain);[1..5] ~> $sumsq()) ", + "dataset": null, + "bindings": {}, + "result": 225 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case014.json b/__tests__/test-suite/groups/function-applications/case014.json new file mode 100644 index 00000000..71525489 --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "($square := function($x){$x*$x};$chain := λ($f, $g){λ($x){ $x ~> $f ~> $g }};$instructions := [$sum, $square, $string];$sumsq := $instructions ~> $reduce($chain);[1..5] ~> $sumsq()) ", + "dataset": null, + "bindings": {}, + "result": "225" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case015.json b/__tests__/test-suite/groups/function-applications/case015.json new file mode 100644 index 00000000..8ac24e8a --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "($square := function($x){$x*$x};$instructions := $sum ~> $square;[1..5] ~> $instructions()) ", + "dataset": null, + "bindings": {}, + "result": 225 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case016.json b/__tests__/test-suite/groups/function-applications/case016.json new file mode 100644 index 00000000..8a5daf94 --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case016.json @@ -0,0 +1,6 @@ +{ + "expr": "($square := function($x){$x*$x};$sum_of_squares := $map(?, $square) ~> $sum;[1..5] ~> $sum_of_squares()) ", + "dataset": null, + "bindings": {}, + "result": 55 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case017.json b/__tests__/test-suite/groups/function-applications/case017.json new file mode 100644 index 00000000..929fadc8 --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "($times := λ($x, $y) { $x * $y };$product := $reduce(?, $times);$square := function($x){$x*$x};$product_of_squares := $map(?, $square) ~> $product;[1..5] ~> $product_of_squares())", + "dataset": null, + "bindings": {}, + "result": 14400 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case018.json b/__tests__/test-suite/groups/function-applications/case018.json new file mode 100644 index 00000000..dfa983b0 --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case018.json @@ -0,0 +1,6 @@ +{ + "expr": "($square := function($x){$x*$x};[1..5] ~> $map($square) ~> $reduce(λ($x, $y) { $x * $y });)", + "dataset": null, + "bindings": {}, + "result": 14400 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case019.json b/__tests__/test-suite/groups/function-applications/case019.json new file mode 100644 index 00000000..fb6a8ae2 --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case019.json @@ -0,0 +1,6 @@ +{ + "expr": "($prices := Account.Order.Product.Price;$quantities := Account.Order.Product.Quantity;$product := λ($arr) { $arr[0] * $arr[1] };$zip($prices, $quantities) ~> $map($product) ~> $sum())", + "dataset": "dataset5", + "bindings": {}, + "result": 336.36 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case020.json b/__tests__/test-suite/groups/function-applications/case020.json new file mode 100644 index 00000000..294be121 --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case020.json @@ -0,0 +1,6 @@ +{ + "expr": "42 ~> \"hello\"", + "dataset": "dataset5", + "bindings": {}, + "code": "T2006" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-applications/case021.json b/__tests__/test-suite/groups/function-applications/case021.json new file mode 100644 index 00000000..809af8ae --- /dev/null +++ b/__tests__/test-suite/groups/function-applications/case021.json @@ -0,0 +1,10 @@ +{ + "expr": "Account.Order.Product[$.\"Product Name\" ~> /hat/i].ProductID", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 858383, + 858236, + 858383 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-average/case000.json b/__tests__/test-suite/groups/function-average/case000.json new file mode 100644 index 00000000..b11893cd --- /dev/null +++ b/__tests__/test-suite/groups/function-average/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$average(Account.Order.Product.(Price * Quantity))", + "dataset": "dataset5", + "bindings": {}, + "result": 84.09 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-average/case001.json b/__tests__/test-suite/groups/function-average/case001.json new file mode 100644 index 00000000..d1987fdf --- /dev/null +++ b/__tests__/test-suite/groups/function-average/case001.json @@ -0,0 +1,9 @@ +{ + "expr": "Account.Order.$average(Product.(Price * Quantity))", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 45.285000000000004, + 122.89500000000001 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-average/case002.json b/__tests__/test-suite/groups/function-average/case002.json new file mode 100644 index 00000000..9ba37778 --- /dev/null +++ b/__tests__/test-suite/groups/function-average/case002.json @@ -0,0 +1,9 @@ +{ + "expr": "Account.Order.(OrderID & \": \" & $average(Product.(Price*Quantity)))", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "order103: 45.285", + "order104: 122.895" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-average/case003.json b/__tests__/test-suite/groups/function-average/case003.json new file mode 100644 index 00000000..6c126577 --- /dev/null +++ b/__tests__/test-suite/groups/function-average/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$average([])", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-average/case004.json b/__tests__/test-suite/groups/function-average/case004.json new file mode 100644 index 00000000..f1c0ea7c --- /dev/null +++ b/__tests__/test-suite/groups/function-average/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$average([1,2,3])", + "dataset": null, + "bindings": {}, + "result": 2 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-average/case005.json b/__tests__/test-suite/groups/function-average/case005.json new file mode 100644 index 00000000..01a2b441 --- /dev/null +++ b/__tests__/test-suite/groups/function-average/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$average([\"1\",\"2\",\"3\"])", + "dataset": null, + "bindings": {}, + "code": "T0412" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-average/case006.json b/__tests__/test-suite/groups/function-average/case006.json new file mode 100644 index 00000000..b4966838 --- /dev/null +++ b/__tests__/test-suite/groups/function-average/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$average([\"1\",\"2\",3])", + "dataset": null, + "bindings": {}, + "code": "T0412" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-average/case007.json b/__tests__/test-suite/groups/function-average/case007.json new file mode 100644 index 00000000..0c9098b7 --- /dev/null +++ b/__tests__/test-suite/groups/function-average/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "$average(1)", + "dataset": null, + "bindings": {}, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-average/case008.json b/__tests__/test-suite/groups/function-average/case008.json new file mode 100644 index 00000000..884bfe38 --- /dev/null +++ b/__tests__/test-suite/groups/function-average/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "$average([],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-average/case009.json b/__tests__/test-suite/groups/function-average/case009.json new file mode 100644 index 00000000..e44cb8d8 --- /dev/null +++ b/__tests__/test-suite/groups/function-average/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "$average([1,2,3],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-average/case010.json b/__tests__/test-suite/groups/function-average/case010.json new file mode 100644 index 00000000..bbfa6e46 --- /dev/null +++ b/__tests__/test-suite/groups/function-average/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "$average([],[],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-average/case011.json b/__tests__/test-suite/groups/function-average/case011.json new file mode 100644 index 00000000..161b0538 --- /dev/null +++ b/__tests__/test-suite/groups/function-average/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$average([1,2],[],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-average/case012.json b/__tests__/test-suite/groups/function-average/case012.json new file mode 100644 index 00000000..43e5a408 --- /dev/null +++ b/__tests__/test-suite/groups/function-average/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "$average(undefined)", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case000.json b/__tests__/test-suite/groups/function-boolean/case000.json new file mode 100644 index 00000000..9947faaa --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean(\"Hello World\")", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case001.json b/__tests__/test-suite/groups/function-boolean/case001.json new file mode 100644 index 00000000..df60a330 --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean(\"\")", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case002.json b/__tests__/test-suite/groups/function-boolean/case002.json new file mode 100644 index 00000000..742b5af6 --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean(true)", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case003.json b/__tests__/test-suite/groups/function-boolean/case003.json new file mode 100644 index 00000000..514f8865 --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean(false)", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case004.json b/__tests__/test-suite/groups/function-boolean/case004.json new file mode 100644 index 00000000..b7e466ec --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean(0)", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case005.json b/__tests__/test-suite/groups/function-boolean/case005.json new file mode 100644 index 00000000..b7aa0e4e --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean(10)", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case006.json b/__tests__/test-suite/groups/function-boolean/case006.json new file mode 100644 index 00000000..c093f463 --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean(-0.5)", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case007.json b/__tests__/test-suite/groups/function-boolean/case007.json new file mode 100644 index 00000000..365a75f3 --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean(null)", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case008.json b/__tests__/test-suite/groups/function-boolean/case008.json new file mode 100644 index 00000000..b5db4aac --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean([])", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case009.json b/__tests__/test-suite/groups/function-boolean/case009.json new file mode 100644 index 00000000..e6f49ec2 --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean([0])", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case010.json b/__tests__/test-suite/groups/function-boolean/case010.json new file mode 100644 index 00000000..f07f610a --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean([1])", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case011.json b/__tests__/test-suite/groups/function-boolean/case011.json new file mode 100644 index 00000000..909beb5c --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean([1,2,3])", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case012.json b/__tests__/test-suite/groups/function-boolean/case012.json new file mode 100644 index 00000000..4bde64ab --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean([0,0])", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case013.json b/__tests__/test-suite/groups/function-boolean/case013.json new file mode 100644 index 00000000..67d5fe7d --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean([[]])", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case014.json b/__tests__/test-suite/groups/function-boolean/case014.json new file mode 100644 index 00000000..92a20060 --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean([[null]])", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case015.json b/__tests__/test-suite/groups/function-boolean/case015.json new file mode 100644 index 00000000..8def2c46 --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean([[[true]]])", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case016.json b/__tests__/test-suite/groups/function-boolean/case016.json new file mode 100644 index 00000000..562744d7 --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case016.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean({})", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case017.json b/__tests__/test-suite/groups/function-boolean/case017.json new file mode 100644 index 00000000..985ae08e --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean({\"hello\":\"world\"})", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case018.json b/__tests__/test-suite/groups/function-boolean/case018.json new file mode 100644 index 00000000..230b89e0 --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case018.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean(Account)", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case019.json b/__tests__/test-suite/groups/function-boolean/case019.json new file mode 100644 index 00000000..62422af5 --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case019.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean(Account.Order.Product.Price)", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case020.json b/__tests__/test-suite/groups/function-boolean/case020.json new file mode 100644 index 00000000..62f79c36 --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case020.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean(Account.blah)", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case021.json b/__tests__/test-suite/groups/function-boolean/case021.json new file mode 100644 index 00000000..5c39a33e --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case021.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean($boolean)", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case022.json b/__tests__/test-suite/groups/function-boolean/case022.json new file mode 100644 index 00000000..ea676fa1 --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case022.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean(function(){true})", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-boolean/case023.json b/__tests__/test-suite/groups/function-boolean/case023.json new file mode 100644 index 00000000..c02af74e --- /dev/null +++ b/__tests__/test-suite/groups/function-boolean/case023.json @@ -0,0 +1,6 @@ +{ + "expr": "$boolean(2,3)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-ceil/case000.json b/__tests__/test-suite/groups/function-ceil/case000.json new file mode 100644 index 00000000..dd6a6b53 --- /dev/null +++ b/__tests__/test-suite/groups/function-ceil/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$ceil(3.7)", + "dataset": null, + "bindings": {}, + "result": 4 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-ceil/case001.json b/__tests__/test-suite/groups/function-ceil/case001.json new file mode 100644 index 00000000..8a9dae94 --- /dev/null +++ b/__tests__/test-suite/groups/function-ceil/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$ceil(-3.7)", + "dataset": null, + "bindings": {}, + "result": -3 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-ceil/case002.json b/__tests__/test-suite/groups/function-ceil/case002.json new file mode 100644 index 00000000..b8d49a24 --- /dev/null +++ b/__tests__/test-suite/groups/function-ceil/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$ceil(0)", + "dataset": null, + "bindings": {}, + "result": 0 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-ceil/case003.json b/__tests__/test-suite/groups/function-ceil/case003.json new file mode 100644 index 00000000..249f9002 --- /dev/null +++ b/__tests__/test-suite/groups/function-ceil/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$ceil(nothing)", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-clone/case000.json b/__tests__/test-suite/groups/function-clone/case000.json new file mode 100644 index 00000000..40075ab8 --- /dev/null +++ b/__tests__/test-suite/groups/function-clone/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$clone(foo)", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-clone/case001.json b/__tests__/test-suite/groups/function-clone/case001.json new file mode 100644 index 00000000..4a1c8b73 --- /dev/null +++ b/__tests__/test-suite/groups/function-clone/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$clone({})", + "dataset": "dataset5", + "bindings": {}, + "result": {} +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-clone/case002.json b/__tests__/test-suite/groups/function-clone/case002.json new file mode 100644 index 00000000..d597af71 --- /dev/null +++ b/__tests__/test-suite/groups/function-clone/case002.json @@ -0,0 +1,8 @@ +{ + "expr": "$clone({\"a\": 1})", + "dataset": "dataset5", + "bindings": {}, + "result": { + "a": 1 + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-contains/case000.json b/__tests__/test-suite/groups/function-contains/case000.json new file mode 100644 index 00000000..9cf6db3d --- /dev/null +++ b/__tests__/test-suite/groups/function-contains/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$contains(\"Hello World\", \"lo\")", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-contains/case001.json b/__tests__/test-suite/groups/function-contains/case001.json new file mode 100644 index 00000000..5eb63dae --- /dev/null +++ b/__tests__/test-suite/groups/function-contains/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$contains(\"Hello World\", \"World\")", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-contains/case002.json b/__tests__/test-suite/groups/function-contains/case002.json new file mode 100644 index 00000000..8b9676cc --- /dev/null +++ b/__tests__/test-suite/groups/function-contains/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$contains(\"Hello World\", \"world\")", + "dataset": null, + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-contains/case003.json b/__tests__/test-suite/groups/function-contains/case003.json new file mode 100644 index 00000000..4002ab67 --- /dev/null +++ b/__tests__/test-suite/groups/function-contains/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$contains(\"Hello World\", \"Word\")", + "dataset": null, + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-contains/case004.json b/__tests__/test-suite/groups/function-contains/case004.json new file mode 100644 index 00000000..8ae7f828 --- /dev/null +++ b/__tests__/test-suite/groups/function-contains/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$contains(nothing, \"World\")", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-contains/case005.json b/__tests__/test-suite/groups/function-contains/case005.json new file mode 100644 index 00000000..baca1ae1 --- /dev/null +++ b/__tests__/test-suite/groups/function-contains/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$contains(23, 3)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-contains/case006.json b/__tests__/test-suite/groups/function-contains/case006.json new file mode 100644 index 00000000..94085bf1 --- /dev/null +++ b/__tests__/test-suite/groups/function-contains/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$contains(\"23\", 3)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-count/case000.json b/__tests__/test-suite/groups/function-count/case000.json new file mode 100644 index 00000000..736f91e6 --- /dev/null +++ b/__tests__/test-suite/groups/function-count/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$count(Account.Order.Product.(Price * Quantity))", + "dataset": "dataset5", + "bindings": {}, + "result": 4 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-count/case001.json b/__tests__/test-suite/groups/function-count/case001.json new file mode 100644 index 00000000..d27256a5 --- /dev/null +++ b/__tests__/test-suite/groups/function-count/case001.json @@ -0,0 +1,9 @@ +{ + "expr": "Account.Order.$count(Product.(Price * Quantity))", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 2, + 2 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-count/case002.json b/__tests__/test-suite/groups/function-count/case002.json new file mode 100644 index 00000000..9ec0f151 --- /dev/null +++ b/__tests__/test-suite/groups/function-count/case002.json @@ -0,0 +1,9 @@ +{ + "expr": "Account.Order.(OrderID & \": \" & $count(Product.(Price*Quantity)))", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "order103: 2", + "order104: 2" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-count/case003.json b/__tests__/test-suite/groups/function-count/case003.json new file mode 100644 index 00000000..e6b356eb --- /dev/null +++ b/__tests__/test-suite/groups/function-count/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$count([])", + "dataset": null, + "bindings": {}, + "result": 0 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-count/case004.json b/__tests__/test-suite/groups/function-count/case004.json new file mode 100644 index 00000000..2a2f3ae9 --- /dev/null +++ b/__tests__/test-suite/groups/function-count/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$count([1,2,3])", + "dataset": null, + "bindings": {}, + "result": 3 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-count/case005.json b/__tests__/test-suite/groups/function-count/case005.json new file mode 100644 index 00000000..e4304849 --- /dev/null +++ b/__tests__/test-suite/groups/function-count/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$count([\"1\",\"2\",\"3\"])", + "dataset": null, + "bindings": {}, + "result": 3 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-count/case006.json b/__tests__/test-suite/groups/function-count/case006.json new file mode 100644 index 00000000..46219706 --- /dev/null +++ b/__tests__/test-suite/groups/function-count/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$count([\"1\",\"2\",3])", + "dataset": null, + "bindings": {}, + "result": 3 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-count/case007.json b/__tests__/test-suite/groups/function-count/case007.json new file mode 100644 index 00000000..d387bde2 --- /dev/null +++ b/__tests__/test-suite/groups/function-count/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "$count(1)", + "dataset": null, + "bindings": {}, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-count/case008.json b/__tests__/test-suite/groups/function-count/case008.json new file mode 100644 index 00000000..7f210176 --- /dev/null +++ b/__tests__/test-suite/groups/function-count/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "$count([],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-count/case009.json b/__tests__/test-suite/groups/function-count/case009.json new file mode 100644 index 00000000..114c41a1 --- /dev/null +++ b/__tests__/test-suite/groups/function-count/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "$count([1,2,3],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-count/case010.json b/__tests__/test-suite/groups/function-count/case010.json new file mode 100644 index 00000000..2fda57cf --- /dev/null +++ b/__tests__/test-suite/groups/function-count/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "$count([],[],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-count/case011.json b/__tests__/test-suite/groups/function-count/case011.json new file mode 100644 index 00000000..e93d8e4e --- /dev/null +++ b/__tests__/test-suite/groups/function-count/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$count([1,2],[],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-count/case012.json b/__tests__/test-suite/groups/function-count/case012.json new file mode 100644 index 00000000..eb691912 --- /dev/null +++ b/__tests__/test-suite/groups/function-count/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "$count(undefined)", + "dataset": null, + "bindings": {}, + "result": 0 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-count/case013.json b/__tests__/test-suite/groups/function-count/case013.json new file mode 100644 index 00000000..e7fa8d6f --- /dev/null +++ b/__tests__/test-suite/groups/function-count/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "$count([1,2,3,4]) / 2", + "dataset": null, + "bindings": {}, + "result": 2 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-each/case000.json b/__tests__/test-suite/groups/function-each/case000.json new file mode 100644 index 00000000..970b4b1d --- /dev/null +++ b/__tests__/test-suite/groups/function-each/case000.json @@ -0,0 +1,10 @@ +{ + "expr": "$each(Address, λ($v, $k) {$k & \": \" & $v})", + "dataset": "dataset1", + "bindings": {}, + "result": [ + "Street: Hursley Park", + "City: Winchester", + "Postcode: SO21 2JN" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-each/case001.json b/__tests__/test-suite/groups/function-each/case001.json new file mode 100644 index 00000000..fb112cfa --- /dev/null +++ b/__tests__/test-suite/groups/function-each/case001.json @@ -0,0 +1,12 @@ +{ + "expr": "$reverse([1..5])", + "dataset": "dataset1", + "bindings": {}, + "result": [ + 5, + 4, + 3, + 2, + 1 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-each/case002.json b/__tests__/test-suite/groups/function-each/case002.json new file mode 100644 index 00000000..ae40617f --- /dev/null +++ b/__tests__/test-suite/groups/function-each/case002.json @@ -0,0 +1,26 @@ +{ + "expr": "[[$], [$reverse($)], [$]]", + "data": [ + 1, + 2, + 3 + ], + "bindings": {}, + "result": [ + [ + 1, + 2, + 3 + ], + [ + 3, + 2, + 1 + ], + [ + 1, + 2, + 3 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-each/case003.json b/__tests__/test-suite/groups/function-each/case003.json new file mode 100644 index 00000000..6967223c --- /dev/null +++ b/__tests__/test-suite/groups/function-each/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$reverse(nothing)", + "dataset": "dataset1", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-each/case004.json b/__tests__/test-suite/groups/function-each/case004.json new file mode 100644 index 00000000..58982632 --- /dev/null +++ b/__tests__/test-suite/groups/function-each/case004.json @@ -0,0 +1,8 @@ +{ + "expr": "$reverse([1])", + "dataset": "dataset1", + "bindings": {}, + "result": [ + 1 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case000.json b/__tests__/test-suite/groups/function-exists/case000.json new file mode 100644 index 00000000..241d79e6 --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists(\"Hello World\")", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case001.json b/__tests__/test-suite/groups/function-exists/case001.json new file mode 100644 index 00000000..52759bfd --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists(\"\")", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case002.json b/__tests__/test-suite/groups/function-exists/case002.json new file mode 100644 index 00000000..7d950a90 --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists(true)", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case003.json b/__tests__/test-suite/groups/function-exists/case003.json new file mode 100644 index 00000000..dddee531 --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists(false)", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case004.json b/__tests__/test-suite/groups/function-exists/case004.json new file mode 100644 index 00000000..ca7ab5c4 --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists(0)", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case005.json b/__tests__/test-suite/groups/function-exists/case005.json new file mode 100644 index 00000000..29c0274b --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists(-0.5)", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case006.json b/__tests__/test-suite/groups/function-exists/case006.json new file mode 100644 index 00000000..8de43dd3 --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists(null)", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case007.json b/__tests__/test-suite/groups/function-exists/case007.json new file mode 100644 index 00000000..c0ca0a79 --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists([])", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case008.json b/__tests__/test-suite/groups/function-exists/case008.json new file mode 100644 index 00000000..24b88a46 --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists([0])", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case009.json b/__tests__/test-suite/groups/function-exists/case009.json new file mode 100644 index 00000000..9240dc54 --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists([1,2,3])", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case010.json b/__tests__/test-suite/groups/function-exists/case010.json new file mode 100644 index 00000000..fe45826a --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists([[]])", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case011.json b/__tests__/test-suite/groups/function-exists/case011.json new file mode 100644 index 00000000..17ccfc9d --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists([[null]])", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case012.json b/__tests__/test-suite/groups/function-exists/case012.json new file mode 100644 index 00000000..2c7d3c4d --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists([[[true]]])", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case013.json b/__tests__/test-suite/groups/function-exists/case013.json new file mode 100644 index 00000000..ec2503bc --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists({})", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case014.json b/__tests__/test-suite/groups/function-exists/case014.json new file mode 100644 index 00000000..e613fa4e --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists({\"hello\":\"world\"})", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case015.json b/__tests__/test-suite/groups/function-exists/case015.json new file mode 100644 index 00000000..27e949fa --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists(Account)", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case016.json b/__tests__/test-suite/groups/function-exists/case016.json new file mode 100644 index 00000000..fcc61d6f --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case016.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists(Account.Order.Product.Price)", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case017.json b/__tests__/test-suite/groups/function-exists/case017.json new file mode 100644 index 00000000..6f6148ab --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists($exists)", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case018.json b/__tests__/test-suite/groups/function-exists/case018.json new file mode 100644 index 00000000..ec9a02df --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case018.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists(function(){true})", + "dataset": "dataset5", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case019.json b/__tests__/test-suite/groups/function-exists/case019.json new file mode 100644 index 00000000..453e5b6c --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case019.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists(blah)", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case020.json b/__tests__/test-suite/groups/function-exists/case020.json new file mode 100644 index 00000000..4c04cfa1 --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case020.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists(Account.blah)", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case021.json b/__tests__/test-suite/groups/function-exists/case021.json new file mode 100644 index 00000000..60f3dc82 --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case021.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists(Account.Order[2])", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case022.json b/__tests__/test-suite/groups/function-exists/case022.json new file mode 100644 index 00000000..7b395d5d --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case022.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists(Account.Order[0].blah)", + "dataset": "dataset5", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case023.json b/__tests__/test-suite/groups/function-exists/case023.json new file mode 100644 index 00000000..b4641a9d --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case023.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists(2,3)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-exists/case024.json b/__tests__/test-suite/groups/function-exists/case024.json new file mode 100644 index 00000000..6955902a --- /dev/null +++ b/__tests__/test-suite/groups/function-exists/case024.json @@ -0,0 +1,6 @@ +{ + "expr": "$exists()", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-floor/case000.json b/__tests__/test-suite/groups/function-floor/case000.json new file mode 100644 index 00000000..c8650941 --- /dev/null +++ b/__tests__/test-suite/groups/function-floor/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$floor(3.7)", + "dataset": null, + "bindings": {}, + "result": 3 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-floor/case001.json b/__tests__/test-suite/groups/function-floor/case001.json new file mode 100644 index 00000000..ce9aa9f4 --- /dev/null +++ b/__tests__/test-suite/groups/function-floor/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$floor(-3.7)", + "dataset": null, + "bindings": {}, + "result": -4 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-floor/case002.json b/__tests__/test-suite/groups/function-floor/case002.json new file mode 100644 index 00000000..2f97c4e9 --- /dev/null +++ b/__tests__/test-suite/groups/function-floor/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$floor(0)", + "dataset": null, + "bindings": {}, + "result": 0 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-floor/case003.json b/__tests__/test-suite/groups/function-floor/case003.json new file mode 100644 index 00000000..e424a3e3 --- /dev/null +++ b/__tests__/test-suite/groups/function-floor/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$floor(nothing)", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatBase/case000.json b/__tests__/test-suite/groups/function-formatBase/case000.json new file mode 100644 index 00000000..90a91021 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatBase/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatBase(100)", + "dataset": null, + "bindings": {}, + "result": "100" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatBase/case001.json b/__tests__/test-suite/groups/function-formatBase/case001.json new file mode 100644 index 00000000..64380a3a --- /dev/null +++ b/__tests__/test-suite/groups/function-formatBase/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatBase(nothing)", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatBase/case002.json b/__tests__/test-suite/groups/function-formatBase/case002.json new file mode 100644 index 00000000..1ebf1873 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatBase/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatBase(100, 2)", + "dataset": null, + "bindings": {}, + "result": "1100100" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatBase/case003.json b/__tests__/test-suite/groups/function-formatBase/case003.json new file mode 100644 index 00000000..634802cc --- /dev/null +++ b/__tests__/test-suite/groups/function-formatBase/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatBase(-100, 2)", + "dataset": null, + "bindings": {}, + "result": "-1100100" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatBase/case004.json b/__tests__/test-suite/groups/function-formatBase/case004.json new file mode 100644 index 00000000..82e6ae23 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatBase/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatBase(100, 36)", + "dataset": null, + "bindings": {}, + "result": "2s" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatBase/case005.json b/__tests__/test-suite/groups/function-formatBase/case005.json new file mode 100644 index 00000000..bc79f2cb --- /dev/null +++ b/__tests__/test-suite/groups/function-formatBase/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatBase(99.5, 2.5)", + "dataset": null, + "bindings": {}, + "result": "1100100" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatBase/case006.json b/__tests__/test-suite/groups/function-formatBase/case006.json new file mode 100644 index 00000000..f8f33641 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatBase/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatBase(100, 1)", + "dataset": null, + "bindings": {}, + "code": "D3100" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatBase/case007.json b/__tests__/test-suite/groups/function-formatBase/case007.json new file mode 100644 index 00000000..c2aad9ec --- /dev/null +++ b/__tests__/test-suite/groups/function-formatBase/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatBase(100, 37)", + "dataset": null, + "bindings": {}, + "code": "D3100" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case000.json b/__tests__/test-suite/groups/function-formatNumber/case000.json new file mode 100644 index 00000000..89426477 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(12345.6, \"#,###.00\")", + "dataset": null, + "bindings": {}, + "result": "12,345.60" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case001.json b/__tests__/test-suite/groups/function-formatNumber/case001.json new file mode 100644 index 00000000..28eeff7e --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(12345678.9, \"9,999.99\")", + "dataset": null, + "bindings": {}, + "result": "12,345,678.90" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case002.json b/__tests__/test-suite/groups/function-formatNumber/case002.json new file mode 100644 index 00000000..daaa39ea --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(123412345678.9, \"9,9,99.99\")", + "dataset": null, + "bindings": {}, + "result": "123412345,6,78.90" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case003.json b/__tests__/test-suite/groups/function-formatNumber/case003.json new file mode 100644 index 00000000..fbe29cb0 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(1234.56789, \"9,999.999,999\")", + "dataset": null, + "bindings": {}, + "result": "1,234.567,890" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case004.json b/__tests__/test-suite/groups/function-formatNumber/case004.json new file mode 100644 index 00000000..98313549 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(123.9, \"9999\")", + "dataset": null, + "bindings": {}, + "result": "0124" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case005.json b/__tests__/test-suite/groups/function-formatNumber/case005.json new file mode 100644 index 00000000..6241c55f --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(0.14, \"01%\")", + "dataset": null, + "bindings": {}, + "result": "14%" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case006.json b/__tests__/test-suite/groups/function-formatNumber/case006.json new file mode 100644 index 00000000..13a5c8b2 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(0.4857,\"###.###‰\")", + "dataset": null, + "bindings": {}, + "result": "485.7‰" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case007.json b/__tests__/test-suite/groups/function-formatNumber/case007.json new file mode 100644 index 00000000..f3869870 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(0.14, \"###pm\", {\"per-mille\": \"pm\"})", + "dataset": null, + "bindings": {}, + "result": "140pm" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case008.json b/__tests__/test-suite/groups/function-formatNumber/case008.json new file mode 100644 index 00000000..31843ac2 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(-6, \"000\")", + "dataset": null, + "bindings": {}, + "result": "-006" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case009.json b/__tests__/test-suite/groups/function-formatNumber/case009.json new file mode 100644 index 00000000..707d190d --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(1234.5678, \"00.000e0\")", + "dataset": null, + "bindings": {}, + "result": "12.346e2" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case010.json b/__tests__/test-suite/groups/function-formatNumber/case010.json new file mode 100644 index 00000000..9a5e35b9 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(1234.5678, \"00.000e000\")", + "dataset": null, + "bindings": {}, + "result": "12.346e002" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case011.json b/__tests__/test-suite/groups/function-formatNumber/case011.json new file mode 100644 index 00000000..3cf8465d --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(1234.5678, \"①①.①①①e①\", {\"zero-digit\": \"⑟\"})", + "dataset": null, + "bindings": {}, + "result": "①②.③④⑥e②" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case012.json b/__tests__/test-suite/groups/function-formatNumber/case012.json new file mode 100644 index 00000000..f8808b45 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(0.234, \"0.0e0\")", + "dataset": null, + "bindings": {}, + "result": "2.3e-1" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case013.json b/__tests__/test-suite/groups/function-formatNumber/case013.json new file mode 100644 index 00000000..bce24c87 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(0.234, \"#.00e0\")", + "dataset": null, + "bindings": {}, + "result": "0.23e0" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case014.json b/__tests__/test-suite/groups/function-formatNumber/case014.json new file mode 100644 index 00000000..b2e2f15a --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(0.123, \"#.e9\")", + "dataset": null, + "bindings": {}, + "result": "0.1e0" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case015.json b/__tests__/test-suite/groups/function-formatNumber/case015.json new file mode 100644 index 00000000..ef90eb16 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(0.234, \".00e0\")", + "dataset": null, + "bindings": {}, + "result": ".23e0" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case016.json b/__tests__/test-suite/groups/function-formatNumber/case016.json new file mode 100644 index 00000000..82f1b924 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case016.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(2392.14*(-36.58), \"000,000.000###;###,###.000###\")", + "dataset": null, + "bindings": {}, + "result": "87,504.4812" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case017.json b/__tests__/test-suite/groups/function-formatNumber/case017.json new file mode 100644 index 00000000..38f9e6e2 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(2.14*86.58,\"PREFIX##00.000###SUFFIX\")", + "dataset": null, + "bindings": {}, + "result": "PREFIX185.2812SUFFIX" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case018.json b/__tests__/test-suite/groups/function-formatNumber/case018.json new file mode 100644 index 00000000..8745366b --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case018.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(1E20,\"#,######\")", + "dataset": null, + "bindings": {}, + "result": "100,000000,000000,000000" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case019.json b/__tests__/test-suite/groups/function-formatNumber/case019.json new file mode 100644 index 00000000..36e04a24 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case019.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(20,\"#;#;#\")", + "dataset": null, + "bindings": {}, + "code": "D3080" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case020.json b/__tests__/test-suite/groups/function-formatNumber/case020.json new file mode 100644 index 00000000..19e400f3 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case020.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(20,\"#.0.0\")", + "dataset": null, + "bindings": {}, + "code": "D3081" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case021.json b/__tests__/test-suite/groups/function-formatNumber/case021.json new file mode 100644 index 00000000..007d9380 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case021.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(20,\"#0%%\")", + "dataset": null, + "bindings": {}, + "code": "D3082" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case022.json b/__tests__/test-suite/groups/function-formatNumber/case022.json new file mode 100644 index 00000000..2ec5141d --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case022.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(20,\"#0‰‰\")", + "dataset": null, + "bindings": {}, + "code": "D3083" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case023.json b/__tests__/test-suite/groups/function-formatNumber/case023.json new file mode 100644 index 00000000..ddea4c20 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case023.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(20,\"#0%‰\")", + "dataset": null, + "bindings": {}, + "code": "D3084" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case024.json b/__tests__/test-suite/groups/function-formatNumber/case024.json new file mode 100644 index 00000000..43cbb66b --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case024.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(20,\".e0\")", + "dataset": null, + "bindings": {}, + "code": "D3085" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case025.json b/__tests__/test-suite/groups/function-formatNumber/case025.json new file mode 100644 index 00000000..814e2d59 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case025.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(20,\"0+.e0\")", + "dataset": null, + "bindings": {}, + "code": "D3086" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case026.json b/__tests__/test-suite/groups/function-formatNumber/case026.json new file mode 100644 index 00000000..fe73e520 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case026.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(20,\"0,.e0\")", + "dataset": null, + "bindings": {}, + "code": "D3087" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case027.json b/__tests__/test-suite/groups/function-formatNumber/case027.json new file mode 100644 index 00000000..5ab38d95 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case027.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(20,\"0,\")", + "dataset": null, + "bindings": {}, + "code": "D3088" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case028.json b/__tests__/test-suite/groups/function-formatNumber/case028.json new file mode 100644 index 00000000..945ae0bc --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case028.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(20,\"0,,0\")", + "dataset": null, + "bindings": {}, + "code": "D3089" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case029.json b/__tests__/test-suite/groups/function-formatNumber/case029.json new file mode 100644 index 00000000..d8b7ec21 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case029.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(20,\"0#.e0\")", + "dataset": null, + "bindings": {}, + "code": "D3090" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case030.json b/__tests__/test-suite/groups/function-formatNumber/case030.json new file mode 100644 index 00000000..dae1eb45 --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case030.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(20,\"#0.#0e0\")", + "dataset": null, + "bindings": {}, + "code": "D3091" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case031.json b/__tests__/test-suite/groups/function-formatNumber/case031.json new file mode 100644 index 00000000..8f3bc92b --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case031.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(20,\"#0.0e0%\")", + "dataset": null, + "bindings": {}, + "code": "D3092" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-formatNumber/case032.json b/__tests__/test-suite/groups/function-formatNumber/case032.json new file mode 100644 index 00000000..fdffc78b --- /dev/null +++ b/__tests__/test-suite/groups/function-formatNumber/case032.json @@ -0,0 +1,6 @@ +{ + "expr": "$formatNumber(20,\"#0.0e0,0\")", + "dataset": null, + "bindings": {}, + "code": "D3093" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-fromMillis/case000.json b/__tests__/test-suite/groups/function-fromMillis/case000.json new file mode 100644 index 00000000..ca08c4f6 --- /dev/null +++ b/__tests__/test-suite/groups/function-fromMillis/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$fromMillis(1)", + "dataset": "dataset5", + "bindings": {}, + "result": "1970-01-01T00:00:00.001Z" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-fromMillis/case001.json b/__tests__/test-suite/groups/function-fromMillis/case001.json new file mode 100644 index 00000000..ff59f2e5 --- /dev/null +++ b/__tests__/test-suite/groups/function-fromMillis/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$fromMillis(1509380732935)", + "dataset": "dataset5", + "bindings": {}, + "result": "2017-10-30T16:25:32.935Z" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-fromMillis/case002.json b/__tests__/test-suite/groups/function-fromMillis/case002.json new file mode 100644 index 00000000..9975c636 --- /dev/null +++ b/__tests__/test-suite/groups/function-fromMillis/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$fromMillis(foo)", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-join/case000.json b/__tests__/test-suite/groups/function-join/case000.json new file mode 100644 index 00000000..df0ae720 --- /dev/null +++ b/__tests__/test-suite/groups/function-join/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$join(\"hello\")", + "dataset": null, + "bindings": {}, + "result": "hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-join/case001.json b/__tests__/test-suite/groups/function-join/case001.json new file mode 100644 index 00000000..13a2e717 --- /dev/null +++ b/__tests__/test-suite/groups/function-join/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$join([\"hello\"])", + "dataset": null, + "bindings": {}, + "result": "hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-join/case002.json b/__tests__/test-suite/groups/function-join/case002.json new file mode 100644 index 00000000..7711aa96 --- /dev/null +++ b/__tests__/test-suite/groups/function-join/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$join([\"hello\", \"world\"])", + "dataset": null, + "bindings": {}, + "result": "helloworld" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-join/case003.json b/__tests__/test-suite/groups/function-join/case003.json new file mode 100644 index 00000000..e04cd30f --- /dev/null +++ b/__tests__/test-suite/groups/function-join/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$join([\"hello\", \"world\"], \", \")", + "dataset": null, + "bindings": {}, + "result": "hello, world" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-join/case004.json b/__tests__/test-suite/groups/function-join/case004.json new file mode 100644 index 00000000..8281010a --- /dev/null +++ b/__tests__/test-suite/groups/function-join/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$join([], \", \")", + "dataset": null, + "bindings": {}, + "result": "" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-join/case005.json b/__tests__/test-suite/groups/function-join/case005.json new file mode 100644 index 00000000..c7580df4 --- /dev/null +++ b/__tests__/test-suite/groups/function-join/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$join(Account.Order.Product.Description.Colour, \", \")", + "dataset": "dataset5", + "bindings": {}, + "result": "Purple, Orange, Purple, Black" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-join/case006.json b/__tests__/test-suite/groups/function-join/case006.json new file mode 100644 index 00000000..32342a4d --- /dev/null +++ b/__tests__/test-suite/groups/function-join/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$join(Account.Order.Product.Description.Colour, no.sep)", + "dataset": "dataset5", + "bindings": {}, + "result": "PurpleOrangePurpleBlack" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-join/case007.json b/__tests__/test-suite/groups/function-join/case007.json new file mode 100644 index 00000000..8dcd5d1c --- /dev/null +++ b/__tests__/test-suite/groups/function-join/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "$join(Account.blah.Product.Description.Colour, \", \")", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-join/case008.json b/__tests__/test-suite/groups/function-join/case008.json new file mode 100644 index 00000000..6548fa59 --- /dev/null +++ b/__tests__/test-suite/groups/function-join/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "$join(true, \", \")", + "dataset": null, + "bindings": {}, + "code": "T0412" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-join/case009.json b/__tests__/test-suite/groups/function-join/case009.json new file mode 100644 index 00000000..ac5cd27f --- /dev/null +++ b/__tests__/test-suite/groups/function-join/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "$join([1,2,3], \", \")", + "dataset": null, + "bindings": {}, + "code": "T0412" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-join/case010.json b/__tests__/test-suite/groups/function-join/case010.json new file mode 100644 index 00000000..d9dbbee6 --- /dev/null +++ b/__tests__/test-suite/groups/function-join/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "$join([\"hello\"], 3)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-join/case011.json b/__tests__/test-suite/groups/function-join/case011.json new file mode 100644 index 00000000..6f84e0b0 --- /dev/null +++ b/__tests__/test-suite/groups/function-join/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$join()", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-keys/case000.json b/__tests__/test-suite/groups/function-keys/case000.json new file mode 100644 index 00000000..71e9c29f --- /dev/null +++ b/__tests__/test-suite/groups/function-keys/case000.json @@ -0,0 +1,9 @@ +{ + "expr": "$keys(Account)", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "Account Name", + "Order" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-keys/case001.json b/__tests__/test-suite/groups/function-keys/case001.json new file mode 100644 index 00000000..f813e486 --- /dev/null +++ b/__tests__/test-suite/groups/function-keys/case001.json @@ -0,0 +1,13 @@ +{ + "expr": "$keys(Account.Order.Product)", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "Product Name", + "ProductID", + "SKU", + "Description", + "Price", + "Quantity" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-keys/case002.json b/__tests__/test-suite/groups/function-keys/case002.json new file mode 100644 index 00000000..fde16468 --- /dev/null +++ b/__tests__/test-suite/groups/function-keys/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$keys({})", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-keys/case003.json b/__tests__/test-suite/groups/function-keys/case003.json new file mode 100644 index 00000000..e3463230 --- /dev/null +++ b/__tests__/test-suite/groups/function-keys/case003.json @@ -0,0 +1,8 @@ +{ + "expr": "$keys({\"foo\":{}})", + "dataset": null, + "bindings": {}, + "result": [ + "foo" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-keys/case004.json b/__tests__/test-suite/groups/function-keys/case004.json new file mode 100644 index 00000000..ded845ec --- /dev/null +++ b/__tests__/test-suite/groups/function-keys/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$keys(\"foo\")", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-keys/case005.json b/__tests__/test-suite/groups/function-keys/case005.json new file mode 100644 index 00000000..57f00aa7 --- /dev/null +++ b/__tests__/test-suite/groups/function-keys/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$keys(function(){1})", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-keys/case006.json b/__tests__/test-suite/groups/function-keys/case006.json new file mode 100644 index 00000000..47979881 --- /dev/null +++ b/__tests__/test-suite/groups/function-keys/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$keys([\"foo\", \"bar\"])", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case000.json b/__tests__/test-suite/groups/function-length/case000.json new file mode 100644 index 00000000..ba27a8ec --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$length(\"\")", + "dataset": null, + "bindings": {}, + "result": 0 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case001.json b/__tests__/test-suite/groups/function-length/case001.json new file mode 100644 index 00000000..27c2442e --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$length(\"hello\")", + "dataset": null, + "bindings": {}, + "result": 5 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case002.json b/__tests__/test-suite/groups/function-length/case002.json new file mode 100644 index 00000000..4fc1f26f --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$length(missing)", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case003.json b/__tests__/test-suite/groups/function-length/case003.json new file mode 100644 index 00000000..29829684 --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$length(\"\\u03BB-calculus\")", + "dataset": null, + "bindings": {}, + "result": 10 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case004.json b/__tests__/test-suite/groups/function-length/case004.json new file mode 100644 index 00000000..13d616f3 --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$length(\"\\uD834\\uDD1E\")", + "dataset": null, + "bindings": {}, + "result": 2 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case005.json b/__tests__/test-suite/groups/function-length/case005.json new file mode 100644 index 00000000..cd47df84 --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$length(\"𝄞\")", + "dataset": null, + "bindings": {}, + "result": 2 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case006.json b/__tests__/test-suite/groups/function-length/case006.json new file mode 100644 index 00000000..35c7e1e1 --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$length(\"超明體繁\")", + "dataset": null, + "bindings": {}, + "result": 4 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case007.json b/__tests__/test-suite/groups/function-length/case007.json new file mode 100644 index 00000000..d33c1ea3 --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "$length(\"\\t\")", + "dataset": null, + "bindings": {}, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case008.json b/__tests__/test-suite/groups/function-length/case008.json new file mode 100644 index 00000000..f856dcc4 --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "$length(\"\\n\")", + "dataset": null, + "bindings": {}, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case009.json b/__tests__/test-suite/groups/function-length/case009.json new file mode 100644 index 00000000..70d4b18b --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "$length(1234)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case010.json b/__tests__/test-suite/groups/function-length/case010.json new file mode 100644 index 00000000..6160ab69 --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "$length(null)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case011.json b/__tests__/test-suite/groups/function-length/case011.json new file mode 100644 index 00000000..a41c8493 --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$length(true)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case012.json b/__tests__/test-suite/groups/function-length/case012.json new file mode 100644 index 00000000..9a51f691 --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "$length([\"str\"])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case013.json b/__tests__/test-suite/groups/function-length/case013.json new file mode 100644 index 00000000..aac3bb39 --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "$length()", + "data": 23, + "bindings": {}, + "code": "T0411" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case014.json b/__tests__/test-suite/groups/function-length/case014.json new file mode 100644 index 00000000..7b77ce50 --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "$length()", + "dataset": "dataset5", + "bindings": {}, + "code": "T0411" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-length/case015.json b/__tests__/test-suite/groups/function-length/case015.json new file mode 100644 index 00000000..2835b1b0 --- /dev/null +++ b/__tests__/test-suite/groups/function-length/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "$length(\"Hello\", \"World\")", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-lookup/case000.json b/__tests__/test-suite/groups/function-lookup/case000.json new file mode 100644 index 00000000..b539cd07 --- /dev/null +++ b/__tests__/test-suite/groups/function-lookup/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$lookup(Account, \"Account Name\")", + "dataset": "dataset5", + "bindings": {}, + "result": "Firefly" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-lookup/case001.json b/__tests__/test-suite/groups/function-lookup/case001.json new file mode 100644 index 00000000..8c4f88ca --- /dev/null +++ b/__tests__/test-suite/groups/function-lookup/case001.json @@ -0,0 +1,11 @@ +{ + "expr": "$lookup(Account.Order.Product, \"Product Name\")", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "Bowler Hat", + "Trilby hat", + "Bowler Hat", + "Cloak" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-lookup/case002.json b/__tests__/test-suite/groups/function-lookup/case002.json new file mode 100644 index 00000000..b308fab9 --- /dev/null +++ b/__tests__/test-suite/groups/function-lookup/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$lookup(Account.Order.Product.ProductID, \"Product Name\")", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-lookup/case003.json b/__tests__/test-suite/groups/function-lookup/case003.json new file mode 100644 index 00000000..2091120e --- /dev/null +++ b/__tests__/test-suite/groups/function-lookup/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$lookup($$, \"gust\")", + "dataset": "dataset9", + "bindings": {}, + "result": null +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-lowercase/case000.json b/__tests__/test-suite/groups/function-lowercase/case000.json new file mode 100644 index 00000000..9973d46b --- /dev/null +++ b/__tests__/test-suite/groups/function-lowercase/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$lowercase(\"Hello World\")", + "dataset": "dataset5", + "bindings": {}, + "result": "hello world" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-lowercase/case001.json b/__tests__/test-suite/groups/function-lowercase/case001.json new file mode 100644 index 00000000..1efa5256 --- /dev/null +++ b/__tests__/test-suite/groups/function-lowercase/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$lowercase(blah)", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case000.json b/__tests__/test-suite/groups/function-max/case000.json new file mode 100644 index 00000000..8670957e --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$max(Account.Order.Product.(Price * Quantity))", + "dataset": "dataset5", + "bindings": {}, + "result": 137.8 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case001.json b/__tests__/test-suite/groups/function-max/case001.json new file mode 100644 index 00000000..c3418e9b --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case001.json @@ -0,0 +1,9 @@ +{ + "expr": "Account.Order.$max(Product.(Price * Quantity))", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 68.9, + 137.8 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case002.json b/__tests__/test-suite/groups/function-max/case002.json new file mode 100644 index 00000000..9ec0f151 --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case002.json @@ -0,0 +1,9 @@ +{ + "expr": "Account.Order.(OrderID & \": \" & $count(Product.(Price*Quantity)))", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "order103: 2", + "order104: 2" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case003.json b/__tests__/test-suite/groups/function-max/case003.json new file mode 100644 index 00000000..2b1132eb --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$max([])", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case004.json b/__tests__/test-suite/groups/function-max/case004.json new file mode 100644 index 00000000..7441d533 --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$max([1,2,3])", + "dataset": null, + "bindings": {}, + "result": 3 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case005.json b/__tests__/test-suite/groups/function-max/case005.json new file mode 100644 index 00000000..0c4ac6fe --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$max([\"1\",\"2\",\"3\"])", + "dataset": null, + "bindings": {}, + "code": "T0412" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case006.json b/__tests__/test-suite/groups/function-max/case006.json new file mode 100644 index 00000000..53145ee7 --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$max([\"1\",\"2\",3])", + "dataset": null, + "bindings": {}, + "code": "T0412" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case007.json b/__tests__/test-suite/groups/function-max/case007.json new file mode 100644 index 00000000..de447e86 --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "$max(1)", + "dataset": null, + "bindings": {}, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case008.json b/__tests__/test-suite/groups/function-max/case008.json new file mode 100644 index 00000000..0772716d --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "$max([-1,-5])", + "dataset": null, + "bindings": {}, + "result": -1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case009.json b/__tests__/test-suite/groups/function-max/case009.json new file mode 100644 index 00000000..9d322eb7 --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "$max([],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case010.json b/__tests__/test-suite/groups/function-max/case010.json new file mode 100644 index 00000000..bd9fc50e --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "$max([1,2,3],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case011.json b/__tests__/test-suite/groups/function-max/case011.json new file mode 100644 index 00000000..bb96993d --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$max([],[],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case012.json b/__tests__/test-suite/groups/function-max/case012.json new file mode 100644 index 00000000..7ce53d4e --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "$max([1,2],[],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case013.json b/__tests__/test-suite/groups/function-max/case013.json new file mode 100644 index 00000000..e74815b6 --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "$max(undefined)", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case014.json b/__tests__/test-suite/groups/function-max/case014.json new file mode 100644 index 00000000..59fbd0b2 --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "$min(Account.Order.Product.(Price * Quantity))", + "dataset": "dataset5", + "bindings": {}, + "result": 21.67 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case015.json b/__tests__/test-suite/groups/function-max/case015.json new file mode 100644 index 00000000..5f4c1a88 --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case015.json @@ -0,0 +1,9 @@ +{ + "expr": "Account.Order.$min(Product.(Price * Quantity))", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 21.67, + 107.99 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case016.json b/__tests__/test-suite/groups/function-max/case016.json new file mode 100644 index 00000000..f48409f4 --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case016.json @@ -0,0 +1,9 @@ +{ + "expr": "Account.Order.(OrderID & \": \" & $min(Product.(Price*Quantity)))", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "order103: 21.67", + "order104: 107.99" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case017.json b/__tests__/test-suite/groups/function-max/case017.json new file mode 100644 index 00000000..166c123b --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "$min([])", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case018.json b/__tests__/test-suite/groups/function-max/case018.json new file mode 100644 index 00000000..9902c373 --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case018.json @@ -0,0 +1,6 @@ +{ + "expr": "$min([1,2,3])", + "dataset": null, + "bindings": {}, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case019.json b/__tests__/test-suite/groups/function-max/case019.json new file mode 100644 index 00000000..e257905f --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case019.json @@ -0,0 +1,6 @@ +{ + "expr": "$min([\"1\",\"2\",\"3\"])", + "dataset": null, + "bindings": {}, + "code": "T0412" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case020.json b/__tests__/test-suite/groups/function-max/case020.json new file mode 100644 index 00000000..7c5b3100 --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case020.json @@ -0,0 +1,6 @@ +{ + "expr": "$min([\"1\",\"2\",3])", + "dataset": null, + "bindings": {}, + "code": "T0412" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case021.json b/__tests__/test-suite/groups/function-max/case021.json new file mode 100644 index 00000000..8a2d1fba --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case021.json @@ -0,0 +1,6 @@ +{ + "expr": "$min(1)", + "dataset": null, + "bindings": {}, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case022.json b/__tests__/test-suite/groups/function-max/case022.json new file mode 100644 index 00000000..f4caf21d --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case022.json @@ -0,0 +1,6 @@ +{ + "expr": "$min([],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case023.json b/__tests__/test-suite/groups/function-max/case023.json new file mode 100644 index 00000000..f6e6efb8 --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case023.json @@ -0,0 +1,6 @@ +{ + "expr": "$min([1,2,3],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case024.json b/__tests__/test-suite/groups/function-max/case024.json new file mode 100644 index 00000000..bd6d263a --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case024.json @@ -0,0 +1,6 @@ +{ + "expr": "$min([],[],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case025.json b/__tests__/test-suite/groups/function-max/case025.json new file mode 100644 index 00000000..7fea0739 --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case025.json @@ -0,0 +1,6 @@ +{ + "expr": "$min([1,2],[],[])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-max/case026.json b/__tests__/test-suite/groups/function-max/case026.json new file mode 100644 index 00000000..1b83ef5d --- /dev/null +++ b/__tests__/test-suite/groups/function-max/case026.json @@ -0,0 +1,6 @@ +{ + "expr": "$min(undefined)", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-merge/case000.json b/__tests__/test-suite/groups/function-merge/case000.json new file mode 100644 index 00000000..6234a17c --- /dev/null +++ b/__tests__/test-suite/groups/function-merge/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$merge(nothing)", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-merge/case001.json b/__tests__/test-suite/groups/function-merge/case001.json new file mode 100644 index 00000000..ddaa10ce --- /dev/null +++ b/__tests__/test-suite/groups/function-merge/case001.json @@ -0,0 +1,8 @@ +{ + "expr": "$merge({\"a\":1})", + "dataset": "dataset5", + "bindings": {}, + "result": { + "a": 1 + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-merge/case002.json b/__tests__/test-suite/groups/function-merge/case002.json new file mode 100644 index 00000000..ff679a5a --- /dev/null +++ b/__tests__/test-suite/groups/function-merge/case002.json @@ -0,0 +1,9 @@ +{ + "expr": "$merge([{\"a\":1}, {\"b\":2}])", + "dataset": "dataset5", + "bindings": {}, + "result": { + "a": 1, + "b": 2 + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-merge/case003.json b/__tests__/test-suite/groups/function-merge/case003.json new file mode 100644 index 00000000..8c1c581c --- /dev/null +++ b/__tests__/test-suite/groups/function-merge/case003.json @@ -0,0 +1,10 @@ +{ + "expr": "$merge([{\"a\": 1}, {\"b\": 2, \"c\": 3}])", + "dataset": "dataset5", + "bindings": {}, + "result": { + "a": 1, + "b": 2, + "c": 3 + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-merge/case004.json b/__tests__/test-suite/groups/function-merge/case004.json new file mode 100644 index 00000000..d320ee3d --- /dev/null +++ b/__tests__/test-suite/groups/function-merge/case004.json @@ -0,0 +1,9 @@ +{ + "expr": "$merge([{\"a\": 1}, {\"b\": 2, \"a\": 3}])", + "dataset": "dataset5", + "bindings": {}, + "result": { + "a": 3, + "b": 2 + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case000.json b/__tests__/test-suite/groups/function-number/case000.json new file mode 100644 index 00000000..6f1919d2 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(0)", + "dataset": null, + "bindings": {}, + "result": 0 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case001.json b/__tests__/test-suite/groups/function-number/case001.json new file mode 100644 index 00000000..35d1ca10 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(10)", + "dataset": null, + "bindings": {}, + "result": 10 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case002.json b/__tests__/test-suite/groups/function-number/case002.json new file mode 100644 index 00000000..2f58611a --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(-0.05)", + "dataset": null, + "bindings": {}, + "result": -0.05 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case003.json b/__tests__/test-suite/groups/function-number/case003.json new file mode 100644 index 00000000..a4057b35 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(\"0\")", + "dataset": null, + "bindings": {}, + "result": 0 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case004.json b/__tests__/test-suite/groups/function-number/case004.json new file mode 100644 index 00000000..052f18a2 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(\"-0.05\")", + "dataset": null, + "bindings": {}, + "result": -0.05 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case005.json b/__tests__/test-suite/groups/function-number/case005.json new file mode 100644 index 00000000..8df81dcb --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(\"1e2\")", + "dataset": null, + "bindings": {}, + "result": 100 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case006.json b/__tests__/test-suite/groups/function-number/case006.json new file mode 100644 index 00000000..d963271b --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(\"1.0e-2\")", + "dataset": null, + "bindings": {}, + "result": 0.01 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case007.json b/__tests__/test-suite/groups/function-number/case007.json new file mode 100644 index 00000000..2cb5a084 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(\"1e0\")", + "dataset": null, + "bindings": {}, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case008.json b/__tests__/test-suite/groups/function-number/case008.json new file mode 100644 index 00000000..388abd06 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(\"10e500\")", + "dataset": null, + "bindings": {}, + "code": "D3030" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case009.json b/__tests__/test-suite/groups/function-number/case009.json new file mode 100644 index 00000000..7f45fad5 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(\"Hello world\")", + "dataset": null, + "bindings": {}, + "code": "D3030" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case010.json b/__tests__/test-suite/groups/function-number/case010.json new file mode 100644 index 00000000..cc05e9b6 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(\"1/2\")", + "dataset": null, + "bindings": {}, + "code": "D3030" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case011.json b/__tests__/test-suite/groups/function-number/case011.json new file mode 100644 index 00000000..80d7b483 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(\"1234 hello\")", + "dataset": null, + "bindings": {}, + "code": "D3030" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case012.json b/__tests__/test-suite/groups/function-number/case012.json new file mode 100644 index 00000000..14130ed9 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(\"\")", + "dataset": null, + "bindings": {}, + "code": "D3030" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case013.json b/__tests__/test-suite/groups/function-number/case013.json new file mode 100644 index 00000000..b860fc1a --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(true)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case014.json b/__tests__/test-suite/groups/function-number/case014.json new file mode 100644 index 00000000..aeb487fc --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(false)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case015.json b/__tests__/test-suite/groups/function-number/case015.json new file mode 100644 index 00000000..e16c182c --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(Account.blah)", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case016.json b/__tests__/test-suite/groups/function-number/case016.json new file mode 100644 index 00000000..1680999c --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case016.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(null)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case017.json b/__tests__/test-suite/groups/function-number/case017.json new file mode 100644 index 00000000..93b816bf --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "$number([])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case018.json b/__tests__/test-suite/groups/function-number/case018.json new file mode 100644 index 00000000..bbe61052 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case018.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(\"[1]\")", + "dataset": null, + "bindings": {}, + "code": "D3030" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case019.json b/__tests__/test-suite/groups/function-number/case019.json new file mode 100644 index 00000000..8bdd9280 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case019.json @@ -0,0 +1,6 @@ +{ + "expr": "$number([1,2])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case020.json b/__tests__/test-suite/groups/function-number/case020.json new file mode 100644 index 00000000..e129f4b8 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case020.json @@ -0,0 +1,6 @@ +{ + "expr": "$number([\"hello\"])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case021.json b/__tests__/test-suite/groups/function-number/case021.json new file mode 100644 index 00000000..6b6c01a9 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case021.json @@ -0,0 +1,6 @@ +{ + "expr": "$number([\"2\"])", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case022.json b/__tests__/test-suite/groups/function-number/case022.json new file mode 100644 index 00000000..c2139b2d --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case022.json @@ -0,0 +1,6 @@ +{ + "expr": "$number({})", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case023.json b/__tests__/test-suite/groups/function-number/case023.json new file mode 100644 index 00000000..3703606c --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case023.json @@ -0,0 +1,6 @@ +{ + "expr": "$number({\"hello\":\"world\"})", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case024.json b/__tests__/test-suite/groups/function-number/case024.json new file mode 100644 index 00000000..a576ea29 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case024.json @@ -0,0 +1,6 @@ +{ + "expr": "$number($number)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case025.json b/__tests__/test-suite/groups/function-number/case025.json new file mode 100644 index 00000000..50ab2d81 --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case025.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(function(){5})", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-number/case026.json b/__tests__/test-suite/groups/function-number/case026.json new file mode 100644 index 00000000..b7c32c5d --- /dev/null +++ b/__tests__/test-suite/groups/function-number/case026.json @@ -0,0 +1,6 @@ +{ + "expr": "$number(1,2)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-pad/case000.json b/__tests__/test-suite/groups/function-pad/case000.json new file mode 100644 index 00000000..da8cc9ef --- /dev/null +++ b/__tests__/test-suite/groups/function-pad/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$pad(\"foo\", 5)", + "dataset": null, + "bindings": {}, + "result": "foo " +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-pad/case001.json b/__tests__/test-suite/groups/function-pad/case001.json new file mode 100644 index 00000000..9e1bab44 --- /dev/null +++ b/__tests__/test-suite/groups/function-pad/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$pad(\"foo\", -5)", + "dataset": null, + "bindings": {}, + "result": " foo" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-pad/case002.json b/__tests__/test-suite/groups/function-pad/case002.json new file mode 100644 index 00000000..5416b19b --- /dev/null +++ b/__tests__/test-suite/groups/function-pad/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$pad(\"foo\", -5, \"#\")", + "dataset": null, + "bindings": {}, + "result": "##foo" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-pad/case003.json b/__tests__/test-suite/groups/function-pad/case003.json new file mode 100644 index 00000000..a5aca10b --- /dev/null +++ b/__tests__/test-suite/groups/function-pad/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$pad(\"foo\", 5, \"\")", + "dataset": null, + "bindings": {}, + "result": "foo " +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-pad/case004.json b/__tests__/test-suite/groups/function-pad/case004.json new file mode 100644 index 00000000..5746999f --- /dev/null +++ b/__tests__/test-suite/groups/function-pad/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$pad(\"foo\", 1)", + "dataset": null, + "bindings": {}, + "result": "foo" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-pad/case005.json b/__tests__/test-suite/groups/function-pad/case005.json new file mode 100644 index 00000000..b1cf709a --- /dev/null +++ b/__tests__/test-suite/groups/function-pad/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$pad(\"foo\", 8, \"-+\")", + "dataset": null, + "bindings": {}, + "result": "foo-+-+-" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-pad/case006.json b/__tests__/test-suite/groups/function-pad/case006.json new file mode 100644 index 00000000..ccc5fba7 --- /dev/null +++ b/__tests__/test-suite/groups/function-pad/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$pad(nothing, 1)", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-power/case000.json b/__tests__/test-suite/groups/function-power/case000.json new file mode 100644 index 00000000..9ae3cbbc --- /dev/null +++ b/__tests__/test-suite/groups/function-power/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$power(4, 2)", + "dataset": null, + "bindings": {}, + "result": 16 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-power/case001.json b/__tests__/test-suite/groups/function-power/case001.json new file mode 100644 index 00000000..ddf93cbd --- /dev/null +++ b/__tests__/test-suite/groups/function-power/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$power(4, 0.5)", + "dataset": null, + "bindings": {}, + "result": 2 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-power/case002.json b/__tests__/test-suite/groups/function-power/case002.json new file mode 100644 index 00000000..99902571 --- /dev/null +++ b/__tests__/test-suite/groups/function-power/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$power(10, -2)", + "dataset": null, + "bindings": {}, + "result": 0.01 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-power/case003.json b/__tests__/test-suite/groups/function-power/case003.json new file mode 100644 index 00000000..78edf382 --- /dev/null +++ b/__tests__/test-suite/groups/function-power/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$power(-2, 3)", + "dataset": null, + "bindings": {}, + "result": -8 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-power/case004.json b/__tests__/test-suite/groups/function-power/case004.json new file mode 100644 index 00000000..bc846195 --- /dev/null +++ b/__tests__/test-suite/groups/function-power/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$power(nothing, 3)", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-power/case005.json b/__tests__/test-suite/groups/function-power/case005.json new file mode 100644 index 00000000..b7df4c3e --- /dev/null +++ b/__tests__/test-suite/groups/function-power/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$power(-2, 1/3)", + "dataset": null, + "bindings": {}, + "code": "D3061" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-power/case006.json b/__tests__/test-suite/groups/function-power/case006.json new file mode 100644 index 00000000..8dd0319d --- /dev/null +++ b/__tests__/test-suite/groups/function-power/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$power(100, 1000)", + "dataset": null, + "bindings": {}, + "code": "D3061" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-replace/case000.json b/__tests__/test-suite/groups/function-replace/case000.json new file mode 100644 index 00000000..fd5c7cc8 --- /dev/null +++ b/__tests__/test-suite/groups/function-replace/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"Hello World\", \"World\", \"Everyone\")", + "dataset": null, + "bindings": {}, + "result": "Hello Everyone" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-replace/case001.json b/__tests__/test-suite/groups/function-replace/case001.json new file mode 100644 index 00000000..ac172554 --- /dev/null +++ b/__tests__/test-suite/groups/function-replace/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"the cat sat on the mat\", \"at\", \"it\")", + "dataset": null, + "bindings": {}, + "result": "the cit sit on the mit" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-replace/case002.json b/__tests__/test-suite/groups/function-replace/case002.json new file mode 100644 index 00000000..6fda4a96 --- /dev/null +++ b/__tests__/test-suite/groups/function-replace/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"the cat sat on the mat\", \"at\", \"it\", 0)", + "dataset": null, + "bindings": {}, + "result": "the cat sat on the mat" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-replace/case003.json b/__tests__/test-suite/groups/function-replace/case003.json new file mode 100644 index 00000000..6b286b8b --- /dev/null +++ b/__tests__/test-suite/groups/function-replace/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"the cat sat on the mat\", \"at\", \"it\", 2)", + "dataset": null, + "bindings": {}, + "result": "the cit sit on the mat" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-replace/case004.json b/__tests__/test-suite/groups/function-replace/case004.json new file mode 100644 index 00000000..605fdd60 --- /dev/null +++ b/__tests__/test-suite/groups/function-replace/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(nothing, \"at\", \"it\", 2)", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-replace/case005.json b/__tests__/test-suite/groups/function-replace/case005.json new file mode 100644 index 00000000..48b1a98b --- /dev/null +++ b/__tests__/test-suite/groups/function-replace/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"hello\")", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-replace/case006.json b/__tests__/test-suite/groups/function-replace/case006.json new file mode 100644 index 00000000..77637007 --- /dev/null +++ b/__tests__/test-suite/groups/function-replace/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"hello\", \"l\", \"1\", null)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-replace/case007.json b/__tests__/test-suite/groups/function-replace/case007.json new file mode 100644 index 00000000..8698a9b2 --- /dev/null +++ b/__tests__/test-suite/groups/function-replace/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"hello\", \"l\", \"1\", -2)", + "dataset": null, + "bindings": {}, + "code": "D3011" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-replace/case008.json b/__tests__/test-suite/groups/function-replace/case008.json new file mode 100644 index 00000000..39ce3d9a --- /dev/null +++ b/__tests__/test-suite/groups/function-replace/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"hello\", 1)", + "data": "hello", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-replace/case009.json b/__tests__/test-suite/groups/function-replace/case009.json new file mode 100644 index 00000000..df53f340 --- /dev/null +++ b/__tests__/test-suite/groups/function-replace/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"hello\", \"\", \"bye\")", + "dataset": null, + "bindings": {}, + "code": "D3010" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-replace/case010.json b/__tests__/test-suite/groups/function-replace/case010.json new file mode 100644 index 00000000..a632c57b --- /dev/null +++ b/__tests__/test-suite/groups/function-replace/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"hello\", 2, 1)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-replace/case011.json b/__tests__/test-suite/groups/function-replace/case011.json new file mode 100644 index 00000000..5721cbd2 --- /dev/null +++ b/__tests__/test-suite/groups/function-replace/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(123, 2, 1)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case000.json b/__tests__/test-suite/groups/function-round/case000.json new file mode 100644 index 00000000..3fb324bb --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(4)", + "dataset": null, + "bindings": {}, + "result": 4 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case001.json b/__tests__/test-suite/groups/function-round/case001.json new file mode 100644 index 00000000..0c95344d --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(2.3)", + "dataset": null, + "bindings": {}, + "result": 2 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case002.json b/__tests__/test-suite/groups/function-round/case002.json new file mode 100644 index 00000000..ff0b2360 --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(2.7)", + "dataset": null, + "bindings": {}, + "result": 3 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case003.json b/__tests__/test-suite/groups/function-round/case003.json new file mode 100644 index 00000000..7f61c2e4 --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(2.5)", + "dataset": null, + "bindings": {}, + "result": 2 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case004.json b/__tests__/test-suite/groups/function-round/case004.json new file mode 100644 index 00000000..caee2a2d --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(3.5)", + "dataset": null, + "bindings": {}, + "result": 4 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case005.json b/__tests__/test-suite/groups/function-round/case005.json new file mode 100644 index 00000000..4e4372da --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(-0.5)", + "dataset": null, + "bindings": {}, + "result": 0 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case006.json b/__tests__/test-suite/groups/function-round/case006.json new file mode 100644 index 00000000..328f83a1 --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(-0.3)", + "dataset": null, + "bindings": {}, + "result": 0 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case007.json b/__tests__/test-suite/groups/function-round/case007.json new file mode 100644 index 00000000..c41daf81 --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(0.5)", + "dataset": null, + "bindings": {}, + "result": 0 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case008.json b/__tests__/test-suite/groups/function-round/case008.json new file mode 100644 index 00000000..d67d8700 --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(-7.5)", + "dataset": null, + "bindings": {}, + "result": -8 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case009.json b/__tests__/test-suite/groups/function-round/case009.json new file mode 100644 index 00000000..76ebb59a --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(-8.5)", + "dataset": null, + "bindings": {}, + "result": -8 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case010.json b/__tests__/test-suite/groups/function-round/case010.json new file mode 100644 index 00000000..4d529a97 --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(4.49, 1)", + "dataset": null, + "bindings": {}, + "result": 4.5 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case011.json b/__tests__/test-suite/groups/function-round/case011.json new file mode 100644 index 00000000..a92e6f32 --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(4.525, 2)", + "dataset": null, + "bindings": {}, + "result": 4.52 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case012.json b/__tests__/test-suite/groups/function-round/case012.json new file mode 100644 index 00000000..566a5f49 --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(4.515, 2)", + "dataset": null, + "bindings": {}, + "result": 4.52 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case013.json b/__tests__/test-suite/groups/function-round/case013.json new file mode 100644 index 00000000..48af7220 --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(12345, -2)", + "dataset": null, + "bindings": {}, + "result": 12300 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case014.json b/__tests__/test-suite/groups/function-round/case014.json new file mode 100644 index 00000000..81e09308 --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(12450, -2)", + "dataset": null, + "bindings": {}, + "result": 12400 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case015.json b/__tests__/test-suite/groups/function-round/case015.json new file mode 100644 index 00000000..ae6d765e --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(12350, -2)", + "dataset": null, + "bindings": {}, + "result": 12400 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case016.json b/__tests__/test-suite/groups/function-round/case016.json new file mode 100644 index 00000000..d36fd7b0 --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case016.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(6.022e-23, 24)", + "dataset": null, + "bindings": {}, + "result": 6e-23 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-round/case017.json b/__tests__/test-suite/groups/function-round/case017.json new file mode 100644 index 00000000..7932b336 --- /dev/null +++ b/__tests__/test-suite/groups/function-round/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "$round(unknown)", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-shuffle/case000.json b/__tests__/test-suite/groups/function-shuffle/case000.json new file mode 100644 index 00000000..beb37983 --- /dev/null +++ b/__tests__/test-suite/groups/function-shuffle/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$count($shuffle([1..10]))", + "dataset": "dataset1", + "bindings": {}, + "result": 10 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-shuffle/case001.json b/__tests__/test-suite/groups/function-shuffle/case001.json new file mode 100644 index 00000000..56635dbe --- /dev/null +++ b/__tests__/test-suite/groups/function-shuffle/case001.json @@ -0,0 +1,17 @@ +{ + "expr": "$sort($shuffle([1..10]))", + "dataset": "dataset1", + "bindings": {}, + "result": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-shuffle/case002.json b/__tests__/test-suite/groups/function-shuffle/case002.json new file mode 100644 index 00000000..5ed7c35d --- /dev/null +++ b/__tests__/test-suite/groups/function-shuffle/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$shuffle(nothing)", + "dataset": "dataset1", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-shuffle/case003.json b/__tests__/test-suite/groups/function-shuffle/case003.json new file mode 100644 index 00000000..4b89b592 --- /dev/null +++ b/__tests__/test-suite/groups/function-shuffle/case003.json @@ -0,0 +1,8 @@ +{ + "expr": "$shuffle([1])", + "dataset": "dataset1", + "bindings": {}, + "result": [ + 1 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sift/case000.json b/__tests__/test-suite/groups/function-sift/case000.json new file mode 100644 index 00000000..ea945f4e --- /dev/null +++ b/__tests__/test-suite/groups/function-sift/case000.json @@ -0,0 +1,21 @@ +{ + "expr": "$sift(λ($v){$v.**.Postcode})", + "dataset": "dataset1", + "bindings": {}, + "result": { + "Address": { + "Street": "Hursley Park", + "City": "Winchester", + "Postcode": "SO21 2JN" + }, + "Other": { + "Over 18 ?": true, + "Misc": null, + "Alternative.Address": { + "Street": "Brick Lane", + "City": "London", + "Postcode": "E1 6RF" + } + } + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sift/case001.json b/__tests__/test-suite/groups/function-sift/case001.json new file mode 100644 index 00000000..b5c0bbd5 --- /dev/null +++ b/__tests__/test-suite/groups/function-sift/case001.json @@ -0,0 +1,21 @@ +{ + "expr": "**[*].$sift(λ($v){$v.Postcode})", + "dataset": "dataset1", + "bindings": {}, + "result": [ + { + "Address": { + "Street": "Hursley Park", + "City": "Winchester", + "Postcode": "SO21 2JN" + } + }, + { + "Alternative.Address": { + "Street": "Brick Lane", + "City": "London", + "Postcode": "E1 6RF" + } + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sift/case002.json b/__tests__/test-suite/groups/function-sift/case002.json new file mode 100644 index 00000000..7c46a08c --- /dev/null +++ b/__tests__/test-suite/groups/function-sift/case002.json @@ -0,0 +1,13 @@ +{ + "expr": "$sift(λ($v, $k){$k ~> /^A/})", + "dataset": "dataset1", + "bindings": {}, + "result": { + "Age": 28, + "Address": { + "Street": "Hursley Park", + "City": "Winchester", + "Postcode": "SO21 2JN" + } + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sift/case003.json b/__tests__/test-suite/groups/function-sift/case003.json new file mode 100644 index 00000000..7a89d895 --- /dev/null +++ b/__tests__/test-suite/groups/function-sift/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$toMillis(\"1970-01-01T00:00:00.001Z\")", + "dataset": "dataset5", + "bindings": {}, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sift/case004.json b/__tests__/test-suite/groups/function-sift/case004.json new file mode 100644 index 00000000..9e4617d0 --- /dev/null +++ b/__tests__/test-suite/groups/function-sift/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$toMillis(\"2017-10-30T16:25:32.935Z\")", + "dataset": "dataset5", + "bindings": {}, + "result": 1509380732935 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sift/case005.json b/__tests__/test-suite/groups/function-sift/case005.json new file mode 100644 index 00000000..7c07971e --- /dev/null +++ b/__tests__/test-suite/groups/function-sift/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$toMillis(foo)", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sift/case006.json b/__tests__/test-suite/groups/function-sift/case006.json new file mode 100644 index 00000000..0bc9327d --- /dev/null +++ b/__tests__/test-suite/groups/function-sift/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$toMillis(\"foo\")", + "dataset": "dataset5", + "bindings": {}, + "code": "D3110" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case000.json b/__tests__/test-suite/groups/function-signatures/case000.json new file mode 100644 index 00000000..6dff6f1f --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arg){$not($arg)}(true)", + "dataset": null, + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case001.json b/__tests__/test-suite/groups/function-signatures/case001.json new file mode 100644 index 00000000..6ffc0644 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arg){$not($arg)}(foo)", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case002.json b/__tests__/test-suite/groups/function-signatures/case002.json new file mode 100644 index 00000000..d96823af --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arg){$not($arg)}(null)", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case003.json b/__tests__/test-suite/groups/function-signatures/case003.json new file mode 100644 index 00000000..0d5b2213 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "function($x,$y){$x+$y}(2, 6)", + "dataset": null, + "bindings": {}, + "result": 8 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case004.json b/__tests__/test-suite/groups/function-signatures/case004.json new file mode 100644 index 00000000..28f25484 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case004.json @@ -0,0 +1,12 @@ +{ + "expr": "[1..5].function($x,$y){$x+$y}(6)", + "dataset": null, + "bindings": {}, + "result": [ + 7, + 8, + 9, + 10, + 11 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case005.json b/__tests__/test-suite/groups/function-signatures/case005.json new file mode 100644 index 00000000..e7618ff7 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case005.json @@ -0,0 +1,12 @@ +{ + "expr": "[1..5].function($x,$y){$x+$y}(2, 6)", + "dataset": null, + "bindings": {}, + "result": [ + 8, + 8, + 8, + 8, + 8 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case006.json b/__tests__/test-suite/groups/function-signatures/case006.json new file mode 100644 index 00000000..78e84f94 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "Age.function($x,$y){$x+$y}(6)", + "dataset": "dataset1", + "bindings": {}, + "result": 34 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case007.json b/__tests__/test-suite/groups/function-signatures/case007.json new file mode 100644 index 00000000..c7d0b599 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($str){$uppercase($str)}(\"hello\")", + "dataset": null, + "bindings": {}, + "result": "HELLO" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case008.json b/__tests__/test-suite/groups/function-signatures/case008.json new file mode 100644 index 00000000..a6e04802 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case008.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product.Description.Colour.λ($str){$uppercase($str)}()", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "PURPLE", + "ORANGE", + "PURPLE", + "BLACK" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case009.json b/__tests__/test-suite/groups/function-signatures/case009.json new file mode 100644 index 00000000..8dd08bb6 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($str, $prefix){$prefix & $str}(\"World\", \"Hello \")", + "dataset": null, + "bindings": {}, + "result": "Hello World" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case010.json b/__tests__/test-suite/groups/function-signatures/case010.json new file mode 100644 index 00000000..051f2cfb --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "FirstName.λ($str, $prefix){$prefix & $str}(\"Hello \")", + "dataset": "dataset1", + "bindings": {}, + "result": "Hello Fred" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case011.json b/__tests__/test-suite/groups/function-signatures/case011.json new file mode 100644 index 00000000..6aedc198 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arr, $sep)s?:s>{$join($arr, $sep)}(\"a\")", + "dataset": null, + "bindings": {}, + "result": "a" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case012.json b/__tests__/test-suite/groups/function-signatures/case012.json new file mode 100644 index 00000000..d04bb8f3 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arr, $sep)s?:s>{$join($arr, $sep)}([\"a\"])", + "dataset": "dataset1", + "bindings": {}, + "result": "a" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case013.json b/__tests__/test-suite/groups/function-signatures/case013.json new file mode 100644 index 00000000..6b30da4f --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arr, $sep)s?:s>{$join($arr, $sep)}(\"a\", \"-\")", + "dataset": null, + "bindings": {}, + "result": "a" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case014.json b/__tests__/test-suite/groups/function-signatures/case014.json new file mode 100644 index 00000000..1a7a7358 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arr, $sep)s?:s>{$join($arr, $sep)}([\"a\"], \"-\")", + "dataset": null, + "bindings": {}, + "result": "a" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case015.json b/__tests__/test-suite/groups/function-signatures/case015.json new file mode 100644 index 00000000..e21e2841 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arr, $sep)s?:s>{$join($arr, $sep)}([\"a\", \"b\"], \"-\")", + "dataset": null, + "bindings": {}, + "result": "a-b" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case016.json b/__tests__/test-suite/groups/function-signatures/case016.json new file mode 100644 index 00000000..85d3b64b --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case016.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arr, $sep){$join($arr, $sep)}([\"a\", \"b\"], \"-\")", + "dataset": null, + "bindings": {}, + "result": "a-b" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case017.json b/__tests__/test-suite/groups/function-signatures/case017.json new file mode 100644 index 00000000..43e3912d --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arr, $sep)s?:s>{$join($arr, $sep)}([], \"-\")", + "dataset": null, + "bindings": {}, + "result": "" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case018.json b/__tests__/test-suite/groups/function-signatures/case018.json new file mode 100644 index 00000000..1b16e7c1 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case018.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arr, $sep)s?:s>{$join($arr, $sep)}(foo, \"-\")", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case019.json b/__tests__/test-suite/groups/function-signatures/case019.json new file mode 100644 index 00000000..3f341f4d --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case019.json @@ -0,0 +1,8 @@ +{ + "expr": "λ($obj){$obj}({\"hello\": \"world\"})", + "dataset": null, + "bindings": {}, + "result": { + "hello": "world" + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case020.json b/__tests__/test-suite/groups/function-signatures/case020.json new file mode 100644 index 00000000..6ee1d7d7 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case020.json @@ -0,0 +1,10 @@ +{ + "expr": "λ($arr)>>{$arr}([[1]])", + "dataset": null, + "bindings": {}, + "result": [ + [ + 1 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case021.json b/__tests__/test-suite/groups/function-signatures/case021.json new file mode 100644 index 00000000..2bb52bb4 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case021.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($num)<(ns)-:n>{$number($num)}(5)", + "dataset": null, + "bindings": {}, + "result": 5 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case022.json b/__tests__/test-suite/groups/function-signatures/case022.json new file mode 100644 index 00000000..e68909c1 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case022.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($num)<(ns)-:n>{$number($num)}(\"5\")", + "dataset": null, + "bindings": {}, + "result": 5 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case023.json b/__tests__/test-suite/groups/function-signatures/case023.json new file mode 100644 index 00000000..f6d63c8b --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case023.json @@ -0,0 +1,12 @@ +{ + "expr": "[1..5].λ($num)<(ns)-:n>{$number($num)}()", + "dataset": null, + "bindings": {}, + "result": [ + 1, + 2, + 3, + 4, + 5 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case024.json b/__tests__/test-suite/groups/function-signatures/case024.json new file mode 100644 index 00000000..12959f73 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case024.json @@ -0,0 +1,6 @@ +{ + "expr": "($twice := function($f){function($x){$f($f($x))}};$add2 := function($x){$x+2};$add4 := $twice($add2);$add4(5))", + "dataset": null, + "bindings": {}, + "result": 9 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case025.json b/__tests__/test-suite/groups/function-signatures/case025.json new file mode 100644 index 00000000..08ee9055 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case025.json @@ -0,0 +1,6 @@ +{ + "expr": "($twice := function($f):f>{function($x){$f($f($x))}};$add2 := function($x){$x+2};$add4 := $twice($add2);$add4(5))", + "dataset": null, + "bindings": {}, + "result": 9 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case026.json b/__tests__/test-suite/groups/function-signatures/case026.json new file mode 100644 index 00000000..a7a768bb --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case026.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arg)>{$arg}(5)", + "dataset": null, + "bindings": {}, + "code": "S0401" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case027.json b/__tests__/test-suite/groups/function-signatures/case027.json new file mode 100644 index 00000000..29d1f908 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case027.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arg1, $arg2){[$arg1, $arg2]}(1,\"2\")", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case028.json b/__tests__/test-suite/groups/function-signatures/case028.json new file mode 100644 index 00000000..45f8f2ea --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case028.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arg1, $arg2){[$arg1, $arg2]}(1,3,\"2\")", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case029.json b/__tests__/test-suite/groups/function-signatures/case029.json new file mode 100644 index 00000000..371f9b5f --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case029.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arg1, $arg2){[$arg1, $arg2]}(1,3, 2,\"g\")", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case030.json b/__tests__/test-suite/groups/function-signatures/case030.json new file mode 100644 index 00000000..826758d4 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case030.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arr)>{$arr}([\"3\"]) ", + "dataset": null, + "bindings": {}, + "code": "T0412" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case031.json b/__tests__/test-suite/groups/function-signatures/case031.json new file mode 100644 index 00000000..ca76b79a --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case031.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arr)>{$arr}([1, 2, \"3\"]) ", + "dataset": null, + "bindings": {}, + "code": "T0412" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case032.json b/__tests__/test-suite/groups/function-signatures/case032.json new file mode 100644 index 00000000..05ec369b --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case032.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arr)>{$arr}(\"f\")", + "dataset": null, + "bindings": {}, + "code": "T0412" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case033.json b/__tests__/test-suite/groups/function-signatures/case033.json new file mode 100644 index 00000000..ca40bb74 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case033.json @@ -0,0 +1,6 @@ +{ + "expr": "($fun := λ($arr)>{$arr};$fun(\"f\"))", + "dataset": null, + "bindings": {}, + "code": "T0412" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-signatures/case034.json b/__tests__/test-suite/groups/function-signatures/case034.json new file mode 100644 index 00000000..5c073cf0 --- /dev/null +++ b/__tests__/test-suite/groups/function-signatures/case034.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($arr)<(sa)>>{$arr}([[1]])", + "dataset": null, + "bindings": {}, + "code": "S0402" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sort/case000.json b/__tests__/test-suite/groups/function-sort/case000.json new file mode 100644 index 00000000..4decca4d --- /dev/null +++ b/__tests__/test-suite/groups/function-sort/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$sort(nothing)", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sort/case001.json b/__tests__/test-suite/groups/function-sort/case001.json new file mode 100644 index 00000000..352999f2 --- /dev/null +++ b/__tests__/test-suite/groups/function-sort/case001.json @@ -0,0 +1,8 @@ +{ + "expr": "$sort(1)", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 1 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sort/case002.json b/__tests__/test-suite/groups/function-sort/case002.json new file mode 100644 index 00000000..2b07a91a --- /dev/null +++ b/__tests__/test-suite/groups/function-sort/case002.json @@ -0,0 +1,10 @@ +{ + "expr": "$sort([1,3,2])", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 1, + 2, + 3 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sort/case003.json b/__tests__/test-suite/groups/function-sort/case003.json new file mode 100644 index 00000000..d4ec2c00 --- /dev/null +++ b/__tests__/test-suite/groups/function-sort/case003.json @@ -0,0 +1,11 @@ +{ + "expr": "$sort([1,3,22,11])", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 1, + 3, + 11, + 22 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sort/case004.json b/__tests__/test-suite/groups/function-sort/case004.json new file mode 100644 index 00000000..67f7db40 --- /dev/null +++ b/__tests__/test-suite/groups/function-sort/case004.json @@ -0,0 +1,26 @@ +{ + "expr": "[[$], [$sort($)], [$]]", + "data": [ + 1, + 3, + 2 + ], + "bindings": {}, + "result": [ + [ + 1, + 3, + 2 + ], + [ + 1, + 2, + 3 + ], + [ + 1, + 3, + 2 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sort/case005.json b/__tests__/test-suite/groups/function-sort/case005.json new file mode 100644 index 00000000..18d674b6 --- /dev/null +++ b/__tests__/test-suite/groups/function-sort/case005.json @@ -0,0 +1,11 @@ +{ + "expr": "$sort(Account.Order.Product.Price)", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 21.67, + 34.45, + 34.45, + 107.99 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sort/case006.json b/__tests__/test-suite/groups/function-sort/case006.json new file mode 100644 index 00000000..e6115431 --- /dev/null +++ b/__tests__/test-suite/groups/function-sort/case006.json @@ -0,0 +1,11 @@ +{ + "expr": "$sort(Account.Order.Product.\"Product Name\")", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "Bowler Hat", + "Bowler Hat", + "Cloak", + "Trilby hat" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sort/case007.json b/__tests__/test-suite/groups/function-sort/case007.json new file mode 100644 index 00000000..74bfadb5 --- /dev/null +++ b/__tests__/test-suite/groups/function-sort/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "$sort(Account.Order.Product)", + "dataset": "dataset5", + "bindings": {}, + "code": "D3070" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sort/case008.json b/__tests__/test-suite/groups/function-sort/case008.json new file mode 100644 index 00000000..0302b9cd --- /dev/null +++ b/__tests__/test-suite/groups/function-sort/case008.json @@ -0,0 +1,11 @@ +{ + "expr": "$sort(Account.Order.Product, function($a, $b) { $a.(Price * Quantity) > $b.(Price * Quantity) }).(Price & \" x \" & Quantity)", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "21.67 x 1", + "34.45 x 2", + "107.99 x 1", + "34.45 x 4" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sort/case009.json b/__tests__/test-suite/groups/function-sort/case009.json new file mode 100644 index 00000000..299d0ee5 --- /dev/null +++ b/__tests__/test-suite/groups/function-sort/case009.json @@ -0,0 +1,11 @@ +{ + "expr": "$sort(Account.Order.Product, function($a, $b) { $a.Price > $b.Price }).SKU", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "0406634348", + "0406654608", + "040657863", + "0406654603" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sort/case010.json b/__tests__/test-suite/groups/function-sort/case010.json new file mode 100644 index 00000000..9264be59 --- /dev/null +++ b/__tests__/test-suite/groups/function-sort/case010.json @@ -0,0 +1,11 @@ +{ + "expr": "\n (Account.Order.Product\n ~> $sort(λ($a,$b){$a.Quantity < $b.Quantity})\n ~> $sort(λ($a,$b){$a.Price > $b.Price})\n ).SKU\n ", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "0406634348", + "040657863", + "0406654608", + "0406654603" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case000.json b/__tests__/test-suite/groups/function-split/case000.json new file mode 100644 index 00000000..6d9f7105 --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case000.json @@ -0,0 +1,9 @@ +{ + "expr": "$split(\"Hello World\", \" \")", + "dataset": null, + "bindings": {}, + "result": [ + "Hello", + "World" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case001.json b/__tests__/test-suite/groups/function-split/case001.json new file mode 100644 index 00000000..063b23bf --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case001.json @@ -0,0 +1,8 @@ +{ + "expr": "$split(\"Hello\", \" \")", + "dataset": null, + "bindings": {}, + "result": [ + "Hello" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case002.json b/__tests__/test-suite/groups/function-split/case002.json new file mode 100644 index 00000000..5a10a788 --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case002.json @@ -0,0 +1,10 @@ +{ + "expr": "$split(\"Hello World\", \" \")", + "dataset": null, + "bindings": {}, + "result": [ + "Hello", + "", + "World" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case003.json b/__tests__/test-suite/groups/function-split/case003.json new file mode 100644 index 00000000..d5a0450d --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case003.json @@ -0,0 +1,12 @@ +{ + "expr": "$split(\"Hello\", \"\")", + "dataset": null, + "bindings": {}, + "result": [ + "H", + "e", + "l", + "l", + "o" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case004.json b/__tests__/test-suite/groups/function-split/case004.json new file mode 100644 index 00000000..414906ba --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$sum($split(\"12345\", \"\").$number($))", + "dataset": null, + "bindings": {}, + "result": 15 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case005.json b/__tests__/test-suite/groups/function-split/case005.json new file mode 100644 index 00000000..98b8a91e --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case005.json @@ -0,0 +1,11 @@ +{ + "expr": "$split(\"a, b, c, d\", \", \")", + "dataset": null, + "bindings": {}, + "result": [ + "a", + "b", + "c", + "d" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case006.json b/__tests__/test-suite/groups/function-split/case006.json new file mode 100644 index 00000000..d7b263f6 --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case006.json @@ -0,0 +1,9 @@ +{ + "expr": "$split(\"a, b, c, d\", \", \", 2)", + "dataset": null, + "bindings": {}, + "result": [ + "a", + "b" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case007.json b/__tests__/test-suite/groups/function-split/case007.json new file mode 100644 index 00000000..4ad95d81 --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case007.json @@ -0,0 +1,9 @@ +{ + "expr": "$split(\"a, b, c, d\", \", \", 2.5)", + "dataset": null, + "bindings": {}, + "result": [ + "a", + "b" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case008.json b/__tests__/test-suite/groups/function-split/case008.json new file mode 100644 index 00000000..43e7c94c --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case008.json @@ -0,0 +1,11 @@ +{ + "expr": "$split(\"a, b, c, d\", \", \", 10)", + "dataset": null, + "bindings": {}, + "result": [ + "a", + "b", + "c", + "d" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case009.json b/__tests__/test-suite/groups/function-split/case009.json new file mode 100644 index 00000000..30302ab1 --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "$split(\"a, b, c, d\", \", \", 0)", + "dataset": null, + "bindings": {}, + "result": [] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case010.json b/__tests__/test-suite/groups/function-split/case010.json new file mode 100644 index 00000000..2c8a0293 --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "$split(nothing, \" \")", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case011.json b/__tests__/test-suite/groups/function-split/case011.json new file mode 100644 index 00000000..22d8ef05 --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$split(\"a, b, c, d\", \", \", -3)", + "dataset": null, + "bindings": {}, + "code": "D3020" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case012.json b/__tests__/test-suite/groups/function-split/case012.json new file mode 100644 index 00000000..366d8c91 --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "$split(\"a, b, c, d\", \", \", null)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case013.json b/__tests__/test-suite/groups/function-split/case013.json new file mode 100644 index 00000000..c36b981d --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "$split(\"a, b, c, d\", \", \", -5)", + "dataset": null, + "bindings": {}, + "code": "D3020" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case014.json b/__tests__/test-suite/groups/function-split/case014.json new file mode 100644 index 00000000..2d7ba6dd --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "$split(\"a, b, c, d\", \", \", \"2\")", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case015.json b/__tests__/test-suite/groups/function-split/case015.json new file mode 100644 index 00000000..e0ee44b5 --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "$split(\"a, b, c, d\", true)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case016.json b/__tests__/test-suite/groups/function-split/case016.json new file mode 100644 index 00000000..a7d6292b --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case016.json @@ -0,0 +1,6 @@ +{ + "expr": "$split(12345, 3)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-split/case017.json b/__tests__/test-suite/groups/function-split/case017.json new file mode 100644 index 00000000..87fd295c --- /dev/null +++ b/__tests__/test-suite/groups/function-split/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "$split(12345)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-spread/case000.json b/__tests__/test-suite/groups/function-spread/case000.json new file mode 100644 index 00000000..ddcd40fa --- /dev/null +++ b/__tests__/test-suite/groups/function-spread/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$spread(\"Hello World\")", + "dataset": "dataset5", + "bindings": {}, + "result": "Hello World" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-spread/case001.json b/__tests__/test-suite/groups/function-spread/case001.json new file mode 100644 index 00000000..be3cbb76 --- /dev/null +++ b/__tests__/test-suite/groups/function-spread/case001.json @@ -0,0 +1,67 @@ +{ + "expr": "$spread((Account.Order.Product.Description))", + "dataset": "dataset5", + "bindings": {}, + "result": [ + { + "Colour": "Purple" + }, + { + "Width": 300 + }, + { + "Height": 200 + }, + { + "Depth": 210 + }, + { + "Weight": 0.75 + }, + { + "Colour": "Orange" + }, + { + "Width": 300 + }, + { + "Height": 200 + }, + { + "Depth": 210 + }, + { + "Weight": 0.6 + }, + { + "Colour": "Purple" + }, + { + "Width": 300 + }, + { + "Height": 200 + }, + { + "Depth": 210 + }, + { + "Weight": 0.75 + }, + { + "Colour": "Black" + }, + { + "Width": 30 + }, + { + "Height": 20 + }, + { + "Depth": 210 + }, + { + "Weight": 2 + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-spread/case002.json b/__tests__/test-suite/groups/function-spread/case002.json new file mode 100644 index 00000000..9fbbd000 --- /dev/null +++ b/__tests__/test-suite/groups/function-spread/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$spread(blah)", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-spread/case003.json b/__tests__/test-suite/groups/function-spread/case003.json new file mode 100644 index 00000000..5a5bfb41 --- /dev/null +++ b/__tests__/test-suite/groups/function-spread/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$string($spread(function($x){$x*$x}))", + "dataset": "dataset5", + "bindings": {}, + "result": "" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sqrt/case000.json b/__tests__/test-suite/groups/function-sqrt/case000.json new file mode 100644 index 00000000..3eb89600 --- /dev/null +++ b/__tests__/test-suite/groups/function-sqrt/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$sqrt(4)", + "dataset": null, + "bindings": {}, + "result": 2 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sqrt/case001.json b/__tests__/test-suite/groups/function-sqrt/case001.json new file mode 100644 index 00000000..f5500d30 --- /dev/null +++ b/__tests__/test-suite/groups/function-sqrt/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$sqrt(2)", + "dataset": null, + "bindings": {}, + "result": 1.4142135623730951 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sqrt/case002.json b/__tests__/test-suite/groups/function-sqrt/case002.json new file mode 100644 index 00000000..14483407 --- /dev/null +++ b/__tests__/test-suite/groups/function-sqrt/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$sqrt(nothing)", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sqrt/case003.json b/__tests__/test-suite/groups/function-sqrt/case003.json new file mode 100644 index 00000000..ef292b96 --- /dev/null +++ b/__tests__/test-suite/groups/function-sqrt/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$sqrt(-2)", + "dataset": null, + "bindings": {}, + "code": "D3060" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case000.json b/__tests__/test-suite/groups/function-string/case000.json new file mode 100644 index 00000000..e2132b8b --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(5)", + "dataset": "dataset5", + "bindings": {}, + "result": "5" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case001.json b/__tests__/test-suite/groups/function-string/case001.json new file mode 100644 index 00000000..e8318299 --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(22/7)", + "dataset": "dataset5", + "bindings": {}, + "result": "3.142857142857" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case002.json b/__tests__/test-suite/groups/function-string/case002.json new file mode 100644 index 00000000..34cae35f --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(1e100)", + "dataset": "dataset5", + "bindings": {}, + "result": "1e+100" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case003.json b/__tests__/test-suite/groups/function-string/case003.json new file mode 100644 index 00000000..638e461f --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(1e-100)", + "dataset": null, + "bindings": {}, + "result": "1e-100" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case004.json b/__tests__/test-suite/groups/function-string/case004.json new file mode 100644 index 00000000..813d0c20 --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(1e-6)", + "dataset": null, + "bindings": {}, + "result": "0.000001" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case005.json b/__tests__/test-suite/groups/function-string/case005.json new file mode 100644 index 00000000..734e8b2f --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(1e-7)", + "dataset": null, + "bindings": {}, + "result": "1e-7" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case006.json b/__tests__/test-suite/groups/function-string/case006.json new file mode 100644 index 00000000..a695d38a --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(1e20)", + "dataset": null, + "bindings": {}, + "result": "100000000000000000000" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case007.json b/__tests__/test-suite/groups/function-string/case007.json new file mode 100644 index 00000000..863b2ff6 --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(1e21)", + "dataset": null, + "bindings": {}, + "result": "1e+21" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case008.json b/__tests__/test-suite/groups/function-string/case008.json new file mode 100644 index 00000000..f09f25d0 --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case008.json @@ -0,0 +1,9 @@ +{ + "expr": "Account.Order.$string($sum(Product.(Price* Quantity)))", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "90.57", + "245.79" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case009.json b/__tests__/test-suite/groups/function-string/case009.json new file mode 100644 index 00000000..3c0bb9ad --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(true)", + "dataset": "dataset5", + "bindings": {}, + "result": "true" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case010.json b/__tests__/test-suite/groups/function-string/case010.json new file mode 100644 index 00000000..a3bb8c6d --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(false)", + "dataset": "dataset5", + "bindings": {}, + "result": "false" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case011.json b/__tests__/test-suite/groups/function-string/case011.json new file mode 100644 index 00000000..0ee660f3 --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(null)", + "dataset": "dataset5", + "bindings": {}, + "result": "null" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case012.json b/__tests__/test-suite/groups/function-string/case012.json new file mode 100644 index 00000000..988bdc1b --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(blah)", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case013.json b/__tests__/test-suite/groups/function-string/case013.json new file mode 100644 index 00000000..419ced7b --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "$string($string)", + "dataset": "dataset5", + "bindings": {}, + "result": "" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case014.json b/__tests__/test-suite/groups/function-string/case014.json new file mode 100644 index 00000000..01b32f4a --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(function(){true})", + "dataset": "dataset5", + "bindings": {}, + "result": "" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case015.json b/__tests__/test-suite/groups/function-string/case015.json new file mode 100644 index 00000000..67453c4b --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(function(){1})", + "dataset": "dataset5", + "bindings": {}, + "result": "" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case016.json b/__tests__/test-suite/groups/function-string/case016.json new file mode 100644 index 00000000..32f6413b --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case016.json @@ -0,0 +1,6 @@ +{ + "expr": "$string({\"string\": \"hello\"})", + "dataset": null, + "bindings": {}, + "result": "{\"string\":\"hello\"}" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case017.json b/__tests__/test-suite/groups/function-string/case017.json new file mode 100644 index 00000000..07b40927 --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "$string([\"string\", 5])", + "dataset": null, + "bindings": {}, + "result": "[\"string\",5]" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case018.json b/__tests__/test-suite/groups/function-string/case018.json new file mode 100644 index 00000000..5b944c4d --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case018.json @@ -0,0 +1,6 @@ +{ + "expr": "$string({ \"string\": \"hello\", \"number\": 78.8 / 2, \"null\":null, \"boolean\": false, \"function\": $sum, \"lambda\": function(){true}, \"object\": { \"str\": \"another\", \"lambda2\": function($n){$n} }, \"array\": []})", + "dataset": null, + "bindings": {}, + "result": "{\"string\":\"hello\",\"number\":39.4,\"null\":null,\"boolean\":false,\"function\":\"\",\"lambda\":\"\",\"object\":{\"str\":\"another\",\"lambda2\":\"\"},\"array\":[]}" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case019.json b/__tests__/test-suite/groups/function-string/case019.json new file mode 100644 index 00000000..b2d8ff7f --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case019.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(1/0)", + "dataset": null, + "bindings": {}, + "code": "D3001" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case020.json b/__tests__/test-suite/groups/function-string/case020.json new file mode 100644 index 00000000..5a633c88 --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case020.json @@ -0,0 +1,6 @@ +{ + "expr": "$string({\"inf\": 1/0})", + "dataset": null, + "bindings": {}, + "code": "D1001" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case021.json b/__tests__/test-suite/groups/function-string/case021.json new file mode 100644 index 00000000..b3c18316 --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case021.json @@ -0,0 +1,6 @@ +{ + "expr": "$string(2,3)", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-string/case022.json b/__tests__/test-suite/groups/function-string/case022.json new file mode 100644 index 00000000..e3b80c10 --- /dev/null +++ b/__tests__/test-suite/groups/function-string/case022.json @@ -0,0 +1,6 @@ +{ + "expr": "$string()", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-substring/case000.json b/__tests__/test-suite/groups/function-substring/case000.json new file mode 100644 index 00000000..a8e21470 --- /dev/null +++ b/__tests__/test-suite/groups/function-substring/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(\"hello world\", 0, 5)", + "dataset": "dataset5", + "bindings": {}, + "result": "hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-substring/case001.json b/__tests__/test-suite/groups/function-substring/case001.json new file mode 100644 index 00000000..1514752e --- /dev/null +++ b/__tests__/test-suite/groups/function-substring/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(\"hello world\", -5, 5)", + "dataset": "dataset5", + "bindings": {}, + "result": "world" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-substring/case002.json b/__tests__/test-suite/groups/function-substring/case002.json new file mode 100644 index 00000000..b713e831 --- /dev/null +++ b/__tests__/test-suite/groups/function-substring/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(\"hello world\", 6)", + "dataset": "dataset5", + "bindings": {}, + "result": "world" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-substring/case003.json b/__tests__/test-suite/groups/function-substring/case003.json new file mode 100644 index 00000000..747fa65e --- /dev/null +++ b/__tests__/test-suite/groups/function-substring/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(blah, 6)", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-substringAfter/case000.json b/__tests__/test-suite/groups/function-substringAfter/case000.json new file mode 100644 index 00000000..2f809c4c --- /dev/null +++ b/__tests__/test-suite/groups/function-substringAfter/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(\"Hello World\", \" \")", + "dataset": "dataset5", + "bindings": {}, + "result": "World" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-substringAfter/case001.json b/__tests__/test-suite/groups/function-substringAfter/case001.json new file mode 100644 index 00000000..eb8f3703 --- /dev/null +++ b/__tests__/test-suite/groups/function-substringAfter/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(\"Hello World\", \"l\")", + "dataset": "dataset5", + "bindings": {}, + "result": "lo World" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-substringAfter/case002.json b/__tests__/test-suite/groups/function-substringAfter/case002.json new file mode 100644 index 00000000..018a82b7 --- /dev/null +++ b/__tests__/test-suite/groups/function-substringAfter/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(\"Hello World\", \"f\")", + "dataset": "dataset5", + "bindings": {}, + "result": "Hello World" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-substringAfter/case003.json b/__tests__/test-suite/groups/function-substringAfter/case003.json new file mode 100644 index 00000000..69ef4f99 --- /dev/null +++ b/__tests__/test-suite/groups/function-substringAfter/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(\"Hello World\", \"ld\")", + "dataset": "dataset5", + "bindings": {}, + "result": "" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-substringAfter/case004.json b/__tests__/test-suite/groups/function-substringAfter/case004.json new file mode 100644 index 00000000..311ba660 --- /dev/null +++ b/__tests__/test-suite/groups/function-substringAfter/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(blah, \"ld\")", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-substringBefore/case000.json b/__tests__/test-suite/groups/function-substringBefore/case000.json new file mode 100644 index 00000000..6803995f --- /dev/null +++ b/__tests__/test-suite/groups/function-substringBefore/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(\"Hello World\", \" \")", + "dataset": "dataset5", + "bindings": {}, + "result": "Hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-substringBefore/case001.json b/__tests__/test-suite/groups/function-substringBefore/case001.json new file mode 100644 index 00000000..a652dd6e --- /dev/null +++ b/__tests__/test-suite/groups/function-substringBefore/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(\"Hello World\", \"l\")", + "dataset": "dataset5", + "bindings": {}, + "result": "He" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-substringBefore/case002.json b/__tests__/test-suite/groups/function-substringBefore/case002.json new file mode 100644 index 00000000..69cb659c --- /dev/null +++ b/__tests__/test-suite/groups/function-substringBefore/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(\"Hello World\", \"f\")", + "dataset": "dataset5", + "bindings": {}, + "result": "Hello World" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-substringBefore/case003.json b/__tests__/test-suite/groups/function-substringBefore/case003.json new file mode 100644 index 00000000..b1b73d63 --- /dev/null +++ b/__tests__/test-suite/groups/function-substringBefore/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(\"Hello World\", \"He\")", + "dataset": "dataset5", + "bindings": {}, + "result": "" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-substringBefore/case004.json b/__tests__/test-suite/groups/function-substringBefore/case004.json new file mode 100644 index 00000000..7693dbf6 --- /dev/null +++ b/__tests__/test-suite/groups/function-substringBefore/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(blah, \"He\")", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sum/case000.json b/__tests__/test-suite/groups/function-sum/case000.json new file mode 100644 index 00000000..6c9fe9f0 --- /dev/null +++ b/__tests__/test-suite/groups/function-sum/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$sum(Account.Order.Product.(Price * Quantity))", + "dataset": "dataset5", + "bindings": {}, + "result": 336.36 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sum/case001.json b/__tests__/test-suite/groups/function-sum/case001.json new file mode 100644 index 00000000..b0023de1 --- /dev/null +++ b/__tests__/test-suite/groups/function-sum/case001.json @@ -0,0 +1,9 @@ +{ + "expr": "Account.Order.$sum(Product.(Price * Quantity))", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 90.57000000000001, + 245.79000000000002 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sum/case002.json b/__tests__/test-suite/groups/function-sum/case002.json new file mode 100644 index 00000000..57e18b19 --- /dev/null +++ b/__tests__/test-suite/groups/function-sum/case002.json @@ -0,0 +1,9 @@ +{ + "expr": "Account.Order.(OrderID & \": \" & $sum(Product.(Price*Quantity)))", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "order103: 90.57", + "order104: 245.79" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sum/case003.json b/__tests__/test-suite/groups/function-sum/case003.json new file mode 100644 index 00000000..b7606001 --- /dev/null +++ b/__tests__/test-suite/groups/function-sum/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$sum()", + "dataset": "dataset5", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sum/case004.json b/__tests__/test-suite/groups/function-sum/case004.json new file mode 100644 index 00000000..a44a4aa4 --- /dev/null +++ b/__tests__/test-suite/groups/function-sum/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$sum(1)", + "dataset": null, + "bindings": {}, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sum/case005.json b/__tests__/test-suite/groups/function-sum/case005.json new file mode 100644 index 00000000..ca7b9643 --- /dev/null +++ b/__tests__/test-suite/groups/function-sum/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$sum(Account.Order)", + "dataset": "dataset5", + "bindings": {}, + "code": "T0412" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-sum/case006.json b/__tests__/test-suite/groups/function-sum/case006.json new file mode 100644 index 00000000..3350cc6c --- /dev/null +++ b/__tests__/test-suite/groups/function-sum/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$sum(undefined)", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-trim/case000.json b/__tests__/test-suite/groups/function-trim/case000.json new file mode 100644 index 00000000..9dd7a3ed --- /dev/null +++ b/__tests__/test-suite/groups/function-trim/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$trim(\"Hello World\")", + "dataset": null, + "bindings": {}, + "result": "Hello World" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-trim/case001.json b/__tests__/test-suite/groups/function-trim/case001.json new file mode 100644 index 00000000..d85e870d --- /dev/null +++ b/__tests__/test-suite/groups/function-trim/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$trim(\" Hello \n \t World \t \")", + "dataset": null, + "bindings": {}, + "result": "Hello World" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-trim/case002.json b/__tests__/test-suite/groups/function-trim/case002.json new file mode 100644 index 00000000..614df8e2 --- /dev/null +++ b/__tests__/test-suite/groups/function-trim/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "$trim()", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-uppercase/case000.json b/__tests__/test-suite/groups/function-uppercase/case000.json new file mode 100644 index 00000000..fa826b21 --- /dev/null +++ b/__tests__/test-suite/groups/function-uppercase/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(\"Hello World\")", + "dataset": "dataset5", + "bindings": {}, + "result": "HELLO WORLD" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-uppercase/case001.json b/__tests__/test-suite/groups/function-uppercase/case001.json new file mode 100644 index 00000000..9cae9963 --- /dev/null +++ b/__tests__/test-suite/groups/function-uppercase/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(blah)", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-zip/case000.json b/__tests__/test-suite/groups/function-zip/case000.json new file mode 100644 index 00000000..f8fa5cd3 --- /dev/null +++ b/__tests__/test-suite/groups/function-zip/case000.json @@ -0,0 +1,19 @@ +{ + "expr": "$zip([1,2,3],[4,5,6])", + "dataset": null, + "bindings": {}, + "result": [ + [ + 1, + 4 + ], + [ + 2, + 5 + ], + [ + 3, + 6 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-zip/case001.json b/__tests__/test-suite/groups/function-zip/case001.json new file mode 100644 index 00000000..9e4647e0 --- /dev/null +++ b/__tests__/test-suite/groups/function-zip/case001.json @@ -0,0 +1,22 @@ +{ + "expr": "$zip([1,2,3],[4,5,6],[7,8,9])", + "dataset": null, + "bindings": {}, + "result": [ + [ + 1, + 4, + 7 + ], + [ + 2, + 5, + 8 + ], + [ + 3, + 6, + 9 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-zip/case002.json b/__tests__/test-suite/groups/function-zip/case002.json new file mode 100644 index 00000000..7a97fed5 --- /dev/null +++ b/__tests__/test-suite/groups/function-zip/case002.json @@ -0,0 +1,17 @@ +{ + "expr": "$zip([1,2,3],[4,5],[7,8,9])", + "dataset": null, + "bindings": {}, + "result": [ + [ + 1, + 4, + 7 + ], + [ + 2, + 5, + 8 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-zip/case003.json b/__tests__/test-suite/groups/function-zip/case003.json new file mode 100644 index 00000000..1f924e15 --- /dev/null +++ b/__tests__/test-suite/groups/function-zip/case003.json @@ -0,0 +1,16 @@ +{ + "expr": "$zip([1,2,3])", + "dataset": null, + "bindings": {}, + "result": [ + [ + 1 + ], + [ + 2 + ], + [ + 3 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-zip/case004.json b/__tests__/test-suite/groups/function-zip/case004.json new file mode 100644 index 00000000..2398ef69 --- /dev/null +++ b/__tests__/test-suite/groups/function-zip/case004.json @@ -0,0 +1,12 @@ +{ + "expr": "$zip(1,2,3)", + "dataset": null, + "bindings": {}, + "result": [ + [ + 1, + 2, + 3 + ] + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/function-zip/case005.json b/__tests__/test-suite/groups/function-zip/case005.json new file mode 100644 index 00000000..aebf6189 --- /dev/null +++ b/__tests__/test-suite/groups/function-zip/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$zip([1,2,3], [4,5,6], nothing)", + "dataset": null, + "bindings": {}, + "result": [] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/higher-order-functions/case000.json b/__tests__/test-suite/groups/higher-order-functions/case000.json new file mode 100644 index 00000000..47433959 --- /dev/null +++ b/__tests__/test-suite/groups/higher-order-functions/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "($twice:=function($f){function($x){$f($f($x))}}; $add3:=function($y){$y+3}; $add6:=$twice($add3); $add6(7))", + "data": null, + "bindings": {}, + "result": 13 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/higher-order-functions/case001.json b/__tests__/test-suite/groups/higher-order-functions/case001.json new file mode 100644 index 00000000..f36dc9ab --- /dev/null +++ b/__tests__/test-suite/groups/higher-order-functions/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($f) { λ($x) { $x($x) }( λ($g) { $f( (λ($a) {$g($g)($a)}))})}(λ($f) { λ($n) { $n < 2 ? 1 : $n * $f($n - 1) } })(6)", + "data": null, + "bindings": {}, + "result": 720 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/higher-order-functions/case002.json b/__tests__/test-suite/groups/higher-order-functions/case002.json new file mode 100644 index 00000000..a84c3b59 --- /dev/null +++ b/__tests__/test-suite/groups/higher-order-functions/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "λ($f) { λ($x) { $x($x) }( λ($g) { $f( (λ($a) {$g($g)($a)}))})}(λ($f) { λ($n) { $n <= 1 ? $n : $f($n-1) + $f($n-2) } })(6) ", + "data": null, + "bindings": {}, + "result": 8 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-filter/case000.json b/__tests__/test-suite/groups/hof-filter/case000.json new file mode 100644 index 00000000..837f088c --- /dev/null +++ b/__tests__/test-suite/groups/hof-filter/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "(library.books~>$filter(λ($v, $i, $a) {$v.price = $max($a.price)})).isbn", + "dataset": "dataset6", + "bindings": {}, + "result": "9780262510875" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-filter/case001.json b/__tests__/test-suite/groups/hof-filter/case001.json new file mode 100644 index 00000000..60d331b2 --- /dev/null +++ b/__tests__/test-suite/groups/hof-filter/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "nothing~>$filter(λ($v, $i, $a) {$v.price = $max($a.price)})", + "dataset": "dataset6", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-map/case000.json b/__tests__/test-suite/groups/hof-map/case000.json new file mode 100644 index 00000000..1806455a --- /dev/null +++ b/__tests__/test-suite/groups/hof-map/case000.json @@ -0,0 +1,12 @@ +{ + "expr": "( $data := { \"one\": [1,2,3,4,5], \"two\": [5,4,3,2,1] }; $add := function($x){$x*$x}; $map($data.one, $add) ) ", + "data": null, + "bindings": {}, + "result": [ + 1, + 4, + 9, + 16, + 25 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-map/case001.json b/__tests__/test-suite/groups/hof-map/case001.json new file mode 100644 index 00000000..b4c8e5c0 --- /dev/null +++ b/__tests__/test-suite/groups/hof-map/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "( $data := { \"one\": [1,2,3,4,5], \"two\": [5,4,3,2,1] }; $add := function($x){$x*$x}; $map($add) ) ", + "dataset": null, + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-map/case002.json b/__tests__/test-suite/groups/hof-map/case002.json new file mode 100644 index 00000000..44aceb3a --- /dev/null +++ b/__tests__/test-suite/groups/hof-map/case002.json @@ -0,0 +1,10 @@ +{ + "expr": "$map([1,2,3], $string)", + "data": null, + "bindings": {}, + "result": [ + "1", + "2", + "3" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-map/case003.json b/__tests__/test-suite/groups/hof-map/case003.json new file mode 100644 index 00000000..6d557ab0 --- /dev/null +++ b/__tests__/test-suite/groups/hof-map/case003.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product ~> $map(λ($prod, $index) { $index+1 & \": \" & $prod.\"Product Name\" })", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "1: Bowler Hat", + "2: Trilby hat", + "3: Bowler Hat", + "4: Cloak" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-map/case004.json b/__tests__/test-suite/groups/hof-map/case004.json new file mode 100644 index 00000000..7b17ba4e --- /dev/null +++ b/__tests__/test-suite/groups/hof-map/case004.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product ~> $map(λ($prod, $index, $arr) { $index+1 & \"/\" & $count($arr) & \": \" & $prod.\"Product Name\" })", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "1/4: Bowler Hat", + "2/4: Trilby hat", + "3/4: Bowler Hat", + "4/4: Cloak" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-map/case005.json b/__tests__/test-suite/groups/hof-map/case005.json new file mode 100644 index 00000000..db3989e7 --- /dev/null +++ b/__tests__/test-suite/groups/hof-map/case005.json @@ -0,0 +1,9 @@ +{ + "expr": "$map(Phone, function($v, $i) {$i[$v.type=\"office\"]})", + "dataset": "dataset1", + "bindings": {}, + "result": [ + 1, + 2 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-map/case006.json b/__tests__/test-suite/groups/hof-map/case006.json new file mode 100644 index 00000000..cf579bae --- /dev/null +++ b/__tests__/test-suite/groups/hof-map/case006.json @@ -0,0 +1,9 @@ +{ + "expr": "$map(Phone, function($v, $i) {$v.type=\"office\" ? $i})", + "dataset": "dataset1", + "bindings": {}, + "result": [ + 1, + 2 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-map/case007.json b/__tests__/test-suite/groups/hof-map/case007.json new file mode 100644 index 00000000..b8481271 --- /dev/null +++ b/__tests__/test-suite/groups/hof-map/case007.json @@ -0,0 +1,11 @@ +{ + "expr": "$map(Phone, function($v, $i) {$v.type=\"office\" ? $i: null})", + "dataset": "dataset1", + "bindings": {}, + "result": [ + null, + 1, + 2, + null + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-map/case008.json b/__tests__/test-suite/groups/hof-map/case008.json new file mode 100644 index 00000000..64c8e4ba --- /dev/null +++ b/__tests__/test-suite/groups/hof-map/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "$map(Phone, function($v, $i) {$v.type=\"office\" ? $i: null})", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-reduce/case000.json b/__tests__/test-suite/groups/hof-reduce/case000.json new file mode 100644 index 00000000..6035ecc3 --- /dev/null +++ b/__tests__/test-suite/groups/hof-reduce/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "( $seq := [1,2,3,4,5]; $reduce($seq, function($x, $y){$x+$y})) ", + "data": null, + "bindings": {}, + "result": 15 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-reduce/case001.json b/__tests__/test-suite/groups/hof-reduce/case001.json new file mode 100644 index 00000000..d7bec078 --- /dev/null +++ b/__tests__/test-suite/groups/hof-reduce/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "( $concat := function($s){function($a, $b){$string($a) & $s & $string($b)}}; $comma_join := $concat(' ... '); $reduce([1,2,3,4,5], $comma_join)) ", + "data": null, + "bindings": {}, + "result": "1 ... 2 ... 3 ... 4 ... 5" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-reduce/case002.json b/__tests__/test-suite/groups/hof-reduce/case002.json new file mode 100644 index 00000000..31af1d4d --- /dev/null +++ b/__tests__/test-suite/groups/hof-reduce/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "( $seq := [1,2,3,4,5]; $reduce($seq, function($x, $y){$x+$y}, 2))", + "data": null, + "bindings": {}, + "result": 17 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-reduce/case003.json b/__tests__/test-suite/groups/hof-reduce/case003.json new file mode 100644 index 00000000..e3bc3078 --- /dev/null +++ b/__tests__/test-suite/groups/hof-reduce/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "( $seq := 1; $reduce($seq, function($x, $y){$x+$y}))", + "data": null, + "bindings": {}, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-reduce/case004.json b/__tests__/test-suite/groups/hof-reduce/case004.json new file mode 100644 index 00000000..e3bc3078 --- /dev/null +++ b/__tests__/test-suite/groups/hof-reduce/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "( $seq := 1; $reduce($seq, function($x, $y){$x+$y}))", + "data": null, + "bindings": {}, + "result": 1 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-reduce/case005.json b/__tests__/test-suite/groups/hof-reduce/case005.json new file mode 100644 index 00000000..ae52d156 --- /dev/null +++ b/__tests__/test-suite/groups/hof-reduce/case005.json @@ -0,0 +1,11 @@ +{ + "expr": "$reduce(Account.Order.Product.Quantity, $append)", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 2, + 1, + 4, + 1 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-reduce/case006.json b/__tests__/test-suite/groups/hof-reduce/case006.json new file mode 100644 index 00000000..1aecc3be --- /dev/null +++ b/__tests__/test-suite/groups/hof-reduce/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "$reduce(Account.Order.Product.Quantity, $append)", + "dataset": "dataset1", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-reduce/case007.json b/__tests__/test-suite/groups/hof-reduce/case007.json new file mode 100644 index 00000000..9abf42f3 --- /dev/null +++ b/__tests__/test-suite/groups/hof-reduce/case007.json @@ -0,0 +1,13 @@ +{ + "expr": "($product := function($a, $b) { $a * $b };$power := function($x, $n) { $n = 0 ? 1 : $reduce([1..$n].($x), $product) };[0..5].$power(2, $))", + "dataset": null, + "bindings": {}, + "result": [ + 1, + 2, + 4, + 8, + 16, + 32 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-reduce/case008.json b/__tests__/test-suite/groups/hof-reduce/case008.json new file mode 100644 index 00000000..d65b9d77 --- /dev/null +++ b/__tests__/test-suite/groups/hof-reduce/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "( $seq := 1; $reduce($seq, function($x){$x}))", + "dataset": null, + "bindings": {}, + "code": "D3050" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-zip-map/case000.json b/__tests__/test-suite/groups/hof-zip-map/case000.json new file mode 100644 index 00000000..8e88b2ca --- /dev/null +++ b/__tests__/test-suite/groups/hof-zip-map/case000.json @@ -0,0 +1,12 @@ +{ + "expr": "( $data := { \"one\": [1,2,3,4,5], \"two\": [5,4,3,2,1] }; $map($zip($data.one, $data.two), $sum)) ", + "data": null, + "bindings": {}, + "result": [ + 6, + 6, + 6, + 6, + 6 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-zip-map/case001.json b/__tests__/test-suite/groups/hof-zip-map/case001.json new file mode 100644 index 00000000..c95ca042 --- /dev/null +++ b/__tests__/test-suite/groups/hof-zip-map/case001.json @@ -0,0 +1,12 @@ +{ + "expr": "( $data := { \"one\": [1,2,3,4,5], \"two\": [5,4,3,2,1] }; $data.$zip(one, two) ~> $map($sum)) ", + "data": null, + "bindings": {}, + "result": [ + 6, + 6, + 6, + 6, + 6 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-zip-map/case002.json b/__tests__/test-suite/groups/hof-zip-map/case002.json new file mode 100644 index 00000000..ed40fa81 --- /dev/null +++ b/__tests__/test-suite/groups/hof-zip-map/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "( $data := { \"one\": [1], \"two\": [5] }; $data[].$zip(one, two) ~> $map($sum)) ", + "data": null, + "bindings": {}, + "result": 6 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/hof-zip-map/case003.json b/__tests__/test-suite/groups/hof-zip-map/case003.json new file mode 100644 index 00000000..b46d1f0c --- /dev/null +++ b/__tests__/test-suite/groups/hof-zip-map/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "( $data := { \"one\": 1, \"two\": 5 }; $data[].$zip(one, two) ~> $map($sum)) ", + "data": null, + "bindings": {}, + "result": 6 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/inclusion-operator/case000.json b/__tests__/test-suite/groups/inclusion-operator/case000.json new file mode 100644 index 00000000..344ba612 --- /dev/null +++ b/__tests__/test-suite/groups/inclusion-operator/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "1 in [1,2]", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/inclusion-operator/case001.json b/__tests__/test-suite/groups/inclusion-operator/case001.json new file mode 100644 index 00000000..c307d616 --- /dev/null +++ b/__tests__/test-suite/groups/inclusion-operator/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "3 in [1,2]", + "dataset": null, + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/inclusion-operator/case002.json b/__tests__/test-suite/groups/inclusion-operator/case002.json new file mode 100644 index 00000000..5fe38bad --- /dev/null +++ b/__tests__/test-suite/groups/inclusion-operator/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "\"hello\" in [1,2]", + "dataset": null, + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/inclusion-operator/case003.json b/__tests__/test-suite/groups/inclusion-operator/case003.json new file mode 100644 index 00000000..d63a4165 --- /dev/null +++ b/__tests__/test-suite/groups/inclusion-operator/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "\"world\" in [\"hello\", \"world\"]", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/inclusion-operator/case004.json b/__tests__/test-suite/groups/inclusion-operator/case004.json new file mode 100644 index 00000000..71c65d67 --- /dev/null +++ b/__tests__/test-suite/groups/inclusion-operator/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "in in [\"hello\", \"world\"]", + "dataset": null, + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/inclusion-operator/case005.json b/__tests__/test-suite/groups/inclusion-operator/case005.json new file mode 100644 index 00000000..f4616343 --- /dev/null +++ b/__tests__/test-suite/groups/inclusion-operator/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "\"world\" in in", + "dataset": null, + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/inclusion-operator/case006.json b/__tests__/test-suite/groups/inclusion-operator/case006.json new file mode 100644 index 00000000..5c25fd45 --- /dev/null +++ b/__tests__/test-suite/groups/inclusion-operator/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "\"hello\" in \"hello\"", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/inclusion-operator/case007.json b/__tests__/test-suite/groups/inclusion-operator/case007.json new file mode 100644 index 00000000..908041f0 --- /dev/null +++ b/__tests__/test-suite/groups/inclusion-operator/case007.json @@ -0,0 +1,9 @@ +{ + "expr": "library.books[\"Aho\" in authors].title", + "dataset": "dataset6", + "bindings": {}, + "result": [ + "The AWK Programming Language", + "Compilers: Principles, Techniques, and Tools" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/inclusion-operator/case008.json b/__tests__/test-suite/groups/inclusion-operator/case008.json new file mode 100644 index 00000000..4d082c9b --- /dev/null +++ b/__tests__/test-suite/groups/inclusion-operator/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "content.integration.$lowercase(name)", + "dataset": "dataset7", + "bindings": {}, + "result": "fakeintegrationname" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/lambdas/case000.json b/__tests__/test-suite/groups/lambdas/case000.json new file mode 100644 index 00000000..1728d04b --- /dev/null +++ b/__tests__/test-suite/groups/lambdas/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "function($x){$x*$x}(5)", + "data": null, + "bindings": {}, + "result": 25 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/lambdas/case001.json b/__tests__/test-suite/groups/lambdas/case001.json new file mode 100644 index 00000000..200f31ef --- /dev/null +++ b/__tests__/test-suite/groups/lambdas/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "function($x){$x>5 ? \"foo\"}(6)", + "data": null, + "bindings": {}, + "result": "foo" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/lambdas/case002.json b/__tests__/test-suite/groups/lambdas/case002.json new file mode 100644 index 00000000..2903130b --- /dev/null +++ b/__tests__/test-suite/groups/lambdas/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "function($x){$x>5 ? \"foo\"}(3)", + "data": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/lambdas/case003.json b/__tests__/test-suite/groups/lambdas/case003.json new file mode 100644 index 00000000..db6bad93 --- /dev/null +++ b/__tests__/test-suite/groups/lambdas/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "($factorial:= function($x){$x <= 1 ? 1 : $x * $factorial($x-1)}; $factorial(4))", + "data": null, + "bindings": {}, + "result": 24 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/lambdas/case004.json b/__tests__/test-suite/groups/lambdas/case004.json new file mode 100644 index 00000000..632bcc48 --- /dev/null +++ b/__tests__/test-suite/groups/lambdas/case004.json @@ -0,0 +1,16 @@ +{ + "expr": "($fibonacci := function($x){$x <= 1 ? $x : $fibonacci($x-1) + $fibonacci($x-2)}; [1,2,3,4,5,6,7,8,9].$fibonacci($))", + "data": null, + "bindings": {}, + "result": [ + 1, + 1, + 2, + 3, + 5, + 8, + 13, + 21, + 34 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/lambdas/case005.json b/__tests__/test-suite/groups/lambdas/case005.json new file mode 100644 index 00000000..f88503d4 --- /dev/null +++ b/__tests__/test-suite/groups/lambdas/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "($nth_price := function($n) { (Account.Order.Product.Price)[$n] }; $nth_price(1) )", + "dataset": "dataset5", + "bindings": {}, + "result": 21.67 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/lambdas/case006.json b/__tests__/test-suite/groups/lambdas/case006.json new file mode 100644 index 00000000..da7c15ee --- /dev/null +++ b/__tests__/test-suite/groups/lambdas/case006.json @@ -0,0 +1,6 @@ +{ + "expr": " ( $even := function($n) { $n = 0 ? true : $odd($n-1) }; $odd := function($n) { $n = 0 ? false : $even($n-1) }; $even(82) )", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/lambdas/case007.json b/__tests__/test-suite/groups/lambdas/case007.json new file mode 100644 index 00000000..e4426046 --- /dev/null +++ b/__tests__/test-suite/groups/lambdas/case007.json @@ -0,0 +1,6 @@ +{ + "expr": " ( $even := function($n) { $n = 0 ? true : $odd($n-1) }; $odd := function($n) { $n = 0 ? false : $even($n-1) }; $even(65) )", + "dataset": null, + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/lambdas/case008.json b/__tests__/test-suite/groups/lambdas/case008.json new file mode 100644 index 00000000..1d87522c --- /dev/null +++ b/__tests__/test-suite/groups/lambdas/case008.json @@ -0,0 +1,6 @@ +{ + "expr": " ( $even := function($n) { $n = 0 ? true : $odd($n-1) }; $odd := function($n) { $n = 0 ? false : $even($n-1) }; $odd(65) )", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/lambdas/case009.json b/__tests__/test-suite/groups/lambdas/case009.json new file mode 100644 index 00000000..42a7d6cb --- /dev/null +++ b/__tests__/test-suite/groups/lambdas/case009.json @@ -0,0 +1,9 @@ +{ + "expr": "( $gcd := λ($a, $b){$b = 0 ? $a : $gcd($b, $a%$b) }; [$gcd(8,12), $gcd(9,12)])", + "dataset": null, + "bindings": {}, + "result": [ + 4, + 3 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/lambdas/case010.json b/__tests__/test-suite/groups/lambdas/case010.json new file mode 100644 index 00000000..b6f60fb9 --- /dev/null +++ b/__tests__/test-suite/groups/lambdas/case010.json @@ -0,0 +1,23 @@ +{ + "expr": "( $range := function($start, $end, $step) { ( $step:=($step?$step:1); $start+$step > $end ? $start : $append($start, $range($start+$step, $end, $step)) )}; $range(0,15)) ", + "dataset": null, + "bindings": {}, + "result": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/lambdas/case011.json b/__tests__/test-suite/groups/lambdas/case011.json new file mode 100644 index 00000000..9685cbac --- /dev/null +++ b/__tests__/test-suite/groups/lambdas/case011.json @@ -0,0 +1,15 @@ +{ + "expr": "( $range := function($start, $end, $step) { ( $step:=($step?$step:1); $start+$step > $end ? $start : $append($start, $range($start+$step, $end, $step)) )}; $range(0,15,2)) ", + "dataset": null, + "bindings": {}, + "result": [ + 0, + 2, + 4, + 6, + 8, + 10, + 12, + 14 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case000.json b/__tests__/test-suite/groups/literals/case000.json new file mode 100644 index 00000000..8e0d8731 --- /dev/null +++ b/__tests__/test-suite/groups/literals/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "\"hello\"", + "dataset": "dataset0", + "bindings": {}, + "result": "hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case001.json b/__tests__/test-suite/groups/literals/case001.json new file mode 100644 index 00000000..2ee68e49 --- /dev/null +++ b/__tests__/test-suite/groups/literals/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "'hello'", + "dataset": "dataset0", + "bindings": {}, + "result": "hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case002.json b/__tests__/test-suite/groups/literals/case002.json new file mode 100644 index 00000000..970592ab --- /dev/null +++ b/__tests__/test-suite/groups/literals/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "\"Wayne's World\"", + "dataset": "dataset0", + "bindings": {}, + "result": "Wayne's World" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case003.json b/__tests__/test-suite/groups/literals/case003.json new file mode 100644 index 00000000..28e9c4df --- /dev/null +++ b/__tests__/test-suite/groups/literals/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "42", + "dataset": "dataset0", + "bindings": {}, + "result": 42 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case004.json b/__tests__/test-suite/groups/literals/case004.json new file mode 100644 index 00000000..25962ce6 --- /dev/null +++ b/__tests__/test-suite/groups/literals/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "-42", + "dataset": "dataset0", + "bindings": {}, + "result": -42 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case005.json b/__tests__/test-suite/groups/literals/case005.json new file mode 100644 index 00000000..a1358d55 --- /dev/null +++ b/__tests__/test-suite/groups/literals/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "3.14159", + "dataset": "dataset0", + "bindings": {}, + "result": 3.14159 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case006.json b/__tests__/test-suite/groups/literals/case006.json new file mode 100644 index 00000000..373fddc8 --- /dev/null +++ b/__tests__/test-suite/groups/literals/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "6.022e23", + "dataset": "dataset0", + "bindings": {}, + "result": 6.022e+23 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case007.json b/__tests__/test-suite/groups/literals/case007.json new file mode 100644 index 00000000..4a7e70a2 --- /dev/null +++ b/__tests__/test-suite/groups/literals/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "1.602E-19", + "dataset": "dataset0", + "bindings": {}, + "result": 1.602e-19 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case008.json b/__tests__/test-suite/groups/literals/case008.json new file mode 100644 index 00000000..6d3508ca --- /dev/null +++ b/__tests__/test-suite/groups/literals/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "10e1000", + "data": {}, + "bindings": {}, + "code": "S0102" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case009.json b/__tests__/test-suite/groups/literals/case009.json new file mode 100644 index 00000000..f41dd107 --- /dev/null +++ b/__tests__/test-suite/groups/literals/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "\"hello\\tworld\"", + "dataset": "dataset0", + "bindings": {}, + "result": "hello\tworld" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case010.json b/__tests__/test-suite/groups/literals/case010.json new file mode 100644 index 00000000..abde2d82 --- /dev/null +++ b/__tests__/test-suite/groups/literals/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "\"hello\\nworld\"", + "dataset": "dataset0", + "bindings": {}, + "result": "hello\nworld" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case011.json b/__tests__/test-suite/groups/literals/case011.json new file mode 100644 index 00000000..a0e434b3 --- /dev/null +++ b/__tests__/test-suite/groups/literals/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "\"hello \\\"world\\\"\"", + "dataset": "dataset0", + "bindings": {}, + "result": "hello \"world\"" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case012.json b/__tests__/test-suite/groups/literals/case012.json new file mode 100644 index 00000000..3e4606ff --- /dev/null +++ b/__tests__/test-suite/groups/literals/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "\"C:\\\\Test\\\\test.txt\"", + "dataset": "dataset0", + "bindings": {}, + "result": "C:\\Test\\test.txt" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case013.json b/__tests__/test-suite/groups/literals/case013.json new file mode 100644 index 00000000..0aa156e2 --- /dev/null +++ b/__tests__/test-suite/groups/literals/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "\"\\u03BB-calculus rocks\"", + "dataset": "dataset0", + "bindings": {}, + "result": "λ-calculus rocks" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case014.json b/__tests__/test-suite/groups/literals/case014.json new file mode 100644 index 00000000..784bc387 --- /dev/null +++ b/__tests__/test-suite/groups/literals/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "\"𝄞\"", + "dataset": "dataset0", + "bindings": {}, + "result": "𝄞" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case015.json b/__tests__/test-suite/groups/literals/case015.json new file mode 100644 index 00000000..ca9009e5 --- /dev/null +++ b/__tests__/test-suite/groups/literals/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "\"\\y\"", + "data": {}, + "bindings": {}, + "code": "S0103" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case016.json b/__tests__/test-suite/groups/literals/case016.json new file mode 100644 index 00000000..a3f167b3 --- /dev/null +++ b/__tests__/test-suite/groups/literals/case016.json @@ -0,0 +1,6 @@ +{ + "expr": "\"\\u\"", + "data": {}, + "bindings": {}, + "code": "S0104" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/literals/case017.json b/__tests__/test-suite/groups/literals/case017.json new file mode 100644 index 00000000..51ac0217 --- /dev/null +++ b/__tests__/test-suite/groups/literals/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "\"\\u123t\"", + "data": {}, + "bindings": {}, + "code": "S0104" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/missing-paths/case000.json b/__tests__/test-suite/groups/missing-paths/case000.json new file mode 100644 index 00000000..3a4d1b28 --- /dev/null +++ b/__tests__/test-suite/groups/missing-paths/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "fdf", + "dataset": "dataset0", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/missing-paths/case001.json b/__tests__/test-suite/groups/missing-paths/case001.json new file mode 100644 index 00000000..9e704791 --- /dev/null +++ b/__tests__/test-suite/groups/missing-paths/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "fdf.ett", + "dataset": "dataset0", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/missing-paths/case002.json b/__tests__/test-suite/groups/missing-paths/case002.json new file mode 100644 index 00000000..39a7a895 --- /dev/null +++ b/__tests__/test-suite/groups/missing-paths/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "fdf.ett[10]", + "dataset": "dataset0", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/missing-paths/case003.json b/__tests__/test-suite/groups/missing-paths/case003.json new file mode 100644 index 00000000..ce1055c8 --- /dev/null +++ b/__tests__/test-suite/groups/missing-paths/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "fdf.ett[vc > 10]", + "dataset": "dataset0", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/missing-paths/case004.json b/__tests__/test-suite/groups/missing-paths/case004.json new file mode 100644 index 00000000..4fcca814 --- /dev/null +++ b/__tests__/test-suite/groups/missing-paths/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "fdf.ett + 27", + "dataset": "dataset0", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/missing-paths/case005.json b/__tests__/test-suite/groups/missing-paths/case005.json new file mode 100644 index 00000000..ef17318b --- /dev/null +++ b/__tests__/test-suite/groups/missing-paths/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$fdsd", + "dataset": "dataset0", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/multiple-array-selectors/case000.json b/__tests__/test-suite/groups/multiple-array-selectors/case000.json new file mode 100644 index 00000000..2ca49863 --- /dev/null +++ b/__tests__/test-suite/groups/multiple-array-selectors/case000.json @@ -0,0 +1,12 @@ +{ + "expr": "[1..10][[1..3,8,-1]]", + "dataset": null, + "bindings": {}, + "result": [ + 2, + 3, + 4, + 9, + 10 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/multiple-array-selectors/case001.json b/__tests__/test-suite/groups/multiple-array-selectors/case001.json new file mode 100644 index 00000000..e2fdc63e --- /dev/null +++ b/__tests__/test-suite/groups/multiple-array-selectors/case001.json @@ -0,0 +1,12 @@ +{ + "expr": "[1..10][[1..3,8,5]]", + "dataset": null, + "bindings": {}, + "result": [ + 2, + 3, + 4, + 6, + 9 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/multiple-array-selectors/case002.json b/__tests__/test-suite/groups/multiple-array-selectors/case002.json new file mode 100644 index 00000000..a3366c21 --- /dev/null +++ b/__tests__/test-suite/groups/multiple-array-selectors/case002.json @@ -0,0 +1,17 @@ +{ + "expr": "[1..10][[1..3,8,false]]", + "dataset": null, + "bindings": {}, + "result": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/null/case000.json b/__tests__/test-suite/groups/null/case000.json new file mode 100644 index 00000000..438ac119 --- /dev/null +++ b/__tests__/test-suite/groups/null/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "null", + "dataset": "dataset0", + "bindings": {}, + "result": null +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/null/case001.json b/__tests__/test-suite/groups/null/case001.json new file mode 100644 index 00000000..dbaa4ce1 --- /dev/null +++ b/__tests__/test-suite/groups/null/case001.json @@ -0,0 +1,8 @@ +{ + "expr": "[null]", + "dataset": "dataset0", + "bindings": {}, + "result": [ + null + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/null/case002.json b/__tests__/test-suite/groups/null/case002.json new file mode 100644 index 00000000..6b24d722 --- /dev/null +++ b/__tests__/test-suite/groups/null/case002.json @@ -0,0 +1,9 @@ +{ + "expr": "[null, null]", + "dataset": "dataset0", + "bindings": {}, + "result": [ + null, + null + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/null/case003.json b/__tests__/test-suite/groups/null/case003.json new file mode 100644 index 00000000..616b4996 --- /dev/null +++ b/__tests__/test-suite/groups/null/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$not(null)", + "dataset": "dataset0", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/null/case004.json b/__tests__/test-suite/groups/null/case004.json new file mode 100644 index 00000000..fccd8304 --- /dev/null +++ b/__tests__/test-suite/groups/null/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "null = null", + "dataset": "dataset0", + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/null/case005.json b/__tests__/test-suite/groups/null/case005.json new file mode 100644 index 00000000..2f4b12fb --- /dev/null +++ b/__tests__/test-suite/groups/null/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "null != null", + "dataset": "dataset0", + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/null/case006.json b/__tests__/test-suite/groups/null/case006.json new file mode 100644 index 00000000..9e9a8107 --- /dev/null +++ b/__tests__/test-suite/groups/null/case006.json @@ -0,0 +1,10 @@ +{ + "expr": "{\"true\": true, \"false\":false, \"null\": null}", + "dataset": "dataset0", + "bindings": {}, + "result": { + "true": true, + "false": false, + "null": null + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case000.json b/__tests__/test-suite/groups/numeric-operators/case000.json new file mode 100644 index 00000000..9c4702f3 --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.bar + bar", + "dataset": "dataset0", + "bindings": {}, + "result": 140 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case001.json b/__tests__/test-suite/groups/numeric-operators/case001.json new file mode 100644 index 00000000..97d716de --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "bar + foo.bar", + "dataset": "dataset0", + "bindings": {}, + "result": 140 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case002.json b/__tests__/test-suite/groups/numeric-operators/case002.json new file mode 100644 index 00000000..4176239f --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.bar - bar", + "dataset": "dataset0", + "bindings": {}, + "result": -56 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case003.json b/__tests__/test-suite/groups/numeric-operators/case003.json new file mode 100644 index 00000000..b9edda4b --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "bar - foo.bar", + "dataset": "dataset0", + "bindings": {}, + "result": 56 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case004.json b/__tests__/test-suite/groups/numeric-operators/case004.json new file mode 100644 index 00000000..0cc0d260 --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.bar * bar", + "dataset": "dataset0", + "bindings": {}, + "result": 4116 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case005.json b/__tests__/test-suite/groups/numeric-operators/case005.json new file mode 100644 index 00000000..d59ffdf7 --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "bar * foo.bar", + "dataset": "dataset0", + "bindings": {}, + "result": 4116 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case006.json b/__tests__/test-suite/groups/numeric-operators/case006.json new file mode 100644 index 00000000..33ee2998 --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.bar / bar", + "dataset": "dataset0", + "bindings": {}, + "result": 0.42857142857142855 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case007.json b/__tests__/test-suite/groups/numeric-operators/case007.json new file mode 100644 index 00000000..7a4baab5 --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "bar / foo.bar", + "dataset": "dataset0", + "bindings": {}, + "result": 2.3333333333333335 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case008.json b/__tests__/test-suite/groups/numeric-operators/case008.json new file mode 100644 index 00000000..c45d682e --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.bar % bar", + "dataset": "dataset0", + "bindings": {}, + "result": 42 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case009.json b/__tests__/test-suite/groups/numeric-operators/case009.json new file mode 100644 index 00000000..02cb23ba --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "bar % foo.bar", + "dataset": "dataset0", + "bindings": {}, + "result": 14 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case010.json b/__tests__/test-suite/groups/numeric-operators/case010.json new file mode 100644 index 00000000..3b4567b7 --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "bar + foo.bar * bar", + "dataset": "dataset0", + "bindings": {}, + "result": 4214 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case011.json b/__tests__/test-suite/groups/numeric-operators/case011.json new file mode 100644 index 00000000..92076c87 --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.bar * bar + bar", + "dataset": "dataset0", + "bindings": {}, + "result": 4214 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case012.json b/__tests__/test-suite/groups/numeric-operators/case012.json new file mode 100644 index 00000000..cf6c21f7 --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "24 * notexist", + "dataset": "dataset0", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case013.json b/__tests__/test-suite/groups/numeric-operators/case013.json new file mode 100644 index 00000000..8c5d24d7 --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "notexist + 1", + "dataset": "dataset0", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case014.json b/__tests__/test-suite/groups/numeric-operators/case014.json new file mode 100644 index 00000000..c6e67e62 --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "1/(10e300 * 10e100) ", + "dataset": null, + "bindings": {}, + "code": "D1001" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case015.json b/__tests__/test-suite/groups/numeric-operators/case015.json new file mode 100644 index 00000000..027614ee --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "\"5\" + \"5\"", + "dataset": null, + "bindings": {}, + "code": "T2001" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/numeric-operators/case016.json b/__tests__/test-suite/groups/numeric-operators/case016.json new file mode 100644 index 00000000..2668ba3d --- /dev/null +++ b/__tests__/test-suite/groups/numeric-operators/case016.json @@ -0,0 +1,6 @@ +{ + "expr": "- notexist", + "dataset": "dataset0", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case000.json b/__tests__/test-suite/groups/object-constructor/case000.json new file mode 100644 index 00000000..10215dbe --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "{}", + "dataset": "dataset0", + "bindings": {}, + "result": {} +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case001.json b/__tests__/test-suite/groups/object-constructor/case001.json new file mode 100644 index 00000000..d2a92fff --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case001.json @@ -0,0 +1,8 @@ +{ + "expr": "{\"key\": \"value\"}", + "dataset": "dataset0", + "bindings": {}, + "result": { + "key": "value" + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case002.json b/__tests__/test-suite/groups/object-constructor/case002.json new file mode 100644 index 00000000..e6c0b635 --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case002.json @@ -0,0 +1,9 @@ +{ + "expr": "{\"one\": 1, \"two\": 2}", + "dataset": "dataset0", + "bindings": {}, + "result": { + "one": 1, + "two": 2 + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case003.json b/__tests__/test-suite/groups/object-constructor/case003.json new file mode 100644 index 00000000..855f4497 --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "{\"one\": 1, \"two\": 2}.two", + "dataset": "dataset0", + "bindings": {}, + "result": 2 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case004.json b/__tests__/test-suite/groups/object-constructor/case004.json new file mode 100644 index 00000000..c275df16 --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case004.json @@ -0,0 +1,12 @@ +{ + "expr": "{\"one\": 1, \"two\": {\"three\": 3, \"four\": \"4\"}}", + "dataset": "dataset0", + "bindings": {}, + "result": { + "one": 1, + "two": { + "three": 3, + "four": "4" + } + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case005.json b/__tests__/test-suite/groups/object-constructor/case005.json new file mode 100644 index 00000000..c5a5425c --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case005.json @@ -0,0 +1,12 @@ +{ + "expr": "{\"one\": 1, \"two\": [3, \"four\"]}", + "dataset": "dataset0", + "bindings": {}, + "result": { + "one": 1, + "two": [ + 3, + "four" + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case006.json b/__tests__/test-suite/groups/object-constructor/case006.json new file mode 100644 index 00000000..2d95e2a7 --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "{\"test\": ()}", + "data": null, + "bindings": {}, + "result": {} +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case007.json b/__tests__/test-suite/groups/object-constructor/case007.json new file mode 100644 index 00000000..9ffcf1e2 --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "blah.{}", + "dataset": "dataset0", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case008.json b/__tests__/test-suite/groups/object-constructor/case008.json new file mode 100644 index 00000000..a991c358 --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case008.json @@ -0,0 +1,15 @@ +{ + "expr": "Account.Order{OrderID: Product.\"Product Name\"}", + "dataset": "dataset5", + "bindings": {}, + "result": { + "order103": [ + "Bowler Hat", + "Trilby hat" + ], + "order104": [ + "Bowler Hat", + "Cloak" + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case009.json b/__tests__/test-suite/groups/object-constructor/case009.json new file mode 100644 index 00000000..088f9720 --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case009.json @@ -0,0 +1,19 @@ +{ + "expr": "Account.Order.{OrderID: Product.\"Product Name\"}", + "dataset": "dataset5", + "bindings": {}, + "result": [ + { + "order103": [ + "Bowler Hat", + "Trilby hat" + ] + }, + { + "order104": [ + "Bowler Hat", + "Cloak" + ] + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case010.json b/__tests__/test-suite/groups/object-constructor/case010.json new file mode 100644 index 00000000..31d5b6ac --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case010.json @@ -0,0 +1,13 @@ +{ + "expr": "Account.Order.Product{$string(ProductID): Price}", + "dataset": "dataset5", + "bindings": {}, + "result": { + "345664": 107.99, + "858236": 21.67, + "858383": [ + 34.45, + 34.45 + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case011.json b/__tests__/test-suite/groups/object-constructor/case011.json new file mode 100644 index 00000000..40910321 --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case011.json @@ -0,0 +1,10 @@ +{ + "expr": "Account.Order.Product{$string(ProductID): (Price)[0]}", + "dataset": "dataset5", + "bindings": {}, + "result": { + "345664": 107.99, + "858236": 21.67, + "858383": 34.45 + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case012.json b/__tests__/test-suite/groups/object-constructor/case012.json new file mode 100644 index 00000000..9b7f7d22 --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case012.json @@ -0,0 +1,19 @@ +{ + "expr": "Account.Order.Product.{$string(ProductID): Price}", + "dataset": "dataset5", + "bindings": {}, + "result": [ + { + "858383": 34.45 + }, + { + "858236": 21.67 + }, + { + "858383": 34.45 + }, + { + "345664": 107.99 + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case013.json b/__tests__/test-suite/groups/object-constructor/case013.json new file mode 100644 index 00000000..857c5568 --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order.Product{ProductID: \"Product Name\"}", + "dataset": "dataset5", + "bindings": {}, + "code": "T1003" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case014.json b/__tests__/test-suite/groups/object-constructor/case014.json new file mode 100644 index 00000000..766b9137 --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order.Product.{ProductID: \"Product Name\"}", + "dataset": "dataset5", + "bindings": {}, + "code": "T1003" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case015.json b/__tests__/test-suite/groups/object-constructor/case015.json new file mode 100644 index 00000000..9fab7277 --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case015.json @@ -0,0 +1,9 @@ +{ + "expr": "Account.Order{OrderID: $sum(Product.(Price*Quantity))}", + "dataset": "dataset5", + "bindings": {}, + "result": { + "order103": 90.57000000000001, + "order104": 245.79000000000002 + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case016.json b/__tests__/test-suite/groups/object-constructor/case016.json new file mode 100644 index 00000000..fe90ddf9 --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case016.json @@ -0,0 +1,13 @@ +{ + "expr": "Account.Order.{OrderID: $sum(Product.(Price*Quantity))}", + "dataset": "dataset5", + "bindings": {}, + "result": [ + { + "order103": 90.57000000000001 + }, + { + "order104": 245.79000000000002 + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case017.json b/__tests__/test-suite/groups/object-constructor/case017.json new file mode 100644 index 00000000..a0cf596a --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case017.json @@ -0,0 +1,21 @@ +{ + "expr": "Account.Order.Product{$.\"Product Name\": Price, $.\"Product Name\": Price}", + "dataset": "dataset5", + "bindings": {}, + "result": { + "Bowler Hat": [ + 34.45, + 34.45, + 34.45, + 34.45 + ], + "Trilby hat": [ + 21.67, + 21.67 + ], + "Cloak": [ + 107.99, + 107.99 + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case018.json b/__tests__/test-suite/groups/object-constructor/case018.json new file mode 100644 index 00000000..69086d8d --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case018.json @@ -0,0 +1,21 @@ +{ + "expr": "Account.Order.Product{`Product Name`: Price, `Product Name`: Price}", + "dataset": "dataset5", + "bindings": {}, + "result": { + "Bowler Hat": [ + 34.45, + 34.45, + 34.45, + 34.45 + ], + "Trilby hat": [ + 21.67, + 21.67 + ], + "Cloak": [ + 107.99, + 107.99 + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case019.json b/__tests__/test-suite/groups/object-constructor/case019.json new file mode 100644 index 00000000..ce88d38e --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case019.json @@ -0,0 +1,21 @@ +{ + "expr": "Account.Order{ OrderID: { \"TotalPrice\":$sum(Product.(Price * Quantity)), \"Items\": Product.\"Product Name\" }}", + "dataset": "dataset5", + "bindings": {}, + "result": { + "order103": { + "TotalPrice": 90.57000000000001, + "Items": [ + "Bowler Hat", + "Trilby hat" + ] + }, + "order104": { + "TotalPrice": 245.79000000000002, + "Items": [ + "Bowler Hat", + "Cloak" + ] + } + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case020.json b/__tests__/test-suite/groups/object-constructor/case020.json new file mode 100644 index 00000000..9128c0c7 --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case020.json @@ -0,0 +1,53 @@ +{ + "expr": "{ \"Order\": Account.Order.{ \"ID\": OrderID, \"Product\": Product.{ \"Name\": $.\"Product Name\", \"SKU\": ProductID, \"Details\": { \"Weight\": Description.Weight, \"Dimensions\": Description.(Width & \" x \" & Height & \" x \" & Depth) } }, \"Total Price\": $sum(Product.(Price * Quantity)) }}", + "dataset": "dataset5", + "bindings": {}, + "result": { + "Order": [ + { + "ID": "order103", + "Product": [ + { + "Name": "Bowler Hat", + "SKU": 858383, + "Details": { + "Weight": 0.75, + "Dimensions": "300 x 200 x 210" + } + }, + { + "Name": "Trilby hat", + "SKU": 858236, + "Details": { + "Weight": 0.6, + "Dimensions": "300 x 200 x 210" + } + } + ], + "Total Price": 90.57000000000001 + }, + { + "ID": "order104", + "Product": [ + { + "Name": "Bowler Hat", + "SKU": 858383, + "Details": { + "Weight": 0.75, + "Dimensions": "300 x 200 x 210" + } + }, + { + "Name": "Cloak", + "SKU": 345664, + "Details": { + "Weight": 2, + "Dimensions": "30 x 20 x 210" + } + } + ], + "Total Price": 245.79000000000002 + } + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case021.json b/__tests__/test-suite/groups/object-constructor/case021.json new file mode 100644 index 00000000..24868a5a --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case021.json @@ -0,0 +1,53 @@ +{ + "expr": "{ \"Order\": Account.Order.{ \"ID\": OrderID, \"Product\": Product.{ \"Name\": `Product Name`, \"SKU\": ProductID, \"Details\": { \"Weight\": Description.Weight, \"Dimensions\": Description.(Width & \" x \" & Height & \" x \" & Depth) } }, \"Total Price\": $sum(Product.(Price * Quantity)) }}", + "dataset": "dataset5", + "bindings": {}, + "result": { + "Order": [ + { + "ID": "order103", + "Product": [ + { + "Name": "Bowler Hat", + "SKU": 858383, + "Details": { + "Weight": 0.75, + "Dimensions": "300 x 200 x 210" + } + }, + { + "Name": "Trilby hat", + "SKU": 858236, + "Details": { + "Weight": 0.6, + "Dimensions": "300 x 200 x 210" + } + } + ], + "Total Price": 90.57000000000001 + }, + { + "ID": "order104", + "Product": [ + { + "Name": "Bowler Hat", + "SKU": 858383, + "Details": { + "Weight": 0.75, + "Dimensions": "300 x 200 x 210" + } + }, + { + "Name": "Cloak", + "SKU": 345664, + "Details": { + "Weight": 2, + "Dimensions": "30 x 20 x 210" + } + } + ], + "Total Price": 245.79000000000002 + } + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/object-constructor/case022.json b/__tests__/test-suite/groups/object-constructor/case022.json new file mode 100644 index 00000000..61df7e7f --- /dev/null +++ b/__tests__/test-suite/groups/object-constructor/case022.json @@ -0,0 +1,16 @@ +{ + "expr": "Phone{type: $join(number, \", \"), \"phone\":number}", + "dataset": "dataset1", + "bindings": {}, + "result": { + "home": "0203 544 1234", + "phone": [ + "0203 544 1234", + "01962 001234", + "01962 001235", + "077 7700 1234" + ], + "office": "01962 001234, 01962 001235", + "mobile": "077 7700 1234" + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/parentheses/case000.json b/__tests__/test-suite/groups/parentheses/case000.json new file mode 100644 index 00000000..724dfc81 --- /dev/null +++ b/__tests__/test-suite/groups/parentheses/case000.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.(blah).baz.fud", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/parentheses/case001.json b/__tests__/test-suite/groups/parentheses/case001.json new file mode 100644 index 00000000..05e67e0b --- /dev/null +++ b/__tests__/test-suite/groups/parentheses/case001.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.(blah.baz).fud", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/parentheses/case002.json b/__tests__/test-suite/groups/parentheses/case002.json new file mode 100644 index 00000000..2a0bcf15 --- /dev/null +++ b/__tests__/test-suite/groups/parentheses/case002.json @@ -0,0 +1,9 @@ +{ + "expr": "(foo.blah.baz).fud", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/parentheses/case003.json b/__tests__/test-suite/groups/parentheses/case003.json new file mode 100644 index 00000000..fe6eaccf --- /dev/null +++ b/__tests__/test-suite/groups/parentheses/case003.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.blah.(baz.fud)", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/parentheses/case004.json b/__tests__/test-suite/groups/parentheses/case004.json new file mode 100644 index 00000000..8c74c05a --- /dev/null +++ b/__tests__/test-suite/groups/parentheses/case004.json @@ -0,0 +1,9 @@ +{ + "expr": "(foo.blah.baz.fud)", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/parentheses/case005.json b/__tests__/test-suite/groups/parentheses/case005.json new file mode 100644 index 00000000..8463b53b --- /dev/null +++ b/__tests__/test-suite/groups/parentheses/case005.json @@ -0,0 +1,9 @@ +{ + "expr": "(foo).(blah).baz.(fud)", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/parentheses/case006.json b/__tests__/test-suite/groups/parentheses/case006.json new file mode 100644 index 00000000..18e1b1af --- /dev/null +++ b/__tests__/test-suite/groups/parentheses/case006.json @@ -0,0 +1,9 @@ +{ + "expr": "(foo.(blah).baz.fud)", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/parentheses/case007.json b/__tests__/test-suite/groups/parentheses/case007.json new file mode 100644 index 00000000..b4aa7021 --- /dev/null +++ b/__tests__/test-suite/groups/parentheses/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "(4 + 2) / 2", + "dataset": "dataset0", + "bindings": {}, + "result": 3 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/partial-application/case000.json b/__tests__/test-suite/groups/partial-application/case000.json new file mode 100644 index 00000000..5cde05d4 --- /dev/null +++ b/__tests__/test-suite/groups/partial-application/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "( $add := function($x, $y){$x+$y}; $add2 := $add(?, 2); $add2(3))", + "dataset": "dataset5", + "bindings": {}, + "result": 5 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/partial-application/case001.json b/__tests__/test-suite/groups/partial-application/case001.json new file mode 100644 index 00000000..d37a42fc --- /dev/null +++ b/__tests__/test-suite/groups/partial-application/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "( $add := function($x, $y){$x+$y}; $add2 := $add(2, ?); $add2(4))", + "dataset": "dataset5", + "bindings": {}, + "result": 6 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/partial-application/case002.json b/__tests__/test-suite/groups/partial-application/case002.json new file mode 100644 index 00000000..49df73fc --- /dev/null +++ b/__tests__/test-suite/groups/partial-application/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "( $firstn := $substring(?, 0, ?); $first5 := $firstn(?, 5); $first5(\"Hello World\"))", + "dataset": "dataset5", + "bindings": {}, + "result": "Hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/partial-application/case003.json b/__tests__/test-suite/groups/partial-application/case003.json new file mode 100644 index 00000000..a5f12a9f --- /dev/null +++ b/__tests__/test-suite/groups/partial-application/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "substring(?, 0, ?)", + "data": {}, + "bindings": {}, + "code": "T1007" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/partial-application/case004.json b/__tests__/test-suite/groups/partial-application/case004.json new file mode 100644 index 00000000..4f6c40fb --- /dev/null +++ b/__tests__/test-suite/groups/partial-application/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "unknown(?)", + "data": {}, + "bindings": {}, + "code": "T1008" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/predicates/case000.json b/__tests__/test-suite/groups/predicates/case000.json new file mode 100644 index 00000000..b9393e32 --- /dev/null +++ b/__tests__/test-suite/groups/predicates/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "nothing[x=6][y=3].number", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/predicates/case001.json b/__tests__/test-suite/groups/predicates/case001.json new file mode 100644 index 00000000..976448b8 --- /dev/null +++ b/__tests__/test-suite/groups/predicates/case001.json @@ -0,0 +1,14 @@ +{ + "expr": "clues[x=6][y=3].number", + "data": { + "clues": [ + { + "x": 6, + "y": 3, + "number": 7 + } + ] + }, + "bindings": {}, + "result": 7 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/predicates/case002.json b/__tests__/test-suite/groups/predicates/case002.json new file mode 100644 index 00000000..5f8724e3 --- /dev/null +++ b/__tests__/test-suite/groups/predicates/case002.json @@ -0,0 +1,12 @@ +{ + "expr": "$[x=6][y=3].number", + "data": [ + { + "x": 6, + "y": 2, + "number": 7 + } + ], + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/predicates/case003.json b/__tests__/test-suite/groups/predicates/case003.json new file mode 100644 index 00000000..1a37de83 --- /dev/null +++ b/__tests__/test-suite/groups/predicates/case003.json @@ -0,0 +1,9 @@ +{ + "expr": "Account.Order.Product[$lowercase(Description.Colour) = \"purple\"][0].Price", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 34.45, + 34.45 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/quoted-selectors/case000.json b/__tests__/test-suite/groups/quoted-selectors/case000.json new file mode 100644 index 00000000..616b6f64 --- /dev/null +++ b/__tests__/test-suite/groups/quoted-selectors/case000.json @@ -0,0 +1,20 @@ +{ + "expr": "foo.\"blah\"", + "dataset": "dataset0", + "bindings": {}, + "result": [ + { + "baz": { + "fud": "hello" + } + }, + { + "baz": { + "fud": "world" + } + }, + { + "bazz": "gotcha" + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/quoted-selectors/case001.json b/__tests__/test-suite/groups/quoted-selectors/case001.json new file mode 100644 index 00000000..8846899f --- /dev/null +++ b/__tests__/test-suite/groups/quoted-selectors/case001.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.\"blah\".baz.'fud'", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/quoted-selectors/case002.json b/__tests__/test-suite/groups/quoted-selectors/case002.json new file mode 100644 index 00000000..94435934 --- /dev/null +++ b/__tests__/test-suite/groups/quoted-selectors/case002.json @@ -0,0 +1,9 @@ +{ + "expr": "\"foo\".\"blah\".\"baz\".\"fud\"", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/quoted-selectors/case003.json b/__tests__/test-suite/groups/quoted-selectors/case003.json new file mode 100644 index 00000000..e283b269 --- /dev/null +++ b/__tests__/test-suite/groups/quoted-selectors/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.\"blah.baz\"", + "dataset": "dataset0", + "bindings": {}, + "result": "here" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/quoted-selectors/case004.json b/__tests__/test-suite/groups/quoted-selectors/case004.json new file mode 100644 index 00000000..f29097f6 --- /dev/null +++ b/__tests__/test-suite/groups/quoted-selectors/case004.json @@ -0,0 +1,20 @@ +{ + "expr": "foo.`blah`", + "dataset": "dataset0", + "bindings": {}, + "result": [ + { + "baz": { + "fud": "hello" + } + }, + { + "baz": { + "fud": "world" + } + }, + { + "bazz": "gotcha" + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/quoted-selectors/case005.json b/__tests__/test-suite/groups/quoted-selectors/case005.json new file mode 100644 index 00000000..f9ff36c0 --- /dev/null +++ b/__tests__/test-suite/groups/quoted-selectors/case005.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.`blah`.baz.'fud'", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/quoted-selectors/case006.json b/__tests__/test-suite/groups/quoted-selectors/case006.json new file mode 100644 index 00000000..ac529231 --- /dev/null +++ b/__tests__/test-suite/groups/quoted-selectors/case006.json @@ -0,0 +1,9 @@ +{ + "expr": "`foo`.`blah`.`baz`.`fud`", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/quoted-selectors/case007.json b/__tests__/test-suite/groups/quoted-selectors/case007.json new file mode 100644 index 00000000..59c73b66 --- /dev/null +++ b/__tests__/test-suite/groups/quoted-selectors/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.`blah.baz`", + "dataset": "dataset0", + "bindings": {}, + "result": "here" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/range-operator/case000.json b/__tests__/test-suite/groups/range-operator/case000.json new file mode 100644 index 00000000..48476972 --- /dev/null +++ b/__tests__/test-suite/groups/range-operator/case000.json @@ -0,0 +1,17 @@ +{ + "expr": "[0..9]", + "dataset": "dataset0", + "bindings": {}, + "result": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/range-operator/case001.json b/__tests__/test-suite/groups/range-operator/case001.json new file mode 100644 index 00000000..e494512c --- /dev/null +++ b/__tests__/test-suite/groups/range-operator/case001.json @@ -0,0 +1,12 @@ +{ + "expr": "[0..9][$ % 2 = 0]", + "dataset": "dataset0", + "bindings": {}, + "result": [ + 0, + 2, + 4, + 6, + 8 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/range-operator/case002.json b/__tests__/test-suite/groups/range-operator/case002.json new file mode 100644 index 00000000..b8dfbc08 --- /dev/null +++ b/__tests__/test-suite/groups/range-operator/case002.json @@ -0,0 +1,16 @@ +{ + "expr": "[0, 4..9, 20, 22]", + "dataset": "dataset0", + "bindings": {}, + "result": [ + 0, + 4, + 5, + 6, + 7, + 8, + 9, + 20, + 22 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/range-operator/case003.json b/__tests__/test-suite/groups/range-operator/case003.json new file mode 100644 index 00000000..86e9b329 --- /dev/null +++ b/__tests__/test-suite/groups/range-operator/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "[5..2]", + "dataset": "dataset0", + "bindings": {}, + "result": [] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/range-operator/case004.json b/__tests__/test-suite/groups/range-operator/case004.json new file mode 100644 index 00000000..cbc9d8c3 --- /dev/null +++ b/__tests__/test-suite/groups/range-operator/case004.json @@ -0,0 +1,11 @@ +{ + "expr": "[5..2, 2..5]", + "dataset": "dataset0", + "bindings": {}, + "result": [ + 2, + 3, + 4, + 5 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/range-operator/case005.json b/__tests__/test-suite/groups/range-operator/case005.json new file mode 100644 index 00000000..2cd8fee9 --- /dev/null +++ b/__tests__/test-suite/groups/range-operator/case005.json @@ -0,0 +1,12 @@ +{ + "expr": "[-2..2]", + "dataset": "dataset0", + "bindings": {}, + "result": [ + -2, + -1, + 0, + 1, + 2 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/range-operator/case006.json b/__tests__/test-suite/groups/range-operator/case006.json new file mode 100644 index 00000000..22b52704 --- /dev/null +++ b/__tests__/test-suite/groups/range-operator/case006.json @@ -0,0 +1,12 @@ +{ + "expr": "[-2..2].($*$)", + "dataset": "dataset0", + "bindings": {}, + "result": [ + 4, + 1, + 0, + 1, + 4 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/range-operator/case007.json b/__tests__/test-suite/groups/range-operator/case007.json new file mode 100644 index 00000000..19b0c00e --- /dev/null +++ b/__tests__/test-suite/groups/range-operator/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "[-2..blah]", + "dataset": null, + "bindings": {}, + "result": [] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/range-operator/case008.json b/__tests__/test-suite/groups/range-operator/case008.json new file mode 100644 index 00000000..4b5b0964 --- /dev/null +++ b/__tests__/test-suite/groups/range-operator/case008.json @@ -0,0 +1,8 @@ +{ + "expr": "[blah..5, 3, -2..blah]", + "dataset": null, + "bindings": {}, + "result": [ + 3 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/range-operator/case009.json b/__tests__/test-suite/groups/range-operator/case009.json new file mode 100644 index 00000000..5b2f0044 --- /dev/null +++ b/__tests__/test-suite/groups/range-operator/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "[1.1 .. 5]", + "dataset": null, + "bindings": {}, + "code": "T2003" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/range-operator/case010.json b/__tests__/test-suite/groups/range-operator/case010.json new file mode 100644 index 00000000..8a205a17 --- /dev/null +++ b/__tests__/test-suite/groups/range-operator/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "[1 .. 5.5]", + "dataset": null, + "bindings": {}, + "code": "T2004" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case000.json b/__tests__/test-suite/groups/regex/case000.json new file mode 100644 index 00000000..25ed470a --- /dev/null +++ b/__tests__/test-suite/groups/regex/case000.json @@ -0,0 +1,11 @@ +{ + "expr": "$split(\"ababbxabbcc\",/b+/)", + "dataset": null, + "bindings": {}, + "result": [ + "a", + "a", + "xa", + "cc" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case001.json b/__tests__/test-suite/groups/regex/case001.json new file mode 100644 index 00000000..52839a9e --- /dev/null +++ b/__tests__/test-suite/groups/regex/case001.json @@ -0,0 +1,9 @@ +{ + "expr": "$split(\"ababbxabbcc\",/b+/, 2)", + "dataset": null, + "bindings": {}, + "result": [ + "a", + "a" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case002.json b/__tests__/test-suite/groups/regex/case002.json new file mode 100644 index 00000000..1662c0c2 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case002.json @@ -0,0 +1,8 @@ +{ + "expr": "$split(\"ababbxabbcc\",/d+/)", + "dataset": null, + "bindings": {}, + "result": [ + "ababbxabbcc" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case003.json b/__tests__/test-suite/groups/regex/case003.json new file mode 100644 index 00000000..0cf77135 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "$contains(\"ababbxabbcc\",/ab+/)", + "dataset": null, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case004.json b/__tests__/test-suite/groups/regex/case004.json new file mode 100644 index 00000000..3bd42dc7 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$contains(\"ababbxabbcc\",/ax+/)", + "dataset": null, + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case005.json b/__tests__/test-suite/groups/regex/case005.json new file mode 100644 index 00000000..4d72c834 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order.Product[$contains($.\"Product Name\", /hat/)].ProductID", + "dataset": "dataset5", + "bindings": {}, + "result": 858236 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case006.json b/__tests__/test-suite/groups/regex/case006.json new file mode 100644 index 00000000..be1825d8 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case006.json @@ -0,0 +1,10 @@ +{ + "expr": "Account.Order.Product[$contains($.\"Product Name\", /hat/i)].ProductID", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 858383, + 858236, + 858383 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case007.json b/__tests__/test-suite/groups/regex/case007.json new file mode 100644 index 00000000..8a808f54 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"ababbxabbcc\",/b+/, \"yy\")", + "dataset": null, + "bindings": {}, + "result": "ayyayyxayycc" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case008.json b/__tests__/test-suite/groups/regex/case008.json new file mode 100644 index 00000000..3c07354c --- /dev/null +++ b/__tests__/test-suite/groups/regex/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"ababbxabbcc\",/b+/, \"yy\", 2)", + "dataset": null, + "bindings": {}, + "result": "ayyayyxabbcc" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case009.json b/__tests__/test-suite/groups/regex/case009.json new file mode 100644 index 00000000..1b9cf938 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"ababbxabbcc\",/b+/, \"yy\", 0)", + "dataset": null, + "bindings": {}, + "result": "ababbxabbcc" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case010.json b/__tests__/test-suite/groups/regex/case010.json new file mode 100644 index 00000000..8f00e8dd --- /dev/null +++ b/__tests__/test-suite/groups/regex/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"ababbxabbcc\",/d+/, \"yy\")", + "dataset": null, + "bindings": {}, + "result": "ababbxabbcc" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case011.json b/__tests__/test-suite/groups/regex/case011.json new file mode 100644 index 00000000..de84123f --- /dev/null +++ b/__tests__/test-suite/groups/regex/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"John Smith\", /(\\w+)\\s(\\w+)/, \"$2, $1\")", + "dataset": null, + "bindings": {}, + "result": "Smith, John" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case012.json b/__tests__/test-suite/groups/regex/case012.json new file mode 100644 index 00000000..9dd2ac32 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"265USD\", /([0-9]+)USD/, \"$$$1\")", + "dataset": null, + "bindings": {}, + "result": "$265" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case013.json b/__tests__/test-suite/groups/regex/case013.json new file mode 100644 index 00000000..9044a1d0 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"265USD\", /([0-9]+)USD/, \"$w\")", + "dataset": null, + "bindings": {}, + "result": "$w" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case014.json b/__tests__/test-suite/groups/regex/case014.json new file mode 100644 index 00000000..cef5081d --- /dev/null +++ b/__tests__/test-suite/groups/regex/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"265USD\", /([0-9]+)USD/, \"$0 -> $$$1\")", + "dataset": null, + "bindings": {}, + "result": "265USD -> $265" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case015.json b/__tests__/test-suite/groups/regex/case015.json new file mode 100644 index 00000000..91fd7914 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"265USD\", /([0-9]+)USD/, \"$0$1$2\")", + "dataset": null, + "bindings": {}, + "result": "265USD265" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case016.json b/__tests__/test-suite/groups/regex/case016.json new file mode 100644 index 00000000..2a21dc7e --- /dev/null +++ b/__tests__/test-suite/groups/regex/case016.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"abcd\", /(ab)|(a)/, \"[1=$1][2=$2]\")", + "dataset": null, + "bindings": {}, + "result": "[1=ab][2=]cd" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case017.json b/__tests__/test-suite/groups/regex/case017.json new file mode 100644 index 00000000..a2708e48 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"abracadabra\", /bra/, \"*\")", + "dataset": null, + "bindings": {}, + "result": "a*cada*" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case018.json b/__tests__/test-suite/groups/regex/case018.json new file mode 100644 index 00000000..836feac3 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case018.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"abracadabra\", /a.*a/, \"*\")", + "dataset": null, + "bindings": {}, + "result": "*" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case019.json b/__tests__/test-suite/groups/regex/case019.json new file mode 100644 index 00000000..3f58fc4d --- /dev/null +++ b/__tests__/test-suite/groups/regex/case019.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"abracadabra\", /a.*?a/, \"*\")", + "dataset": null, + "bindings": {}, + "result": "*c*bra" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case020.json b/__tests__/test-suite/groups/regex/case020.json new file mode 100644 index 00000000..a81b32cc --- /dev/null +++ b/__tests__/test-suite/groups/regex/case020.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"abracadabra\", /a/, \"\")", + "dataset": null, + "bindings": {}, + "result": "brcdbr" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case021.json b/__tests__/test-suite/groups/regex/case021.json new file mode 100644 index 00000000..e5501c73 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case021.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"abracadabra\", /a(.)/, \"a$1$1\")", + "dataset": null, + "bindings": {}, + "result": "abbraccaddabbra" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case022.json b/__tests__/test-suite/groups/regex/case022.json new file mode 100644 index 00000000..8b2e6c54 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case022.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"abracadabra\", /.*?/, \"$1\")", + "dataset": null, + "bindings": {}, + "code": "D1004" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case023.json b/__tests__/test-suite/groups/regex/case023.json new file mode 100644 index 00000000..d3b3c5b8 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case023.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"AAAA\", /A+/, \"b\")", + "dataset": null, + "bindings": {}, + "result": "b" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case024.json b/__tests__/test-suite/groups/regex/case024.json new file mode 100644 index 00000000..c1901394 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case024.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"AAAA\", /A+?/, \"b\")", + "dataset": null, + "bindings": {}, + "result": "bbbb" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case025.json b/__tests__/test-suite/groups/regex/case025.json new file mode 100644 index 00000000..027e272b --- /dev/null +++ b/__tests__/test-suite/groups/regex/case025.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"darted\", /^(.*?)d(.*)$/, \"$1c$2\")", + "dataset": null, + "bindings": {}, + "result": "carted" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case026.json b/__tests__/test-suite/groups/regex/case026.json new file mode 100644 index 00000000..2352d700 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case026.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"abcdefghijklmno\", /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)/, \"$8$5$12$12$18$123\")", + "dataset": null, + "bindings": {}, + "result": "hella8l3no" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case027.json b/__tests__/test-suite/groups/regex/case027.json new file mode 100644 index 00000000..8e0d07e0 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case027.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"abcdefghijklmno\", /xyz/, \"$8$5$12$12$18$123\")", + "dataset": null, + "bindings": {}, + "result": "abcdefghijklmno" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case028.json b/__tests__/test-suite/groups/regex/case028.json new file mode 100644 index 00000000..a1827527 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case028.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"abcdefghijklmno\", /ijk/, \"$8$5$12$12$18$123\")", + "dataset": null, + "bindings": {}, + "result": "abcdefgh22823lmno" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case029.json b/__tests__/test-suite/groups/regex/case029.json new file mode 100644 index 00000000..49fc506d --- /dev/null +++ b/__tests__/test-suite/groups/regex/case029.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"abcdefghijklmno\", /(ijk)/, \"$8$5$12$12$18$123\")", + "dataset": null, + "bindings": {}, + "result": "abcdefghijk2ijk2ijk8ijk23lmno" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case030.json b/__tests__/test-suite/groups/regex/case030.json new file mode 100644 index 00000000..20d3403c --- /dev/null +++ b/__tests__/test-suite/groups/regex/case030.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"abcdefghijklmno\", /ijk/, \"$x\")", + "dataset": null, + "bindings": {}, + "result": "abcdefgh$xlmno" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case031.json b/__tests__/test-suite/groups/regex/case031.json new file mode 100644 index 00000000..2fa4134d --- /dev/null +++ b/__tests__/test-suite/groups/regex/case031.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"abcdefghijklmno\", /(ijk)/, \"$x$\")", + "dataset": null, + "bindings": {}, + "result": "abcdefgh$x$lmno" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case032.json b/__tests__/test-suite/groups/regex/case032.json new file mode 100644 index 00000000..c61f90cc --- /dev/null +++ b/__tests__/test-suite/groups/regex/case032.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product.$replace($.\"Product Name\", /hat/i, function($match) { \"foo\" })", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "Bowler foo", + "Trilby foo", + "Bowler foo", + "Cloak" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case033.json b/__tests__/test-suite/groups/regex/case033.json new file mode 100644 index 00000000..06f4f0a3 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case033.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product.$replace($.\"Product Name\", /(h)(at)/i, function($match) { $uppercase($match.match) })", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "Bowler HAT", + "Trilby HAT", + "Bowler HAT", + "Cloak" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case034.json b/__tests__/test-suite/groups/regex/case034.json new file mode 100644 index 00000000..19b03ead --- /dev/null +++ b/__tests__/test-suite/groups/regex/case034.json @@ -0,0 +1,6 @@ +{ + "expr": "$replace(\"temperature = 68F today\", /(-?\\d+(?:\\.\\d*)?)F\\b/, function($m) { ($number($m.groups[0]) - 32) * 5/9 & \"C\" })", + "dataset": null, + "bindings": {}, + "result": "temperature = 20C today" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case035.json b/__tests__/test-suite/groups/regex/case035.json new file mode 100644 index 00000000..bd020504 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case035.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order.Product.$replace($.\"Product Name\", /hat/i, function($match) { true })", + "dataset": "dataset5", + "bindings": {}, + "code": "D3012" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/regex/case036.json b/__tests__/test-suite/groups/regex/case036.json new file mode 100644 index 00000000..57e9ac38 --- /dev/null +++ b/__tests__/test-suite/groups/regex/case036.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order.Product.$replace($.\"Product Name\", /hat/i, function($match) { 42 })", + "dataset": "dataset5", + "bindings": {}, + "code": "D3012" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case000.json b/__tests__/test-suite/groups/simple-array-selectors/case000.json new file mode 100644 index 00000000..44d888df --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case000.json @@ -0,0 +1,11 @@ +{ + "expr": "nest0.nest1[0]", + "dataset": "dataset4", + "bindings": {}, + "result": [ + 1, + 3, + 5, + 6 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case001.json b/__tests__/test-suite/groups/simple-array-selectors/case001.json new file mode 100644 index 00000000..7b5addf0 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.blah[0].baz.fud", + "dataset": "dataset0", + "bindings": {}, + "result": "hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case002.json b/__tests__/test-suite/groups/simple-array-selectors/case002.json new file mode 100644 index 00000000..af7af8c2 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.blah[1].baz.fud", + "dataset": "dataset0", + "bindings": {}, + "result": "world" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case003.json b/__tests__/test-suite/groups/simple-array-selectors/case003.json new file mode 100644 index 00000000..a3e2ea5c --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.blah[-1].bazz", + "dataset": "dataset0", + "bindings": {}, + "result": "gotcha" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case004.json b/__tests__/test-suite/groups/simple-array-selectors/case004.json new file mode 100644 index 00000000..9aa53675 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "(foo.blah)[1].baz.fud", + "dataset": "dataset0", + "bindings": {}, + "result": "world" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case005.json b/__tests__/test-suite/groups/simple-array-selectors/case005.json new file mode 100644 index 00000000..0aa5a580 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case005.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.blah.baz.fud[0]", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case006.json b/__tests__/test-suite/groups/simple-array-selectors/case006.json new file mode 100644 index 00000000..31e0b549 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case006.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.blah.baz.fud[-1]", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case007.json b/__tests__/test-suite/groups/simple-array-selectors/case007.json new file mode 100644 index 00000000..61a16048 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "(foo.blah.baz.fud)[0]", + "dataset": "dataset0", + "bindings": {}, + "result": "hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case008.json b/__tests__/test-suite/groups/simple-array-selectors/case008.json new file mode 100644 index 00000000..535ab2b7 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "(foo.blah.baz.fud)[1]", + "dataset": "dataset0", + "bindings": {}, + "result": "world" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case009.json b/__tests__/test-suite/groups/simple-array-selectors/case009.json new file mode 100644 index 00000000..4813c5f9 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "(foo.blah.baz.fud)[5 * 0.2]", + "dataset": "dataset0", + "bindings": {}, + "result": "world" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case010.json b/__tests__/test-suite/groups/simple-array-selectors/case010.json new file mode 100644 index 00000000..5622986a --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "(foo.blah.baz.fud)[-1]", + "dataset": "dataset0", + "bindings": {}, + "result": "world" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case011.json b/__tests__/test-suite/groups/simple-array-selectors/case011.json new file mode 100644 index 00000000..7eb02e61 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "(foo.blah.baz.fud)[-2]", + "dataset": "dataset0", + "bindings": {}, + "result": "hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case012.json b/__tests__/test-suite/groups/simple-array-selectors/case012.json new file mode 100644 index 00000000..856bb7e1 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "(foo.blah.baz.fud)[2-4]", + "dataset": "dataset0", + "bindings": {}, + "result": "hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case013.json b/__tests__/test-suite/groups/simple-array-selectors/case013.json new file mode 100644 index 00000000..53928eea --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "(foo.blah.baz.fud)[-(4-2)]", + "dataset": "dataset0", + "bindings": {}, + "result": "hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case014.json b/__tests__/test-suite/groups/simple-array-selectors/case014.json new file mode 100644 index 00000000..08194c71 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "(foo.blah.baz.fud)[$$.foo.bar / 30]", + "dataset": "dataset0", + "bindings": {}, + "result": "world" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case015.json b/__tests__/test-suite/groups/simple-array-selectors/case015.json new file mode 100644 index 00000000..6a4edc42 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case015.json @@ -0,0 +1,8 @@ +{ + "expr": "foo.blah[0].baz", + "dataset": "dataset0", + "bindings": {}, + "result": { + "fud": "hello" + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case016.json b/__tests__/test-suite/groups/simple-array-selectors/case016.json new file mode 100644 index 00000000..9f9ddc87 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case016.json @@ -0,0 +1,13 @@ +{ + "expr": "foo.blah.baz[0]", + "dataset": "dataset0", + "bindings": {}, + "result": [ + { + "fud": "hello" + }, + { + "fud": "world" + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case017.json b/__tests__/test-suite/groups/simple-array-selectors/case017.json new file mode 100644 index 00000000..fd6271a6 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case017.json @@ -0,0 +1,8 @@ +{ + "expr": "(foo.blah.baz)[0]", + "dataset": "dataset0", + "bindings": {}, + "result": { + "fud": "hello" + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case018.json b/__tests__/test-suite/groups/simple-array-selectors/case018.json new file mode 100644 index 00000000..d6dbfffb --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case018.json @@ -0,0 +1,18 @@ +{ + "expr": "$[0]", + "data": [ + [ + 1, + 2 + ], + [ + 3, + 4 + ] + ], + "bindings": {}, + "result": [ + 1, + 2 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case019.json b/__tests__/test-suite/groups/simple-array-selectors/case019.json new file mode 100644 index 00000000..7a5f8e76 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case019.json @@ -0,0 +1,18 @@ +{ + "expr": "$[1]", + "data": [ + [ + 1, + 2 + ], + [ + 3, + 4 + ] + ], + "bindings": {}, + "result": [ + 3, + 4 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case020.json b/__tests__/test-suite/groups/simple-array-selectors/case020.json new file mode 100644 index 00000000..c560dd30 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case020.json @@ -0,0 +1,18 @@ +{ + "expr": "$[-1]", + "data": [ + [ + 1, + 2 + ], + [ + 3, + 4 + ] + ], + "bindings": {}, + "result": [ + 3, + 4 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case021.json b/__tests__/test-suite/groups/simple-array-selectors/case021.json new file mode 100644 index 00000000..e6b7d8c0 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case021.json @@ -0,0 +1,15 @@ +{ + "expr": "$[1][0]", + "data": [ + [ + 1, + 2 + ], + [ + 3, + 4 + ] + ], + "bindings": {}, + "result": 3 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/simple-array-selectors/case022.json b/__tests__/test-suite/groups/simple-array-selectors/case022.json new file mode 100644 index 00000000..86e58183 --- /dev/null +++ b/__tests__/test-suite/groups/simple-array-selectors/case022.json @@ -0,0 +1,15 @@ +{ + "expr": "$[1.1][0.9]", + "data": [ + [ + 1, + 2 + ], + [ + 3, + 4 + ] + ], + "bindings": {}, + "result": 3 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/sorting/case000.json b/__tests__/test-suite/groups/sorting/case000.json new file mode 100644 index 00000000..a7e65756 --- /dev/null +++ b/__tests__/test-suite/groups/sorting/case000.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product.Price^($)", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 21.67, + 34.45, + 34.45, + 107.99 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/sorting/case001.json b/__tests__/test-suite/groups/sorting/case001.json new file mode 100644 index 00000000..bbf32042 --- /dev/null +++ b/__tests__/test-suite/groups/sorting/case001.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product.Price^(<$)", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 21.67, + 34.45, + 34.45, + 107.99 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/sorting/case002.json b/__tests__/test-suite/groups/sorting/case002.json new file mode 100644 index 00000000..ad16fc59 --- /dev/null +++ b/__tests__/test-suite/groups/sorting/case002.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product.Price^(>$)", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 107.99, + 34.45, + 34.45, + 21.67 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/sorting/case003.json b/__tests__/test-suite/groups/sorting/case003.json new file mode 100644 index 00000000..70118fa7 --- /dev/null +++ b/__tests__/test-suite/groups/sorting/case003.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product^(Price).Description.Colour", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "Orange", + "Purple", + "Purple", + "Black" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/sorting/case004.json b/__tests__/test-suite/groups/sorting/case004.json new file mode 100644 index 00000000..6f0e6804 --- /dev/null +++ b/__tests__/test-suite/groups/sorting/case004.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product^(Price).SKU", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "0406634348", + "0406654608", + "040657863", + "0406654603" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/sorting/case005.json b/__tests__/test-suite/groups/sorting/case005.json new file mode 100644 index 00000000..a4800728 --- /dev/null +++ b/__tests__/test-suite/groups/sorting/case005.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product^(Price * Quantity).Description.Colour", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "Orange", + "Purple", + "Black", + "Purple" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/sorting/case006.json b/__tests__/test-suite/groups/sorting/case006.json new file mode 100644 index 00000000..bdd6ea01 --- /dev/null +++ b/__tests__/test-suite/groups/sorting/case006.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product^(Quantity, Description.Colour).Description.Colour", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "Black", + "Orange", + "Purple", + "Purple" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/sorting/case007.json b/__tests__/test-suite/groups/sorting/case007.json new file mode 100644 index 00000000..5a36e689 --- /dev/null +++ b/__tests__/test-suite/groups/sorting/case007.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product^(Quantity, >Description.Colour).Description.Colour", + "dataset": "dataset5", + "bindings": {}, + "result": [ + "Orange", + "Black", + "Purple", + "Purple" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/sorting/case008.json b/__tests__/test-suite/groups/sorting/case008.json new file mode 100644 index 00000000..f92b8dd9 --- /dev/null +++ b/__tests__/test-suite/groups/sorting/case008.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product^(Price).SKU", + "dataset": "dataset12", + "bindings": {}, + "result": [ + "0406634348", + "040657863", + "0406654603", + "0406654608" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/sorting/case009.json b/__tests__/test-suite/groups/sorting/case009.json new file mode 100644 index 00000000..fc5b6f33 --- /dev/null +++ b/__tests__/test-suite/groups/sorting/case009.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product^(Price).SKU", + "dataset": "dataset13", + "bindings": {}, + "result": [ + "0406654608", + "040657863", + "0406654603", + "0406634348" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/sorting/case010.json b/__tests__/test-suite/groups/sorting/case010.json new file mode 100644 index 00000000..590a7751 --- /dev/null +++ b/__tests__/test-suite/groups/sorting/case010.json @@ -0,0 +1,11 @@ +{ + "expr": "Account.Order.Product^(Price).SKU", + "dataset": "dataset14", + "bindings": {}, + "result": [ + "040657863", + "0406654603", + "0406654608", + "0406634348" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/sorting/case011.json b/__tests__/test-suite/groups/sorting/case011.json new file mode 100644 index 00000000..27fa1b47 --- /dev/null +++ b/__tests__/test-suite/groups/sorting/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order.Product^(Price).SKU", + "dataset": "dataset15", + "bindings": {}, + "code": "T2007" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/sorting/case012.json b/__tests__/test-suite/groups/sorting/case012.json new file mode 100644 index 00000000..fcd8172d --- /dev/null +++ b/__tests__/test-suite/groups/sorting/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order.Product^(Price).SKU", + "dataset": "dataset16", + "bindings": {}, + "code": "T2008" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/sorting/case013.json b/__tests__/test-suite/groups/sorting/case013.json new file mode 100644 index 00000000..ff70b9f6 --- /dev/null +++ b/__tests__/test-suite/groups/sorting/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "Account.Order.Product^(Price).SKU", + "dataset": "dataset17", + "bindings": {}, + "code": "T2008" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/string-concat/case000.json b/__tests__/test-suite/groups/string-concat/case000.json new file mode 100644 index 00000000..91a5c7f3 --- /dev/null +++ b/__tests__/test-suite/groups/string-concat/case000.json @@ -0,0 +1,6 @@ +{ + "expr": "\"foo\" & \"bar\"", + "dataset": "dataset0", + "bindings": {}, + "result": "foobar" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/string-concat/case001.json b/__tests__/test-suite/groups/string-concat/case001.json new file mode 100644 index 00000000..18dfd62e --- /dev/null +++ b/__tests__/test-suite/groups/string-concat/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "\"foo\"&\"bar\"", + "dataset": "dataset0", + "bindings": {}, + "result": "foobar" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/string-concat/case002.json b/__tests__/test-suite/groups/string-concat/case002.json new file mode 100644 index 00000000..9fe51781 --- /dev/null +++ b/__tests__/test-suite/groups/string-concat/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.blah[0].baz.fud &foo.blah[1].baz.fud", + "dataset": "dataset0", + "bindings": {}, + "result": "helloworld" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/string-concat/case003.json b/__tests__/test-suite/groups/string-concat/case003.json new file mode 100644 index 00000000..728cdedc --- /dev/null +++ b/__tests__/test-suite/groups/string-concat/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.(blah[0].baz.fud & blah[1].baz.fud)", + "dataset": "dataset0", + "bindings": {}, + "result": "helloworld" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/string-concat/case004.json b/__tests__/test-suite/groups/string-concat/case004.json new file mode 100644 index 00000000..2c5c3d50 --- /dev/null +++ b/__tests__/test-suite/groups/string-concat/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.(blah[0].baz.fud & none)", + "dataset": "dataset0", + "bindings": {}, + "result": "hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/string-concat/case005.json b/__tests__/test-suite/groups/string-concat/case005.json new file mode 100644 index 00000000..c5793c4d --- /dev/null +++ b/__tests__/test-suite/groups/string-concat/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.(none.here & blah[1].baz.fud)", + "dataset": "dataset0", + "bindings": {}, + "result": "world" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/string-concat/case006.json b/__tests__/test-suite/groups/string-concat/case006.json new file mode 100644 index 00000000..a2620487 --- /dev/null +++ b/__tests__/test-suite/groups/string-concat/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "[1,2]&[3,4]", + "dataset": "dataset0", + "bindings": {}, + "result": "[1,2][3,4]" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/string-concat/case007.json b/__tests__/test-suite/groups/string-concat/case007.json new file mode 100644 index 00000000..a1fc0c0f --- /dev/null +++ b/__tests__/test-suite/groups/string-concat/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "[1,2]&3", + "dataset": "dataset0", + "bindings": {}, + "result": "[1,2]3" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/string-concat/case008.json b/__tests__/test-suite/groups/string-concat/case008.json new file mode 100644 index 00000000..291e8153 --- /dev/null +++ b/__tests__/test-suite/groups/string-concat/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "1&2", + "dataset": "dataset0", + "bindings": {}, + "result": "12" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/string-concat/case009.json b/__tests__/test-suite/groups/string-concat/case009.json new file mode 100644 index 00000000..01e98b95 --- /dev/null +++ b/__tests__/test-suite/groups/string-concat/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "1&[2]", + "dataset": "dataset0", + "bindings": {}, + "result": "1[2]" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/string-concat/case010.json b/__tests__/test-suite/groups/string-concat/case010.json new file mode 100644 index 00000000..c952fec3 --- /dev/null +++ b/__tests__/test-suite/groups/string-concat/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "\"hello\"&5", + "dataset": "dataset0", + "bindings": {}, + "result": "hello5" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/string-concat/case011.json b/__tests__/test-suite/groups/string-concat/case011.json new file mode 100644 index 00000000..4ad5f6ff --- /dev/null +++ b/__tests__/test-suite/groups/string-concat/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "\"Prices: \" & Account.Order.Product.Price", + "dataset": "dataset5", + "bindings": {}, + "result": "Prices: [34.45,21.67,34.45,107.99]" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/tail-recursion/case000.json b/__tests__/test-suite/groups/tail-recursion/case000.json new file mode 100644 index 00000000..464c20ee --- /dev/null +++ b/__tests__/test-suite/groups/tail-recursion/case000.json @@ -0,0 +1,6 @@ +{ + "expr": " ( $f := function($n){()}; $f(1) ) ", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/tail-recursion/case001.json b/__tests__/test-suite/groups/tail-recursion/case001.json new file mode 100644 index 00000000..15ef1d31 --- /dev/null +++ b/__tests__/test-suite/groups/tail-recursion/case001.json @@ -0,0 +1,8 @@ +{ + "expr": "( $factorial := function($n){$n = 0 ? 1 : $n * $factorial($n - 1)}; $factorial(99)) ", + "dataset": null, + "timelimit": 2000, + "depth": 302, + "bindings": {}, + "result": 9.33262154439441e+155 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/tail-recursion/case002.json b/__tests__/test-suite/groups/tail-recursion/case002.json new file mode 100644 index 00000000..b39c3e88 --- /dev/null +++ b/__tests__/test-suite/groups/tail-recursion/case002.json @@ -0,0 +1,8 @@ +{ + "expr": "( $factorial := function($n){$n = 0 ? 1 : $n * $factorial($n - 1)}; $factorial(100)) ", + "dataset": null, + "timelimit": 1000, + "depth": 302, + "bindings": {}, + "code": "U1001" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/tail-recursion/case003.json b/__tests__/test-suite/groups/tail-recursion/case003.json new file mode 100644 index 00000000..f901215c --- /dev/null +++ b/__tests__/test-suite/groups/tail-recursion/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "( $factorial := function($n){( $iter := function($n, $acc) { $n = 0 ? $acc : $iter($n - 1, $n * $acc) }; $iter($n, 1) )}; $factorial(5)) ", + "dataset": null, + "bindings": {}, + "result": 120 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/tail-recursion/case004.json b/__tests__/test-suite/groups/tail-recursion/case004.json new file mode 100644 index 00000000..fbb1bc47 --- /dev/null +++ b/__tests__/test-suite/groups/tail-recursion/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "( $factorial := function($n){( $iter := function($n, $acc) { $n = 0 ? $acc : $iter($n - 1, $n * $acc) }; $iter($n, 1) )}; $factorial(150)) ", + "dataset": null, + "bindings": {}, + "result": 5.7133839564458575e+262 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/tail-recursion/case005.json b/__tests__/test-suite/groups/tail-recursion/case005.json new file mode 100644 index 00000000..10b0a385 --- /dev/null +++ b/__tests__/test-suite/groups/tail-recursion/case005.json @@ -0,0 +1,8 @@ +{ + "expr": "( $inf := function($n){$n+$inf($n-1)}; $inf(5))", + "dataset": null, + "timelimit": 1000, + "depth": 300, + "bindings": {}, + "code": "U1001" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/tail-recursion/case006.json b/__tests__/test-suite/groups/tail-recursion/case006.json new file mode 100644 index 00000000..0a1b706d --- /dev/null +++ b/__tests__/test-suite/groups/tail-recursion/case006.json @@ -0,0 +1,8 @@ +{ + "expr": "( $inf := function(){$inf()}; $inf())", + "dataset": null, + "timelimit": 1000, + "depth": 500, + "bindings": {}, + "code": "U1001" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/tail-recursion/case007.json b/__tests__/test-suite/groups/tail-recursion/case007.json new file mode 100644 index 00000000..9d21f36b --- /dev/null +++ b/__tests__/test-suite/groups/tail-recursion/case007.json @@ -0,0 +1,8 @@ +{ + "expr": " ( $even := function($n) { $n = 0 ? true : $odd($n-1) }; $odd := function($n) { $n = 0 ? false : $even($n-1) }; $odd(6555) )", + "dataset": null, + "timelimit": 9000, + "depth": 500, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case000.json b/__tests__/test-suite/groups/transform/case000.json new file mode 100644 index 00000000..936579e3 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case000.json @@ -0,0 +1,49 @@ +{ + "expr": "{'Order': Account.Order.{ 'ID': OrderID, 'Product': Product.{ 'SKU': ProductID, 'Details': { 'Weight': Description.Weight, 'Dimensions': Description.(Width & ' x ' & Height & ' x ' & Depth) } }, 'Total Price': $sum(Product.(Price * Quantity))}}", + "dataset": "dataset5", + "bindings": {}, + "result": { + "Order": [ + { + "ID": "order103", + "Product": [ + { + "SKU": 858383, + "Details": { + "Weight": 0.75, + "Dimensions": "300 x 200 x 210" + } + }, + { + "SKU": 858236, + "Details": { + "Weight": 0.6, + "Dimensions": "300 x 200 x 210" + } + } + ], + "Total Price": 90.57000000000001 + }, + { + "ID": "order104", + "Product": [ + { + "SKU": 858383, + "Details": { + "Weight": 0.75, + "Dimensions": "300 x 200 x 210" + } + }, + { + "SKU": 345664, + "Details": { + "Weight": 2, + "Dimensions": "30 x 20 x 210" + } + } + ], + "Total Price": 245.79000000000002 + } + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case001.json b/__tests__/test-suite/groups/transform/case001.json new file mode 100644 index 00000000..39b1e56c --- /dev/null +++ b/__tests__/test-suite/groups/transform/case001.json @@ -0,0 +1,18 @@ +{ + "expr": "\n (\n $tempReadings := $count(state.tempReadings) = 5 ?\n [state.tempReadings[[1..4]], event.t] :\n [state.tempReadings, event.t];\n \n {\n \"tempReadings\": $tempReadings,\n \"sumTemperatures\": $sum($tempReadings),\n \"avgTemperature\": $average($tempReadings) ~> $round(2),\n \"maxTemperature\": $max($tempReadings),\n \"minTemperature\": $min($tempReadings)\n }\n )", + "dataset": "dataset18", + "bindings": {}, + "result": { + "tempReadings": [ + 28.9, + 28, + 28.2, + 28.4, + 28.4 + ], + "sumTemperatures": 141.9, + "avgTemperature": 28.38, + "maxTemperature": 28.9, + "minTemperature": 28 + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case002.json b/__tests__/test-suite/groups/transform/case002.json new file mode 100644 index 00000000..74d2a1a9 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case002.json @@ -0,0 +1,14 @@ +{ + "expr": "$", + "dataset": "dataset19", + "bindings": {}, + "result": { + "output": { + "is": { + "same": { + "as": "input" + } + } + } + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case003.json b/__tests__/test-suite/groups/transform/case003.json new file mode 100644 index 00000000..b6c1530a --- /dev/null +++ b/__tests__/test-suite/groups/transform/case003.json @@ -0,0 +1,12 @@ +{ + "expr": "foo", + "data": { + "foo": { + "bar": 42 + } + }, + "bindings": {}, + "result": { + "bar": 42 + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case004.json b/__tests__/test-suite/groups/transform/case004.json new file mode 100644 index 00000000..c1616032 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case004.json @@ -0,0 +1,15 @@ +{ + "expr": "baz", + "data": { + "foo": { + "bar": 42 + }, + "baz": { + "gar": 50 + } + }, + "bindings": {}, + "result": { + "gar": 50 + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case005.json b/__tests__/test-suite/groups/transform/case005.json new file mode 100644 index 00000000..f305012b --- /dev/null +++ b/__tests__/test-suite/groups/transform/case005.json @@ -0,0 +1,15 @@ +{ + "expr": "Foo", + "data": { + "foo": { + "lala": 42 + }, + "Foo": { + "mama": 45 + } + }, + "bindings": {}, + "result": { + "mama": 45 + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case006.json b/__tests__/test-suite/groups/transform/case006.json new file mode 100644 index 00000000..f18fadd3 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case006.json @@ -0,0 +1,15 @@ +{ + "expr": "food", + "data": { + "foo": { + "food": 2 + }, + "food": { + "wa": "hume" + } + }, + "bindings": {}, + "result": { + "wa": "hume" + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case007.json b/__tests__/test-suite/groups/transform/case007.json new file mode 100644 index 00000000..270c6a74 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case007.json @@ -0,0 +1,10 @@ +{ + "expr": "maz.rar", + "data": { + "maz": { + "rar": 42 + } + }, + "bindings": {}, + "result": 42 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case008.json b/__tests__/test-suite/groups/transform/case008.json new file mode 100644 index 00000000..c7c4494f --- /dev/null +++ b/__tests__/test-suite/groups/transform/case008.json @@ -0,0 +1,8 @@ +{ + "expr": "jee.par.waa", + "dataset": "dataset20", + "bindings": {}, + "result": { + "bar": 87 + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case009.json b/__tests__/test-suite/groups/transform/case009.json new file mode 100644 index 00000000..58d2d01b --- /dev/null +++ b/__tests__/test-suite/groups/transform/case009.json @@ -0,0 +1,8 @@ +{ + "expr": "foo", + "data": { + "stuff": 4 + }, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case010.json b/__tests__/test-suite/groups/transform/case010.json new file mode 100644 index 00000000..1a1803e4 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case010.json @@ -0,0 +1,8 @@ +{ + "expr": "foo.bar", + "data": { + "stuff": 4 + }, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case011.json b/__tests__/test-suite/groups/transform/case011.json new file mode 100644 index 00000000..00eacecf --- /dev/null +++ b/__tests__/test-suite/groups/transform/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$", + "data": "foo", + "bindings": {}, + "result": "foo" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case012.json b/__tests__/test-suite/groups/transform/case012.json new file mode 100644 index 00000000..e9249fa8 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case012.json @@ -0,0 +1,8 @@ +{ + "expr": "bar", + "data": { + "bar": "foo" + }, + "bindings": {}, + "result": "foo" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case013.json b/__tests__/test-suite/groups/transform/case013.json new file mode 100644 index 00000000..41b21460 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "$", + "data": 6754322, + "bindings": {}, + "result": 6754322 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case014.json b/__tests__/test-suite/groups/transform/case014.json new file mode 100644 index 00000000..d128c60d --- /dev/null +++ b/__tests__/test-suite/groups/transform/case014.json @@ -0,0 +1,6 @@ +{ + "expr": "$", + "data": 0, + "bindings": {}, + "result": 0 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case015.json b/__tests__/test-suite/groups/transform/case015.json new file mode 100644 index 00000000..417cf028 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case015.json @@ -0,0 +1,6 @@ +{ + "expr": "$", + "data": -24, + "bindings": {}, + "result": -24 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case016.json b/__tests__/test-suite/groups/transform/case016.json new file mode 100644 index 00000000..2f15befc --- /dev/null +++ b/__tests__/test-suite/groups/transform/case016.json @@ -0,0 +1,8 @@ +{ + "expr": "bar", + "data": { + "bar": 6.54 + }, + "bindings": {}, + "result": 6.54 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case017.json b/__tests__/test-suite/groups/transform/case017.json new file mode 100644 index 00000000..d404b638 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case017.json @@ -0,0 +1,6 @@ +{ + "expr": "$", + "data": true, + "bindings": {}, + "result": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case018.json b/__tests__/test-suite/groups/transform/case018.json new file mode 100644 index 00000000..fd67948c --- /dev/null +++ b/__tests__/test-suite/groups/transform/case018.json @@ -0,0 +1,8 @@ +{ + "expr": "bar", + "data": { + "bar": false + }, + "bindings": {}, + "result": false +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case019.json b/__tests__/test-suite/groups/transform/case019.json new file mode 100644 index 00000000..0295d00f --- /dev/null +++ b/__tests__/test-suite/groups/transform/case019.json @@ -0,0 +1,6 @@ +{ + "expr": "$", + "data": null, + "bindings": {}, + "result": null +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case020.json b/__tests__/test-suite/groups/transform/case020.json new file mode 100644 index 00000000..00b6515a --- /dev/null +++ b/__tests__/test-suite/groups/transform/case020.json @@ -0,0 +1,8 @@ +{ + "expr": "bar", + "data": { + "bar": null + }, + "bindings": {}, + "result": null +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case021.json b/__tests__/test-suite/groups/transform/case021.json new file mode 100644 index 00000000..c2eaa4d3 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case021.json @@ -0,0 +1,6 @@ +{ + "expr": "bar", + "data": {}, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case022.json b/__tests__/test-suite/groups/transform/case022.json new file mode 100644 index 00000000..30880bed --- /dev/null +++ b/__tests__/test-suite/groups/transform/case022.json @@ -0,0 +1,6 @@ +{ + "expr": "$", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case023.json b/__tests__/test-suite/groups/transform/case023.json new file mode 100644 index 00000000..f362eedf --- /dev/null +++ b/__tests__/test-suite/groups/transform/case023.json @@ -0,0 +1,8 @@ +{ + "expr": "bar", + "data": { + "bar": "\"Hello\"" + }, + "bindings": {}, + "result": "\"Hello\"" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case024.json b/__tests__/test-suite/groups/transform/case024.json new file mode 100644 index 00000000..5fe8bb2d --- /dev/null +++ b/__tests__/test-suite/groups/transform/case024.json @@ -0,0 +1,6 @@ +{ + "expr": "$", + "data": "\"Hello\"", + "bindings": {}, + "result": "\"Hello\"" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case025.json b/__tests__/test-suite/groups/transform/case025.json new file mode 100644 index 00000000..08ca999f --- /dev/null +++ b/__tests__/test-suite/groups/transform/case025.json @@ -0,0 +1,8 @@ +{ + "expr": "bar", + "data": { + "bar": "'Hello'" + }, + "bindings": {}, + "result": "'Hello'" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case026.json b/__tests__/test-suite/groups/transform/case026.json new file mode 100644 index 00000000..682d8e1a --- /dev/null +++ b/__tests__/test-suite/groups/transform/case026.json @@ -0,0 +1,6 @@ +{ + "expr": "$", + "data": "'Hello'", + "bindings": {}, + "result": "'Hello'" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case027.json b/__tests__/test-suite/groups/transform/case027.json new file mode 100644 index 00000000..13f45462 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case027.json @@ -0,0 +1,6 @@ +{ + "expr": "$lowercase(Salutation)", + "dataset": "dataset21", + "bindings": {}, + "result": "mr" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case028.json b/__tests__/test-suite/groups/transform/case028.json new file mode 100644 index 00000000..bd53c6fd --- /dev/null +++ b/__tests__/test-suite/groups/transform/case028.json @@ -0,0 +1,6 @@ +{ + "expr": "$lowercase(敷)", + "dataset": "dataset21", + "bindings": {}, + "result": "steve" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case029.json b/__tests__/test-suite/groups/transform/case029.json new file mode 100644 index 00000000..d47301af --- /dev/null +++ b/__tests__/test-suite/groups/transform/case029.json @@ -0,0 +1,6 @@ +{ + "expr": "$lowercase(Español)", + "dataset": "dataset21", + "bindings": {}, + "result": "/ˈspænɪʃ/" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case030.json b/__tests__/test-suite/groups/transform/case030.json new file mode 100644 index 00000000..b9430976 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case030.json @@ -0,0 +1,6 @@ +{ + "expr": "$lowercase($.\"NI.Number\")", + "dataset": "dataset21", + "bindings": {}, + "result": "no10furbzness" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case031.json b/__tests__/test-suite/groups/transform/case031.json new file mode 100644 index 00000000..11ccd2fc --- /dev/null +++ b/__tests__/test-suite/groups/transform/case031.json @@ -0,0 +1,6 @@ +{ + "expr": "$lowercase(\"COMPENSATION IS : \" & Employment.\"Executive.Compensation\")", + "dataset": "dataset21", + "bindings": {}, + "result": "compensation is : 1400000" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case032.json b/__tests__/test-suite/groups/transform/case032.json new file mode 100644 index 00000000..a00bddc0 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case032.json @@ -0,0 +1,6 @@ +{ + "expr": "\"Hello\"", + "dataset": "dataset21", + "bindings": {}, + "result": "Hello" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case033.json b/__tests__/test-suite/groups/transform/case033.json new file mode 100644 index 00000000..15965640 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case033.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(Salutation)", + "dataset": "dataset21", + "bindings": {}, + "result": "MR" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case034.json b/__tests__/test-suite/groups/transform/case034.json new file mode 100644 index 00000000..a1d1cdad --- /dev/null +++ b/__tests__/test-suite/groups/transform/case034.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(\"Hello World\")", + "dataset": "dataset21", + "bindings": {}, + "result": "HELLO WORLD" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case035.json b/__tests__/test-suite/groups/transform/case035.json new file mode 100644 index 00000000..b8da2cd0 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case035.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(\"鯵噂ソ竹\")", + "dataset": "dataset21", + "bindings": {}, + "result": "鯵噂ソ竹" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case036.json b/__tests__/test-suite/groups/transform/case036.json new file mode 100644 index 00000000..46f505e1 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case036.json @@ -0,0 +1,6 @@ +{ + "expr": "Employment.Name & \" is happy\"", + "dataset": "dataset21", + "bindings": {}, + "result": "IBM UK is happy" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case037.json b/__tests__/test-suite/groups/transform/case037.json new file mode 100644 index 00000000..d276bf78 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case037.json @@ -0,0 +1,6 @@ +{ + "expr": "Employment.Name & \" is pleased to employ \" & Salutation & \" \" & Surname", + "dataset": "dataset21", + "bindings": {}, + "result": "IBM UK is pleased to employ Mr Smith" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case038.json b/__tests__/test-suite/groups/transform/case038.json new file mode 100644 index 00000000..d8e3a845 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case038.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(\"Hello \" & Salutation & \" \" & Surname)", + "dataset": "dataset21", + "bindings": {}, + "result": "HELLO MR SMITH" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case039.json b/__tests__/test-suite/groups/transform/case039.json new file mode 100644 index 00000000..92b566c0 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case039.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(Salutation & \" \" & Surname & \" - has \" & Cars & \" registered cars\")", + "dataset": "dataset21", + "bindings": {}, + "result": "MR SMITH - HAS 3 REGISTERED CARS" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case040.json b/__tests__/test-suite/groups/transform/case040.json new file mode 100644 index 00000000..b04aa856 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case040.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(Employment.ContractType)", + "dataset": "dataset21", + "bindings": {}, + "result": "PERMANENT" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case041.json b/__tests__/test-suite/groups/transform/case041.json new file mode 100644 index 00000000..5ccf1478 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case041.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(\"Hola\", \"l\")", + "dataset": "dataset21", + "bindings": {}, + "result": "Ho" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case042.json b/__tests__/test-suite/groups/transform/case042.json new file mode 100644 index 00000000..fd2230f3 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case042.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(\"Hola\", 'l')", + "dataset": "dataset21", + "bindings": {}, + "result": "Ho" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case043.json b/__tests__/test-suite/groups/transform/case043.json new file mode 100644 index 00000000..fa2fcd99 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case043.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(\"Hola\", \"Q\")", + "dataset": "dataset21", + "bindings": {}, + "result": "Hola" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case044.json b/__tests__/test-suite/groups/transform/case044.json new file mode 100644 index 00000000..55b59b1c --- /dev/null +++ b/__tests__/test-suite/groups/transform/case044.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(\"Hola\", \"\")", + "dataset": "dataset21", + "bindings": {}, + "result": "" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case045.json b/__tests__/test-suite/groups/transform/case045.json new file mode 100644 index 00000000..72064c76 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case045.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(\"鯵噂ソ竹\", \"ソ\")", + "dataset": "dataset21", + "bindings": {}, + "result": "鯵噂" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case046.json b/__tests__/test-suite/groups/transform/case046.json new file mode 100644 index 00000000..bb6822d4 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case046.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(\"Coca\" & \"Cola\", \"ca\")", + "dataset": "dataset21", + "bindings": {}, + "result": "Cola" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case047.json b/__tests__/test-suite/groups/transform/case047.json new file mode 100644 index 00000000..1828a10b --- /dev/null +++ b/__tests__/test-suite/groups/transform/case047.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(Salutation & \" \" & MiddleName &\" \" & Surname, MiddleName)", + "dataset": "dataset21", + "bindings": {}, + "result": " Smith" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case048.json b/__tests__/test-suite/groups/transform/case048.json new file mode 100644 index 00000000..39c71af9 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case048.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(Salutation & \" \" & Employment.Role, Salutation)", + "dataset": "dataset21", + "bindings": {}, + "result": " Senior Physician" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case049.json b/__tests__/test-suite/groups/transform/case049.json new file mode 100644 index 00000000..15a414e2 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case049.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(\"Hola\", 'l')", + "dataset": "dataset21", + "bindings": {}, + "result": "a" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case050.json b/__tests__/test-suite/groups/transform/case050.json new file mode 100644 index 00000000..eb24d68e --- /dev/null +++ b/__tests__/test-suite/groups/transform/case050.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(\"Hola\", \"Q\")", + "dataset": "dataset21", + "bindings": {}, + "result": "Hola" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case051.json b/__tests__/test-suite/groups/transform/case051.json new file mode 100644 index 00000000..8971ee64 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case051.json @@ -0,0 +1,6 @@ +{ + "expr": "$lowercase(Employment.Role) & \" (\" & Employment.Role & \")\"", + "dataset": "dataset21", + "bindings": {}, + "result": "senior physician (Senior Physician)" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case052.json b/__tests__/test-suite/groups/transform/case052.json new file mode 100644 index 00000000..8a8f0df2 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case052.json @@ -0,0 +1,6 @@ +{ + "expr": "Employment.Years & \" years of employment\"", + "dataset": "dataset21", + "bindings": {}, + "result": "12 years of employment" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case053.json b/__tests__/test-suite/groups/transform/case053.json new file mode 100644 index 00000000..9abf5107 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case053.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(Salutation & \" \" & Surname & \" - has \" & Employment.Years & \" years of employment\")", + "dataset": "dataset21", + "bindings": {}, + "result": "MR SMITH - HAS 12 YEARS OF EMPLOYMENT" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case054.json b/__tests__/test-suite/groups/transform/case054.json new file mode 100644 index 00000000..17912a4b --- /dev/null +++ b/__tests__/test-suite/groups/transform/case054.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(Employment.Role, 7,4)", + "dataset": "dataset21", + "bindings": {}, + "result": "Phys" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case055.json b/__tests__/test-suite/groups/transform/case055.json new file mode 100644 index 00000000..bcb7e172 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case055.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(Employment.Role, -4,4)", + "dataset": "dataset21", + "bindings": {}, + "result": "cian" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case056.json b/__tests__/test-suite/groups/transform/case056.json new file mode 100644 index 00000000..b6bd470d --- /dev/null +++ b/__tests__/test-suite/groups/transform/case056.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(\"Hello World\",Cars,5)", + "dataset": "dataset21", + "bindings": {}, + "result": "lo Wo" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case057.json b/__tests__/test-suite/groups/transform/case057.json new file mode 100644 index 00000000..4ded6366 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case057.json @@ -0,0 +1,6 @@ +{ + "expr": "$lowercase(\"Missing close brackets\"", + "dataset": "dataset21", + "bindings": {}, + "code": "S0203" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case058.json b/__tests__/test-suite/groups/transform/case058.json new file mode 100644 index 00000000..fdaed6fc --- /dev/null +++ b/__tests__/test-suite/groups/transform/case058.json @@ -0,0 +1,6 @@ +{ + "expr": "$unknown(Salutation)", + "dataset": "dataset21", + "bindings": {}, + "code": "T1006" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case059.json b/__tests__/test-suite/groups/transform/case059.json new file mode 100644 index 00000000..26453f52 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case059.json @@ -0,0 +1,6 @@ +{ + "expr": "$decrypt(Salutation)", + "dataset": "dataset21", + "bindings": {}, + "code": "T1006" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case060.json b/__tests__/test-suite/groups/transform/case060.json new file mode 100644 index 00000000..d45b2481 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case060.json @@ -0,0 +1,6 @@ +{ + "expr": "Employment.authentication(Salutation)", + "dataset": "dataset21", + "bindings": {}, + "code": "T1006" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case061.json b/__tests__/test-suite/groups/transform/case061.json new file mode 100644 index 00000000..5e1a1ef2 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case061.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(Invalid)", + "dataset": "dataset21", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case062.json b/__tests__/test-suite/groups/transform/case062.json new file mode 100644 index 00000000..01b2613f --- /dev/null +++ b/__tests__/test-suite/groups/transform/case062.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(Employment.Invalid)", + "dataset": "dataset21", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case063.json b/__tests__/test-suite/groups/transform/case063.json new file mode 100644 index 00000000..4b66dc5b --- /dev/null +++ b/__tests__/test-suite/groups/transform/case063.json @@ -0,0 +1,6 @@ +{ + "expr": "$lowercase(\"Coca\", \"Cola\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case064.json b/__tests__/test-suite/groups/transform/case064.json new file mode 100644 index 00000000..45ef8bf8 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case064.json @@ -0,0 +1,6 @@ +{ + "expr": "$lowercase(Salary)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case065.json b/__tests__/test-suite/groups/transform/case065.json new file mode 100644 index 00000000..1c5784dc --- /dev/null +++ b/__tests__/test-suite/groups/transform/case065.json @@ -0,0 +1,6 @@ +{ + "expr": "$lowercase(20)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case066.json b/__tests__/test-suite/groups/transform/case066.json new file mode 100644 index 00000000..c4620ed9 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case066.json @@ -0,0 +1,6 @@ +{ + "expr": "$lowercase(20.55)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case067.json b/__tests__/test-suite/groups/transform/case067.json new file mode 100644 index 00000000..ffb4bc4f --- /dev/null +++ b/__tests__/test-suite/groups/transform/case067.json @@ -0,0 +1,6 @@ +{ + "expr": "$lowercase(Employment)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case068.json b/__tests__/test-suite/groups/transform/case068.json new file mode 100644 index 00000000..1a1136a7 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case068.json @@ -0,0 +1,6 @@ +{ + "expr": "$lowercase(Qualifications)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case069.json b/__tests__/test-suite/groups/transform/case069.json new file mode 100644 index 00000000..54cbf83d --- /dev/null +++ b/__tests__/test-suite/groups/transform/case069.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(\"Coca\", \"Cola\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case070.json b/__tests__/test-suite/groups/transform/case070.json new file mode 100644 index 00000000..39ba5e45 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case070.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(Salary)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case071.json b/__tests__/test-suite/groups/transform/case071.json new file mode 100644 index 00000000..6612f4cc --- /dev/null +++ b/__tests__/test-suite/groups/transform/case071.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(28)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case072.json b/__tests__/test-suite/groups/transform/case072.json new file mode 100644 index 00000000..b3349d9c --- /dev/null +++ b/__tests__/test-suite/groups/transform/case072.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(20.55)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case073.json b/__tests__/test-suite/groups/transform/case073.json new file mode 100644 index 00000000..371e258e --- /dev/null +++ b/__tests__/test-suite/groups/transform/case073.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(Cars)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case074.json b/__tests__/test-suite/groups/transform/case074.json new file mode 100644 index 00000000..cf7b676e --- /dev/null +++ b/__tests__/test-suite/groups/transform/case074.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(Employment)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case075.json b/__tests__/test-suite/groups/transform/case075.json new file mode 100644 index 00000000..4698d58e --- /dev/null +++ b/__tests__/test-suite/groups/transform/case075.json @@ -0,0 +1,6 @@ +{ + "expr": "$uppercase(Qualifications)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case076.json b/__tests__/test-suite/groups/transform/case076.json new file mode 100644 index 00000000..9d8ab55e --- /dev/null +++ b/__tests__/test-suite/groups/transform/case076.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(\"Coca\" & \"ca\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0411" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case077.json b/__tests__/test-suite/groups/transform/case077.json new file mode 100644 index 00000000..20f402ff --- /dev/null +++ b/__tests__/test-suite/groups/transform/case077.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(Salary,\"xx\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case078.json b/__tests__/test-suite/groups/transform/case078.json new file mode 100644 index 00000000..59cd3bf1 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case078.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(22,\"xx\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case079.json b/__tests__/test-suite/groups/transform/case079.json new file mode 100644 index 00000000..c73c607c --- /dev/null +++ b/__tests__/test-suite/groups/transform/case079.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(22.55,\"xx\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case080.json b/__tests__/test-suite/groups/transform/case080.json new file mode 100644 index 00000000..6f4ec257 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case080.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(\"22\",2)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case081.json b/__tests__/test-suite/groups/transform/case081.json new file mode 100644 index 00000000..4dcf23d4 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case081.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(\"22.55\",5)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case082.json b/__tests__/test-suite/groups/transform/case082.json new file mode 100644 index 00000000..72dcadbf --- /dev/null +++ b/__tests__/test-suite/groups/transform/case082.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(Employment,\"xx\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case083.json b/__tests__/test-suite/groups/transform/case083.json new file mode 100644 index 00000000..0f6c51c1 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case083.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringBefore(Qualifications,\"xx\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case084.json b/__tests__/test-suite/groups/transform/case084.json new file mode 100644 index 00000000..7754d57c --- /dev/null +++ b/__tests__/test-suite/groups/transform/case084.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(\"Coca\" & \"ca\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0411" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case085.json b/__tests__/test-suite/groups/transform/case085.json new file mode 100644 index 00000000..e0c09a8c --- /dev/null +++ b/__tests__/test-suite/groups/transform/case085.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(Salary,\"xx\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case086.json b/__tests__/test-suite/groups/transform/case086.json new file mode 100644 index 00000000..4ba2fb73 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case086.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(22,\"xx\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case087.json b/__tests__/test-suite/groups/transform/case087.json new file mode 100644 index 00000000..6d134831 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case087.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(22.55,\"xx\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case088.json b/__tests__/test-suite/groups/transform/case088.json new file mode 100644 index 00000000..144a4cbc --- /dev/null +++ b/__tests__/test-suite/groups/transform/case088.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(\"22\",2)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case089.json b/__tests__/test-suite/groups/transform/case089.json new file mode 100644 index 00000000..d27f9f47 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case089.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(\"22.55\",5)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case090.json b/__tests__/test-suite/groups/transform/case090.json new file mode 100644 index 00000000..e2e9997e --- /dev/null +++ b/__tests__/test-suite/groups/transform/case090.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(Employment,\"xx\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case091.json b/__tests__/test-suite/groups/transform/case091.json new file mode 100644 index 00000000..47c225c0 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case091.json @@ -0,0 +1,6 @@ +{ + "expr": "$substringAfter(Qualifications,\"xx\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case092.json b/__tests__/test-suite/groups/transform/case092.json new file mode 100644 index 00000000..1f9d4a53 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case092.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(\"Coca\" & \"ca\", 2, 4, 5)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case093.json b/__tests__/test-suite/groups/transform/case093.json new file mode 100644 index 00000000..51c9f0b7 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case093.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(\"Coca\", \"Mr\", 4)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case094.json b/__tests__/test-suite/groups/transform/case094.json new file mode 100644 index 00000000..6ab8e821 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case094.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(\"Coca\", 3, \"Whoops\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case095.json b/__tests__/test-suite/groups/transform/case095.json new file mode 100644 index 00000000..1d21f9ef --- /dev/null +++ b/__tests__/test-suite/groups/transform/case095.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(Salary,2,4)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case096.json b/__tests__/test-suite/groups/transform/case096.json new file mode 100644 index 00000000..61c71a0f --- /dev/null +++ b/__tests__/test-suite/groups/transform/case096.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(\"Hello\",\"World\",5)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case097.json b/__tests__/test-suite/groups/transform/case097.json new file mode 100644 index 00000000..a44c0016 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case097.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(\"Hello\",5,\"World\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case098.json b/__tests__/test-suite/groups/transform/case098.json new file mode 100644 index 00000000..f80ce285 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case098.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(\"Hello World\",5.5,5)", + "dataset": "dataset21", + "bindings": {}, + "result": " Worl" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case099.json b/__tests__/test-suite/groups/transform/case099.json new file mode 100644 index 00000000..85b26a8d --- /dev/null +++ b/__tests__/test-suite/groups/transform/case099.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(Employment,\"xx\")", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case100.json b/__tests__/test-suite/groups/transform/case100.json new file mode 100644 index 00000000..5822a263 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case100.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(Qualifications,6,5)", + "dataset": "dataset21", + "bindings": {}, + "code": "T0410" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case101.json b/__tests__/test-suite/groups/transform/case101.json new file mode 100644 index 00000000..0a3ce55a --- /dev/null +++ b/__tests__/test-suite/groups/transform/case101.json @@ -0,0 +1,6 @@ +{ + "expr": "detail.contents", + "dataset": "dataset22", + "bindings": {}, + "result": "stuff" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case102.json b/__tests__/test-suite/groups/transform/case102.json new file mode 100644 index 00000000..cdd4107c --- /dev/null +++ b/__tests__/test-suite/groups/transform/case102.json @@ -0,0 +1,6 @@ +{ + "expr": "detail.meta", + "dataset": "dataset23", + "bindings": {}, + "result": "boo" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transform/case103.json b/__tests__/test-suite/groups/transform/case103.json new file mode 100644 index 00000000..351f6bd9 --- /dev/null +++ b/__tests__/test-suite/groups/transform/case103.json @@ -0,0 +1,6 @@ +{ + "expr": "detail.meta", + "dataset": "dataset22", + "bindings": {}, + "result": 5 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transforms/case000.json b/__tests__/test-suite/groups/transforms/case000.json new file mode 100644 index 00000000..86e4aa4c --- /dev/null +++ b/__tests__/test-suite/groups/transforms/case000.json @@ -0,0 +1,50 @@ +{ + "expr": "$ ~> |Account.Order.Product|{\"Total\":Price*Quantity},[\"Description\", \"SKU\"]|", + "dataset": "dataset5", + "bindings": {}, + "result": { + "Account": { + "Account Name": "Firefly", + "Order": [ + { + "OrderID": "order103", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "Price": 34.45, + "Quantity": 2, + "Total": 68.9 + }, + { + "Product Name": "Trilby hat", + "ProductID": 858236, + "Price": 21.67, + "Quantity": 1, + "Total": 21.67 + } + ] + }, + { + "OrderID": "order104", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "Price": 34.45, + "Quantity": 4, + "Total": 137.8 + }, + { + "ProductID": 345664, + "Product Name": "Cloak", + "Price": 107.99, + "Quantity": 1, + "Total": 107.99 + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transforms/case001.json b/__tests__/test-suite/groups/transforms/case001.json new file mode 100644 index 00000000..97416b0e --- /dev/null +++ b/__tests__/test-suite/groups/transforms/case001.json @@ -0,0 +1,45 @@ +{ + "expr": "Account.Order ~> |Product|{\"Total\":Price*Quantity},[\"Description\", \"SKU\"]|", + "dataset": "dataset5", + "bindings": {}, + "result": [ + { + "OrderID": "order103", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "Price": 34.45, + "Quantity": 2, + "Total": 68.9 + }, + { + "Product Name": "Trilby hat", + "ProductID": 858236, + "Price": 21.67, + "Quantity": 1, + "Total": 21.67 + } + ] + }, + { + "OrderID": "order104", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "Price": 34.45, + "Quantity": 4, + "Total": 137.8 + }, + { + "ProductID": 345664, + "Product Name": "Cloak", + "Price": 107.99, + "Quantity": 1, + "Total": 107.99 + } + ] + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transforms/case002.json b/__tests__/test-suite/groups/transforms/case002.json new file mode 100644 index 00000000..0312b259 --- /dev/null +++ b/__tests__/test-suite/groups/transforms/case002.json @@ -0,0 +1,82 @@ +{ + "expr": "$ ~> |Account.Order.Product|{\"Total\":Price*Quantity, \"Price\": Price * 1.2}|", + "dataset": "dataset5", + "bindings": {}, + "result": { + "Account": { + "Account Name": "Firefly", + "Order": [ + { + "OrderID": "order103", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "0406654608", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": 41.34, + "Quantity": 2, + "Total": 68.9 + }, + { + "Product Name": "Trilby hat", + "ProductID": 858236, + "SKU": "0406634348", + "Description": { + "Colour": "Orange", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.6 + }, + "Price": 26.004, + "Quantity": 1, + "Total": 21.67 + } + ] + }, + { + "OrderID": "order104", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "040657863", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": 41.34, + "Quantity": 4, + "Total": 137.8 + }, + { + "ProductID": 345664, + "SKU": "0406654603", + "Product Name": "Cloak", + "Description": { + "Colour": "Black", + "Width": 30, + "Height": 20, + "Depth": 210, + "Weight": 2 + }, + "Price": 129.588, + "Quantity": 1, + "Total": 107.99 + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transforms/case003.json b/__tests__/test-suite/groups/transforms/case003.json new file mode 100644 index 00000000..77fc4bf8 --- /dev/null +++ b/__tests__/test-suite/groups/transforms/case003.json @@ -0,0 +1,50 @@ +{ + "expr": "$ ~> |Account.Order.Product|{},\"Description\"|", + "dataset": "dataset5", + "bindings": {}, + "result": { + "Account": { + "Account Name": "Firefly", + "Order": [ + { + "OrderID": "order103", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "0406654608", + "Price": 34.45, + "Quantity": 2 + }, + { + "Product Name": "Trilby hat", + "ProductID": 858236, + "SKU": "0406634348", + "Price": 21.67, + "Quantity": 1 + } + ] + }, + { + "OrderID": "order104", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "040657863", + "Price": 34.45, + "Quantity": 4 + }, + { + "ProductID": 345664, + "SKU": "0406654603", + "Product Name": "Cloak", + "Price": 107.99, + "Quantity": 1 + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transforms/case004.json b/__tests__/test-suite/groups/transforms/case004.json new file mode 100644 index 00000000..5df5a019 --- /dev/null +++ b/__tests__/test-suite/groups/transforms/case004.json @@ -0,0 +1,50 @@ +{ + "expr": "$ ~> |Account.Order.Product|nomatch,\"Description\"|", + "dataset": "dataset5", + "bindings": {}, + "result": { + "Account": { + "Account Name": "Firefly", + "Order": [ + { + "OrderID": "order103", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "0406654608", + "Price": 34.45, + "Quantity": 2 + }, + { + "Product Name": "Trilby hat", + "ProductID": 858236, + "SKU": "0406634348", + "Price": 21.67, + "Quantity": 1 + } + ] + }, + { + "OrderID": "order104", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "040657863", + "Price": 34.45, + "Quantity": 4 + }, + { + "ProductID": 345664, + "SKU": "0406654603", + "Product Name": "Cloak", + "Price": 107.99, + "Quantity": 1 + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transforms/case005.json b/__tests__/test-suite/groups/transforms/case005.json new file mode 100644 index 00000000..33c9db6e --- /dev/null +++ b/__tests__/test-suite/groups/transforms/case005.json @@ -0,0 +1,72 @@ +{ + "expr": "$ ~> |(Account.Order.Product)[0]|{\"Description\":\"blah\"}|", + "dataset": "dataset5", + "bindings": {}, + "result": { + "Account": { + "Account Name": "Firefly", + "Order": [ + { + "OrderID": "order103", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "0406654608", + "Description": "blah", + "Price": 34.45, + "Quantity": 2 + }, + { + "Product Name": "Trilby hat", + "ProductID": 858236, + "SKU": "0406634348", + "Description": { + "Colour": "Orange", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.6 + }, + "Price": 21.67, + "Quantity": 1 + } + ] + }, + { + "OrderID": "order104", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "040657863", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": 34.45, + "Quantity": 4 + }, + { + "ProductID": 345664, + "SKU": "0406654603", + "Product Name": "Cloak", + "Description": { + "Colour": "Black", + "Width": 30, + "Height": 20, + "Depth": 210, + "Weight": 2 + }, + "Price": 107.99, + "Quantity": 1 + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transforms/case006.json b/__tests__/test-suite/groups/transforms/case006.json new file mode 100644 index 00000000..6a461c07 --- /dev/null +++ b/__tests__/test-suite/groups/transforms/case006.json @@ -0,0 +1,78 @@ +{ + "expr": "$ ~> |foo.bar|{\"Description\":\"blah\"}|", + "dataset": "dataset5", + "bindings": {}, + "result": { + "Account": { + "Account Name": "Firefly", + "Order": [ + { + "OrderID": "order103", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "0406654608", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": 34.45, + "Quantity": 2 + }, + { + "Product Name": "Trilby hat", + "ProductID": 858236, + "SKU": "0406634348", + "Description": { + "Colour": "Orange", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.6 + }, + "Price": 21.67, + "Quantity": 1 + } + ] + }, + { + "OrderID": "order104", + "Product": [ + { + "Product Name": "Bowler Hat", + "ProductID": 858383, + "SKU": "040657863", + "Description": { + "Colour": "Purple", + "Width": 300, + "Height": 200, + "Depth": 210, + "Weight": 0.75 + }, + "Price": 34.45, + "Quantity": 4 + }, + { + "ProductID": 345664, + "SKU": "0406654603", + "Product Name": "Cloak", + "Description": { + "Colour": "Black", + "Width": 30, + "Height": 20, + "Depth": 210, + "Weight": 2 + }, + "Price": 107.99, + "Quantity": 1 + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transforms/case007.json b/__tests__/test-suite/groups/transforms/case007.json new file mode 100644 index 00000000..121dee5a --- /dev/null +++ b/__tests__/test-suite/groups/transforms/case007.json @@ -0,0 +1,18 @@ +{ + "expr": "Account ~> |Order|{\"Product\":\"blah\"},nomatch|", + "dataset": "dataset5", + "bindings": {}, + "result": { + "Account Name": "Firefly", + "Order": [ + { + "OrderID": "order103", + "Product": "blah" + }, + { + "OrderID": "order104", + "Product": "blah" + } + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transforms/case008.json b/__tests__/test-suite/groups/transforms/case008.json new file mode 100644 index 00000000..5993dd43 --- /dev/null +++ b/__tests__/test-suite/groups/transforms/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "foo ~> |foo.bar|{\"Description\":\"blah\"}|", + "dataset": "dataset5", + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transforms/case009.json b/__tests__/test-suite/groups/transforms/case009.json new file mode 100644 index 00000000..d0db25b6 --- /dev/null +++ b/__tests__/test-suite/groups/transforms/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "Account ~> |Order|5|", + "dataset": "dataset5", + "bindings": {}, + "code": "T2011" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transforms/case010.json b/__tests__/test-suite/groups/transforms/case010.json new file mode 100644 index 00000000..506b9902 --- /dev/null +++ b/__tests__/test-suite/groups/transforms/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "Account ~> |Order|{},5|", + "dataset": "dataset5", + "bindings": {}, + "code": "T2012" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transforms/case011.json b/__tests__/test-suite/groups/transforms/case011.json new file mode 100644 index 00000000..121dee5a --- /dev/null +++ b/__tests__/test-suite/groups/transforms/case011.json @@ -0,0 +1,18 @@ +{ + "expr": "Account ~> |Order|{\"Product\":\"blah\"},nomatch|", + "dataset": "dataset5", + "bindings": {}, + "result": { + "Account Name": "Firefly", + "Order": [ + { + "OrderID": "order103", + "Product": "blah" + }, + { + "OrderID": "order104", + "Product": "blah" + } + ] + } +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/transforms/case012.json b/__tests__/test-suite/groups/transforms/case012.json new file mode 100644 index 00000000..6ef5666b --- /dev/null +++ b/__tests__/test-suite/groups/transforms/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "( $clone := 5; $ ~> |Account.Order.Product|{\"blah\":\"foo\"}| )", + "dataset": "dataset5", + "bindings": {}, + "code": "T2013" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/variables/case000.json b/__tests__/test-suite/groups/variables/case000.json new file mode 100644 index 00000000..b050c6f7 --- /dev/null +++ b/__tests__/test-suite/groups/variables/case000.json @@ -0,0 +1,12 @@ +{ + "expr": "$price.foo.bar", + "dataset": "dataset5", + "bindings": { + "price": { + "foo": { + "bar": 45 + } + } + }, + "result": 45 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/variables/case001.json b/__tests__/test-suite/groups/variables/case001.json new file mode 100644 index 00000000..b050c6f7 --- /dev/null +++ b/__tests__/test-suite/groups/variables/case001.json @@ -0,0 +1,12 @@ +{ + "expr": "$price.foo.bar", + "dataset": "dataset5", + "bindings": { + "price": { + "foo": { + "bar": 45 + } + } + }, + "result": 45 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/variables/case002.json b/__tests__/test-suite/groups/variables/case002.json new file mode 100644 index 00000000..368e0df6 --- /dev/null +++ b/__tests__/test-suite/groups/variables/case002.json @@ -0,0 +1,12 @@ +{ + "expr": "$var[1]", + "dataset": "dataset5", + "bindings": { + "var": [ + 1, + 2, + 3 + ] + }, + "result": 2 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/variables/case003.json b/__tests__/test-suite/groups/variables/case003.json new file mode 100644 index 00000000..a65b465d --- /dev/null +++ b/__tests__/test-suite/groups/variables/case003.json @@ -0,0 +1,12 @@ +{ + "expr": "$.foo.bar", + "dataset": "dataset0", + "bindings": { + "price": { + "foo": { + "bar": 45 + } + } + }, + "result": 42 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/variables/case004.json b/__tests__/test-suite/groups/variables/case004.json new file mode 100644 index 00000000..f6acf60c --- /dev/null +++ b/__tests__/test-suite/groups/variables/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "$a := 5", + "dataset": null, + "bindings": {}, + "result": 5 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/variables/case005.json b/__tests__/test-suite/groups/variables/case005.json new file mode 100644 index 00000000..3b3ceddb --- /dev/null +++ b/__tests__/test-suite/groups/variables/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "$a := $b := 5", + "dataset": null, + "bindings": {}, + "result": 5 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/variables/case006.json b/__tests__/test-suite/groups/variables/case006.json new file mode 100644 index 00000000..7a8360a7 --- /dev/null +++ b/__tests__/test-suite/groups/variables/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "($a := $b := 5; $a)", + "dataset": null, + "bindings": {}, + "result": 5 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/variables/case007.json b/__tests__/test-suite/groups/variables/case007.json new file mode 100644 index 00000000..4646a709 --- /dev/null +++ b/__tests__/test-suite/groups/variables/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "($a := $b := 5; $b)", + "dataset": null, + "bindings": {}, + "result": 5 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/variables/case008.json b/__tests__/test-suite/groups/variables/case008.json new file mode 100644 index 00000000..1524e608 --- /dev/null +++ b/__tests__/test-suite/groups/variables/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "( $a := 5; $a := $a + 2; $a )", + "dataset": null, + "bindings": {}, + "result": 7 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/variables/case009.json b/__tests__/test-suite/groups/variables/case009.json new file mode 100644 index 00000000..e5fac0e1 --- /dev/null +++ b/__tests__/test-suite/groups/variables/case009.json @@ -0,0 +1,8 @@ +{ + "expr": "[1,2,3].$v", + "dataset": null, + "bindings": { + "v": [] + }, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/variables/case010.json b/__tests__/test-suite/groups/variables/case010.json new file mode 100644 index 00000000..e3e9f00f --- /dev/null +++ b/__tests__/test-suite/groups/variables/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "( $foo := \"defined\"; ( $foo := nothing ); $foo )", + "dataset": null, + "bindings": {}, + "result": "defined" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/variables/case011.json b/__tests__/test-suite/groups/variables/case011.json new file mode 100644 index 00000000..5ab1d4f6 --- /dev/null +++ b/__tests__/test-suite/groups/variables/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "( $foo := \"defined\"; ( $foo := nothing; $foo ) )", + "dataset": null, + "bindings": {}, + "undefinedResult": true +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/wildcards/case000.json b/__tests__/test-suite/groups/wildcards/case000.json new file mode 100644 index 00000000..9215ee18 --- /dev/null +++ b/__tests__/test-suite/groups/wildcards/case000.json @@ -0,0 +1,22 @@ +{ + "expr": "foo.*", + "dataset": "dataset0", + "bindings": {}, + "result": [ + 42, + { + "baz": { + "fud": "hello" + } + }, + { + "baz": { + "fud": "world" + } + }, + { + "bazz": "gotcha" + }, + "here" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/wildcards/case001.json b/__tests__/test-suite/groups/wildcards/case001.json new file mode 100644 index 00000000..dc8af3f5 --- /dev/null +++ b/__tests__/test-suite/groups/wildcards/case001.json @@ -0,0 +1,13 @@ +{ + "expr": "foo.*.baz", + "dataset": "dataset0", + "bindings": {}, + "result": [ + { + "fud": "hello" + }, + { + "fud": "world" + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/wildcards/case002.json b/__tests__/test-suite/groups/wildcards/case002.json new file mode 100644 index 00000000..f75b1e86 --- /dev/null +++ b/__tests__/test-suite/groups/wildcards/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.*.bazz", + "dataset": "dataset0", + "bindings": {}, + "result": "gotcha" +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/wildcards/case003.json b/__tests__/test-suite/groups/wildcards/case003.json new file mode 100644 index 00000000..88833e0d --- /dev/null +++ b/__tests__/test-suite/groups/wildcards/case003.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.*.baz.*", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/wildcards/case004.json b/__tests__/test-suite/groups/wildcards/case004.json new file mode 100644 index 00000000..88833e0d --- /dev/null +++ b/__tests__/test-suite/groups/wildcards/case004.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.*.baz.*", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/wildcards/case005.json b/__tests__/test-suite/groups/wildcards/case005.json new file mode 100644 index 00000000..88833e0d --- /dev/null +++ b/__tests__/test-suite/groups/wildcards/case005.json @@ -0,0 +1,9 @@ +{ + "expr": "foo.*.baz.*", + "dataset": "dataset0", + "bindings": {}, + "result": [ + "hello", + "world" + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/wildcards/case006.json b/__tests__/test-suite/groups/wildcards/case006.json new file mode 100644 index 00000000..6307c4fd --- /dev/null +++ b/__tests__/test-suite/groups/wildcards/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "foo.*[0]", + "dataset": "dataset0", + "bindings": {}, + "result": 42 +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/wildcards/case007.json b/__tests__/test-suite/groups/wildcards/case007.json new file mode 100644 index 00000000..d59c1f5e --- /dev/null +++ b/__tests__/test-suite/groups/wildcards/case007.json @@ -0,0 +1,18 @@ +{ + "expr": "*[type=\"home\"]", + "dataset": "dataset1", + "bindings": {}, + "result": [ + { + "type": "home", + "number": "0203 544 1234" + }, + { + "type": "home", + "address": [ + "freddy@my-social.com", + "frederic.smith@very-serious.com" + ] + } + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/wildcards/case008.json b/__tests__/test-suite/groups/wildcards/case008.json new file mode 100644 index 00000000..092f5972 --- /dev/null +++ b/__tests__/test-suite/groups/wildcards/case008.json @@ -0,0 +1,9 @@ +{ + "expr": "Account[$$.Account.\"Account Name\" = \"Firefly\"].*[OrderID=\"order104\"].Product.Price", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 34.45, + 107.99 + ] +} \ No newline at end of file diff --git a/__tests__/test-suite/groups/wildcards/case009.json b/__tests__/test-suite/groups/wildcards/case009.json new file mode 100644 index 00000000..73aa9708 --- /dev/null +++ b/__tests__/test-suite/groups/wildcards/case009.json @@ -0,0 +1,9 @@ +{ + "expr": "Account[$$.Account.`Account Name` = \"Firefly\"].*[OrderID=\"order104\"].Product.Price", + "dataset": "dataset5", + "bindings": {}, + "result": [ + 34.45, + 107.99 + ] +} \ No newline at end of file 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..7ce59ad8 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,46 @@ "eslint": "^4.0.0", "eslint-plugin-ideal": "^0.1.3", "istanbul": "^0.4.5", + "jest": "^22.1.3", "jsdoc": "^3.4.0", "mocha": "^5.0.0", "mocha-lcov-reporter": "^1.2.0", "request": "^2.81.0", + "rollup": "^0.54.1", + "ts-jest": "^22.0.1", "uglify-es": "^3.0.20" }, "engines": { "node": ">= 4" + }, + "dependencies": { + "@types/node": "^9.3.0", + "typescript": "^2.6.2" + }, + "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/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..d8763a8c --- /dev/null +++ b/src/evaluate.ts @@ -0,0 +1,1447 @@ +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"; + +/** + * 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..0cc83209 --- /dev/null +++ b/src/jsonata.ts @@ -0,0 +1,136 @@ +import { parser } from './parser'; +import { lookupMessage, createFrame } from './utils'; +import { evaluate } from './evaluate'; +import { defineFunction } from './signatures'; +import { createStandardFrame } from './functions'; + +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 { + 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; + } + + 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") { + 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/ast.ts b/src/parser/ast.ts new file mode 100644 index 00000000..3e83c14d --- /dev/null +++ b/src/parser/ast.ts @@ -0,0 +1,130 @@ +import { Token } from "../tokenizer"; + +export interface BaseNode { + type: string; + value: any; + keepArray?: boolean; + // TODO: This is only added to the root expression node...should probably be a separate return value from parser + errors?: string[]; +} + +export interface WildcardNode extends BaseNode { + type: "wildcard"; +} + +export interface DescendantNode extends BaseNode { + type: "descendant"; +} + +export interface ErrorNode extends BaseNode { + type: "error"; + // TODO: refine + error: any; + // TODO: refine + lhs: any; + remaining: Token[]; +} + +export interface VariableNode extends BaseNode { + type: "variable"; + position: number; +} + +export interface NameNode extends BaseNode { + type: "name"; + position: number; +} +export interface LiteralNode extends BaseNode { + type: "literal"; + position: number; +} + +export interface RegexNode extends BaseNode { + type: "regex"; + position: number; +} + +export interface OperatorNode extends BaseNode { + type: "operator"; + position: number; +} + +export interface EndNode extends BaseNode { + type: "end"; + value: string; + position: number; +} + +export type TerminalNode = VariableNode | NameNode | LiteralNode | RegexNode | OperatorNode | EndNode; + +export interface UnaryNode extends BaseNode { + type: "unary"; + // TODO: refine + expression?: any; + // TODO: Used by objectParser (should get rid of this eventually) + lhs?: any; + // TODO: Used by array constructor + expressions?: any; +} + +export interface BinaryNode extends BaseNode { + type: "binary"; + value: string; // Could be refined + lhs: any; + rhs: any; + position?: number; // Required for sort operator!?! +} + +export interface TernaryNode extends BaseNode { + type: "condition"; + condition: any; + then: any; + else: any; +} + +export interface BlockNode extends BaseNode { + type: "block"; + // TODO: refine + expressions: any[]; +} + +export interface TransformNode extends BaseNode { + type: "transform"; + // TODO: Refine these + pattern: any; + update: any; + delete?: any; +} + +export interface FunctionInvocationNode extends BaseNode { + type: "function" | "partial"; + procedure: any; + arguments: any; + position: number; +} + +export interface LambdaDefinitionNode extends BaseNode { + type: "lambda"; + body: any; + signature: any; + procedure: any; + arguments: any; +} + +export type ASTNode = + | WildcardNode + | DescendantNode + | ErrorNode + | LiteralNode + | NameNode + | VariableNode + | RegexNode + | OperatorNode + | UnaryNode + | BinaryNode + | TernaryNode + | BlockNode + | TransformNode + | FunctionInvocationNode + | LambdaDefinitionNode + | EndNode; 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..5016ed9f --- /dev/null +++ b/src/parser/leds.ts @@ -0,0 +1,203 @@ +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, + 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, + type: "lambda", + body: body, + signature: signature, + procedure: left, + arguments: args, + }; +}; + +export const filterLED: LED = (state: ParserState, left: ast.ASTNode): ast.ASTNode | ast.BinaryNode => { + let initialToken = state.previousToken; + if (state.symbol.id === "]") { + // empty predicate means maintain singleton arrays in the output + var step = left; + while (step && step.type === "binary" && step.value === "[") { + let s = step as ast.BinaryNode; + step = s.lhs; + } + step.keepArray = true; + state.advance("]"); + return left; + } else { + let rhs = state.expression(operators["]"]); + state.advance("]", true); + let ret: ast.BinaryNode = { + value: initialToken.value, + type: "binary", + lhs: left, + rhs: rhs, + }; + return ret; + } +}; + +export const orderByLED: LED = (state: ParserState, left: ast.ASTNode): ast.BinaryNode => { + let initialToken = state.previousToken; + state.advance("("); + var terms = []; + for (;;) { + var term = { + descending: false, + }; + if (state.symbol.id === "<") { + // ascending sort + state.advance("<"); + } else if (state.symbol.id === ">") { + // descending sort + term.descending = true; + state.advance(">"); + } else { + //unspecified - default to ascending + } + // TODO: Fix any cast + (term as any).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: "binary", + lhs: left, + rhs: terms, // TODO: Not an expression node...different node type recommended + }; +}; + +export const objectParserLED: LED = (state: ParserState, left: ast.ASTNode): ast.BinaryNode => { + 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: initialToken.value, + type: "binary", + lhs: left, + rhs: a, + }; +}; diff --git a/src/parser/nuds.ts b/src/parser/nuds.ts new file mode 100644 index 00000000..a6e7acef --- /dev/null +++ b/src/parser/nuds.ts @@ -0,0 +1,196 @@ +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, + 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, + type: "wildcard", + }; +}; + +export const descendantNUD = (state: ParserState): ast.DescendantNode => { + return { + value: state.previousToken.value, + 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, + 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); + // TODO: Should this be a different type...? (not unary) + return { + value: initialToken.value, + type: "unary", + expressions: a, + }; +}; + +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, + 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, + 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..2953d708 --- /dev/null +++ b/src/parser/optimize.ts @@ -0,0 +1,261 @@ +import { isNumeric } from "../utils"; +import { tail_call_optimize } from "./tail_call"; +import { ErrorCollector } from "./types"; + +// 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. +// TODO: Add types and adjust for errors +export function ast_optimize(expr /* : ast.ASTNode */, collect: undefined | ErrorCollector) { + var result; + switch (expr.type) { + case "binary": + switch (expr.value) { + case ".": + var lstep = ast_optimize(expr.lhs, collect); + 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, collect); + 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, collect); + 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, collect)); + break; + case "{": + // group-by + // LHS is a step or a predicated step + // RHS is the object constructor expr + result = ast_optimize(expr.lhs, collect); + 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], collect), ast_optimize(pair[1], collect)]; + }), + 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, collect); + result.rhs = expr.rhs.map(function(terms) { + return { + descending: terms.descending, + expression: ast_optimize(terms.expression, collect), + }; + }); + break; + case ":=": + result = { type: "bind", value: expr.value, position: expr.position }; + result.lhs = ast_optimize(expr.lhs, collect); + result.rhs = ast_optimize(expr.rhs, collect); + break; + case "~>": + result = { type: "apply", value: expr.value, position: expr.position }; + result.lhs = ast_optimize(expr.lhs, collect); + result.rhs = ast_optimize(expr.rhs, collect); + break; + default: + result = { type: expr.type, value: expr.value, position: expr.position }; + result.lhs = ast_optimize(expr.lhs, collect); + result.rhs = ast_optimize(expr.rhs, collect); + } + 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, collect); + }); + } else if (expr.value === "{") { + // object constructor - process each pair + result.lhs = expr.lhs.map(function(pair) { + return [ast_optimize(pair[0], collect), ast_optimize(pair[1], collect)]; + }); + } else { + // all other unary expressions - just process the expression + result.expression = ast_optimize(expr.expression, collect); + // 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, collect); + }); + result.procedure = ast_optimize(expr.procedure, collect); + break; + case "lambda": + result = { + type: expr.type, + arguments: expr.arguments, + signature: expr.signature, + position: expr.position, + }; + var body = ast_optimize(expr.body, collect); + result.body = tail_call_optimize(body); + break; + case "condition": + result = { type: expr.type, position: expr.position }; + result.condition = ast_optimize(expr.condition, collect); + // TODO: Yikes! This is very dangerous (might appear like a Promise) + result.then = ast_optimize(expr.then, collect); + if (typeof expr.else !== "undefined") { + result.else = ast_optimize(expr.else, collect); + } + break; + case "transform": + result = { type: expr.type, position: expr.position }; + result.pattern = ast_optimize(expr.pattern, collect); + result.update = ast_optimize(expr.update, collect); + if (typeof expr.delete !== "undefined") { + result.delete = ast_optimize(expr.delete, collect); + } + 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, collect); + }); + // 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, collect); + } 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, collect); + } + break; + default: + var code = "S0206"; + /* istanbul ignore else */ + if (expr.type == "end") { + code = "S0207"; + } + var err = { + code: code, + position: expr.position, + token: expr.value, + }; + if (collect) { + collect(err); + return { type: "error", error: err }; + } else { + (err as any).stack = new Error().stack; + throw err; + } + } + return result; +} diff --git a/src/parser/parser.ts b/src/parser/parser.ts new file mode 100644 index 00000000..95b8bc24 --- /dev/null +++ b/src/parser/parser.ts @@ -0,0 +1,185 @@ +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 { + symbol: Symbol = undefined; + previousToken: Token = undefined; + token: Token = undefined; + error: any = undefined; + + protected lexer: Tokenizer; + protected errors: string[] = []; + 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); + + if (this.errors.length > 0) { + expr.errors = this.errors; + } + + 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, recover?: boolean) { + let p = new Parser(source, recover); + return p.parse(); +} + diff --git a/src/parser/symbols.ts b/src/parser/symbols.ts new file mode 100644 index 00000000..67fe0bf2 --- /dev/null +++ b/src/parser/symbols.ts @@ -0,0 +1,165 @@ +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, + 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, + 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..9de382d4 --- /dev/null +++ b/src/parser/tail_call.ts @@ -0,0 +1,29 @@ +// 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) { + var result; + if (expr.type === "function") { + var thunk = { type: "lambda", thunk: true, arguments: [], position: expr.position, 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; +} diff --git a/src/parser/types.ts b/src/parser/types.ts new file mode 100644 index 00000000..b0a21a78 --- /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/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/async-function.js b/test/async-function.js index 55b7216e..abd7dde6 100644 --- a/test/async-function.js +++ b/test/async-function.js @@ -1,6 +1,6 @@ "use strict"; -var jsonata = require('../jsonata'); +var jsonata = require('../lib/src').jsonata; var request = require('request'); //var assert = require('assert'); var chai = require("chai"); diff --git a/test/implementation-tests.js b/test/implementation-tests.js index 88fed1bc..6a6a4247 100644 --- a/test/implementation-tests.js +++ b/test/implementation-tests.js @@ -10,7 +10,9 @@ "use strict"; -var jsonata = require("../jsonata"); +var jsonata = require('../lib/src').jsonata; +var timeboxExpression = require('../lib/src/utils').timeboxExpression; + var chai = require("chai"); var expect = chai.expect; @@ -560,46 +562,3 @@ describe("Tests that include infinite recursion", () => { }); }); }); - -/** - * 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(); - }); -} diff --git a/test/parser-recovery.js b/test/parser-recovery.js index 53a7be0e..db28ed70 100644 --- a/test/parser-recovery.js +++ b/test/parser-recovery.js @@ -1,6 +1,6 @@ "use strict"; -var jsonata = require('../jsonata'); +var jsonata = require('../lib/src').jsonata; var assert = require('assert'); var chai = require("chai"); var expect = chai.expect; diff --git a/test/run-test-suite.js b/test/run-test-suite.js index ddf6ff52..ff913f8b 100644 --- a/test/run-test-suite.js +++ b/test/run-test-suite.js @@ -8,7 +8,7 @@ var fs = require("fs"); var path = require("path"); -var jsonata = require("../jsonata"); +var jsonata = require('../lib/src').jsonata; var chai = require("chai"); var expect = chai.expect; diff --git a/test/test-suite/groups/tail-recursion/case001.json b/test/test-suite/groups/tail-recursion/case001.json index c9fdf2f9..15ef1d31 100644 --- a/test/test-suite/groups/tail-recursion/case001.json +++ b/test/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/tsconfig-es2015.json b/tsconfig-es2015.json new file mode 100644 index 00000000..37c9b1f1 --- /dev/null +++ b/tsconfig-es2015.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig", + "compilerOptions": { + "moduleResolution": "node" + } +} \ 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..9e250923 --- /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..9dfa4a5e --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4161 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0-beta.35": + version "7.0.0-beta.38" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.38.tgz#c0af5930617e55e050336838e3a3670983b0b2b2" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +"@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@*", "@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@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" + dependencies: + acorn "^5.0.0" + +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: + version "4.0.13" + resolved "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +acorn@^5.0.0, acorn@^5.1.2, 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@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-22.1.0.tgz#7fae6f655fffe77e818a8c2868c754a42463fdfd" + dependencies: + babel-plugin-istanbul "^4.1.5" + babel-preset-jest "^22.1.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.1.4, babel-plugin-istanbul@^4.1.5: + 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@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.1.0.tgz#c1281dd7887d77a1711dc760468c3b8285dde9ee" + +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@^22.0.1, babel-preset-jest@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.1.0.tgz#ff4e704102f9642765e2254226050561d8942ec9" + dependencies: + babel-plugin-jest-hoist "^22.1.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-process-hrtime@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + +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@^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" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +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" + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + +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.0.2: + 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" + +domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/domexception/-/domexception-1.0.0.tgz#81fe5df81b3f057052cde3a9fa9bf536a85b9ab0" + +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" + +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" + +es-abstract@^1.5.1: + version "1.10.0" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.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.9.0: + 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.15.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-4.15.0.tgz#89ab38c12713eec3d13afac14e4a89e75ef08145" + 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.0.2" + 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" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + +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@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/expect/-/expect-22.1.0.tgz#f8f9b019ab275d859cbefed531fbaefe8972431d" + dependencies: + ansi-styles "^3.2.0" + jest-diff "^22.1.0" + jest-get-type "^22.1.0" + jest-matcher-utils "^22.1.0" + jest-message-util "^22.1.0" + jest-regex-util "^22.1.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.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" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +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.3: + 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, function-bind@^1.1.1: + 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, has@^1.0.1: + 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" + +import-local@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + dependencies: + pkg-dir "^2.0.0" + resolve-cwd "^2.0.0" + +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-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +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-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +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-generator-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" + +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-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-resolvable@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz#acca1cd36dbe44b974b924321555a70ba03b1cf4" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +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.14: + 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.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.7.5, istanbul-lib-instrument@^1.8.0, 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.2.1, 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@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.1.0.tgz#586a6164b87255dbd541a8bab880d98f14c99b7d" + dependencies: + throat "^4.0.0" + +jest-cli@^22.1.3: + version "22.1.3" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-22.1.3.tgz#b4fe4a66f476672924a2093d8ca01f1c227970fc" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.1.11" + import-local "^1.0.0" + is-ci "^1.0.10" + istanbul-api "^1.1.14" + istanbul-lib-coverage "^1.1.1" + istanbul-lib-instrument "^1.8.0" + istanbul-lib-source-maps "^1.2.1" + jest-changed-files "^22.1.0" + jest-config "^22.1.3" + jest-environment-jsdom "^22.1.2" + jest-get-type "^22.1.0" + jest-haste-map "^22.1.0" + jest-message-util "^22.1.0" + jest-regex-util "^22.1.0" + jest-resolve-dependencies "^22.1.0" + jest-runner "^22.1.3" + jest-runtime "^22.1.3" + jest-snapshot "^22.1.2" + jest-util "^22.1.2" + jest-worker "^22.1.0" + micromatch "^2.3.11" + node-notifier "^5.1.2" + realpath-native "^1.0.0" + rimraf "^2.5.4" + slash "^1.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" + which "^1.2.12" + yargs "^10.0.3" + +jest-config@^22.0.1, jest-config@^22.1.3: + version "22.1.3" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-22.1.3.tgz#1572e214b75a3592c66841db371862ab080662d1" + dependencies: + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^22.1.2" + jest-environment-node "^22.1.2" + jest-get-type "^22.1.0" + jest-jasmine2 "^22.1.3" + jest-regex-util "^22.1.0" + jest-resolve "^22.1.0" + jest-util "^22.1.2" + jest-validate "^22.1.2" + pretty-format "^22.1.0" + +jest-diff@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-22.1.0.tgz#0fad9d96c87b453896bf939df3dc8aac6919ac38" + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^22.1.0" + pretty-format "^22.1.0" + +jest-docblock@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.1.0.tgz#3fe5986d5444cbcb149746eb4b07c57c5a464dfd" + dependencies: + detect-newline "^2.1.0" + +jest-environment-jsdom@^22.1.2: + version "22.1.2" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.1.2.tgz#4488c629631dd5de9059ec747fcd358735247f70" + dependencies: + jest-mock "^22.1.0" + jest-util "^22.1.2" + jsdom "^11.5.1" + +jest-environment-node@^22.1.2: + version "22.1.2" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.1.2.tgz#77dc32fbe08caa03ef2acb0948dce4b25a14633a" + dependencies: + jest-mock "^22.1.0" + jest-util "^22.1.2" + +jest-get-type@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.1.0.tgz#4e90af298ed6181edc85d2da500dbd2753e0d5a9" + +jest-haste-map@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.1.0.tgz#1174c6ff393f9818ebf1163710d8868b5370da2a" + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + jest-docblock "^22.1.0" + jest-worker "^22.1.0" + micromatch "^2.3.11" + sane "^2.0.0" + +jest-jasmine2@^22.1.3: + version "22.1.3" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.1.3.tgz#35429cd22e9aed2d234aee48b73734eefc140f96" + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^22.1.0" + graceful-fs "^4.1.11" + is-generator-fn "^1.0.0" + jest-diff "^22.1.0" + jest-matcher-utils "^22.1.0" + jest-message-util "^22.1.0" + jest-snapshot "^22.1.2" + source-map-support "^0.5.0" + +jest-leak-detector@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.1.0.tgz#08376644cee07103da069baac19adb0299b772c2" + dependencies: + pretty-format "^22.1.0" + +jest-matcher-utils@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.1.0.tgz#e164665b5d313636ac29f7f6fe9ef0a6ce04febc" + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + pretty-format "^22.1.0" + +jest-message-util@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.1.0.tgz#51ba0794cb6e579bfc4e9adfac452f9f1a0293fc" + dependencies: + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + stack-utils "^1.0.1" + +jest-mock@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-22.1.0.tgz#87ec21c0599325671c9a23ad0e05c86fb5879b61" + +jest-regex-util@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.1.0.tgz#5daf2fe270074b6da63e5d85f1c9acc866768f53" + +jest-resolve-dependencies@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.1.0.tgz#340e4139fb13315cd43abc054e6c06136be51e31" + dependencies: + jest-regex-util "^22.1.0" + +jest-resolve@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.1.0.tgz#5f4307f48b93c1abdbeacc9ed80642ffcb246294" + dependencies: + browser-resolve "^1.11.2" + chalk "^2.0.1" + +jest-runner@^22.1.3: + version "22.1.3" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-22.1.3.tgz#8fdd2da200d95a486e5d4b001add061ac4253261" + dependencies: + exit "^0.1.2" + jest-config "^22.1.3" + jest-docblock "^22.1.0" + jest-haste-map "^22.1.0" + jest-jasmine2 "^22.1.3" + jest-leak-detector "^22.1.0" + jest-message-util "^22.1.0" + jest-runtime "^22.1.3" + jest-util "^22.1.2" + jest-worker "^22.1.0" + throat "^4.0.0" + +jest-runtime@^22.1.3: + version "22.1.3" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.1.3.tgz#c807fa91655121e719f51caf01eb4b08b714cb23" + dependencies: + babel-core "^6.0.0" + babel-jest "^22.1.0" + babel-plugin-istanbul "^4.1.5" + chalk "^2.0.1" + convert-source-map "^1.4.0" + exit "^0.1.2" + graceful-fs "^4.1.11" + jest-config "^22.1.3" + jest-haste-map "^22.1.0" + jest-regex-util "^22.1.0" + jest-resolve "^22.1.0" + jest-util "^22.1.2" + json-stable-stringify "^1.0.1" + micromatch "^2.3.11" + realpath-native "^1.0.0" + slash "^1.0.0" + strip-bom "3.0.0" + write-file-atomic "^2.1.0" + yargs "^10.0.3" + +jest-snapshot@^22.1.2: + version "22.1.2" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.1.2.tgz#b270cf6e3098f33aceeafda02b13eb0933dc6139" + dependencies: + chalk "^2.0.1" + jest-diff "^22.1.0" + jest-matcher-utils "^22.1.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^22.1.0" + +jest-util@^22.1.2: + version "22.1.2" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-22.1.2.tgz#4bf098f651e8611d744cefa23fa026c97a6a3d5d" + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + jest-message-util "^22.1.0" + jest-validate "^22.1.2" + mkdirp "^0.5.1" + +jest-validate@^22.1.2: + version "22.1.2" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-22.1.2.tgz#c3b06bcba7bd9a850919fe336b5f2a8c3a239404" + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + leven "^2.1.0" + pretty-format "^22.1.0" + +jest-worker@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-22.1.0.tgz#0987832fe58fbdc205357f4c19b992446368cafb" + dependencies: + merge-stream "^1.0.1" + +jest@^22.1.3: + version "22.1.3" + resolved "https://registry.npmjs.org/jest/-/jest-22.1.3.tgz#59bd66af5e9cd6367cbeeead9de6c3cfdd6d4204" + dependencies: + jest-cli "^22.1.3" + +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@^11.5.1: + version "11.5.1" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-11.5.1.tgz#5df753b8d0bca20142ce21f4f6c039f99a992929" + dependencies: + abab "^1.0.3" + acorn "^5.1.2" + acorn-globals "^4.0.0" + array-equal "^1.0.0" + browser-process-hrtime "^0.1.2" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + domexception "^1.0.0" + escodegen "^1.9.0" + html-encoding-sniffer "^1.0.1" + left-pad "^1.2.0" + nwmatcher "^1.4.3" + parse5 "^3.0.2" + pn "^1.0.0" + request "^2.83.0" + request-promise-native "^1.0.3" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.3" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.1" + whatwg-url "^6.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" + +left-pad@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee" + +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" + +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.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + +lodash@^4.13.1, 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-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + +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.1.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.4.3: + 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-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +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-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@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + dependencies: + "@types/node" "*" + +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" + +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" + +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" + +pn@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + +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@^22.1.0: + version "22.1.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-22.1.0.tgz#2277605b40ed4529ae4db51ff62f4be817647914" + 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" + +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" + +punycode@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + +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@^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" + +readable-stream@^2.0.1, 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" + +realpath-native@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0" + dependencies: + util.promisify "^1.0.0" + +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-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + dependencies: + lodash "^4.13.1" + +request-promise-native@^1.0.3: + version "1.0.5" + resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + +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, request@^2.83.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-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + dependencies: + resolve-from "^3.0.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-from@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + +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.5.4, 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.2.0" + resolved "https://registry.npmjs.org/sane/-/sane-2.2.0.tgz#d6d2e2fcab00e3d283c93b912b7c3a20846f1d56" + 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.9" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d" + 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" + +stack-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" + +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + +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: + 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.3, tough-cookie@^2.3.3, 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@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + dependencies: + punycode "^2.1.0" + +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@^22.0.1: + version "22.0.1" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-22.0.1.tgz#48942936a466c2e76e259b02e2f1356f1839afc3" + dependencies: + babel-core "^6.24.1" + babel-plugin-istanbul "^4.1.4" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-preset-jest "^22.0.1" + cpx "^1.5.0" + fs-extra "4.0.3" + jest-config "^22.0.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.7" + resolved "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.7.tgz#d1249af668666aba7cb1163e277455be9eb393cf" + 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.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +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@^4.0.1, webidl-conversions@^4.0.2: + 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@^6.3.0: + version "6.4.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08" + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.0" + webidl-conversions "^4.0.1" + +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" + +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: + 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@^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@~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" From f8ee6ec552917571ff5b14260e6387eb15da1d3e Mon Sep 17 00:00:00 2001 From: Michael Tiller Date: Mon, 22 Jan 2018 11:54:12 -0500 Subject: [PATCH 2/4] Removed previous 'mocha' tests (everything was previously migrated to 'jest') --- test/.eslintrc | 6 - test/async-function.js | 162 ----- test/implementation-tests.js | 564 ------------------ test/parser-recovery.js | 448 -------------- test/run-test-suite.js | 183 ------ test/test-suite/TESTSUITE.md | 39 -- test/test-suite/datasets/dataset0.json | 22 - test/test-suite/datasets/dataset1.json | 53 -- test/test-suite/datasets/dataset10.json | 22 - test/test-suite/datasets/dataset11.json | 9 - test/test-suite/datasets/dataset12.json | 72 --- test/test-suite/datasets/dataset13.json | 72 --- test/test-suite/datasets/dataset14.json | 71 --- test/test-suite/datasets/dataset15.json | 73 --- test/test-suite/datasets/dataset16.json | 73 --- test/test-suite/datasets/dataset17.json | 73 --- test/test-suite/datasets/dataset18.json | 19 - test/test-suite/datasets/dataset19.json | 9 - test/test-suite/datasets/dataset2.json | 17 - test/test-suite/datasets/dataset20.json | 10 - test/test-suite/datasets/dataset21.json | 22 - test/test-suite/datasets/dataset22.json | 7 - test/test-suite/datasets/dataset23.json | 7 - test/test-suite/datasets/dataset24.json | 52 -- test/test-suite/datasets/dataset3.json | 28 - test/test-suite/datasets/dataset4.json | 32 - test/test-suite/datasets/dataset5.json | 73 --- test/test-suite/datasets/dataset6.json | 89 --- test/test-suite/datasets/dataset7.json | 9 - test/test-suite/datasets/dataset8.json | 68 --- test/test-suite/datasets/dataset9.json | 6 - .../groups/array-constructor/case000.json | 6 - .../groups/array-constructor/case001.json | 8 - .../groups/array-constructor/case002.json | 9 - .../groups/array-constructor/case003.json | 10 - .../groups/array-constructor/case004.json | 13 - .../groups/array-constructor/case005.json | 13 - .../groups/array-constructor/case006.json | 16 - .../groups/array-constructor/case007.json | 18 - .../groups/array-constructor/case008.json | 6 - .../groups/array-constructor/case009.json | 9 - .../groups/array-constructor/case010.json | 6 - .../groups/array-constructor/case011.json | 15 - .../groups/array-constructor/case012.json | 19 - .../groups/array-constructor/case013.json | 6 - .../groups/array-constructor/case014.json | 9 - .../groups/array-constructor/case015.json | 9 - .../groups/array-constructor/case016.json | 9 - .../groups/array-constructor/case017.json | 12 - .../groups/array-constructor/case018.json | 10 - .../groups/array-constructor/case019.json | 10 - .../groups/array-constructor/case020.json | 14 - test/test-suite/groups/blocks/case000.json | 6 - test/test-suite/groups/blocks/case001.json | 6 - test/test-suite/groups/blocks/case002.json | 6 - test/test-suite/groups/blocks/case003.json | 6 - test/test-suite/groups/blocks/case004.json | 11 - test/test-suite/groups/blocks/case005.json | 6 - test/test-suite/groups/blocks/case006.json | 6 - .../groups/boolean-expresssions/case000.json | 6 - .../groups/boolean-expresssions/case001.json | 6 - .../groups/boolean-expresssions/case002.json | 6 - .../groups/boolean-expresssions/case003.json | 6 - .../groups/boolean-expresssions/case004.json | 6 - .../groups/boolean-expresssions/case005.json | 6 - .../groups/boolean-expresssions/case006.json | 6 - .../groups/boolean-expresssions/case007.json | 6 - .../groups/boolean-expresssions/case008.json | 6 - .../groups/boolean-expresssions/case009.json | 6 - .../groups/boolean-expresssions/case010.json | 6 - .../groups/boolean-expresssions/case011.json | 6 - .../groups/boolean-expresssions/case012.json | 9 - .../groups/boolean-expresssions/case013.json | 9 - .../groups/boolean-expresssions/case014.json | 9 - .../groups/boolean-expresssions/case015.json | 9 - .../groups/boolean-expresssions/case016.json | 8 - test/test-suite/groups/closures/case000.json | 10 - test/test-suite/groups/closures/case001.json | 10 - .../groups/comparison-operators/case000.json | 6 - .../groups/comparison-operators/case001.json | 6 - .../groups/comparison-operators/case002.json | 6 - .../groups/comparison-operators/case003.json | 6 - .../groups/comparison-operators/case004.json | 6 - .../groups/comparison-operators/case005.json | 6 - .../groups/comparison-operators/case006.json | 6 - .../groups/comparison-operators/case007.json | 6 - .../groups/comparison-operators/case008.json | 6 - .../groups/comparison-operators/case009.json | 6 - .../groups/comparison-operators/case010.json | 6 - .../groups/comparison-operators/case011.json | 6 - .../groups/comparison-operators/case012.json | 6 - .../groups/comparison-operators/case013.json | 6 - .../groups/comparison-operators/case014.json | 6 - .../groups/comparison-operators/case015.json | 6 - .../groups/comparison-operators/case016.json | 6 - .../groups/comparison-operators/case017.json | 6 - .../groups/comparison-operators/case018.json | 6 - .../groups/comparison-operators/case019.json | 6 - .../groups/comparison-operators/case020.json | 6 - .../groups/comparison-operators/case021.json | 8 - .../groups/comparison-operators/case022.json | 8 - .../groups/comparison-operators/case023.json | 10 - .../groups/comparison-operators/case024.json | 10 - .../groups/conditionals/case000.json | 6 - .../groups/conditionals/case001.json | 6 - .../groups/conditionals/case002.json | 6 - .../groups/conditionals/case003.json | 6 - .../groups/conditionals/case004.json | 6 - .../groups/conditionals/case005.json | 6 - .../groups/conditionals/case006.json | 6 - .../groups/conditionals/case007.json | 11 - .../groups/conditionals/case008.json | 11 - test/test-suite/groups/context/case000.json | 6 - test/test-suite/groups/context/case001.json | 12 - test/test-suite/groups/context/case002.json | 12 - test/test-suite/groups/context/case003.json | 11 - .../groups/descendent-operator/case000.json | 20 - .../groups/descendent-operator/case001.json | 13 - .../groups/descendent-operator/case002.json | 9 - .../groups/descendent-operator/case003.json | 9 - .../groups/descendent-operator/case004.json | 9 - .../groups/descendent-operator/case005.json | 9 - .../groups/descendent-operator/case006.json | 9 - .../groups/descendent-operator/case007.json | 9 - .../groups/descendent-operator/case008.json | 11 - .../groups/descendent-operator/case009.json | 9 - .../groups/descendent-operator/case010.json | 6 - .../groups/descendent-operator/case011.json | 6 - .../groups/descendent-operator/case012.json | 11 - .../groups/descendent-operator/case013.json | 11 - .../groups/descendent-operator/case014.json | 6 - .../groups/descendent-operator/case015.json | 6 - .../groups/descendent-operator/case016.json | 6 - .../groups/descendent-operator/case017.json | 6 - test/test-suite/groups/encoding/case000.json | 6 - test/test-suite/groups/encoding/case001.json | 6 - test/test-suite/groups/encoding/case002.json | 6 - test/test-suite/groups/encoding/case003.json | 6 - test/test-suite/groups/errors/case000.json | 6 - test/test-suite/groups/errors/case001.json | 6 - test/test-suite/groups/errors/case002.json | 6 - test/test-suite/groups/errors/case003.json | 6 - test/test-suite/groups/errors/case004.json | 6 - test/test-suite/groups/errors/case005.json | 6 - test/test-suite/groups/errors/case006.json | 6 - test/test-suite/groups/errors/case007.json | 6 - test/test-suite/groups/errors/case008.json | 6 - test/test-suite/groups/errors/case009.json | 6 - test/test-suite/groups/errors/case010.json | 6 - test/test-suite/groups/errors/case011.json | 6 - test/test-suite/groups/errors/case012.json | 6 - test/test-suite/groups/errors/case013.json | 6 - test/test-suite/groups/errors/case014.json | 6 - test/test-suite/groups/errors/case015.json | 6 - test/test-suite/groups/errors/case016.json | 6 - test/test-suite/groups/errors/case017.json | 6 - test/test-suite/groups/errors/case018.json | 6 - test/test-suite/groups/errors/case019.json | 6 - test/test-suite/groups/errors/case020.json | 6 - test/test-suite/groups/errors/case021.json | 6 - test/test-suite/groups/errors/case022.json | 6 - test/test-suite/groups/errors/case023.json | 6 - test/test-suite/groups/errors/case024.json | 6 - test/test-suite/groups/fields/case000.json | 6 - test/test-suite/groups/fields/case001.json | 20 - test/test-suite/groups/fields/case002.json | 6 - test/test-suite/groups/fields/case003.json | 13 - test/test-suite/groups/fields/case004.json | 9 - test/test-suite/groups/fields/case005.json | 6 - test/test-suite/groups/fields/case006.json | 6 - test/test-suite/groups/fields/case007.json | 9 - .../test-suite/groups/flattening/case000.json | 15 - .../test-suite/groups/flattening/case001.json | 24 - .../test-suite/groups/flattening/case002.json | 24 - .../test-suite/groups/flattening/case003.json | 24 - .../test-suite/groups/flattening/case004.json | 24 - .../test-suite/groups/flattening/case005.json | 24 - .../test-suite/groups/flattening/case006.json | 22 - .../test-suite/groups/flattening/case007.json | 22 - .../test-suite/groups/flattening/case008.json | 19 - .../test-suite/groups/flattening/case009.json | 43 -- .../test-suite/groups/flattening/case010.json | 39 -- .../test-suite/groups/flattening/case011.json | 35 -- .../test-suite/groups/flattening/case012.json | 27 - .../test-suite/groups/flattening/case013.json | 19 - .../test-suite/groups/flattening/case014.json | 23 - .../test-suite/groups/flattening/case015.json | 31 - .../test-suite/groups/flattening/case016.json | 15 - .../test-suite/groups/flattening/case017.json | 43 -- .../test-suite/groups/flattening/case018.json | 39 -- .../test-suite/groups/flattening/case019.json | 35 -- .../test-suite/groups/flattening/case020.json | 27 - .../test-suite/groups/flattening/case021.json | 19 - .../test-suite/groups/flattening/case022.json | 23 - .../test-suite/groups/flattening/case023.json | 31 - .../test-suite/groups/flattening/case024.json | 15 - .../test-suite/groups/flattening/case025.json | 5 - .../test-suite/groups/flattening/case026.json | 7 - .../test-suite/groups/flattening/case027.json | 7 - .../test-suite/groups/flattening/case028.json | 11 - .../test-suite/groups/flattening/case029.json | 9 - .../test-suite/groups/flattening/case030.json | 15 - .../test-suite/groups/flattening/case031.json | 9 - .../test-suite/groups/flattening/case032.json | 21 - .../test-suite/groups/flattening/case033.json | 8 - .../test-suite/groups/flattening/case034.json | 37 -- .../test-suite/groups/flattening/case035.json | 39 -- .../test-suite/groups/flattening/case036.json | 6 - .../test-suite/groups/flattening/case037.json | 8 - .../test-suite/groups/flattening/case038.json | 8 - .../test-suite/groups/flattening/case039.json | 9 - .../test-suite/groups/flattening/case040.json | 13 - .../test-suite/groups/flattening/case041.json | 17 - .../groups/function-abs/case000.json | 6 - .../groups/function-abs/case001.json | 6 - .../groups/function-abs/case002.json | 6 - .../groups/function-abs/case003.json | 6 - .../groups/function-append/case000.json | 11 - .../groups/function-append/case001.json | 10 - .../groups/function-append/case002.json | 9 - .../groups/function-append/case003.json | 6 - .../groups/function-append/case004.json | 10 - .../groups/function-applications/case000.json | 6 - .../groups/function-applications/case001.json | 6 - .../groups/function-applications/case002.json | 6 - .../groups/function-applications/case003.json | 6 - .../groups/function-applications/case004.json | 6 - .../groups/function-applications/case005.json | 6 - .../groups/function-applications/case006.json | 6 - .../groups/function-applications/case007.json | 6 - .../groups/function-applications/case008.json | 6 - .../groups/function-applications/case009.json | 6 - .../groups/function-applications/case010.json | 12 - .../groups/function-applications/case011.json | 6 - .../groups/function-applications/case012.json | 6 - .../groups/function-applications/case013.json | 6 - .../groups/function-applications/case014.json | 6 - .../groups/function-applications/case015.json | 6 - .../groups/function-applications/case016.json | 6 - .../groups/function-applications/case017.json | 6 - .../groups/function-applications/case018.json | 6 - .../groups/function-applications/case019.json | 6 - .../groups/function-applications/case020.json | 6 - .../groups/function-applications/case021.json | 10 - .../groups/function-average/case000.json | 6 - .../groups/function-average/case001.json | 9 - .../groups/function-average/case002.json | 9 - .../groups/function-average/case003.json | 6 - .../groups/function-average/case004.json | 6 - .../groups/function-average/case005.json | 6 - .../groups/function-average/case006.json | 6 - .../groups/function-average/case007.json | 6 - .../groups/function-average/case008.json | 6 - .../groups/function-average/case009.json | 6 - .../groups/function-average/case010.json | 6 - .../groups/function-average/case011.json | 6 - .../groups/function-average/case012.json | 6 - .../groups/function-boolean/case000.json | 6 - .../groups/function-boolean/case001.json | 6 - .../groups/function-boolean/case002.json | 6 - .../groups/function-boolean/case003.json | 6 - .../groups/function-boolean/case004.json | 6 - .../groups/function-boolean/case005.json | 6 - .../groups/function-boolean/case006.json | 6 - .../groups/function-boolean/case007.json | 6 - .../groups/function-boolean/case008.json | 6 - .../groups/function-boolean/case009.json | 6 - .../groups/function-boolean/case010.json | 6 - .../groups/function-boolean/case011.json | 6 - .../groups/function-boolean/case012.json | 6 - .../groups/function-boolean/case013.json | 6 - .../groups/function-boolean/case014.json | 6 - .../groups/function-boolean/case015.json | 6 - .../groups/function-boolean/case016.json | 6 - .../groups/function-boolean/case017.json | 6 - .../groups/function-boolean/case018.json | 6 - .../groups/function-boolean/case019.json | 6 - .../groups/function-boolean/case020.json | 6 - .../groups/function-boolean/case021.json | 6 - .../groups/function-boolean/case022.json | 6 - .../groups/function-boolean/case023.json | 6 - .../groups/function-ceil/case000.json | 6 - .../groups/function-ceil/case001.json | 6 - .../groups/function-ceil/case002.json | 6 - .../groups/function-ceil/case003.json | 6 - .../groups/function-clone/case000.json | 6 - .../groups/function-clone/case001.json | 6 - .../groups/function-clone/case002.json | 8 - .../groups/function-contains/case000.json | 6 - .../groups/function-contains/case001.json | 6 - .../groups/function-contains/case002.json | 6 - .../groups/function-contains/case003.json | 6 - .../groups/function-contains/case004.json | 6 - .../groups/function-contains/case005.json | 6 - .../groups/function-contains/case006.json | 6 - .../groups/function-count/case000.json | 6 - .../groups/function-count/case001.json | 9 - .../groups/function-count/case002.json | 9 - .../groups/function-count/case003.json | 6 - .../groups/function-count/case004.json | 6 - .../groups/function-count/case005.json | 6 - .../groups/function-count/case006.json | 6 - .../groups/function-count/case007.json | 6 - .../groups/function-count/case008.json | 6 - .../groups/function-count/case009.json | 6 - .../groups/function-count/case010.json | 6 - .../groups/function-count/case011.json | 6 - .../groups/function-count/case012.json | 6 - .../groups/function-count/case013.json | 6 - .../groups/function-each/case000.json | 10 - .../groups/function-each/case001.json | 12 - .../groups/function-each/case002.json | 26 - .../groups/function-each/case003.json | 6 - .../groups/function-each/case004.json | 8 - .../groups/function-exists/case000.json | 6 - .../groups/function-exists/case001.json | 6 - .../groups/function-exists/case002.json | 6 - .../groups/function-exists/case003.json | 6 - .../groups/function-exists/case004.json | 6 - .../groups/function-exists/case005.json | 6 - .../groups/function-exists/case006.json | 6 - .../groups/function-exists/case007.json | 6 - .../groups/function-exists/case008.json | 6 - .../groups/function-exists/case009.json | 6 - .../groups/function-exists/case010.json | 6 - .../groups/function-exists/case011.json | 6 - .../groups/function-exists/case012.json | 6 - .../groups/function-exists/case013.json | 6 - .../groups/function-exists/case014.json | 6 - .../groups/function-exists/case015.json | 6 - .../groups/function-exists/case016.json | 6 - .../groups/function-exists/case017.json | 6 - .../groups/function-exists/case018.json | 6 - .../groups/function-exists/case019.json | 6 - .../groups/function-exists/case020.json | 6 - .../groups/function-exists/case021.json | 6 - .../groups/function-exists/case022.json | 6 - .../groups/function-exists/case023.json | 6 - .../groups/function-exists/case024.json | 6 - .../groups/function-floor/case000.json | 6 - .../groups/function-floor/case001.json | 6 - .../groups/function-floor/case002.json | 6 - .../groups/function-floor/case003.json | 6 - .../groups/function-formatBase/case000.json | 6 - .../groups/function-formatBase/case001.json | 6 - .../groups/function-formatBase/case002.json | 6 - .../groups/function-formatBase/case003.json | 6 - .../groups/function-formatBase/case004.json | 6 - .../groups/function-formatBase/case005.json | 6 - .../groups/function-formatBase/case006.json | 6 - .../groups/function-formatBase/case007.json | 6 - .../groups/function-formatNumber/case000.json | 6 - .../groups/function-formatNumber/case001.json | 6 - .../groups/function-formatNumber/case002.json | 6 - .../groups/function-formatNumber/case003.json | 6 - .../groups/function-formatNumber/case004.json | 6 - .../groups/function-formatNumber/case005.json | 6 - .../groups/function-formatNumber/case006.json | 6 - .../groups/function-formatNumber/case007.json | 6 - .../groups/function-formatNumber/case008.json | 6 - .../groups/function-formatNumber/case009.json | 6 - .../groups/function-formatNumber/case010.json | 6 - .../groups/function-formatNumber/case011.json | 6 - .../groups/function-formatNumber/case012.json | 6 - .../groups/function-formatNumber/case013.json | 6 - .../groups/function-formatNumber/case014.json | 6 - .../groups/function-formatNumber/case015.json | 6 - .../groups/function-formatNumber/case016.json | 6 - .../groups/function-formatNumber/case017.json | 6 - .../groups/function-formatNumber/case018.json | 6 - .../groups/function-formatNumber/case019.json | 6 - .../groups/function-formatNumber/case020.json | 6 - .../groups/function-formatNumber/case021.json | 6 - .../groups/function-formatNumber/case022.json | 6 - .../groups/function-formatNumber/case023.json | 6 - .../groups/function-formatNumber/case024.json | 6 - .../groups/function-formatNumber/case025.json | 6 - .../groups/function-formatNumber/case026.json | 6 - .../groups/function-formatNumber/case027.json | 6 - .../groups/function-formatNumber/case028.json | 6 - .../groups/function-formatNumber/case029.json | 6 - .../groups/function-formatNumber/case030.json | 6 - .../groups/function-formatNumber/case031.json | 6 - .../groups/function-formatNumber/case032.json | 6 - .../groups/function-fromMillis/case000.json | 6 - .../groups/function-fromMillis/case001.json | 6 - .../groups/function-fromMillis/case002.json | 6 - .../groups/function-join/case000.json | 6 - .../groups/function-join/case001.json | 6 - .../groups/function-join/case002.json | 6 - .../groups/function-join/case003.json | 6 - .../groups/function-join/case004.json | 6 - .../groups/function-join/case005.json | 6 - .../groups/function-join/case006.json | 6 - .../groups/function-join/case007.json | 6 - .../groups/function-join/case008.json | 6 - .../groups/function-join/case009.json | 6 - .../groups/function-join/case010.json | 6 - .../groups/function-join/case011.json | 6 - .../groups/function-keys/case000.json | 9 - .../groups/function-keys/case001.json | 13 - .../groups/function-keys/case002.json | 6 - .../groups/function-keys/case003.json | 8 - .../groups/function-keys/case004.json | 6 - .../groups/function-keys/case005.json | 6 - .../groups/function-keys/case006.json | 6 - .../groups/function-length/case000.json | 6 - .../groups/function-length/case001.json | 6 - .../groups/function-length/case002.json | 6 - .../groups/function-length/case003.json | 6 - .../groups/function-length/case004.json | 6 - .../groups/function-length/case005.json | 6 - .../groups/function-length/case006.json | 6 - .../groups/function-length/case007.json | 6 - .../groups/function-length/case008.json | 6 - .../groups/function-length/case009.json | 6 - .../groups/function-length/case010.json | 6 - .../groups/function-length/case011.json | 6 - .../groups/function-length/case012.json | 6 - .../groups/function-length/case013.json | 6 - .../groups/function-length/case014.json | 6 - .../groups/function-length/case015.json | 6 - .../groups/function-lookup/case000.json | 6 - .../groups/function-lookup/case001.json | 11 - .../groups/function-lookup/case002.json | 6 - .../groups/function-lookup/case003.json | 6 - .../groups/function-lowercase/case000.json | 6 - .../groups/function-lowercase/case001.json | 6 - .../groups/function-max/case000.json | 6 - .../groups/function-max/case001.json | 9 - .../groups/function-max/case002.json | 9 - .../groups/function-max/case003.json | 6 - .../groups/function-max/case004.json | 6 - .../groups/function-max/case005.json | 6 - .../groups/function-max/case006.json | 6 - .../groups/function-max/case007.json | 6 - .../groups/function-max/case008.json | 6 - .../groups/function-max/case009.json | 6 - .../groups/function-max/case010.json | 6 - .../groups/function-max/case011.json | 6 - .../groups/function-max/case012.json | 6 - .../groups/function-max/case013.json | 6 - .../groups/function-max/case014.json | 6 - .../groups/function-max/case015.json | 9 - .../groups/function-max/case016.json | 9 - .../groups/function-max/case017.json | 6 - .../groups/function-max/case018.json | 6 - .../groups/function-max/case019.json | 6 - .../groups/function-max/case020.json | 6 - .../groups/function-max/case021.json | 6 - .../groups/function-max/case022.json | 6 - .../groups/function-max/case023.json | 6 - .../groups/function-max/case024.json | 6 - .../groups/function-max/case025.json | 6 - .../groups/function-max/case026.json | 6 - .../groups/function-merge/case000.json | 6 - .../groups/function-merge/case001.json | 8 - .../groups/function-merge/case002.json | 9 - .../groups/function-merge/case003.json | 10 - .../groups/function-merge/case004.json | 9 - .../groups/function-number/case000.json | 6 - .../groups/function-number/case001.json | 6 - .../groups/function-number/case002.json | 6 - .../groups/function-number/case003.json | 6 - .../groups/function-number/case004.json | 6 - .../groups/function-number/case005.json | 6 - .../groups/function-number/case006.json | 6 - .../groups/function-number/case007.json | 6 - .../groups/function-number/case008.json | 6 - .../groups/function-number/case009.json | 6 - .../groups/function-number/case010.json | 6 - .../groups/function-number/case011.json | 6 - .../groups/function-number/case012.json | 6 - .../groups/function-number/case013.json | 6 - .../groups/function-number/case014.json | 6 - .../groups/function-number/case015.json | 6 - .../groups/function-number/case016.json | 6 - .../groups/function-number/case017.json | 6 - .../groups/function-number/case018.json | 6 - .../groups/function-number/case019.json | 6 - .../groups/function-number/case020.json | 6 - .../groups/function-number/case021.json | 6 - .../groups/function-number/case022.json | 6 - .../groups/function-number/case023.json | 6 - .../groups/function-number/case024.json | 6 - .../groups/function-number/case025.json | 6 - .../groups/function-number/case026.json | 6 - .../groups/function-pad/case000.json | 6 - .../groups/function-pad/case001.json | 6 - .../groups/function-pad/case002.json | 6 - .../groups/function-pad/case003.json | 6 - .../groups/function-pad/case004.json | 6 - .../groups/function-pad/case005.json | 6 - .../groups/function-pad/case006.json | 6 - .../groups/function-power/case000.json | 6 - .../groups/function-power/case001.json | 6 - .../groups/function-power/case002.json | 6 - .../groups/function-power/case003.json | 6 - .../groups/function-power/case004.json | 6 - .../groups/function-power/case005.json | 6 - .../groups/function-power/case006.json | 6 - .../groups/function-replace/case000.json | 6 - .../groups/function-replace/case001.json | 6 - .../groups/function-replace/case002.json | 6 - .../groups/function-replace/case003.json | 6 - .../groups/function-replace/case004.json | 6 - .../groups/function-replace/case005.json | 6 - .../groups/function-replace/case006.json | 6 - .../groups/function-replace/case007.json | 6 - .../groups/function-replace/case008.json | 6 - .../groups/function-replace/case009.json | 6 - .../groups/function-replace/case010.json | 6 - .../groups/function-replace/case011.json | 6 - .../groups/function-round/case000.json | 6 - .../groups/function-round/case001.json | 6 - .../groups/function-round/case002.json | 6 - .../groups/function-round/case003.json | 6 - .../groups/function-round/case004.json | 6 - .../groups/function-round/case005.json | 6 - .../groups/function-round/case006.json | 6 - .../groups/function-round/case007.json | 6 - .../groups/function-round/case008.json | 6 - .../groups/function-round/case009.json | 6 - .../groups/function-round/case010.json | 6 - .../groups/function-round/case011.json | 6 - .../groups/function-round/case012.json | 6 - .../groups/function-round/case013.json | 6 - .../groups/function-round/case014.json | 6 - .../groups/function-round/case015.json | 6 - .../groups/function-round/case016.json | 6 - .../groups/function-round/case017.json | 6 - .../groups/function-shuffle/case000.json | 6 - .../groups/function-shuffle/case001.json | 17 - .../groups/function-shuffle/case002.json | 6 - .../groups/function-shuffle/case003.json | 8 - .../groups/function-sift/case000.json | 21 - .../groups/function-sift/case001.json | 21 - .../groups/function-sift/case002.json | 13 - .../groups/function-sift/case003.json | 6 - .../groups/function-sift/case004.json | 6 - .../groups/function-sift/case005.json | 6 - .../groups/function-sift/case006.json | 6 - .../groups/function-signatures/case000.json | 6 - .../groups/function-signatures/case001.json | 6 - .../groups/function-signatures/case002.json | 6 - .../groups/function-signatures/case003.json | 6 - .../groups/function-signatures/case004.json | 12 - .../groups/function-signatures/case005.json | 12 - .../groups/function-signatures/case006.json | 6 - .../groups/function-signatures/case007.json | 6 - .../groups/function-signatures/case008.json | 11 - .../groups/function-signatures/case009.json | 6 - .../groups/function-signatures/case010.json | 6 - .../groups/function-signatures/case011.json | 6 - .../groups/function-signatures/case012.json | 6 - .../groups/function-signatures/case013.json | 6 - .../groups/function-signatures/case014.json | 6 - .../groups/function-signatures/case015.json | 6 - .../groups/function-signatures/case016.json | 6 - .../groups/function-signatures/case017.json | 6 - .../groups/function-signatures/case018.json | 6 - .../groups/function-signatures/case019.json | 8 - .../groups/function-signatures/case020.json | 10 - .../groups/function-signatures/case021.json | 6 - .../groups/function-signatures/case022.json | 6 - .../groups/function-signatures/case023.json | 12 - .../groups/function-signatures/case024.json | 6 - .../groups/function-signatures/case025.json | 6 - .../groups/function-signatures/case026.json | 6 - .../groups/function-signatures/case027.json | 6 - .../groups/function-signatures/case028.json | 6 - .../groups/function-signatures/case029.json | 6 - .../groups/function-signatures/case030.json | 6 - .../groups/function-signatures/case031.json | 6 - .../groups/function-signatures/case032.json | 6 - .../groups/function-signatures/case033.json | 6 - .../groups/function-signatures/case034.json | 6 - .../groups/function-sort/case000.json | 6 - .../groups/function-sort/case001.json | 8 - .../groups/function-sort/case002.json | 10 - .../groups/function-sort/case003.json | 11 - .../groups/function-sort/case004.json | 26 - .../groups/function-sort/case005.json | 11 - .../groups/function-sort/case006.json | 11 - .../groups/function-sort/case007.json | 6 - .../groups/function-sort/case008.json | 11 - .../groups/function-sort/case009.json | 11 - .../groups/function-sort/case010.json | 11 - .../groups/function-split/case000.json | 9 - .../groups/function-split/case001.json | 8 - .../groups/function-split/case002.json | 10 - .../groups/function-split/case003.json | 12 - .../groups/function-split/case004.json | 6 - .../groups/function-split/case005.json | 11 - .../groups/function-split/case006.json | 9 - .../groups/function-split/case007.json | 9 - .../groups/function-split/case008.json | 11 - .../groups/function-split/case009.json | 6 - .../groups/function-split/case010.json | 6 - .../groups/function-split/case011.json | 6 - .../groups/function-split/case012.json | 6 - .../groups/function-split/case013.json | 6 - .../groups/function-split/case014.json | 6 - .../groups/function-split/case015.json | 6 - .../groups/function-split/case016.json | 6 - .../groups/function-split/case017.json | 6 - .../groups/function-spread/case000.json | 6 - .../groups/function-spread/case001.json | 67 --- .../groups/function-spread/case002.json | 6 - .../groups/function-spread/case003.json | 6 - .../groups/function-sqrt/case000.json | 6 - .../groups/function-sqrt/case001.json | 6 - .../groups/function-sqrt/case002.json | 6 - .../groups/function-sqrt/case003.json | 6 - .../groups/function-string/case000.json | 6 - .../groups/function-string/case001.json | 6 - .../groups/function-string/case002.json | 6 - .../groups/function-string/case003.json | 6 - .../groups/function-string/case004.json | 6 - .../groups/function-string/case005.json | 6 - .../groups/function-string/case006.json | 6 - .../groups/function-string/case007.json | 6 - .../groups/function-string/case008.json | 9 - .../groups/function-string/case009.json | 6 - .../groups/function-string/case010.json | 6 - .../groups/function-string/case011.json | 6 - .../groups/function-string/case012.json | 6 - .../groups/function-string/case013.json | 6 - .../groups/function-string/case014.json | 6 - .../groups/function-string/case015.json | 6 - .../groups/function-string/case016.json | 6 - .../groups/function-string/case017.json | 6 - .../groups/function-string/case018.json | 6 - .../groups/function-string/case019.json | 6 - .../groups/function-string/case020.json | 6 - .../groups/function-string/case021.json | 6 - .../groups/function-string/case022.json | 6 - .../groups/function-substring/case000.json | 6 - .../groups/function-substring/case001.json | 6 - .../groups/function-substring/case002.json | 6 - .../groups/function-substring/case003.json | 6 - .../function-substringAfter/case000.json | 6 - .../function-substringAfter/case001.json | 6 - .../function-substringAfter/case002.json | 6 - .../function-substringAfter/case003.json | 6 - .../function-substringAfter/case004.json | 6 - .../function-substringBefore/case000.json | 6 - .../function-substringBefore/case001.json | 6 - .../function-substringBefore/case002.json | 6 - .../function-substringBefore/case003.json | 6 - .../function-substringBefore/case004.json | 6 - .../groups/function-sum/case000.json | 6 - .../groups/function-sum/case001.json | 9 - .../groups/function-sum/case002.json | 9 - .../groups/function-sum/case003.json | 6 - .../groups/function-sum/case004.json | 6 - .../groups/function-sum/case005.json | 6 - .../groups/function-sum/case006.json | 6 - .../groups/function-trim/case000.json | 6 - .../groups/function-trim/case001.json | 6 - .../groups/function-trim/case002.json | 6 - .../groups/function-uppercase/case000.json | 6 - .../groups/function-uppercase/case001.json | 6 - .../groups/function-zip/case000.json | 19 - .../groups/function-zip/case001.json | 22 - .../groups/function-zip/case002.json | 17 - .../groups/function-zip/case003.json | 16 - .../groups/function-zip/case004.json | 12 - .../groups/function-zip/case005.json | 6 - .../higher-order-functions/case000.json | 6 - .../higher-order-functions/case001.json | 6 - .../higher-order-functions/case002.json | 6 - .../test-suite/groups/hof-filter/case000.json | 6 - .../test-suite/groups/hof-filter/case001.json | 6 - test/test-suite/groups/hof-map/case000.json | 12 - test/test-suite/groups/hof-map/case001.json | 6 - test/test-suite/groups/hof-map/case002.json | 10 - test/test-suite/groups/hof-map/case003.json | 11 - test/test-suite/groups/hof-map/case004.json | 11 - test/test-suite/groups/hof-map/case005.json | 9 - test/test-suite/groups/hof-map/case006.json | 9 - test/test-suite/groups/hof-map/case007.json | 11 - test/test-suite/groups/hof-map/case008.json | 6 - .../test-suite/groups/hof-reduce/case000.json | 6 - .../test-suite/groups/hof-reduce/case001.json | 6 - .../test-suite/groups/hof-reduce/case002.json | 6 - .../test-suite/groups/hof-reduce/case003.json | 6 - .../test-suite/groups/hof-reduce/case004.json | 6 - .../test-suite/groups/hof-reduce/case005.json | 11 - .../test-suite/groups/hof-reduce/case006.json | 6 - .../test-suite/groups/hof-reduce/case007.json | 13 - .../test-suite/groups/hof-reduce/case008.json | 6 - .../groups/hof-zip-map/case000.json | 12 - .../groups/hof-zip-map/case001.json | 12 - .../groups/hof-zip-map/case002.json | 6 - .../groups/hof-zip-map/case003.json | 6 - .../groups/inclusion-operator/case000.json | 6 - .../groups/inclusion-operator/case001.json | 6 - .../groups/inclusion-operator/case002.json | 6 - .../groups/inclusion-operator/case003.json | 6 - .../groups/inclusion-operator/case004.json | 6 - .../groups/inclusion-operator/case005.json | 6 - .../groups/inclusion-operator/case006.json | 6 - .../groups/inclusion-operator/case007.json | 9 - .../groups/inclusion-operator/case008.json | 6 - test/test-suite/groups/lambdas/case000.json | 6 - test/test-suite/groups/lambdas/case001.json | 6 - test/test-suite/groups/lambdas/case002.json | 6 - test/test-suite/groups/lambdas/case003.json | 6 - test/test-suite/groups/lambdas/case004.json | 16 - test/test-suite/groups/lambdas/case005.json | 6 - test/test-suite/groups/lambdas/case006.json | 6 - test/test-suite/groups/lambdas/case007.json | 6 - test/test-suite/groups/lambdas/case008.json | 6 - test/test-suite/groups/lambdas/case009.json | 9 - test/test-suite/groups/lambdas/case010.json | 23 - test/test-suite/groups/lambdas/case011.json | 15 - test/test-suite/groups/literals/case000.json | 6 - test/test-suite/groups/literals/case001.json | 6 - test/test-suite/groups/literals/case002.json | 6 - test/test-suite/groups/literals/case003.json | 6 - test/test-suite/groups/literals/case004.json | 6 - test/test-suite/groups/literals/case005.json | 6 - test/test-suite/groups/literals/case006.json | 6 - test/test-suite/groups/literals/case007.json | 6 - test/test-suite/groups/literals/case008.json | 6 - test/test-suite/groups/literals/case009.json | 6 - test/test-suite/groups/literals/case010.json | 6 - test/test-suite/groups/literals/case011.json | 6 - test/test-suite/groups/literals/case012.json | 6 - test/test-suite/groups/literals/case013.json | 6 - test/test-suite/groups/literals/case014.json | 6 - test/test-suite/groups/literals/case015.json | 6 - test/test-suite/groups/literals/case016.json | 6 - test/test-suite/groups/literals/case017.json | 6 - .../groups/missing-paths/case000.json | 6 - .../groups/missing-paths/case001.json | 6 - .../groups/missing-paths/case002.json | 6 - .../groups/missing-paths/case003.json | 6 - .../groups/missing-paths/case004.json | 6 - .../groups/missing-paths/case005.json | 6 - .../multiple-array-selectors/case000.json | 12 - .../multiple-array-selectors/case001.json | 12 - .../multiple-array-selectors/case002.json | 17 - test/test-suite/groups/null/case000.json | 6 - test/test-suite/groups/null/case001.json | 8 - test/test-suite/groups/null/case002.json | 9 - test/test-suite/groups/null/case003.json | 6 - test/test-suite/groups/null/case004.json | 6 - test/test-suite/groups/null/case005.json | 6 - test/test-suite/groups/null/case006.json | 10 - .../groups/numeric-operators/case000.json | 6 - .../groups/numeric-operators/case001.json | 6 - .../groups/numeric-operators/case002.json | 6 - .../groups/numeric-operators/case003.json | 6 - .../groups/numeric-operators/case004.json | 6 - .../groups/numeric-operators/case005.json | 6 - .../groups/numeric-operators/case006.json | 6 - .../groups/numeric-operators/case007.json | 6 - .../groups/numeric-operators/case008.json | 6 - .../groups/numeric-operators/case009.json | 6 - .../groups/numeric-operators/case010.json | 6 - .../groups/numeric-operators/case011.json | 6 - .../groups/numeric-operators/case012.json | 6 - .../groups/numeric-operators/case013.json | 6 - .../groups/numeric-operators/case014.json | 6 - .../groups/numeric-operators/case015.json | 6 - .../groups/numeric-operators/case016.json | 6 - .../groups/object-constructor/case000.json | 6 - .../groups/object-constructor/case001.json | 8 - .../groups/object-constructor/case002.json | 9 - .../groups/object-constructor/case003.json | 6 - .../groups/object-constructor/case004.json | 12 - .../groups/object-constructor/case005.json | 12 - .../groups/object-constructor/case006.json | 6 - .../groups/object-constructor/case007.json | 6 - .../groups/object-constructor/case008.json | 15 - .../groups/object-constructor/case009.json | 19 - .../groups/object-constructor/case010.json | 13 - .../groups/object-constructor/case011.json | 10 - .../groups/object-constructor/case012.json | 19 - .../groups/object-constructor/case013.json | 6 - .../groups/object-constructor/case014.json | 6 - .../groups/object-constructor/case015.json | 9 - .../groups/object-constructor/case016.json | 13 - .../groups/object-constructor/case017.json | 21 - .../groups/object-constructor/case018.json | 21 - .../groups/object-constructor/case019.json | 21 - .../groups/object-constructor/case020.json | 53 -- .../groups/object-constructor/case021.json | 53 -- .../groups/object-constructor/case022.json | 16 - .../groups/parentheses/case000.json | 9 - .../groups/parentheses/case001.json | 9 - .../groups/parentheses/case002.json | 9 - .../groups/parentheses/case003.json | 9 - .../groups/parentheses/case004.json | 9 - .../groups/parentheses/case005.json | 9 - .../groups/parentheses/case006.json | 9 - .../groups/parentheses/case007.json | 6 - .../groups/partial-application/case000.json | 6 - .../groups/partial-application/case001.json | 6 - .../groups/partial-application/case002.json | 6 - .../groups/partial-application/case003.json | 6 - .../groups/partial-application/case004.json | 6 - .../test-suite/groups/predicates/case000.json | 6 - .../test-suite/groups/predicates/case001.json | 14 - .../test-suite/groups/predicates/case002.json | 12 - .../test-suite/groups/predicates/case003.json | 9 - .../groups/quoted-selectors/case000.json | 20 - .../groups/quoted-selectors/case001.json | 9 - .../groups/quoted-selectors/case002.json | 9 - .../groups/quoted-selectors/case003.json | 6 - .../groups/quoted-selectors/case004.json | 20 - .../groups/quoted-selectors/case005.json | 9 - .../groups/quoted-selectors/case006.json | 9 - .../groups/quoted-selectors/case007.json | 6 - .../groups/range-operator/case000.json | 17 - .../groups/range-operator/case001.json | 12 - .../groups/range-operator/case002.json | 16 - .../groups/range-operator/case003.json | 6 - .../groups/range-operator/case004.json | 11 - .../groups/range-operator/case005.json | 12 - .../groups/range-operator/case006.json | 12 - .../groups/range-operator/case007.json | 6 - .../groups/range-operator/case008.json | 8 - .../groups/range-operator/case009.json | 6 - .../groups/range-operator/case010.json | 6 - test/test-suite/groups/regex/case000.json | 11 - test/test-suite/groups/regex/case001.json | 9 - test/test-suite/groups/regex/case002.json | 8 - test/test-suite/groups/regex/case003.json | 6 - test/test-suite/groups/regex/case004.json | 6 - test/test-suite/groups/regex/case005.json | 6 - test/test-suite/groups/regex/case006.json | 10 - test/test-suite/groups/regex/case007.json | 6 - test/test-suite/groups/regex/case008.json | 6 - test/test-suite/groups/regex/case009.json | 6 - test/test-suite/groups/regex/case010.json | 6 - test/test-suite/groups/regex/case011.json | 6 - test/test-suite/groups/regex/case012.json | 6 - test/test-suite/groups/regex/case013.json | 6 - test/test-suite/groups/regex/case014.json | 6 - test/test-suite/groups/regex/case015.json | 6 - test/test-suite/groups/regex/case016.json | 6 - test/test-suite/groups/regex/case017.json | 6 - test/test-suite/groups/regex/case018.json | 6 - test/test-suite/groups/regex/case019.json | 6 - test/test-suite/groups/regex/case020.json | 6 - test/test-suite/groups/regex/case021.json | 6 - test/test-suite/groups/regex/case022.json | 6 - test/test-suite/groups/regex/case023.json | 6 - test/test-suite/groups/regex/case024.json | 6 - test/test-suite/groups/regex/case025.json | 6 - test/test-suite/groups/regex/case026.json | 6 - test/test-suite/groups/regex/case027.json | 6 - test/test-suite/groups/regex/case028.json | 6 - test/test-suite/groups/regex/case029.json | 6 - test/test-suite/groups/regex/case030.json | 6 - test/test-suite/groups/regex/case031.json | 6 - test/test-suite/groups/regex/case032.json | 11 - test/test-suite/groups/regex/case033.json | 11 - test/test-suite/groups/regex/case034.json | 6 - test/test-suite/groups/regex/case035.json | 6 - test/test-suite/groups/regex/case036.json | 6 - .../simple-array-selectors/case000.json | 11 - .../simple-array-selectors/case001.json | 6 - .../simple-array-selectors/case002.json | 6 - .../simple-array-selectors/case003.json | 6 - .../simple-array-selectors/case004.json | 6 - .../simple-array-selectors/case005.json | 9 - .../simple-array-selectors/case006.json | 9 - .../simple-array-selectors/case007.json | 6 - .../simple-array-selectors/case008.json | 6 - .../simple-array-selectors/case009.json | 6 - .../simple-array-selectors/case010.json | 6 - .../simple-array-selectors/case011.json | 6 - .../simple-array-selectors/case012.json | 6 - .../simple-array-selectors/case013.json | 6 - .../simple-array-selectors/case014.json | 6 - .../simple-array-selectors/case015.json | 8 - .../simple-array-selectors/case016.json | 13 - .../simple-array-selectors/case017.json | 8 - .../simple-array-selectors/case018.json | 18 - .../simple-array-selectors/case019.json | 18 - .../simple-array-selectors/case020.json | 18 - .../simple-array-selectors/case021.json | 15 - .../simple-array-selectors/case022.json | 15 - test/test-suite/groups/sorting/case000.json | 11 - test/test-suite/groups/sorting/case001.json | 11 - test/test-suite/groups/sorting/case002.json | 11 - test/test-suite/groups/sorting/case003.json | 11 - test/test-suite/groups/sorting/case004.json | 11 - test/test-suite/groups/sorting/case005.json | 11 - test/test-suite/groups/sorting/case006.json | 11 - test/test-suite/groups/sorting/case007.json | 11 - test/test-suite/groups/sorting/case008.json | 11 - test/test-suite/groups/sorting/case009.json | 11 - test/test-suite/groups/sorting/case010.json | 11 - test/test-suite/groups/sorting/case011.json | 6 - test/test-suite/groups/sorting/case012.json | 6 - test/test-suite/groups/sorting/case013.json | 6 - .../groups/string-concat/case000.json | 6 - .../groups/string-concat/case001.json | 6 - .../groups/string-concat/case002.json | 6 - .../groups/string-concat/case003.json | 6 - .../groups/string-concat/case004.json | 6 - .../groups/string-concat/case005.json | 6 - .../groups/string-concat/case006.json | 6 - .../groups/string-concat/case007.json | 6 - .../groups/string-concat/case008.json | 6 - .../groups/string-concat/case009.json | 6 - .../groups/string-concat/case010.json | 6 - .../groups/string-concat/case011.json | 6 - .../groups/tail-recursion/case000.json | 6 - .../groups/tail-recursion/case001.json | 8 - .../groups/tail-recursion/case002.json | 8 - .../groups/tail-recursion/case003.json | 6 - .../groups/tail-recursion/case004.json | 6 - .../groups/tail-recursion/case005.json | 8 - .../groups/tail-recursion/case006.json | 8 - .../groups/tail-recursion/case007.json | 8 - test/test-suite/groups/transform/case000.json | 49 -- test/test-suite/groups/transform/case001.json | 18 - test/test-suite/groups/transform/case002.json | 14 - test/test-suite/groups/transform/case003.json | 12 - test/test-suite/groups/transform/case004.json | 15 - test/test-suite/groups/transform/case005.json | 15 - test/test-suite/groups/transform/case006.json | 15 - test/test-suite/groups/transform/case007.json | 10 - test/test-suite/groups/transform/case008.json | 8 - test/test-suite/groups/transform/case009.json | 8 - test/test-suite/groups/transform/case010.json | 8 - test/test-suite/groups/transform/case011.json | 6 - test/test-suite/groups/transform/case012.json | 8 - test/test-suite/groups/transform/case013.json | 6 - test/test-suite/groups/transform/case014.json | 6 - test/test-suite/groups/transform/case015.json | 6 - test/test-suite/groups/transform/case016.json | 8 - test/test-suite/groups/transform/case017.json | 6 - test/test-suite/groups/transform/case018.json | 8 - test/test-suite/groups/transform/case019.json | 6 - test/test-suite/groups/transform/case020.json | 8 - test/test-suite/groups/transform/case021.json | 6 - test/test-suite/groups/transform/case022.json | 6 - test/test-suite/groups/transform/case023.json | 8 - test/test-suite/groups/transform/case024.json | 6 - test/test-suite/groups/transform/case025.json | 8 - test/test-suite/groups/transform/case026.json | 6 - test/test-suite/groups/transform/case027.json | 6 - test/test-suite/groups/transform/case028.json | 6 - test/test-suite/groups/transform/case029.json | 6 - test/test-suite/groups/transform/case030.json | 6 - test/test-suite/groups/transform/case031.json | 6 - test/test-suite/groups/transform/case032.json | 6 - test/test-suite/groups/transform/case033.json | 6 - test/test-suite/groups/transform/case034.json | 6 - test/test-suite/groups/transform/case035.json | 6 - test/test-suite/groups/transform/case036.json | 6 - test/test-suite/groups/transform/case037.json | 6 - test/test-suite/groups/transform/case038.json | 6 - test/test-suite/groups/transform/case039.json | 6 - test/test-suite/groups/transform/case040.json | 6 - test/test-suite/groups/transform/case041.json | 6 - test/test-suite/groups/transform/case042.json | 6 - test/test-suite/groups/transform/case043.json | 6 - test/test-suite/groups/transform/case044.json | 6 - test/test-suite/groups/transform/case045.json | 6 - test/test-suite/groups/transform/case046.json | 6 - test/test-suite/groups/transform/case047.json | 6 - test/test-suite/groups/transform/case048.json | 6 - test/test-suite/groups/transform/case049.json | 6 - test/test-suite/groups/transform/case050.json | 6 - test/test-suite/groups/transform/case051.json | 6 - test/test-suite/groups/transform/case052.json | 6 - test/test-suite/groups/transform/case053.json | 6 - test/test-suite/groups/transform/case054.json | 6 - test/test-suite/groups/transform/case055.json | 6 - test/test-suite/groups/transform/case056.json | 6 - test/test-suite/groups/transform/case057.json | 6 - test/test-suite/groups/transform/case058.json | 6 - test/test-suite/groups/transform/case059.json | 6 - test/test-suite/groups/transform/case060.json | 6 - test/test-suite/groups/transform/case061.json | 6 - test/test-suite/groups/transform/case062.json | 6 - test/test-suite/groups/transform/case063.json | 6 - test/test-suite/groups/transform/case064.json | 6 - test/test-suite/groups/transform/case065.json | 6 - test/test-suite/groups/transform/case066.json | 6 - test/test-suite/groups/transform/case067.json | 6 - test/test-suite/groups/transform/case068.json | 6 - test/test-suite/groups/transform/case069.json | 6 - test/test-suite/groups/transform/case070.json | 6 - test/test-suite/groups/transform/case071.json | 6 - test/test-suite/groups/transform/case072.json | 6 - test/test-suite/groups/transform/case073.json | 6 - test/test-suite/groups/transform/case074.json | 6 - test/test-suite/groups/transform/case075.json | 6 - test/test-suite/groups/transform/case076.json | 6 - test/test-suite/groups/transform/case077.json | 6 - test/test-suite/groups/transform/case078.json | 6 - test/test-suite/groups/transform/case079.json | 6 - test/test-suite/groups/transform/case080.json | 6 - test/test-suite/groups/transform/case081.json | 6 - test/test-suite/groups/transform/case082.json | 6 - test/test-suite/groups/transform/case083.json | 6 - test/test-suite/groups/transform/case084.json | 6 - test/test-suite/groups/transform/case085.json | 6 - test/test-suite/groups/transform/case086.json | 6 - test/test-suite/groups/transform/case087.json | 6 - test/test-suite/groups/transform/case088.json | 6 - test/test-suite/groups/transform/case089.json | 6 - test/test-suite/groups/transform/case090.json | 6 - test/test-suite/groups/transform/case091.json | 6 - test/test-suite/groups/transform/case092.json | 6 - test/test-suite/groups/transform/case093.json | 6 - test/test-suite/groups/transform/case094.json | 6 - test/test-suite/groups/transform/case095.json | 6 - test/test-suite/groups/transform/case096.json | 6 - test/test-suite/groups/transform/case097.json | 6 - test/test-suite/groups/transform/case098.json | 6 - test/test-suite/groups/transform/case099.json | 6 - test/test-suite/groups/transform/case100.json | 6 - test/test-suite/groups/transform/case101.json | 6 - test/test-suite/groups/transform/case102.json | 6 - test/test-suite/groups/transform/case103.json | 6 - .../test-suite/groups/transforms/case000.json | 50 -- .../test-suite/groups/transforms/case001.json | 45 -- .../test-suite/groups/transforms/case002.json | 82 --- .../test-suite/groups/transforms/case003.json | 50 -- .../test-suite/groups/transforms/case004.json | 50 -- .../test-suite/groups/transforms/case005.json | 72 --- .../test-suite/groups/transforms/case006.json | 78 --- .../test-suite/groups/transforms/case007.json | 18 - .../test-suite/groups/transforms/case008.json | 6 - .../test-suite/groups/transforms/case009.json | 6 - .../test-suite/groups/transforms/case010.json | 6 - .../test-suite/groups/transforms/case011.json | 18 - .../test-suite/groups/transforms/case012.json | 6 - test/test-suite/groups/variables/case000.json | 12 - test/test-suite/groups/variables/case001.json | 12 - test/test-suite/groups/variables/case002.json | 12 - test/test-suite/groups/variables/case003.json | 12 - test/test-suite/groups/variables/case004.json | 6 - test/test-suite/groups/variables/case005.json | 6 - test/test-suite/groups/variables/case006.json | 6 - test/test-suite/groups/variables/case007.json | 6 - test/test-suite/groups/variables/case008.json | 6 - test/test-suite/groups/variables/case009.json | 8 - test/test-suite/groups/variables/case010.json | 6 - test/test-suite/groups/variables/case011.json | 6 - test/test-suite/groups/wildcards/case000.json | 22 - test/test-suite/groups/wildcards/case001.json | 13 - test/test-suite/groups/wildcards/case002.json | 6 - test/test-suite/groups/wildcards/case003.json | 9 - test/test-suite/groups/wildcards/case004.json | 9 - test/test-suite/groups/wildcards/case005.json | 9 - test/test-suite/groups/wildcards/case006.json | 6 - test/test-suite/groups/wildcards/case007.json | 18 - test/test-suite/groups/wildcards/case008.json | 9 - test/test-suite/groups/wildcards/case009.json | 9 - 1060 files changed, 11102 deletions(-) delete mode 100644 test/.eslintrc delete mode 100644 test/async-function.js delete mode 100644 test/implementation-tests.js delete mode 100644 test/parser-recovery.js delete mode 100644 test/run-test-suite.js delete mode 100644 test/test-suite/TESTSUITE.md delete mode 100644 test/test-suite/datasets/dataset0.json delete mode 100644 test/test-suite/datasets/dataset1.json delete mode 100644 test/test-suite/datasets/dataset10.json delete mode 100644 test/test-suite/datasets/dataset11.json delete mode 100644 test/test-suite/datasets/dataset12.json delete mode 100644 test/test-suite/datasets/dataset13.json delete mode 100644 test/test-suite/datasets/dataset14.json delete mode 100644 test/test-suite/datasets/dataset15.json delete mode 100644 test/test-suite/datasets/dataset16.json delete mode 100644 test/test-suite/datasets/dataset17.json delete mode 100644 test/test-suite/datasets/dataset18.json delete mode 100644 test/test-suite/datasets/dataset19.json delete mode 100644 test/test-suite/datasets/dataset2.json delete mode 100644 test/test-suite/datasets/dataset20.json delete mode 100644 test/test-suite/datasets/dataset21.json delete mode 100644 test/test-suite/datasets/dataset22.json delete mode 100644 test/test-suite/datasets/dataset23.json delete mode 100644 test/test-suite/datasets/dataset24.json delete mode 100644 test/test-suite/datasets/dataset3.json delete mode 100644 test/test-suite/datasets/dataset4.json delete mode 100644 test/test-suite/datasets/dataset5.json delete mode 100644 test/test-suite/datasets/dataset6.json delete mode 100644 test/test-suite/datasets/dataset7.json delete mode 100644 test/test-suite/datasets/dataset8.json delete mode 100644 test/test-suite/datasets/dataset9.json delete mode 100644 test/test-suite/groups/array-constructor/case000.json delete mode 100644 test/test-suite/groups/array-constructor/case001.json delete mode 100644 test/test-suite/groups/array-constructor/case002.json delete mode 100644 test/test-suite/groups/array-constructor/case003.json delete mode 100644 test/test-suite/groups/array-constructor/case004.json delete mode 100644 test/test-suite/groups/array-constructor/case005.json delete mode 100644 test/test-suite/groups/array-constructor/case006.json delete mode 100644 test/test-suite/groups/array-constructor/case007.json delete mode 100644 test/test-suite/groups/array-constructor/case008.json delete mode 100644 test/test-suite/groups/array-constructor/case009.json delete mode 100644 test/test-suite/groups/array-constructor/case010.json delete mode 100644 test/test-suite/groups/array-constructor/case011.json delete mode 100644 test/test-suite/groups/array-constructor/case012.json delete mode 100644 test/test-suite/groups/array-constructor/case013.json delete mode 100644 test/test-suite/groups/array-constructor/case014.json delete mode 100644 test/test-suite/groups/array-constructor/case015.json delete mode 100644 test/test-suite/groups/array-constructor/case016.json delete mode 100644 test/test-suite/groups/array-constructor/case017.json delete mode 100644 test/test-suite/groups/array-constructor/case018.json delete mode 100644 test/test-suite/groups/array-constructor/case019.json delete mode 100644 test/test-suite/groups/array-constructor/case020.json delete mode 100644 test/test-suite/groups/blocks/case000.json delete mode 100644 test/test-suite/groups/blocks/case001.json delete mode 100644 test/test-suite/groups/blocks/case002.json delete mode 100644 test/test-suite/groups/blocks/case003.json delete mode 100644 test/test-suite/groups/blocks/case004.json delete mode 100644 test/test-suite/groups/blocks/case005.json delete mode 100644 test/test-suite/groups/blocks/case006.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case000.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case001.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case002.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case003.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case004.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case005.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case006.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case007.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case008.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case009.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case010.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case011.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case012.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case013.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case014.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case015.json delete mode 100644 test/test-suite/groups/boolean-expresssions/case016.json delete mode 100644 test/test-suite/groups/closures/case000.json delete mode 100644 test/test-suite/groups/closures/case001.json delete mode 100644 test/test-suite/groups/comparison-operators/case000.json delete mode 100644 test/test-suite/groups/comparison-operators/case001.json delete mode 100644 test/test-suite/groups/comparison-operators/case002.json delete mode 100644 test/test-suite/groups/comparison-operators/case003.json delete mode 100644 test/test-suite/groups/comparison-operators/case004.json delete mode 100644 test/test-suite/groups/comparison-operators/case005.json delete mode 100644 test/test-suite/groups/comparison-operators/case006.json delete mode 100644 test/test-suite/groups/comparison-operators/case007.json delete mode 100644 test/test-suite/groups/comparison-operators/case008.json delete mode 100644 test/test-suite/groups/comparison-operators/case009.json delete mode 100644 test/test-suite/groups/comparison-operators/case010.json delete mode 100644 test/test-suite/groups/comparison-operators/case011.json delete mode 100644 test/test-suite/groups/comparison-operators/case012.json delete mode 100644 test/test-suite/groups/comparison-operators/case013.json delete mode 100644 test/test-suite/groups/comparison-operators/case014.json delete mode 100644 test/test-suite/groups/comparison-operators/case015.json delete mode 100644 test/test-suite/groups/comparison-operators/case016.json delete mode 100644 test/test-suite/groups/comparison-operators/case017.json delete mode 100644 test/test-suite/groups/comparison-operators/case018.json delete mode 100644 test/test-suite/groups/comparison-operators/case019.json delete mode 100644 test/test-suite/groups/comparison-operators/case020.json delete mode 100644 test/test-suite/groups/comparison-operators/case021.json delete mode 100644 test/test-suite/groups/comparison-operators/case022.json delete mode 100644 test/test-suite/groups/comparison-operators/case023.json delete mode 100644 test/test-suite/groups/comparison-operators/case024.json delete mode 100644 test/test-suite/groups/conditionals/case000.json delete mode 100644 test/test-suite/groups/conditionals/case001.json delete mode 100644 test/test-suite/groups/conditionals/case002.json delete mode 100644 test/test-suite/groups/conditionals/case003.json delete mode 100644 test/test-suite/groups/conditionals/case004.json delete mode 100644 test/test-suite/groups/conditionals/case005.json delete mode 100644 test/test-suite/groups/conditionals/case006.json delete mode 100644 test/test-suite/groups/conditionals/case007.json delete mode 100644 test/test-suite/groups/conditionals/case008.json delete mode 100644 test/test-suite/groups/context/case000.json delete mode 100644 test/test-suite/groups/context/case001.json delete mode 100644 test/test-suite/groups/context/case002.json delete mode 100644 test/test-suite/groups/context/case003.json delete mode 100644 test/test-suite/groups/descendent-operator/case000.json delete mode 100644 test/test-suite/groups/descendent-operator/case001.json delete mode 100644 test/test-suite/groups/descendent-operator/case002.json delete mode 100644 test/test-suite/groups/descendent-operator/case003.json delete mode 100644 test/test-suite/groups/descendent-operator/case004.json delete mode 100644 test/test-suite/groups/descendent-operator/case005.json delete mode 100644 test/test-suite/groups/descendent-operator/case006.json delete mode 100644 test/test-suite/groups/descendent-operator/case007.json delete mode 100644 test/test-suite/groups/descendent-operator/case008.json delete mode 100644 test/test-suite/groups/descendent-operator/case009.json delete mode 100644 test/test-suite/groups/descendent-operator/case010.json delete mode 100644 test/test-suite/groups/descendent-operator/case011.json delete mode 100644 test/test-suite/groups/descendent-operator/case012.json delete mode 100644 test/test-suite/groups/descendent-operator/case013.json delete mode 100644 test/test-suite/groups/descendent-operator/case014.json delete mode 100644 test/test-suite/groups/descendent-operator/case015.json delete mode 100644 test/test-suite/groups/descendent-operator/case016.json delete mode 100644 test/test-suite/groups/descendent-operator/case017.json delete mode 100644 test/test-suite/groups/encoding/case000.json delete mode 100644 test/test-suite/groups/encoding/case001.json delete mode 100644 test/test-suite/groups/encoding/case002.json delete mode 100644 test/test-suite/groups/encoding/case003.json delete mode 100644 test/test-suite/groups/errors/case000.json delete mode 100644 test/test-suite/groups/errors/case001.json delete mode 100644 test/test-suite/groups/errors/case002.json delete mode 100644 test/test-suite/groups/errors/case003.json delete mode 100644 test/test-suite/groups/errors/case004.json delete mode 100644 test/test-suite/groups/errors/case005.json delete mode 100644 test/test-suite/groups/errors/case006.json delete mode 100644 test/test-suite/groups/errors/case007.json delete mode 100644 test/test-suite/groups/errors/case008.json delete mode 100644 test/test-suite/groups/errors/case009.json delete mode 100644 test/test-suite/groups/errors/case010.json delete mode 100644 test/test-suite/groups/errors/case011.json delete mode 100644 test/test-suite/groups/errors/case012.json delete mode 100644 test/test-suite/groups/errors/case013.json delete mode 100644 test/test-suite/groups/errors/case014.json delete mode 100644 test/test-suite/groups/errors/case015.json delete mode 100644 test/test-suite/groups/errors/case016.json delete mode 100644 test/test-suite/groups/errors/case017.json delete mode 100644 test/test-suite/groups/errors/case018.json delete mode 100644 test/test-suite/groups/errors/case019.json delete mode 100644 test/test-suite/groups/errors/case020.json delete mode 100644 test/test-suite/groups/errors/case021.json delete mode 100644 test/test-suite/groups/errors/case022.json delete mode 100644 test/test-suite/groups/errors/case023.json delete mode 100644 test/test-suite/groups/errors/case024.json delete mode 100644 test/test-suite/groups/fields/case000.json delete mode 100644 test/test-suite/groups/fields/case001.json delete mode 100644 test/test-suite/groups/fields/case002.json delete mode 100644 test/test-suite/groups/fields/case003.json delete mode 100644 test/test-suite/groups/fields/case004.json delete mode 100644 test/test-suite/groups/fields/case005.json delete mode 100644 test/test-suite/groups/fields/case006.json delete mode 100644 test/test-suite/groups/fields/case007.json delete mode 100644 test/test-suite/groups/flattening/case000.json delete mode 100644 test/test-suite/groups/flattening/case001.json delete mode 100644 test/test-suite/groups/flattening/case002.json delete mode 100644 test/test-suite/groups/flattening/case003.json delete mode 100644 test/test-suite/groups/flattening/case004.json delete mode 100644 test/test-suite/groups/flattening/case005.json delete mode 100644 test/test-suite/groups/flattening/case006.json delete mode 100644 test/test-suite/groups/flattening/case007.json delete mode 100644 test/test-suite/groups/flattening/case008.json delete mode 100644 test/test-suite/groups/flattening/case009.json delete mode 100644 test/test-suite/groups/flattening/case010.json delete mode 100644 test/test-suite/groups/flattening/case011.json delete mode 100644 test/test-suite/groups/flattening/case012.json delete mode 100644 test/test-suite/groups/flattening/case013.json delete mode 100644 test/test-suite/groups/flattening/case014.json delete mode 100644 test/test-suite/groups/flattening/case015.json delete mode 100644 test/test-suite/groups/flattening/case016.json delete mode 100644 test/test-suite/groups/flattening/case017.json delete mode 100644 test/test-suite/groups/flattening/case018.json delete mode 100644 test/test-suite/groups/flattening/case019.json delete mode 100644 test/test-suite/groups/flattening/case020.json delete mode 100644 test/test-suite/groups/flattening/case021.json delete mode 100644 test/test-suite/groups/flattening/case022.json delete mode 100644 test/test-suite/groups/flattening/case023.json delete mode 100644 test/test-suite/groups/flattening/case024.json delete mode 100644 test/test-suite/groups/flattening/case025.json delete mode 100644 test/test-suite/groups/flattening/case026.json delete mode 100644 test/test-suite/groups/flattening/case027.json delete mode 100644 test/test-suite/groups/flattening/case028.json delete mode 100644 test/test-suite/groups/flattening/case029.json delete mode 100644 test/test-suite/groups/flattening/case030.json delete mode 100644 test/test-suite/groups/flattening/case031.json delete mode 100644 test/test-suite/groups/flattening/case032.json delete mode 100644 test/test-suite/groups/flattening/case033.json delete mode 100644 test/test-suite/groups/flattening/case034.json delete mode 100644 test/test-suite/groups/flattening/case035.json delete mode 100644 test/test-suite/groups/flattening/case036.json delete mode 100644 test/test-suite/groups/flattening/case037.json delete mode 100644 test/test-suite/groups/flattening/case038.json delete mode 100644 test/test-suite/groups/flattening/case039.json delete mode 100644 test/test-suite/groups/flattening/case040.json delete mode 100644 test/test-suite/groups/flattening/case041.json delete mode 100644 test/test-suite/groups/function-abs/case000.json delete mode 100644 test/test-suite/groups/function-abs/case001.json delete mode 100644 test/test-suite/groups/function-abs/case002.json delete mode 100644 test/test-suite/groups/function-abs/case003.json delete mode 100644 test/test-suite/groups/function-append/case000.json delete mode 100644 test/test-suite/groups/function-append/case001.json delete mode 100644 test/test-suite/groups/function-append/case002.json delete mode 100644 test/test-suite/groups/function-append/case003.json delete mode 100644 test/test-suite/groups/function-append/case004.json delete mode 100644 test/test-suite/groups/function-applications/case000.json delete mode 100644 test/test-suite/groups/function-applications/case001.json delete mode 100644 test/test-suite/groups/function-applications/case002.json delete mode 100644 test/test-suite/groups/function-applications/case003.json delete mode 100644 test/test-suite/groups/function-applications/case004.json delete mode 100644 test/test-suite/groups/function-applications/case005.json delete mode 100644 test/test-suite/groups/function-applications/case006.json delete mode 100644 test/test-suite/groups/function-applications/case007.json delete mode 100644 test/test-suite/groups/function-applications/case008.json delete mode 100644 test/test-suite/groups/function-applications/case009.json delete mode 100644 test/test-suite/groups/function-applications/case010.json delete mode 100644 test/test-suite/groups/function-applications/case011.json delete mode 100644 test/test-suite/groups/function-applications/case012.json delete mode 100644 test/test-suite/groups/function-applications/case013.json delete mode 100644 test/test-suite/groups/function-applications/case014.json delete mode 100644 test/test-suite/groups/function-applications/case015.json delete mode 100644 test/test-suite/groups/function-applications/case016.json delete mode 100644 test/test-suite/groups/function-applications/case017.json delete mode 100644 test/test-suite/groups/function-applications/case018.json delete mode 100644 test/test-suite/groups/function-applications/case019.json delete mode 100644 test/test-suite/groups/function-applications/case020.json delete mode 100644 test/test-suite/groups/function-applications/case021.json delete mode 100644 test/test-suite/groups/function-average/case000.json delete mode 100644 test/test-suite/groups/function-average/case001.json delete mode 100644 test/test-suite/groups/function-average/case002.json delete mode 100644 test/test-suite/groups/function-average/case003.json delete mode 100644 test/test-suite/groups/function-average/case004.json delete mode 100644 test/test-suite/groups/function-average/case005.json delete mode 100644 test/test-suite/groups/function-average/case006.json delete mode 100644 test/test-suite/groups/function-average/case007.json delete mode 100644 test/test-suite/groups/function-average/case008.json delete mode 100644 test/test-suite/groups/function-average/case009.json delete mode 100644 test/test-suite/groups/function-average/case010.json delete mode 100644 test/test-suite/groups/function-average/case011.json delete mode 100644 test/test-suite/groups/function-average/case012.json delete mode 100644 test/test-suite/groups/function-boolean/case000.json delete mode 100644 test/test-suite/groups/function-boolean/case001.json delete mode 100644 test/test-suite/groups/function-boolean/case002.json delete mode 100644 test/test-suite/groups/function-boolean/case003.json delete mode 100644 test/test-suite/groups/function-boolean/case004.json delete mode 100644 test/test-suite/groups/function-boolean/case005.json delete mode 100644 test/test-suite/groups/function-boolean/case006.json delete mode 100644 test/test-suite/groups/function-boolean/case007.json delete mode 100644 test/test-suite/groups/function-boolean/case008.json delete mode 100644 test/test-suite/groups/function-boolean/case009.json delete mode 100644 test/test-suite/groups/function-boolean/case010.json delete mode 100644 test/test-suite/groups/function-boolean/case011.json delete mode 100644 test/test-suite/groups/function-boolean/case012.json delete mode 100644 test/test-suite/groups/function-boolean/case013.json delete mode 100644 test/test-suite/groups/function-boolean/case014.json delete mode 100644 test/test-suite/groups/function-boolean/case015.json delete mode 100644 test/test-suite/groups/function-boolean/case016.json delete mode 100644 test/test-suite/groups/function-boolean/case017.json delete mode 100644 test/test-suite/groups/function-boolean/case018.json delete mode 100644 test/test-suite/groups/function-boolean/case019.json delete mode 100644 test/test-suite/groups/function-boolean/case020.json delete mode 100644 test/test-suite/groups/function-boolean/case021.json delete mode 100644 test/test-suite/groups/function-boolean/case022.json delete mode 100644 test/test-suite/groups/function-boolean/case023.json delete mode 100644 test/test-suite/groups/function-ceil/case000.json delete mode 100644 test/test-suite/groups/function-ceil/case001.json delete mode 100644 test/test-suite/groups/function-ceil/case002.json delete mode 100644 test/test-suite/groups/function-ceil/case003.json delete mode 100644 test/test-suite/groups/function-clone/case000.json delete mode 100644 test/test-suite/groups/function-clone/case001.json delete mode 100644 test/test-suite/groups/function-clone/case002.json delete mode 100644 test/test-suite/groups/function-contains/case000.json delete mode 100644 test/test-suite/groups/function-contains/case001.json delete mode 100644 test/test-suite/groups/function-contains/case002.json delete mode 100644 test/test-suite/groups/function-contains/case003.json delete mode 100644 test/test-suite/groups/function-contains/case004.json delete mode 100644 test/test-suite/groups/function-contains/case005.json delete mode 100644 test/test-suite/groups/function-contains/case006.json delete mode 100644 test/test-suite/groups/function-count/case000.json delete mode 100644 test/test-suite/groups/function-count/case001.json delete mode 100644 test/test-suite/groups/function-count/case002.json delete mode 100644 test/test-suite/groups/function-count/case003.json delete mode 100644 test/test-suite/groups/function-count/case004.json delete mode 100644 test/test-suite/groups/function-count/case005.json delete mode 100644 test/test-suite/groups/function-count/case006.json delete mode 100644 test/test-suite/groups/function-count/case007.json delete mode 100644 test/test-suite/groups/function-count/case008.json delete mode 100644 test/test-suite/groups/function-count/case009.json delete mode 100644 test/test-suite/groups/function-count/case010.json delete mode 100644 test/test-suite/groups/function-count/case011.json delete mode 100644 test/test-suite/groups/function-count/case012.json delete mode 100644 test/test-suite/groups/function-count/case013.json delete mode 100644 test/test-suite/groups/function-each/case000.json delete mode 100644 test/test-suite/groups/function-each/case001.json delete mode 100644 test/test-suite/groups/function-each/case002.json delete mode 100644 test/test-suite/groups/function-each/case003.json delete mode 100644 test/test-suite/groups/function-each/case004.json delete mode 100644 test/test-suite/groups/function-exists/case000.json delete mode 100644 test/test-suite/groups/function-exists/case001.json delete mode 100644 test/test-suite/groups/function-exists/case002.json delete mode 100644 test/test-suite/groups/function-exists/case003.json delete mode 100644 test/test-suite/groups/function-exists/case004.json delete mode 100644 test/test-suite/groups/function-exists/case005.json delete mode 100644 test/test-suite/groups/function-exists/case006.json delete mode 100644 test/test-suite/groups/function-exists/case007.json delete mode 100644 test/test-suite/groups/function-exists/case008.json delete mode 100644 test/test-suite/groups/function-exists/case009.json delete mode 100644 test/test-suite/groups/function-exists/case010.json delete mode 100644 test/test-suite/groups/function-exists/case011.json delete mode 100644 test/test-suite/groups/function-exists/case012.json delete mode 100644 test/test-suite/groups/function-exists/case013.json delete mode 100644 test/test-suite/groups/function-exists/case014.json delete mode 100644 test/test-suite/groups/function-exists/case015.json delete mode 100644 test/test-suite/groups/function-exists/case016.json delete mode 100644 test/test-suite/groups/function-exists/case017.json delete mode 100644 test/test-suite/groups/function-exists/case018.json delete mode 100644 test/test-suite/groups/function-exists/case019.json delete mode 100644 test/test-suite/groups/function-exists/case020.json delete mode 100644 test/test-suite/groups/function-exists/case021.json delete mode 100644 test/test-suite/groups/function-exists/case022.json delete mode 100644 test/test-suite/groups/function-exists/case023.json delete mode 100644 test/test-suite/groups/function-exists/case024.json delete mode 100644 test/test-suite/groups/function-floor/case000.json delete mode 100644 test/test-suite/groups/function-floor/case001.json delete mode 100644 test/test-suite/groups/function-floor/case002.json delete mode 100644 test/test-suite/groups/function-floor/case003.json delete mode 100644 test/test-suite/groups/function-formatBase/case000.json delete mode 100644 test/test-suite/groups/function-formatBase/case001.json delete mode 100644 test/test-suite/groups/function-formatBase/case002.json delete mode 100644 test/test-suite/groups/function-formatBase/case003.json delete mode 100644 test/test-suite/groups/function-formatBase/case004.json delete mode 100644 test/test-suite/groups/function-formatBase/case005.json delete mode 100644 test/test-suite/groups/function-formatBase/case006.json delete mode 100644 test/test-suite/groups/function-formatBase/case007.json delete mode 100644 test/test-suite/groups/function-formatNumber/case000.json delete mode 100644 test/test-suite/groups/function-formatNumber/case001.json delete mode 100644 test/test-suite/groups/function-formatNumber/case002.json delete mode 100644 test/test-suite/groups/function-formatNumber/case003.json delete mode 100644 test/test-suite/groups/function-formatNumber/case004.json delete mode 100644 test/test-suite/groups/function-formatNumber/case005.json delete mode 100644 test/test-suite/groups/function-formatNumber/case006.json delete mode 100644 test/test-suite/groups/function-formatNumber/case007.json delete mode 100644 test/test-suite/groups/function-formatNumber/case008.json delete mode 100644 test/test-suite/groups/function-formatNumber/case009.json delete mode 100644 test/test-suite/groups/function-formatNumber/case010.json delete mode 100644 test/test-suite/groups/function-formatNumber/case011.json delete mode 100644 test/test-suite/groups/function-formatNumber/case012.json delete mode 100644 test/test-suite/groups/function-formatNumber/case013.json delete mode 100644 test/test-suite/groups/function-formatNumber/case014.json delete mode 100644 test/test-suite/groups/function-formatNumber/case015.json delete mode 100644 test/test-suite/groups/function-formatNumber/case016.json delete mode 100644 test/test-suite/groups/function-formatNumber/case017.json delete mode 100644 test/test-suite/groups/function-formatNumber/case018.json delete mode 100644 test/test-suite/groups/function-formatNumber/case019.json delete mode 100644 test/test-suite/groups/function-formatNumber/case020.json delete mode 100644 test/test-suite/groups/function-formatNumber/case021.json delete mode 100644 test/test-suite/groups/function-formatNumber/case022.json delete mode 100644 test/test-suite/groups/function-formatNumber/case023.json delete mode 100644 test/test-suite/groups/function-formatNumber/case024.json delete mode 100644 test/test-suite/groups/function-formatNumber/case025.json delete mode 100644 test/test-suite/groups/function-formatNumber/case026.json delete mode 100644 test/test-suite/groups/function-formatNumber/case027.json delete mode 100644 test/test-suite/groups/function-formatNumber/case028.json delete mode 100644 test/test-suite/groups/function-formatNumber/case029.json delete mode 100644 test/test-suite/groups/function-formatNumber/case030.json delete mode 100644 test/test-suite/groups/function-formatNumber/case031.json delete mode 100644 test/test-suite/groups/function-formatNumber/case032.json delete mode 100644 test/test-suite/groups/function-fromMillis/case000.json delete mode 100644 test/test-suite/groups/function-fromMillis/case001.json delete mode 100644 test/test-suite/groups/function-fromMillis/case002.json delete mode 100644 test/test-suite/groups/function-join/case000.json delete mode 100644 test/test-suite/groups/function-join/case001.json delete mode 100644 test/test-suite/groups/function-join/case002.json delete mode 100644 test/test-suite/groups/function-join/case003.json delete mode 100644 test/test-suite/groups/function-join/case004.json delete mode 100644 test/test-suite/groups/function-join/case005.json delete mode 100644 test/test-suite/groups/function-join/case006.json delete mode 100644 test/test-suite/groups/function-join/case007.json delete mode 100644 test/test-suite/groups/function-join/case008.json delete mode 100644 test/test-suite/groups/function-join/case009.json delete mode 100644 test/test-suite/groups/function-join/case010.json delete mode 100644 test/test-suite/groups/function-join/case011.json delete mode 100644 test/test-suite/groups/function-keys/case000.json delete mode 100644 test/test-suite/groups/function-keys/case001.json delete mode 100644 test/test-suite/groups/function-keys/case002.json delete mode 100644 test/test-suite/groups/function-keys/case003.json delete mode 100644 test/test-suite/groups/function-keys/case004.json delete mode 100644 test/test-suite/groups/function-keys/case005.json delete mode 100644 test/test-suite/groups/function-keys/case006.json delete mode 100644 test/test-suite/groups/function-length/case000.json delete mode 100644 test/test-suite/groups/function-length/case001.json delete mode 100644 test/test-suite/groups/function-length/case002.json delete mode 100644 test/test-suite/groups/function-length/case003.json delete mode 100644 test/test-suite/groups/function-length/case004.json delete mode 100644 test/test-suite/groups/function-length/case005.json delete mode 100644 test/test-suite/groups/function-length/case006.json delete mode 100644 test/test-suite/groups/function-length/case007.json delete mode 100644 test/test-suite/groups/function-length/case008.json delete mode 100644 test/test-suite/groups/function-length/case009.json delete mode 100644 test/test-suite/groups/function-length/case010.json delete mode 100644 test/test-suite/groups/function-length/case011.json delete mode 100644 test/test-suite/groups/function-length/case012.json delete mode 100644 test/test-suite/groups/function-length/case013.json delete mode 100644 test/test-suite/groups/function-length/case014.json delete mode 100644 test/test-suite/groups/function-length/case015.json delete mode 100644 test/test-suite/groups/function-lookup/case000.json delete mode 100644 test/test-suite/groups/function-lookup/case001.json delete mode 100644 test/test-suite/groups/function-lookup/case002.json delete mode 100644 test/test-suite/groups/function-lookup/case003.json delete mode 100644 test/test-suite/groups/function-lowercase/case000.json delete mode 100644 test/test-suite/groups/function-lowercase/case001.json delete mode 100644 test/test-suite/groups/function-max/case000.json delete mode 100644 test/test-suite/groups/function-max/case001.json delete mode 100644 test/test-suite/groups/function-max/case002.json delete mode 100644 test/test-suite/groups/function-max/case003.json delete mode 100644 test/test-suite/groups/function-max/case004.json delete mode 100644 test/test-suite/groups/function-max/case005.json delete mode 100644 test/test-suite/groups/function-max/case006.json delete mode 100644 test/test-suite/groups/function-max/case007.json delete mode 100644 test/test-suite/groups/function-max/case008.json delete mode 100644 test/test-suite/groups/function-max/case009.json delete mode 100644 test/test-suite/groups/function-max/case010.json delete mode 100644 test/test-suite/groups/function-max/case011.json delete mode 100644 test/test-suite/groups/function-max/case012.json delete mode 100644 test/test-suite/groups/function-max/case013.json delete mode 100644 test/test-suite/groups/function-max/case014.json delete mode 100644 test/test-suite/groups/function-max/case015.json delete mode 100644 test/test-suite/groups/function-max/case016.json delete mode 100644 test/test-suite/groups/function-max/case017.json delete mode 100644 test/test-suite/groups/function-max/case018.json delete mode 100644 test/test-suite/groups/function-max/case019.json delete mode 100644 test/test-suite/groups/function-max/case020.json delete mode 100644 test/test-suite/groups/function-max/case021.json delete mode 100644 test/test-suite/groups/function-max/case022.json delete mode 100644 test/test-suite/groups/function-max/case023.json delete mode 100644 test/test-suite/groups/function-max/case024.json delete mode 100644 test/test-suite/groups/function-max/case025.json delete mode 100644 test/test-suite/groups/function-max/case026.json delete mode 100644 test/test-suite/groups/function-merge/case000.json delete mode 100644 test/test-suite/groups/function-merge/case001.json delete mode 100644 test/test-suite/groups/function-merge/case002.json delete mode 100644 test/test-suite/groups/function-merge/case003.json delete mode 100644 test/test-suite/groups/function-merge/case004.json delete mode 100644 test/test-suite/groups/function-number/case000.json delete mode 100644 test/test-suite/groups/function-number/case001.json delete mode 100644 test/test-suite/groups/function-number/case002.json delete mode 100644 test/test-suite/groups/function-number/case003.json delete mode 100644 test/test-suite/groups/function-number/case004.json delete mode 100644 test/test-suite/groups/function-number/case005.json delete mode 100644 test/test-suite/groups/function-number/case006.json delete mode 100644 test/test-suite/groups/function-number/case007.json delete mode 100644 test/test-suite/groups/function-number/case008.json delete mode 100644 test/test-suite/groups/function-number/case009.json delete mode 100644 test/test-suite/groups/function-number/case010.json delete mode 100644 test/test-suite/groups/function-number/case011.json delete mode 100644 test/test-suite/groups/function-number/case012.json delete mode 100644 test/test-suite/groups/function-number/case013.json delete mode 100644 test/test-suite/groups/function-number/case014.json delete mode 100644 test/test-suite/groups/function-number/case015.json delete mode 100644 test/test-suite/groups/function-number/case016.json delete mode 100644 test/test-suite/groups/function-number/case017.json delete mode 100644 test/test-suite/groups/function-number/case018.json delete mode 100644 test/test-suite/groups/function-number/case019.json delete mode 100644 test/test-suite/groups/function-number/case020.json delete mode 100644 test/test-suite/groups/function-number/case021.json delete mode 100644 test/test-suite/groups/function-number/case022.json delete mode 100644 test/test-suite/groups/function-number/case023.json delete mode 100644 test/test-suite/groups/function-number/case024.json delete mode 100644 test/test-suite/groups/function-number/case025.json delete mode 100644 test/test-suite/groups/function-number/case026.json delete mode 100644 test/test-suite/groups/function-pad/case000.json delete mode 100644 test/test-suite/groups/function-pad/case001.json delete mode 100644 test/test-suite/groups/function-pad/case002.json delete mode 100644 test/test-suite/groups/function-pad/case003.json delete mode 100644 test/test-suite/groups/function-pad/case004.json delete mode 100644 test/test-suite/groups/function-pad/case005.json delete mode 100644 test/test-suite/groups/function-pad/case006.json delete mode 100644 test/test-suite/groups/function-power/case000.json delete mode 100644 test/test-suite/groups/function-power/case001.json delete mode 100644 test/test-suite/groups/function-power/case002.json delete mode 100644 test/test-suite/groups/function-power/case003.json delete mode 100644 test/test-suite/groups/function-power/case004.json delete mode 100644 test/test-suite/groups/function-power/case005.json delete mode 100644 test/test-suite/groups/function-power/case006.json delete mode 100644 test/test-suite/groups/function-replace/case000.json delete mode 100644 test/test-suite/groups/function-replace/case001.json delete mode 100644 test/test-suite/groups/function-replace/case002.json delete mode 100644 test/test-suite/groups/function-replace/case003.json delete mode 100644 test/test-suite/groups/function-replace/case004.json delete mode 100644 test/test-suite/groups/function-replace/case005.json delete mode 100644 test/test-suite/groups/function-replace/case006.json delete mode 100644 test/test-suite/groups/function-replace/case007.json delete mode 100644 test/test-suite/groups/function-replace/case008.json delete mode 100644 test/test-suite/groups/function-replace/case009.json delete mode 100644 test/test-suite/groups/function-replace/case010.json delete mode 100644 test/test-suite/groups/function-replace/case011.json delete mode 100644 test/test-suite/groups/function-round/case000.json delete mode 100644 test/test-suite/groups/function-round/case001.json delete mode 100644 test/test-suite/groups/function-round/case002.json delete mode 100644 test/test-suite/groups/function-round/case003.json delete mode 100644 test/test-suite/groups/function-round/case004.json delete mode 100644 test/test-suite/groups/function-round/case005.json delete mode 100644 test/test-suite/groups/function-round/case006.json delete mode 100644 test/test-suite/groups/function-round/case007.json delete mode 100644 test/test-suite/groups/function-round/case008.json delete mode 100644 test/test-suite/groups/function-round/case009.json delete mode 100644 test/test-suite/groups/function-round/case010.json delete mode 100644 test/test-suite/groups/function-round/case011.json delete mode 100644 test/test-suite/groups/function-round/case012.json delete mode 100644 test/test-suite/groups/function-round/case013.json delete mode 100644 test/test-suite/groups/function-round/case014.json delete mode 100644 test/test-suite/groups/function-round/case015.json delete mode 100644 test/test-suite/groups/function-round/case016.json delete mode 100644 test/test-suite/groups/function-round/case017.json delete mode 100644 test/test-suite/groups/function-shuffle/case000.json delete mode 100644 test/test-suite/groups/function-shuffle/case001.json delete mode 100644 test/test-suite/groups/function-shuffle/case002.json delete mode 100644 test/test-suite/groups/function-shuffle/case003.json delete mode 100644 test/test-suite/groups/function-sift/case000.json delete mode 100644 test/test-suite/groups/function-sift/case001.json delete mode 100644 test/test-suite/groups/function-sift/case002.json delete mode 100644 test/test-suite/groups/function-sift/case003.json delete mode 100644 test/test-suite/groups/function-sift/case004.json delete mode 100644 test/test-suite/groups/function-sift/case005.json delete mode 100644 test/test-suite/groups/function-sift/case006.json delete mode 100644 test/test-suite/groups/function-signatures/case000.json delete mode 100644 test/test-suite/groups/function-signatures/case001.json delete mode 100644 test/test-suite/groups/function-signatures/case002.json delete mode 100644 test/test-suite/groups/function-signatures/case003.json delete mode 100644 test/test-suite/groups/function-signatures/case004.json delete mode 100644 test/test-suite/groups/function-signatures/case005.json delete mode 100644 test/test-suite/groups/function-signatures/case006.json delete mode 100644 test/test-suite/groups/function-signatures/case007.json delete mode 100644 test/test-suite/groups/function-signatures/case008.json delete mode 100644 test/test-suite/groups/function-signatures/case009.json delete mode 100644 test/test-suite/groups/function-signatures/case010.json delete mode 100644 test/test-suite/groups/function-signatures/case011.json delete mode 100644 test/test-suite/groups/function-signatures/case012.json delete mode 100644 test/test-suite/groups/function-signatures/case013.json delete mode 100644 test/test-suite/groups/function-signatures/case014.json delete mode 100644 test/test-suite/groups/function-signatures/case015.json delete mode 100644 test/test-suite/groups/function-signatures/case016.json delete mode 100644 test/test-suite/groups/function-signatures/case017.json delete mode 100644 test/test-suite/groups/function-signatures/case018.json delete mode 100644 test/test-suite/groups/function-signatures/case019.json delete mode 100644 test/test-suite/groups/function-signatures/case020.json delete mode 100644 test/test-suite/groups/function-signatures/case021.json delete mode 100644 test/test-suite/groups/function-signatures/case022.json delete mode 100644 test/test-suite/groups/function-signatures/case023.json delete mode 100644 test/test-suite/groups/function-signatures/case024.json delete mode 100644 test/test-suite/groups/function-signatures/case025.json delete mode 100644 test/test-suite/groups/function-signatures/case026.json delete mode 100644 test/test-suite/groups/function-signatures/case027.json delete mode 100644 test/test-suite/groups/function-signatures/case028.json delete mode 100644 test/test-suite/groups/function-signatures/case029.json delete mode 100644 test/test-suite/groups/function-signatures/case030.json delete mode 100644 test/test-suite/groups/function-signatures/case031.json delete mode 100644 test/test-suite/groups/function-signatures/case032.json delete mode 100644 test/test-suite/groups/function-signatures/case033.json delete mode 100644 test/test-suite/groups/function-signatures/case034.json delete mode 100644 test/test-suite/groups/function-sort/case000.json delete mode 100644 test/test-suite/groups/function-sort/case001.json delete mode 100644 test/test-suite/groups/function-sort/case002.json delete mode 100644 test/test-suite/groups/function-sort/case003.json delete mode 100644 test/test-suite/groups/function-sort/case004.json delete mode 100644 test/test-suite/groups/function-sort/case005.json delete mode 100644 test/test-suite/groups/function-sort/case006.json delete mode 100644 test/test-suite/groups/function-sort/case007.json delete mode 100644 test/test-suite/groups/function-sort/case008.json delete mode 100644 test/test-suite/groups/function-sort/case009.json delete mode 100644 test/test-suite/groups/function-sort/case010.json delete mode 100644 test/test-suite/groups/function-split/case000.json delete mode 100644 test/test-suite/groups/function-split/case001.json delete mode 100644 test/test-suite/groups/function-split/case002.json delete mode 100644 test/test-suite/groups/function-split/case003.json delete mode 100644 test/test-suite/groups/function-split/case004.json delete mode 100644 test/test-suite/groups/function-split/case005.json delete mode 100644 test/test-suite/groups/function-split/case006.json delete mode 100644 test/test-suite/groups/function-split/case007.json delete mode 100644 test/test-suite/groups/function-split/case008.json delete mode 100644 test/test-suite/groups/function-split/case009.json delete mode 100644 test/test-suite/groups/function-split/case010.json delete mode 100644 test/test-suite/groups/function-split/case011.json delete mode 100644 test/test-suite/groups/function-split/case012.json delete mode 100644 test/test-suite/groups/function-split/case013.json delete mode 100644 test/test-suite/groups/function-split/case014.json delete mode 100644 test/test-suite/groups/function-split/case015.json delete mode 100644 test/test-suite/groups/function-split/case016.json delete mode 100644 test/test-suite/groups/function-split/case017.json delete mode 100644 test/test-suite/groups/function-spread/case000.json delete mode 100644 test/test-suite/groups/function-spread/case001.json delete mode 100644 test/test-suite/groups/function-spread/case002.json delete mode 100644 test/test-suite/groups/function-spread/case003.json delete mode 100644 test/test-suite/groups/function-sqrt/case000.json delete mode 100644 test/test-suite/groups/function-sqrt/case001.json delete mode 100644 test/test-suite/groups/function-sqrt/case002.json delete mode 100644 test/test-suite/groups/function-sqrt/case003.json delete mode 100644 test/test-suite/groups/function-string/case000.json delete mode 100644 test/test-suite/groups/function-string/case001.json delete mode 100644 test/test-suite/groups/function-string/case002.json delete mode 100644 test/test-suite/groups/function-string/case003.json delete mode 100644 test/test-suite/groups/function-string/case004.json delete mode 100644 test/test-suite/groups/function-string/case005.json delete mode 100644 test/test-suite/groups/function-string/case006.json delete mode 100644 test/test-suite/groups/function-string/case007.json delete mode 100644 test/test-suite/groups/function-string/case008.json delete mode 100644 test/test-suite/groups/function-string/case009.json delete mode 100644 test/test-suite/groups/function-string/case010.json delete mode 100644 test/test-suite/groups/function-string/case011.json delete mode 100644 test/test-suite/groups/function-string/case012.json delete mode 100644 test/test-suite/groups/function-string/case013.json delete mode 100644 test/test-suite/groups/function-string/case014.json delete mode 100644 test/test-suite/groups/function-string/case015.json delete mode 100644 test/test-suite/groups/function-string/case016.json delete mode 100644 test/test-suite/groups/function-string/case017.json delete mode 100644 test/test-suite/groups/function-string/case018.json delete mode 100644 test/test-suite/groups/function-string/case019.json delete mode 100644 test/test-suite/groups/function-string/case020.json delete mode 100644 test/test-suite/groups/function-string/case021.json delete mode 100644 test/test-suite/groups/function-string/case022.json delete mode 100644 test/test-suite/groups/function-substring/case000.json delete mode 100644 test/test-suite/groups/function-substring/case001.json delete mode 100644 test/test-suite/groups/function-substring/case002.json delete mode 100644 test/test-suite/groups/function-substring/case003.json delete mode 100644 test/test-suite/groups/function-substringAfter/case000.json delete mode 100644 test/test-suite/groups/function-substringAfter/case001.json delete mode 100644 test/test-suite/groups/function-substringAfter/case002.json delete mode 100644 test/test-suite/groups/function-substringAfter/case003.json delete mode 100644 test/test-suite/groups/function-substringAfter/case004.json delete mode 100644 test/test-suite/groups/function-substringBefore/case000.json delete mode 100644 test/test-suite/groups/function-substringBefore/case001.json delete mode 100644 test/test-suite/groups/function-substringBefore/case002.json delete mode 100644 test/test-suite/groups/function-substringBefore/case003.json delete mode 100644 test/test-suite/groups/function-substringBefore/case004.json delete mode 100644 test/test-suite/groups/function-sum/case000.json delete mode 100644 test/test-suite/groups/function-sum/case001.json delete mode 100644 test/test-suite/groups/function-sum/case002.json delete mode 100644 test/test-suite/groups/function-sum/case003.json delete mode 100644 test/test-suite/groups/function-sum/case004.json delete mode 100644 test/test-suite/groups/function-sum/case005.json delete mode 100644 test/test-suite/groups/function-sum/case006.json delete mode 100644 test/test-suite/groups/function-trim/case000.json delete mode 100644 test/test-suite/groups/function-trim/case001.json delete mode 100644 test/test-suite/groups/function-trim/case002.json delete mode 100644 test/test-suite/groups/function-uppercase/case000.json delete mode 100644 test/test-suite/groups/function-uppercase/case001.json delete mode 100644 test/test-suite/groups/function-zip/case000.json delete mode 100644 test/test-suite/groups/function-zip/case001.json delete mode 100644 test/test-suite/groups/function-zip/case002.json delete mode 100644 test/test-suite/groups/function-zip/case003.json delete mode 100644 test/test-suite/groups/function-zip/case004.json delete mode 100644 test/test-suite/groups/function-zip/case005.json delete mode 100644 test/test-suite/groups/higher-order-functions/case000.json delete mode 100644 test/test-suite/groups/higher-order-functions/case001.json delete mode 100644 test/test-suite/groups/higher-order-functions/case002.json delete mode 100644 test/test-suite/groups/hof-filter/case000.json delete mode 100644 test/test-suite/groups/hof-filter/case001.json delete mode 100644 test/test-suite/groups/hof-map/case000.json delete mode 100644 test/test-suite/groups/hof-map/case001.json delete mode 100644 test/test-suite/groups/hof-map/case002.json delete mode 100644 test/test-suite/groups/hof-map/case003.json delete mode 100644 test/test-suite/groups/hof-map/case004.json delete mode 100644 test/test-suite/groups/hof-map/case005.json delete mode 100644 test/test-suite/groups/hof-map/case006.json delete mode 100644 test/test-suite/groups/hof-map/case007.json delete mode 100644 test/test-suite/groups/hof-map/case008.json delete mode 100644 test/test-suite/groups/hof-reduce/case000.json delete mode 100644 test/test-suite/groups/hof-reduce/case001.json delete mode 100644 test/test-suite/groups/hof-reduce/case002.json delete mode 100644 test/test-suite/groups/hof-reduce/case003.json delete mode 100644 test/test-suite/groups/hof-reduce/case004.json delete mode 100644 test/test-suite/groups/hof-reduce/case005.json delete mode 100644 test/test-suite/groups/hof-reduce/case006.json delete mode 100644 test/test-suite/groups/hof-reduce/case007.json delete mode 100644 test/test-suite/groups/hof-reduce/case008.json delete mode 100644 test/test-suite/groups/hof-zip-map/case000.json delete mode 100644 test/test-suite/groups/hof-zip-map/case001.json delete mode 100644 test/test-suite/groups/hof-zip-map/case002.json delete mode 100644 test/test-suite/groups/hof-zip-map/case003.json delete mode 100644 test/test-suite/groups/inclusion-operator/case000.json delete mode 100644 test/test-suite/groups/inclusion-operator/case001.json delete mode 100644 test/test-suite/groups/inclusion-operator/case002.json delete mode 100644 test/test-suite/groups/inclusion-operator/case003.json delete mode 100644 test/test-suite/groups/inclusion-operator/case004.json delete mode 100644 test/test-suite/groups/inclusion-operator/case005.json delete mode 100644 test/test-suite/groups/inclusion-operator/case006.json delete mode 100644 test/test-suite/groups/inclusion-operator/case007.json delete mode 100644 test/test-suite/groups/inclusion-operator/case008.json delete mode 100644 test/test-suite/groups/lambdas/case000.json delete mode 100644 test/test-suite/groups/lambdas/case001.json delete mode 100644 test/test-suite/groups/lambdas/case002.json delete mode 100644 test/test-suite/groups/lambdas/case003.json delete mode 100644 test/test-suite/groups/lambdas/case004.json delete mode 100644 test/test-suite/groups/lambdas/case005.json delete mode 100644 test/test-suite/groups/lambdas/case006.json delete mode 100644 test/test-suite/groups/lambdas/case007.json delete mode 100644 test/test-suite/groups/lambdas/case008.json delete mode 100644 test/test-suite/groups/lambdas/case009.json delete mode 100644 test/test-suite/groups/lambdas/case010.json delete mode 100644 test/test-suite/groups/lambdas/case011.json delete mode 100644 test/test-suite/groups/literals/case000.json delete mode 100644 test/test-suite/groups/literals/case001.json delete mode 100644 test/test-suite/groups/literals/case002.json delete mode 100644 test/test-suite/groups/literals/case003.json delete mode 100644 test/test-suite/groups/literals/case004.json delete mode 100644 test/test-suite/groups/literals/case005.json delete mode 100644 test/test-suite/groups/literals/case006.json delete mode 100644 test/test-suite/groups/literals/case007.json delete mode 100644 test/test-suite/groups/literals/case008.json delete mode 100644 test/test-suite/groups/literals/case009.json delete mode 100644 test/test-suite/groups/literals/case010.json delete mode 100644 test/test-suite/groups/literals/case011.json delete mode 100644 test/test-suite/groups/literals/case012.json delete mode 100644 test/test-suite/groups/literals/case013.json delete mode 100644 test/test-suite/groups/literals/case014.json delete mode 100644 test/test-suite/groups/literals/case015.json delete mode 100644 test/test-suite/groups/literals/case016.json delete mode 100644 test/test-suite/groups/literals/case017.json delete mode 100644 test/test-suite/groups/missing-paths/case000.json delete mode 100644 test/test-suite/groups/missing-paths/case001.json delete mode 100644 test/test-suite/groups/missing-paths/case002.json delete mode 100644 test/test-suite/groups/missing-paths/case003.json delete mode 100644 test/test-suite/groups/missing-paths/case004.json delete mode 100644 test/test-suite/groups/missing-paths/case005.json delete mode 100644 test/test-suite/groups/multiple-array-selectors/case000.json delete mode 100644 test/test-suite/groups/multiple-array-selectors/case001.json delete mode 100644 test/test-suite/groups/multiple-array-selectors/case002.json delete mode 100644 test/test-suite/groups/null/case000.json delete mode 100644 test/test-suite/groups/null/case001.json delete mode 100644 test/test-suite/groups/null/case002.json delete mode 100644 test/test-suite/groups/null/case003.json delete mode 100644 test/test-suite/groups/null/case004.json delete mode 100644 test/test-suite/groups/null/case005.json delete mode 100644 test/test-suite/groups/null/case006.json delete mode 100644 test/test-suite/groups/numeric-operators/case000.json delete mode 100644 test/test-suite/groups/numeric-operators/case001.json delete mode 100644 test/test-suite/groups/numeric-operators/case002.json delete mode 100644 test/test-suite/groups/numeric-operators/case003.json delete mode 100644 test/test-suite/groups/numeric-operators/case004.json delete mode 100644 test/test-suite/groups/numeric-operators/case005.json delete mode 100644 test/test-suite/groups/numeric-operators/case006.json delete mode 100644 test/test-suite/groups/numeric-operators/case007.json delete mode 100644 test/test-suite/groups/numeric-operators/case008.json delete mode 100644 test/test-suite/groups/numeric-operators/case009.json delete mode 100644 test/test-suite/groups/numeric-operators/case010.json delete mode 100644 test/test-suite/groups/numeric-operators/case011.json delete mode 100644 test/test-suite/groups/numeric-operators/case012.json delete mode 100644 test/test-suite/groups/numeric-operators/case013.json delete mode 100644 test/test-suite/groups/numeric-operators/case014.json delete mode 100644 test/test-suite/groups/numeric-operators/case015.json delete mode 100644 test/test-suite/groups/numeric-operators/case016.json delete mode 100644 test/test-suite/groups/object-constructor/case000.json delete mode 100644 test/test-suite/groups/object-constructor/case001.json delete mode 100644 test/test-suite/groups/object-constructor/case002.json delete mode 100644 test/test-suite/groups/object-constructor/case003.json delete mode 100644 test/test-suite/groups/object-constructor/case004.json delete mode 100644 test/test-suite/groups/object-constructor/case005.json delete mode 100644 test/test-suite/groups/object-constructor/case006.json delete mode 100644 test/test-suite/groups/object-constructor/case007.json delete mode 100644 test/test-suite/groups/object-constructor/case008.json delete mode 100644 test/test-suite/groups/object-constructor/case009.json delete mode 100644 test/test-suite/groups/object-constructor/case010.json delete mode 100644 test/test-suite/groups/object-constructor/case011.json delete mode 100644 test/test-suite/groups/object-constructor/case012.json delete mode 100644 test/test-suite/groups/object-constructor/case013.json delete mode 100644 test/test-suite/groups/object-constructor/case014.json delete mode 100644 test/test-suite/groups/object-constructor/case015.json delete mode 100644 test/test-suite/groups/object-constructor/case016.json delete mode 100644 test/test-suite/groups/object-constructor/case017.json delete mode 100644 test/test-suite/groups/object-constructor/case018.json delete mode 100644 test/test-suite/groups/object-constructor/case019.json delete mode 100644 test/test-suite/groups/object-constructor/case020.json delete mode 100644 test/test-suite/groups/object-constructor/case021.json delete mode 100644 test/test-suite/groups/object-constructor/case022.json delete mode 100644 test/test-suite/groups/parentheses/case000.json delete mode 100644 test/test-suite/groups/parentheses/case001.json delete mode 100644 test/test-suite/groups/parentheses/case002.json delete mode 100644 test/test-suite/groups/parentheses/case003.json delete mode 100644 test/test-suite/groups/parentheses/case004.json delete mode 100644 test/test-suite/groups/parentheses/case005.json delete mode 100644 test/test-suite/groups/parentheses/case006.json delete mode 100644 test/test-suite/groups/parentheses/case007.json delete mode 100644 test/test-suite/groups/partial-application/case000.json delete mode 100644 test/test-suite/groups/partial-application/case001.json delete mode 100644 test/test-suite/groups/partial-application/case002.json delete mode 100644 test/test-suite/groups/partial-application/case003.json delete mode 100644 test/test-suite/groups/partial-application/case004.json delete mode 100644 test/test-suite/groups/predicates/case000.json delete mode 100644 test/test-suite/groups/predicates/case001.json delete mode 100644 test/test-suite/groups/predicates/case002.json delete mode 100644 test/test-suite/groups/predicates/case003.json delete mode 100644 test/test-suite/groups/quoted-selectors/case000.json delete mode 100644 test/test-suite/groups/quoted-selectors/case001.json delete mode 100644 test/test-suite/groups/quoted-selectors/case002.json delete mode 100644 test/test-suite/groups/quoted-selectors/case003.json delete mode 100644 test/test-suite/groups/quoted-selectors/case004.json delete mode 100644 test/test-suite/groups/quoted-selectors/case005.json delete mode 100644 test/test-suite/groups/quoted-selectors/case006.json delete mode 100644 test/test-suite/groups/quoted-selectors/case007.json delete mode 100644 test/test-suite/groups/range-operator/case000.json delete mode 100644 test/test-suite/groups/range-operator/case001.json delete mode 100644 test/test-suite/groups/range-operator/case002.json delete mode 100644 test/test-suite/groups/range-operator/case003.json delete mode 100644 test/test-suite/groups/range-operator/case004.json delete mode 100644 test/test-suite/groups/range-operator/case005.json delete mode 100644 test/test-suite/groups/range-operator/case006.json delete mode 100644 test/test-suite/groups/range-operator/case007.json delete mode 100644 test/test-suite/groups/range-operator/case008.json delete mode 100644 test/test-suite/groups/range-operator/case009.json delete mode 100644 test/test-suite/groups/range-operator/case010.json delete mode 100644 test/test-suite/groups/regex/case000.json delete mode 100644 test/test-suite/groups/regex/case001.json delete mode 100644 test/test-suite/groups/regex/case002.json delete mode 100644 test/test-suite/groups/regex/case003.json delete mode 100644 test/test-suite/groups/regex/case004.json delete mode 100644 test/test-suite/groups/regex/case005.json delete mode 100644 test/test-suite/groups/regex/case006.json delete mode 100644 test/test-suite/groups/regex/case007.json delete mode 100644 test/test-suite/groups/regex/case008.json delete mode 100644 test/test-suite/groups/regex/case009.json delete mode 100644 test/test-suite/groups/regex/case010.json delete mode 100644 test/test-suite/groups/regex/case011.json delete mode 100644 test/test-suite/groups/regex/case012.json delete mode 100644 test/test-suite/groups/regex/case013.json delete mode 100644 test/test-suite/groups/regex/case014.json delete mode 100644 test/test-suite/groups/regex/case015.json delete mode 100644 test/test-suite/groups/regex/case016.json delete mode 100644 test/test-suite/groups/regex/case017.json delete mode 100644 test/test-suite/groups/regex/case018.json delete mode 100644 test/test-suite/groups/regex/case019.json delete mode 100644 test/test-suite/groups/regex/case020.json delete mode 100644 test/test-suite/groups/regex/case021.json delete mode 100644 test/test-suite/groups/regex/case022.json delete mode 100644 test/test-suite/groups/regex/case023.json delete mode 100644 test/test-suite/groups/regex/case024.json delete mode 100644 test/test-suite/groups/regex/case025.json delete mode 100644 test/test-suite/groups/regex/case026.json delete mode 100644 test/test-suite/groups/regex/case027.json delete mode 100644 test/test-suite/groups/regex/case028.json delete mode 100644 test/test-suite/groups/regex/case029.json delete mode 100644 test/test-suite/groups/regex/case030.json delete mode 100644 test/test-suite/groups/regex/case031.json delete mode 100644 test/test-suite/groups/regex/case032.json delete mode 100644 test/test-suite/groups/regex/case033.json delete mode 100644 test/test-suite/groups/regex/case034.json delete mode 100644 test/test-suite/groups/regex/case035.json delete mode 100644 test/test-suite/groups/regex/case036.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case000.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case001.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case002.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case003.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case004.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case005.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case006.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case007.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case008.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case009.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case010.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case011.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case012.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case013.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case014.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case015.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case016.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case017.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case018.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case019.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case020.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case021.json delete mode 100644 test/test-suite/groups/simple-array-selectors/case022.json delete mode 100644 test/test-suite/groups/sorting/case000.json delete mode 100644 test/test-suite/groups/sorting/case001.json delete mode 100644 test/test-suite/groups/sorting/case002.json delete mode 100644 test/test-suite/groups/sorting/case003.json delete mode 100644 test/test-suite/groups/sorting/case004.json delete mode 100644 test/test-suite/groups/sorting/case005.json delete mode 100644 test/test-suite/groups/sorting/case006.json delete mode 100644 test/test-suite/groups/sorting/case007.json delete mode 100644 test/test-suite/groups/sorting/case008.json delete mode 100644 test/test-suite/groups/sorting/case009.json delete mode 100644 test/test-suite/groups/sorting/case010.json delete mode 100644 test/test-suite/groups/sorting/case011.json delete mode 100644 test/test-suite/groups/sorting/case012.json delete mode 100644 test/test-suite/groups/sorting/case013.json delete mode 100644 test/test-suite/groups/string-concat/case000.json delete mode 100644 test/test-suite/groups/string-concat/case001.json delete mode 100644 test/test-suite/groups/string-concat/case002.json delete mode 100644 test/test-suite/groups/string-concat/case003.json delete mode 100644 test/test-suite/groups/string-concat/case004.json delete mode 100644 test/test-suite/groups/string-concat/case005.json delete mode 100644 test/test-suite/groups/string-concat/case006.json delete mode 100644 test/test-suite/groups/string-concat/case007.json delete mode 100644 test/test-suite/groups/string-concat/case008.json delete mode 100644 test/test-suite/groups/string-concat/case009.json delete mode 100644 test/test-suite/groups/string-concat/case010.json delete mode 100644 test/test-suite/groups/string-concat/case011.json delete mode 100644 test/test-suite/groups/tail-recursion/case000.json delete mode 100644 test/test-suite/groups/tail-recursion/case001.json delete mode 100644 test/test-suite/groups/tail-recursion/case002.json delete mode 100644 test/test-suite/groups/tail-recursion/case003.json delete mode 100644 test/test-suite/groups/tail-recursion/case004.json delete mode 100644 test/test-suite/groups/tail-recursion/case005.json delete mode 100644 test/test-suite/groups/tail-recursion/case006.json delete mode 100644 test/test-suite/groups/tail-recursion/case007.json delete mode 100644 test/test-suite/groups/transform/case000.json delete mode 100644 test/test-suite/groups/transform/case001.json delete mode 100644 test/test-suite/groups/transform/case002.json delete mode 100644 test/test-suite/groups/transform/case003.json delete mode 100644 test/test-suite/groups/transform/case004.json delete mode 100644 test/test-suite/groups/transform/case005.json delete mode 100644 test/test-suite/groups/transform/case006.json delete mode 100644 test/test-suite/groups/transform/case007.json delete mode 100644 test/test-suite/groups/transform/case008.json delete mode 100644 test/test-suite/groups/transform/case009.json delete mode 100644 test/test-suite/groups/transform/case010.json delete mode 100644 test/test-suite/groups/transform/case011.json delete mode 100644 test/test-suite/groups/transform/case012.json delete mode 100644 test/test-suite/groups/transform/case013.json delete mode 100644 test/test-suite/groups/transform/case014.json delete mode 100644 test/test-suite/groups/transform/case015.json delete mode 100644 test/test-suite/groups/transform/case016.json delete mode 100644 test/test-suite/groups/transform/case017.json delete mode 100644 test/test-suite/groups/transform/case018.json delete mode 100644 test/test-suite/groups/transform/case019.json delete mode 100644 test/test-suite/groups/transform/case020.json delete mode 100644 test/test-suite/groups/transform/case021.json delete mode 100644 test/test-suite/groups/transform/case022.json delete mode 100644 test/test-suite/groups/transform/case023.json delete mode 100644 test/test-suite/groups/transform/case024.json delete mode 100644 test/test-suite/groups/transform/case025.json delete mode 100644 test/test-suite/groups/transform/case026.json delete mode 100644 test/test-suite/groups/transform/case027.json delete mode 100644 test/test-suite/groups/transform/case028.json delete mode 100644 test/test-suite/groups/transform/case029.json delete mode 100644 test/test-suite/groups/transform/case030.json delete mode 100644 test/test-suite/groups/transform/case031.json delete mode 100644 test/test-suite/groups/transform/case032.json delete mode 100644 test/test-suite/groups/transform/case033.json delete mode 100644 test/test-suite/groups/transform/case034.json delete mode 100644 test/test-suite/groups/transform/case035.json delete mode 100644 test/test-suite/groups/transform/case036.json delete mode 100644 test/test-suite/groups/transform/case037.json delete mode 100644 test/test-suite/groups/transform/case038.json delete mode 100644 test/test-suite/groups/transform/case039.json delete mode 100644 test/test-suite/groups/transform/case040.json delete mode 100644 test/test-suite/groups/transform/case041.json delete mode 100644 test/test-suite/groups/transform/case042.json delete mode 100644 test/test-suite/groups/transform/case043.json delete mode 100644 test/test-suite/groups/transform/case044.json delete mode 100644 test/test-suite/groups/transform/case045.json delete mode 100644 test/test-suite/groups/transform/case046.json delete mode 100644 test/test-suite/groups/transform/case047.json delete mode 100644 test/test-suite/groups/transform/case048.json delete mode 100644 test/test-suite/groups/transform/case049.json delete mode 100644 test/test-suite/groups/transform/case050.json delete mode 100644 test/test-suite/groups/transform/case051.json delete mode 100644 test/test-suite/groups/transform/case052.json delete mode 100644 test/test-suite/groups/transform/case053.json delete mode 100644 test/test-suite/groups/transform/case054.json delete mode 100644 test/test-suite/groups/transform/case055.json delete mode 100644 test/test-suite/groups/transform/case056.json delete mode 100644 test/test-suite/groups/transform/case057.json delete mode 100644 test/test-suite/groups/transform/case058.json delete mode 100644 test/test-suite/groups/transform/case059.json delete mode 100644 test/test-suite/groups/transform/case060.json delete mode 100644 test/test-suite/groups/transform/case061.json delete mode 100644 test/test-suite/groups/transform/case062.json delete mode 100644 test/test-suite/groups/transform/case063.json delete mode 100644 test/test-suite/groups/transform/case064.json delete mode 100644 test/test-suite/groups/transform/case065.json delete mode 100644 test/test-suite/groups/transform/case066.json delete mode 100644 test/test-suite/groups/transform/case067.json delete mode 100644 test/test-suite/groups/transform/case068.json delete mode 100644 test/test-suite/groups/transform/case069.json delete mode 100644 test/test-suite/groups/transform/case070.json delete mode 100644 test/test-suite/groups/transform/case071.json delete mode 100644 test/test-suite/groups/transform/case072.json delete mode 100644 test/test-suite/groups/transform/case073.json delete mode 100644 test/test-suite/groups/transform/case074.json delete mode 100644 test/test-suite/groups/transform/case075.json delete mode 100644 test/test-suite/groups/transform/case076.json delete mode 100644 test/test-suite/groups/transform/case077.json delete mode 100644 test/test-suite/groups/transform/case078.json delete mode 100644 test/test-suite/groups/transform/case079.json delete mode 100644 test/test-suite/groups/transform/case080.json delete mode 100644 test/test-suite/groups/transform/case081.json delete mode 100644 test/test-suite/groups/transform/case082.json delete mode 100644 test/test-suite/groups/transform/case083.json delete mode 100644 test/test-suite/groups/transform/case084.json delete mode 100644 test/test-suite/groups/transform/case085.json delete mode 100644 test/test-suite/groups/transform/case086.json delete mode 100644 test/test-suite/groups/transform/case087.json delete mode 100644 test/test-suite/groups/transform/case088.json delete mode 100644 test/test-suite/groups/transform/case089.json delete mode 100644 test/test-suite/groups/transform/case090.json delete mode 100644 test/test-suite/groups/transform/case091.json delete mode 100644 test/test-suite/groups/transform/case092.json delete mode 100644 test/test-suite/groups/transform/case093.json delete mode 100644 test/test-suite/groups/transform/case094.json delete mode 100644 test/test-suite/groups/transform/case095.json delete mode 100644 test/test-suite/groups/transform/case096.json delete mode 100644 test/test-suite/groups/transform/case097.json delete mode 100644 test/test-suite/groups/transform/case098.json delete mode 100644 test/test-suite/groups/transform/case099.json delete mode 100644 test/test-suite/groups/transform/case100.json delete mode 100644 test/test-suite/groups/transform/case101.json delete mode 100644 test/test-suite/groups/transform/case102.json delete mode 100644 test/test-suite/groups/transform/case103.json delete mode 100644 test/test-suite/groups/transforms/case000.json delete mode 100644 test/test-suite/groups/transforms/case001.json delete mode 100644 test/test-suite/groups/transforms/case002.json delete mode 100644 test/test-suite/groups/transforms/case003.json delete mode 100644 test/test-suite/groups/transforms/case004.json delete mode 100644 test/test-suite/groups/transforms/case005.json delete mode 100644 test/test-suite/groups/transforms/case006.json delete mode 100644 test/test-suite/groups/transforms/case007.json delete mode 100644 test/test-suite/groups/transforms/case008.json delete mode 100644 test/test-suite/groups/transforms/case009.json delete mode 100644 test/test-suite/groups/transforms/case010.json delete mode 100644 test/test-suite/groups/transforms/case011.json delete mode 100644 test/test-suite/groups/transforms/case012.json delete mode 100644 test/test-suite/groups/variables/case000.json delete mode 100644 test/test-suite/groups/variables/case001.json delete mode 100644 test/test-suite/groups/variables/case002.json delete mode 100644 test/test-suite/groups/variables/case003.json delete mode 100644 test/test-suite/groups/variables/case004.json delete mode 100644 test/test-suite/groups/variables/case005.json delete mode 100644 test/test-suite/groups/variables/case006.json delete mode 100644 test/test-suite/groups/variables/case007.json delete mode 100644 test/test-suite/groups/variables/case008.json delete mode 100644 test/test-suite/groups/variables/case009.json delete mode 100644 test/test-suite/groups/variables/case010.json delete mode 100644 test/test-suite/groups/variables/case011.json delete mode 100644 test/test-suite/groups/wildcards/case000.json delete mode 100644 test/test-suite/groups/wildcards/case001.json delete mode 100644 test/test-suite/groups/wildcards/case002.json delete mode 100644 test/test-suite/groups/wildcards/case003.json delete mode 100644 test/test-suite/groups/wildcards/case004.json delete mode 100644 test/test-suite/groups/wildcards/case005.json delete mode 100644 test/test-suite/groups/wildcards/case006.json delete mode 100644 test/test-suite/groups/wildcards/case007.json delete mode 100644 test/test-suite/groups/wildcards/case008.json delete mode 100644 test/test-suite/groups/wildcards/case009.json 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/async-function.js b/test/async-function.js deleted file mode 100644 index abd7dde6..00000000 --- a/test/async-function.js +++ /dev/null @@ -1,162 +0,0 @@ -"use strict"; - -var jsonata = require('../lib/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) { - return new Promise(function(resolve, reject) { - expr.evaluate(data, bindings, function(error, response) { - if(error) reject(error); - resolve(response); - }); - }); -}; - -var httpget = function(url) { - return new Promise(function(resolve, reject) { - request(url, function(error, response, body) { - if(error) { - reject(error); - return; - } - resolve(JSON.parse(body)); - }); - }); -}; - -describe('Invoke JSONata with callback', function() { - describe('Make HTTP request', function() { - it('should return promise to results', function() { - 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({ - '2016-09': 205, - '2016-10': 1266, - '2016-11': 2783, - '2016-12': 2158, - '2017-01': 22977, - '2017-02': 37728, - '2017-03': 46460 }); - }); - - }); -}); - -describe('Invoke JSONata with callback - errors', function() { - describe('type error', function() { - it('should throw', function() { - 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});; - }); - - }); - - describe('Make HTTP request with dodgy url', function() { - it('should throw', function() { - 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});; - }); - }); -}); - -describe('Invoke JSONata with callback - return values', function() { - it('should handle an undefined value', function() { - var data = { value: undefined }; - var expr = jsonata('value'); - return expect(jsonataPromise(expr, data)).to.eventually.equal(undefined); - }); - it('should handle a null value', function() { - var data = { value: null }; - var expr = jsonata('value'); - return expect(jsonataPromise(expr, data)).to.eventually.equal(null); - }); - it('should handle a value', function() { - var data = { value: 'hello' }; - var expr = jsonata('value'); - return expect(jsonataPromise(expr, data)).to.eventually.equal('hello'); - }); - it('should handle a promise', function() { - var data = { value: Promise.resolve('hello') }; - var expr = jsonata('value'); - return expect(jsonataPromise(expr, data)).to.eventually.equal('hello'); - }); -}); - -describe('Handle chained functions that end in promises', function() { - - var counter = function(count) { - return { - inc: function() { - return counter(count + 1); - }, - then: function(onFulfilled) { - setImmediate(function(){ - onFulfilled(count); - }); - return Promise.resolve(count); - } - }; - }; - - var bindings = { - counter: counter - }; - - it('basic function that returns a thenable', function() { - var data = {}; - var expr = jsonata('$counter(5)'); - return expect(jsonataPromise(expr, data, bindings)).to.eventually.equal(5); - }); - - it('basic function that returns a thenable, but invokes another function', function() { - var data = {}; - var expr = jsonata('$counter(0).inc()'); - return expect(jsonataPromise(expr, data, bindings)).to.eventually.equal(1); - }); - - it('basic function that returns a thenable, but invokes another function several times', function() { - var data = {}; - var expr = jsonata('$counter(0).inc().inc().inc().inc()'); - return expect(jsonataPromise(expr, data, bindings)).to.eventually.equal(4); - }); - - it('basic function that returns a thenable and part of a numeric expression', function() { - var data = {}; - var expr = jsonata('$counter(3) + 5'); - return expect(jsonataPromise(expr, data, bindings)).to.eventually.equal(8); - }); - - it('basic function that returns a thenable, but invokes another function several times and part of a numeric expression', function() { - var data = {}; - var expr = jsonata('$counter(0).inc().inc().inc().inc() + 3'); - return expect(jsonataPromise(expr, data, bindings)).to.eventually.equal(7); - }); - - it('basic function that returns a thenable, but invokes another function - nested', function() { - var data = {}; - var expr = jsonata('$counter($counter(3).inc().inc()).inc()'); - return expect(jsonataPromise(expr, data, bindings)).to.eventually.equal(6); - }); - - it('basic function that returns a thenable, then invokes a built-in function', function() { - var data = {}; - var expr = jsonata('$counter(3).inc().$string()'); - return expect(jsonataPromise(expr, data, bindings)).to.eventually.equal('4'); - }); - - it('basic function that returns a thenable, but invokes a non-existent function', function() { - var data = {}; - var expr = jsonata('$counter(2).inc().foo()'); - return expect(jsonataPromise(expr, data, bindings)).to.be.rejected; - }); - -}); \ No newline at end of file diff --git a/test/implementation-tests.js b/test/implementation-tests.js deleted file mode 100644 index 6a6a4247..00000000 --- a/test/implementation-tests.js +++ /dev/null @@ -1,564 +0,0 @@ -/** - * © Copyright IBM Corp. 2016 All Rights Reserved - * Project name: JSONata - * This project is licensed under the MIT License, see LICENSE - * - * The files in this directory are tests that aren't really portable - * to other implementations for various reasons but they are included - * in order to achieve 100% coverage for this implementation. - */ - -"use strict"; - -var jsonata = require('../lib/src').jsonata; -var timeboxExpression = require('../lib/src/utils').timeboxExpression; - -var chai = require("chai"); -var expect = chai.expect; - -var testdata2 = { - Account: { - "Account Name": "Firefly", - Order: [ - { - OrderID: "order103", - Product: [ - { - "Product Name": "Bowler Hat", - ProductID: 858383, - SKU: "0406654608", - Description: { - Colour: "Purple", - Width: 300, - Height: 200, - Depth: 210, - Weight: 0.75 - }, - Price: 34.45, - Quantity: 2 - }, - { - "Product Name": "Trilby hat", - ProductID: 858236, - SKU: "0406634348", - Description: { - Colour: "Orange", - Width: 300, - Height: 200, - Depth: 210, - Weight: 0.6 - }, - Price: 21.67, - Quantity: 1 - } - ] - }, - { - OrderID: "order104", - Product: [ - { - "Product Name": "Bowler Hat", - ProductID: 858383, - SKU: "040657863", - Description: { - Colour: "Purple", - Width: 300, - Height: 200, - Depth: 210, - Weight: 0.75 - }, - Price: 34.45, - Quantity: 4 - }, - { - ProductID: 345664, - SKU: "0406654603", - "Product Name": "Cloak", - Description: { - Colour: "Black", - Width: 30, - Height: 20, - Depth: 210, - Weight: 2.0 - }, - Price: 107.99, - Quantity: 1 - } - ] - } - ] - } -}; - -describe("Functions with side-effects", () => { - describe("Evaluator - function: millis", function() { - describe("$millis() returns milliseconds since the epoch", function() { - it("should return result object", function() { - var expr = jsonata("$millis()"); - 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); - }); - }); - - describe("$millis() always returns same value within an expression", function() { - it("should return result object", function() { - 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); - }); - }); - - describe("$millis() returns different timestamp for subsequent evaluate() calls", function() { - it("should return result object", function() { - var expr = jsonata("($sum([1..10000]); $millis())"); - var result = expr.evaluate(testdata2); - var result2 = expr.evaluate(testdata2); - expect(result).to.not.equal(result2); - }); - }); - }); - - describe("$now() returns timestamp", function() { - it("should return result object", function() { - 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$/); - // 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); - }); - }); - - describe("$now() always returns same value within an expression", function() { - it("should return result object", function() { - 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); - }); - }); - - describe("$now() returns different timestamp for subsequent evaluate() calls", function() { - it("should return result object", function() { - var expr = jsonata("($sum([1..10000]); $now())"); - var result = expr.evaluate(testdata2); - var result2 = expr.evaluate(testdata2); - expect(result).to.not.equal(result2); - }); - }); - - describe("$millis() returns milliseconds since the epoch", function() { - it("should return result object", function() { - var expr = jsonata("$millis()"); - 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); - }); - }); - - describe("Evaluator - functions: random", function() { - describe('random number")', function() { - it("should return result object", function() { - var expr = jsonata("$random()"); - var result = expr.evaluate(); - var expected = result >= 0 && result < 1; - expect(true).to.deep.equal(expected); - }); - }); - - describe('consequetive random numbers should be different")', function() { - it("should return result object", function() { - var expr = jsonata("$random() = $random()"); - var result = expr.evaluate(); - var expected = false; - expect(result).to.deep.equal(expected); - }); - }); - }); -}); - -describe("Tests that bind Javascript functions", () => { - describe("transform expression with overridden $clone function", function() { - it("should return result object", function() { - var expr = jsonata('Account ~> |Order|{"Product":"blah"},nomatch|'); - var count = 0; - expr.registerFunction("clone", function(arg) { - count++; - return JSON.parse(JSON.stringify(arg)); - }); - var result = expr.evaluate(testdata2); - var expected = { - "Account Name": "Firefly", - Order: [ - { - OrderID: "order103", - Product: "blah" - }, - { - OrderID: "order104", - Product: "blah" - } - ] - }; - expect(result).to.deep.equal(expected); - expect(count).to.equal(1); - }); - }); - - // These involve binding of functions - describe("Override implementation of $now()", function() { - it("should return result object", function() { - var expr = jsonata("$now()"); - expr.registerFunction("now", function() { - return "time for tea"; - }); - var result = expr.evaluate(testdata2); - expect(result).to.equal("time for tea"); - }); - }); - - describe("map a user-defined Javascript function with signature", function() { - it("should return result object", function() { - var expr = jsonata("$map([1,4,9,16], $squareroot)"); - expr.registerFunction( - "squareroot", - function(num) { - return Math.sqrt(num); - }, - "" - ); - var result = expr.evaluate(testdata2); - var expected = [1, 2, 3, 4]; - expect(result).to.deep.equal(expected); - }); - }); - describe("map a user-defined Javascript function with undefined signature", function() { - it("should return result object", function() { - var expr = jsonata("$map([1,4,9,16], $squareroot)"); - expr.registerFunction("squareroot", function(num) { - return Math.sqrt(num); - }); - var result = expr.evaluate(testdata2); - var expected = [1, 2, 3, 4]; - expect(result).to.deep.equal(expected); - }); - }); - - describe("map a user-defined Javascript function", function() { - it("should return result object", function() { - var expr = jsonata("$map([1,4,9,16], $squareroot)"); - expr.assign("squareroot", function(num) { - return Math.sqrt(num); - }); - var result = expr.evaluate(testdata2); - var expected = [1, 2, 3, 4]; - expect(result).to.deep.equal(expected); - }); - }); - describe("Partially apply user-defined Javascript function", function() { - it("should return result object", function() { - var expr = jsonata( - "(" + - " $firstn := $substr(?, 0, ?);" + - " $first5 := $firstn(?, 5);" + - ' $first5("Hello World")' + - ")" - ); - expr.assign("substr", function(str, start, len) { - return str.substr(start, len); - }); - var result = expr.evaluate(testdata2); - var expected = "Hello"; - expect(result).to.deep.equal(expected); - }); - }); -}); - -describe("Tests that are specific to a Javascript runtime", () => { - // Javascript specific - describe('/ab/ ("ab")', function() { - it("should return result object", function() { - 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)); - }); - }); - - describe("/ab/ ()", function() { - it("should return result object", function() { - var expr = jsonata("/ab/ ()"); - var result = expr.evaluate(); - var expected = undefined; - expect(JSON.stringify(result)).to.equal(JSON.stringify(expected)); - }); - }); - - describe('/ab+/ ("ababbabbcc")', function() { - it("should return result object", function() { - 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)); - }); - }); - - describe('/a(b+)/ ("ababbabbcc")', function() { - it("should return result object", function() { - 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)); - }); - }); - - describe('/a(b+)/ ("ababbabbcc").next()', function() { - it("should return result object", function() { - 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)); - }); - }); - - describe('/a(b+)/ ("ababbabbcc").next().next()', function() { - it("should return result object", function() { - 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)); - }); - }); - - describe('/a(b+)/ ("ababbabbcc").next().next().next()', function() { - it("should return result object", function() { - 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)); - }); - }); - - describe('/a(b+)/i ("Ababbabbcc")', function() { - it("should return result object", function() { - 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)); - }); - }); - - describe("empty regex", function() { - it("should throw error", function() { - expect(function() { - var expr = jsonata("//"); - expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ position: 1, code: "S0301" }); - }); - }); - - describe("empty regex", function() { - it("should throw error", function() { - expect(function() { - var expr = jsonata("/"); - expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ position: 1, code: "S0302" }); - }); - }); - - describe("Functions - $match", function() { - describe('$match("ababbabbcc",/ab/)', function() { - it("should return result object", function() { - var expr = jsonata('$match("ababbabbcc",/ab/)'); - var result = expr.evaluate(); - var expected = [ - { match: "ab", index: 0, groups: [] }, - { - match: "ab", - index: 2, - groups: [] - }, - { match: "ab", index: 5, groups: [] } - ]; - expect(result).to.deep.equal(expected); - }); - }); - - describe('$match("ababbabbcc",/a(b+)/)', function() { - it("should return result object", function() { - var expr = jsonata('$match("ababbabbcc",/a(b+)/)'); - var result = expr.evaluate(); - var expected = [ - { match: "ab", index: 0, groups: ["b"] }, - { - match: "abb", - index: 2, - groups: ["bb"] - }, - { match: "abb", index: 5, groups: ["bb"] } - ]; - expect(result).to.deep.equal(expected); - }); - }); - - describe('$match("ababbabbcc",/a(b+)/, 1)', function() { - it("should return result object", function() { - 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); - }); - }); - - describe('$match("ababbabbcc",/a(b+)/, 0)', function() { - it("should return result object", function() { - var expr = jsonata('$match("ababbabbcc",/a(b+)/, 0)'); - var result = expr.evaluate(); - var expected = undefined; - expect(result).to.deep.equal(expected); - }); - }); - - describe("$match(nothing,/a(xb+)/)", function() { - it("should return result object", function() { - var expr = jsonata("$match(nothing,/a(xb+)/)"); - var result = expr.evaluate(); - var expected = undefined; - expect(result).to.deep.equal(expected); - }); - }); - - describe('$match("ababbabbcc",/a(xb+)/)', function() { - it("should return result object", function() { - var expr = jsonata('$match("ababbabbcc",/a(xb+)/)'); - var result = expr.evaluate(); - var expected = undefined; - expect(result).to.deep.equal(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() { - expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ 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() { - expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ 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() { - expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ 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() { - expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ 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() { - expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ 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() { - expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ 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() { - expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ position: 7, code: "T0410", token: "match", index: 1 }); - }); - }); - }); -}); - -describe("Test that yield platform specific results", () => { - // Platform specific - describe("$sqrt(10) * $sqrt(10)", function() { - it("should return result object", function() { - var expr = jsonata("$sqrt(10) * $sqrt(10)"); - var result = expr.evaluate(); - var expected = 10; - expect(result).to.be.closeTo(expected, 1e-13); - }); - }); -}); - -describe("Tests that include infinite recursion", () => { - describe("stack overflow - infinite recursive function - non-tail call", function() { - it("should throw error", function() { - expect(function() { - 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" }); - }); - }); - - describe("stack overflow - infinite recursive function - tail call", function() { - this.timeout(5000); - it("should throw error", function() { - expect(function() { - var expr = jsonata("(" + " $inf := function(){$inf()};" + " $inf()" + ")"); - timeboxExpression(expr, 1000, 500); - expr.evaluate(); - }) - .to.throw() - .to.deep.contain({ position: 37, code: "U1001" }); - }); - }); -}); diff --git a/test/parser-recovery.js b/test/parser-recovery.js deleted file mode 100644 index db28ed70..00000000 --- a/test/parser-recovery.js +++ /dev/null @@ -1,448 +0,0 @@ -"use strict"; - -var jsonata = require('../lib/src').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/test/run-test-suite.js b/test/run-test-suite.js deleted file mode 100644 index ff913f8b..00000000 --- a/test/run-test-suite.js +++ /dev/null @@ -1,183 +0,0 @@ -/** - * © Copyright IBM Corp. 2016 All Rights Reserved - * Project name: JSONata - * This project is licensed under the MIT License, see LICENSE - */ - -"use strict"; - -var fs = require("fs"); -var path = require("path"); -var jsonata = require('../lib/src').jsonata; -var chai = require("chai"); -var expect = chai.expect; - -let groups = fs.readdirSync(path.join(__dirname, "test-suite", "groups")).filter((name) => !name.endsWith(".json")); - -/** - * Simple function to read in JSON - * @param {string} dir - Directory containing JSON file - * @param {string} file - Name of JSON file (relative to directory) - * @returns {Object} Parsed JSON object - */ -function readJSON(dir, file) { - try { - return JSON.parse(fs.readFileSync(path.join(__dirname, dir, file)).toString()); - } catch(e) { - throw new Error("Error reading "+file+" in "+dir+": "+e.message); - } -} - -let datasets = {}; -let datasetnames = fs.readdirSync(path.join(__dirname, "test-suite", "datasets")); - -datasetnames.forEach((name) => { - datasets[name.replace(".json", "")] = readJSON(path.join("test-suite", "datasets"), name); -}); - -// This is the start of the set of tests associated with the test cases -// found in the test-suite directory. -describe("JSONata Test Suite", () => { - // Iterate over all groups of tests - groups.forEach(group => { - let casenames = fs.readdirSync(path.join(__dirname, "test-suite", "groups", group)); - // Read JSON file containing all cases for this group - let cases = casenames.map((name) => readJSON(path.join("test-suite", "groups", group), name)); - describe("Group: " + group, () => { - // Iterate over all cases - for (let i = 0; i < cases.length; i++) { - // Extract the current test case of interest - let testcase = cases[i]; - - // Create a test based on the data in this testcase - it(casenames[i]+": "+testcase.expr, function() { - var expr; - // Start by trying to compile the expression associated with this test case - try { - expr = jsonata(testcase.expr); - // 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); - timeboxExpression(expr, testcase.timelimit, testcase.depth); - } - } catch (e) { - // If we get here, an error was thrown. So check to see if this particular - // testcase expects an exception (as indicated by the presence of the - // `code` field in the testcase) - if (testcase.code) { - // See if we go the code we expected - expect(e.code).to.equal(testcase.code); - // If a token was specified, check for that too - if (testcase.hasOwnProperty("token")) { - expect(e.token).to.equal(testcase.token); - } - } else { - // If we get here, something went wrong because an exception - // was thrown when we didn't expect one to be thrown. - throw new Error("Got an unexpected exception: " + e.message); - } - } - // If we managed to compile the expression... - if (expr) { - // Load the input data set. First, check to see if the test case defines its own input - // data (testcase.data). If not, then look for a dataset number. If it is -1, then that - // means there is no data (so use undefined). If there is a dataset number, look up the - // input data in the datasets array. - let dataset = resolveDataset(datasets, testcase); - - // Test cases have three possible outcomes from evaluation... - if ("undefinedResult" in testcase) { - // 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); - } 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); - } 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 }); - } else { - // If we get here, it means there is something wrong with - // the test case data because there was nothing to check. - throw new Error("Nothing to test in this test case"); - } - } - }); - } - }); - }); -}); - -/** - * 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). - * - * @param {Object} datasets Object mapping dataset names to JS values - * @param {Object} testcase Testcase data read from testcase file - * @returns {any} The input data to use when evaluating the jsonata expression - */ -function resolveDataset(datasets, testcase) { - if ("data" in testcase) { - return testcase.data; - } - if (testcase.dataset===null) { - return undefined; - } - if (datasets.hasOwnProperty(testcase.dataset)) { - 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 diff --git a/test/test-suite/TESTSUITE.md b/test/test-suite/TESTSUITE.md deleted file mode 100644 index 62f33637..00000000 --- a/test/test-suite/TESTSUITE.md +++ /dev/null @@ -1,39 +0,0 @@ -# Jsonata Test Suite - -The data contained in this directory is an attempt at a language neutral -test suite for `jsonata`. The original test suite (written in Javascript) -was transformed into a series of JSON files. - -## `datasets` directory - -The `datasets` directory contains a set of JSON files. Each file represents -potential input data to a `jsonata` test. The point of putting this input in -named files is so that it can be re-used (rather than repeated) by different -test cases. - -## `groups//case###.json` - -Each `` directory is a bundle of test cases related to a given -topic. Inside each of those directories are JSON files that represent -individual test cases. Each JSON file contains a test case and each test -case includes the following fields: - -* `expr`: The `jsonata` expression to be evaluated. -* `data` or `dataset`: If `data` is defined, use the value of the `data` field - as the input data for the test case. Otherwise, the `dataset` field contains - the name of the dataset (in the `datasets` directory) to use as input data. - If value of the `dataset` field is `null`, then use `undefined` as the input - data when evaluating the `jsonata` expression. -* `timelimit`: If a timelimit should be imposed on the test, this specifies the - timelimit in milliseconds. -* `depth`: If the depth of evaluation should be limited, this specifies the depth. -* `bindings`: Any variable bindings to be applied when evaluating the expression. - -In addition, (exactly) one of the following fields is specified for each test case: - -* `result`: The expected result of evaluation (if defined) -* `undefinedResult`: A flag indicating the expected result of evaluation will be `undefined` -* `code`: The code associated with the exception that is expected to be thrown when either compiling the expression or evaluating it - -If the `code` field is present, an optional `token` field may also be present indicating which token token the exception -should be associated with. diff --git a/test/test-suite/datasets/dataset0.json b/test/test-suite/datasets/dataset0.json deleted file mode 100644 index f9564da4..00000000 --- a/test/test-suite/datasets/dataset0.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "foo": { - "bar": 42, - "blah": [ - { - "baz": { - "fud": "hello" - } - }, - { - "baz": { - "fud": "world" - } - }, - { - "bazz": "gotcha" - } - ], - "blah.baz": "here" - }, - "bar": 98 -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset1.json b/test/test-suite/datasets/dataset1.json deleted file mode 100644 index fda49015..00000000 --- a/test/test-suite/datasets/dataset1.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "FirstName": "Fred", - "Surname": "Smith", - "Age": 28, - "Address": { - "Street": "Hursley Park", - "City": "Winchester", - "Postcode": "SO21 2JN" - }, - "Phone": [ - { - "type": "home", - "number": "0203 544 1234" - }, - { - "type": "office", - "number": "01962 001234" - }, - { - "type": "office", - "number": "01962 001235" - }, - { - "type": "mobile", - "number": "077 7700 1234" - } - ], - "Email": [ - { - "type": "work", - "address": [ - "fred.smith@my-work.com", - "fsmith@my-work.com" - ] - }, - { - "type": "home", - "address": [ - "freddy@my-social.com", - "frederic.smith@very-serious.com" - ] - } - ], - "Other": { - "Over 18 ?": true, - "Misc": null, - "Alternative.Address": { - "Street": "Brick Lane", - "City": "London", - "Postcode": "E1 6RF" - } - } -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset10.json b/test/test-suite/datasets/dataset10.json deleted file mode 100644 index ccc412b3..00000000 --- a/test/test-suite/datasets/dataset10.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "foo": { - "bar": 42, - "blah": [ - { - "baz": { - "fud": "hello" - } - }, - { - "buz": { - "fud": "world" - } - }, - { - "bazz": "gotcha" - } - ], - "blah.baz": "here" - }, - "bar": 98 -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset11.json b/test/test-suite/datasets/dataset11.json deleted file mode 100644 index b7fb9b2e..00000000 --- a/test/test-suite/datasets/dataset11.json +++ /dev/null @@ -1,9 +0,0 @@ -[ - { - "content": { - "origin": { - "name": "fakeIntegrationName" - } - } - } -] \ No newline at end of file diff --git a/test/test-suite/datasets/dataset12.json b/test/test-suite/datasets/dataset12.json deleted file mode 100644 index 18a092c6..00000000 --- a/test/test-suite/datasets/dataset12.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "Account": { - "Account Name": "Firefly", - "Order": [ - { - "OrderID": "order103", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "0406654608", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Quantity": 2 - }, - { - "Product Name": "Trilby hat", - "ProductID": 858236, - "SKU": "0406634348", - "Description": { - "Colour": "Orange", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.6 - }, - "Price": 21.67, - "Quantity": 1 - } - ] - }, - { - "OrderID": "order104", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "040657863", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": 34.45, - "Quantity": 4 - }, - { - "ProductID": 345664, - "SKU": "0406654603", - "Product Name": "Cloak", - "Description": { - "Colour": "Black", - "Width": 30, - "Height": 20, - "Depth": 210, - "Weight": 2 - }, - "Price": 107.99, - "Quantity": 1 - } - ] - } - ] - } -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset13.json b/test/test-suite/datasets/dataset13.json deleted file mode 100644 index 476c95bd..00000000 --- a/test/test-suite/datasets/dataset13.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "Account": { - "Account Name": "Firefly", - "Order": [ - { - "OrderID": "order103", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "0406654608", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": 34.45, - "Quantity": 2 - }, - { - "Product Name": "Trilby hat", - "ProductID": 858236, - "SKU": "0406634348", - "Description": { - "Colour": "Orange", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.6 - }, - "Quantity": 1 - } - ] - }, - { - "OrderID": "order104", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "040657863", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": 34.45, - "Quantity": 4 - }, - { - "ProductID": 345664, - "SKU": "0406654603", - "Product Name": "Cloak", - "Description": { - "Colour": "Black", - "Width": 30, - "Height": 20, - "Depth": 210, - "Weight": 2 - }, - "Price": 107.99, - "Quantity": 1 - } - ] - } - ] - } -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset14.json b/test/test-suite/datasets/dataset14.json deleted file mode 100644 index 999236ed..00000000 --- a/test/test-suite/datasets/dataset14.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "Account": { - "Account Name": "Firefly", - "Order": [ - { - "OrderID": "order103", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "0406654608", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Quantity": 2 - }, - { - "Product Name": "Trilby hat", - "ProductID": 858236, - "SKU": "0406634348", - "Description": { - "Colour": "Orange", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.6 - }, - "Quantity": 1 - } - ] - }, - { - "OrderID": "order104", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "040657863", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": 34.45, - "Quantity": 4 - }, - { - "ProductID": 345664, - "SKU": "0406654603", - "Product Name": "Cloak", - "Description": { - "Colour": "Black", - "Width": 30, - "Height": 20, - "Depth": 210, - "Weight": 2 - }, - "Price": 107.99, - "Quantity": 1 - } - ] - } - ] - } -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset15.json b/test/test-suite/datasets/dataset15.json deleted file mode 100644 index 68f4916a..00000000 --- a/test/test-suite/datasets/dataset15.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "Account": { - "Account Name": "Firefly", - "Order": [ - { - "OrderID": "order103", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "0406654608", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": "foo", - "Quantity": 2 - }, - { - "Product Name": "Trilby hat", - "ProductID": 858236, - "SKU": "0406634348", - "Description": { - "Colour": "Orange", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.6 - }, - "Price": 21.67, - "Quantity": 1 - } - ] - }, - { - "OrderID": "order104", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "040657863", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": 34.45, - "Quantity": 4 - }, - { - "ProductID": 345664, - "SKU": "0406654603", - "Product Name": "Cloak", - "Description": { - "Colour": "Black", - "Width": 30, - "Height": 20, - "Depth": 210, - "Weight": 2 - }, - "Price": 107.99, - "Quantity": 1 - } - ] - } - ] - } -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset16.json b/test/test-suite/datasets/dataset16.json deleted file mode 100644 index ac8e5d4a..00000000 --- a/test/test-suite/datasets/dataset16.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "Account": { - "Account Name": "Firefly", - "Order": [ - { - "OrderID": "order103", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "0406654608", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": true, - "Quantity": 2 - }, - { - "Product Name": "Trilby hat", - "ProductID": 858236, - "SKU": "0406634348", - "Description": { - "Colour": "Orange", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.6 - }, - "Price": 21.67, - "Quantity": 1 - } - ] - }, - { - "OrderID": "order104", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "040657863", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": 34.45, - "Quantity": 4 - }, - { - "ProductID": 345664, - "SKU": "0406654603", - "Product Name": "Cloak", - "Description": { - "Colour": "Black", - "Width": 30, - "Height": 20, - "Depth": 210, - "Weight": 2 - }, - "Price": 107.99, - "Quantity": 1 - } - ] - } - ] - } -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset17.json b/test/test-suite/datasets/dataset17.json deleted file mode 100644 index 5d3452f6..00000000 --- a/test/test-suite/datasets/dataset17.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "Account": { - "Account Name": "Firefly", - "Order": [ - { - "OrderID": "order103", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "0406654608", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": 34.45, - "Quantity": 2 - }, - { - "Product Name": "Trilby hat", - "ProductID": 858236, - "SKU": "0406634348", - "Description": { - "Colour": "Orange", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.6 - }, - "Price": null, - "Quantity": 1 - } - ] - }, - { - "OrderID": "order104", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "040657863", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": 34.45, - "Quantity": 4 - }, - { - "ProductID": 345664, - "SKU": "0406654603", - "Product Name": "Cloak", - "Description": { - "Colour": "Black", - "Width": 30, - "Height": 20, - "Depth": 210, - "Weight": 2 - }, - "Price": 107.99, - "Quantity": 1 - } - ] - } - ] - } -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset18.json b/test/test-suite/datasets/dataset18.json deleted file mode 100644 index f5ffd328..00000000 --- a/test/test-suite/datasets/dataset18.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "state": { - "tempReadings": [ - 27.2, - 28.9, - 28, - 28.2, - 28.4 - ], - "readingsCount": 5, - "sumTemperatures": 140.7, - "avgTemperature": 28.14, - "maxTemperature": 28.9, - "minTemperature": 27.2 - }, - "event": { - "t": 28.4 - } -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset19.json b/test/test-suite/datasets/dataset19.json deleted file mode 100644 index 803a1e7b..00000000 --- a/test/test-suite/datasets/dataset19.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "output": { - "is": { - "same": { - "as": "input" - } - } - } -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset2.json b/test/test-suite/datasets/dataset2.json deleted file mode 100644 index cba1ae28..00000000 --- a/test/test-suite/datasets/dataset2.json +++ /dev/null @@ -1,17 +0,0 @@ -[ - [ - { - "baz": { - "fud": "hello" - } - }, - { - "baz": { - "fud": "world" - } - }, - { - "bazz": "gotcha" - } - ] -] \ No newline at end of file diff --git a/test/test-suite/datasets/dataset20.json b/test/test-suite/datasets/dataset20.json deleted file mode 100644 index 11d5c9f3..00000000 --- a/test/test-suite/datasets/dataset20.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "moo": 4, - "jee": { - "par": { - "waa": { - "bar": 87 - } - } - } -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset21.json b/test/test-suite/datasets/dataset21.json deleted file mode 100644 index b863ac5c..00000000 --- a/test/test-suite/datasets/dataset21.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "Salutation": "Mr", - "Name": "Alexander", - "MiddleName": "John", - "Surname": "Smith", - "Cars": 3, - "Employment": { - "Name": "IBM UK", - "ContractType": "permanent", - "Role": "Senior Physician", - "Years": 12, - "Executive.Compensation": 1400000 - }, - "Qualifications": [ - "GP", - "Consultant Opthalmologist" - ], - "Salary": null, - "NI.Number": "NO10FURBZNESS", - "敷": "Steve", - "Español": "/ˈspænɪʃ/" -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset22.json b/test/test-suite/datasets/dataset22.json deleted file mode 100644 index 8ff6f5bc..00000000 --- a/test/test-suite/datasets/dataset22.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "doc": 23, - "detail": { - "contents": "stuff", - "meta": 5 - } -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset23.json b/test/test-suite/datasets/dataset23.json deleted file mode 100644 index cd6b95d8..00000000 --- a/test/test-suite/datasets/dataset23.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "doc": 89, - "detail": { - "contents": "some more stuff", - "meta": "boo" - } -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset24.json b/test/test-suite/datasets/dataset24.json deleted file mode 100644 index dc860859..00000000 --- a/test/test-suite/datasets/dataset24.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "nest0": [ - { - "nest1": [ - { - "nest2": [ - { - "nest3": 1 - }, - { - "nest3": 2 - } - ] - }, - { - "nest2": [ - { - "nest3": 3 - }, - { - "nest3": 4 - } - ] - } - ] - }, - { - "nest1": [ - { - "nest2": [ - { - "nest3": 5 - }, - { - "nest3": 6 - } - ] - }, - { - "nest2": [ - { - "nest3": 7 - }, - { - "nest3": 8 - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset3.json b/test/test-suite/datasets/dataset3.json deleted file mode 100644 index 106da97f..00000000 --- a/test/test-suite/datasets/dataset3.json +++ /dev/null @@ -1,28 +0,0 @@ -[ - 42, - [ - { - "baz": { - "fud": "hello" - } - }, - { - "baz": { - "fud": "world" - } - }, - { - "bazz": "gotcha" - } - ], - "here", - { - "fud": "hello" - }, - "hello", - { - "fud": "world" - }, - "world", - "gotcha" -] \ No newline at end of file diff --git a/test/test-suite/datasets/dataset4.json b/test/test-suite/datasets/dataset4.json deleted file mode 100644 index ee9426d2..00000000 --- a/test/test-suite/datasets/dataset4.json +++ /dev/null @@ -1,32 +0,0 @@ -[ - { - "nest0": [ - { - "nest1": [ - 1, - 2 - ] - }, - { - "nest1": [ - 3, - 4 - ] - } - ] - }, - { - "nest0": [ - { - "nest1": [ - 5 - ] - }, - { - "nest1": [ - 6 - ] - } - ] - } -] \ No newline at end of file diff --git a/test/test-suite/datasets/dataset5.json b/test/test-suite/datasets/dataset5.json deleted file mode 100644 index 3c37583a..00000000 --- a/test/test-suite/datasets/dataset5.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "Account": { - "Account Name": "Firefly", - "Order": [ - { - "OrderID": "order103", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "0406654608", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": 34.45, - "Quantity": 2 - }, - { - "Product Name": "Trilby hat", - "ProductID": 858236, - "SKU": "0406634348", - "Description": { - "Colour": "Orange", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.6 - }, - "Price": 21.67, - "Quantity": 1 - } - ] - }, - { - "OrderID": "order104", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "040657863", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": 34.45, - "Quantity": 4 - }, - { - "ProductID": 345664, - "SKU": "0406654603", - "Product Name": "Cloak", - "Description": { - "Colour": "Black", - "Width": 30, - "Height": 20, - "Depth": 210, - "Weight": 2 - }, - "Price": 107.99, - "Quantity": 1 - } - ] - } - ] - } -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset6.json b/test/test-suite/datasets/dataset6.json deleted file mode 100644 index 44328747..00000000 --- a/test/test-suite/datasets/dataset6.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "library": { - "books": [ - { - "title": "Structure and Interpretation of Computer Programs", - "authors": [ - "Abelson", - "Sussman" - ], - "isbn": "9780262510875", - "price": 38.9, - "copies": 2 - }, - { - "title": "The C Programming Language", - "authors": [ - "Kernighan", - "Richie" - ], - "isbn": "9780131103627", - "price": 33.59, - "copies": 3 - }, - { - "title": "The AWK Programming Language", - "authors": [ - "Aho", - "Kernighan", - "Weinberger" - ], - "isbn": "9780201079814", - "copies": 1 - }, - { - "title": "Compilers: Principles, Techniques, and Tools", - "authors": [ - "Aho", - "Lam", - "Sethi", - "Ullman" - ], - "isbn": "9780201100884", - "price": 23.38, - "copies": 1 - } - ], - "loans": [ - { - "customer": "10001", - "isbn": "9780262510875", - "return": "2016-12-05" - }, - { - "customer": "10003", - "isbn": "9780201100884", - "return": "2016-10-22" - } - ], - "customers": [ - { - "id": "10001", - "name": "Joe Doe", - "address": { - "street": "2 Long Road", - "city": "Winchester", - "postcode": "SO22 5PU" - } - }, - { - "id": "10002", - "name": "Fred Bloggs", - "address": { - "street": "56 Letsby Avenue", - "city": "Winchester", - "postcode": "SO22 4WD" - } - }, - { - "id": "10003", - "name": "Jason Arthur", - "address": { - "street": "1 Preddy Gate", - "city": "Southampton", - "postcode": "SO14 0MG" - } - } - ] - } -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset7.json b/test/test-suite/datasets/dataset7.json deleted file mode 100644 index 4c5d9555..00000000 --- a/test/test-suite/datasets/dataset7.json +++ /dev/null @@ -1,9 +0,0 @@ -[ - { - "content": { - "integration": { - "name": "fakeIntegrationName" - } - } - } -] \ No newline at end of file diff --git a/test/test-suite/datasets/dataset8.json b/test/test-suite/datasets/dataset8.json deleted file mode 100644 index 35891253..00000000 --- a/test/test-suite/datasets/dataset8.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "nest0": [ - { - "nest1": [ - { - "nest2": [ - { - "nest3": [ - 1 - ] - }, - { - "nest3": [ - 2 - ] - } - ] - }, - { - "nest2": [ - { - "nest3": [ - 3 - ] - }, - { - "nest3": [ - 4 - ] - } - ] - } - ] - }, - { - "nest1": [ - { - "nest2": [ - { - "nest3": [ - 5 - ] - }, - { - "nest3": [ - 6 - ] - } - ] - }, - { - "nest2": [ - { - "nest3": [ - 7 - ] - }, - { - "nest3": [ - 8 - ] - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/test/test-suite/datasets/dataset9.json b/test/test-suite/datasets/dataset9.json deleted file mode 100644 index 3f904f2e..00000000 --- a/test/test-suite/datasets/dataset9.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "temp": 22.7, - "wind": 7, - "gust": null, - "timestamp": 1508971317377 -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case000.json b/test/test-suite/groups/array-constructor/case000.json deleted file mode 100644 index 99ef395b..00000000 --- a/test/test-suite/groups/array-constructor/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[]", - "dataset": "dataset5", - "bindings": {}, - "result": [] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case001.json b/test/test-suite/groups/array-constructor/case001.json deleted file mode 100644 index 48ea84d8..00000000 --- a/test/test-suite/groups/array-constructor/case001.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "[1]", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 1 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case002.json b/test/test-suite/groups/array-constructor/case002.json deleted file mode 100644 index 99d2e0d4..00000000 --- a/test/test-suite/groups/array-constructor/case002.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "[1, 2]", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 1, - 2 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case003.json b/test/test-suite/groups/array-constructor/case003.json deleted file mode 100644 index 3fa18a1f..00000000 --- a/test/test-suite/groups/array-constructor/case003.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "[1, 2,3]", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 1, - 2, - 3 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case004.json b/test/test-suite/groups/array-constructor/case004.json deleted file mode 100644 index 75dd2755..00000000 --- a/test/test-suite/groups/array-constructor/case004.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "expr": "[1, 2, [3, 4]]", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 1, - 2, - [ - 3, - 4 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case005.json b/test/test-suite/groups/array-constructor/case005.json deleted file mode 100644 index 769703df..00000000 --- a/test/test-suite/groups/array-constructor/case005.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "expr": "[1, \"two\", [\"three\", 4]]", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 1, - "two", - [ - "three", - 4 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case006.json b/test/test-suite/groups/array-constructor/case006.json deleted file mode 100644 index b50548b1..00000000 --- a/test/test-suite/groups/array-constructor/case006.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "expr": "[1, $two, [\"three\", $four]]", - "dataset": "dataset5", - "bindings": { - "two": 2, - "four": "four" - }, - "result": [ - 1, - 2, - [ - "three", - "four" - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case007.json b/test/test-suite/groups/array-constructor/case007.json deleted file mode 100644 index 40c8efd3..00000000 --- a/test/test-suite/groups/array-constructor/case007.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "expr": "[\"foo.bar\", foo.bar, [\"foo.baz\", foo.blah.baz]]", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "foo.bar", - 42, - [ - "foo.baz", - { - "fud": "hello" - }, - { - "fud": "world" - } - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case008.json b/test/test-suite/groups/array-constructor/case008.json deleted file mode 100644 index 09e842d9..00000000 --- a/test/test-suite/groups/array-constructor/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[1, 2, 3][0]", - "dataset": "dataset5", - "bindings": {}, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case009.json b/test/test-suite/groups/array-constructor/case009.json deleted file mode 100644 index 1ddea286..00000000 --- a/test/test-suite/groups/array-constructor/case009.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "[1, 2, [3, 4]][-1]", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 3, - 4 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case010.json b/test/test-suite/groups/array-constructor/case010.json deleted file mode 100644 index a8241a3d..00000000 --- a/test/test-suite/groups/array-constructor/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[1, 2, [3, 4]][-1][-1]", - "dataset": "dataset5", - "bindings": {}, - "result": 4 -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case011.json b/test/test-suite/groups/array-constructor/case011.json deleted file mode 100644 index 5e1aa487..00000000 --- a/test/test-suite/groups/array-constructor/case011.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "expr": "foo.blah.baz.[fud, fud]", - "dataset": "dataset0", - "bindings": {}, - "result": [ - [ - "hello", - "hello" - ], - [ - "world", - "world" - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case012.json b/test/test-suite/groups/array-constructor/case012.json deleted file mode 100644 index 96d80da0..00000000 --- a/test/test-suite/groups/array-constructor/case012.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "expr": "foo.blah.baz.[[fud, fud]]", - "dataset": "dataset0", - "bindings": {}, - "result": [ - [ - [ - "hello", - "hello" - ] - ], - [ - [ - "world", - "world" - ] - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case013.json b/test/test-suite/groups/array-constructor/case013.json deleted file mode 100644 index 8eb1f61f..00000000 --- a/test/test-suite/groups/array-constructor/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.blah.[baz].fud", - "dataset": "dataset10", - "bindings": {}, - "result": "hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case014.json b/test/test-suite/groups/array-constructor/case014.json deleted file mode 100644 index 3a583617..00000000 --- a/test/test-suite/groups/array-constructor/case014.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.blah.[baz, buz].fud", - "dataset": "dataset10", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case015.json b/test/test-suite/groups/array-constructor/case015.json deleted file mode 100644 index 0066062f..00000000 --- a/test/test-suite/groups/array-constructor/case015.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "[Address, Other.\"Alternative.Address\"].City", - "dataset": "dataset1", - "bindings": {}, - "result": [ - "Winchester", - "London" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case016.json b/test/test-suite/groups/array-constructor/case016.json deleted file mode 100644 index 3ddbd390..00000000 --- a/test/test-suite/groups/array-constructor/case016.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "[Address, Other.`Alternative.Address`].City", - "dataset": "dataset1", - "bindings": {}, - "result": [ - "Winchester", - "London" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case017.json b/test/test-suite/groups/array-constructor/case017.json deleted file mode 100644 index f7dbcdc8..00000000 --- a/test/test-suite/groups/array-constructor/case017.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "[0,1,2,3,4,5,6,7,8,9][$ % 2 = 0]", - "data": null, - "bindings": {}, - "result": [ - 0, - 2, - 4, - 6, - 8 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case018.json b/test/test-suite/groups/array-constructor/case018.json deleted file mode 100644 index 39afc146..00000000 --- a/test/test-suite/groups/array-constructor/case018.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "[1, 2, 3].$", - "dataset": null, - "bindings": {}, - "result": [ - 1, - 2, - 3 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case019.json b/test/test-suite/groups/array-constructor/case019.json deleted file mode 100644 index e34dfbf4..00000000 --- a/test/test-suite/groups/array-constructor/case019.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "[1, 2, 3].$", - "data": [], - "bindings": {}, - "result": [ - 1, - 2, - 3 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/array-constructor/case020.json b/test/test-suite/groups/array-constructor/case020.json deleted file mode 100644 index 7bbd6c7e..00000000 --- a/test/test-suite/groups/array-constructor/case020.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "expr": "[1, 2, 3].$", - "data": [ - 4, - 5, - 6 - ], - "bindings": {}, - "result": [ - 1, - 2, - 3 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/blocks/case000.json b/test/test-suite/groups/blocks/case000.json deleted file mode 100644 index 5df04548..00000000 --- a/test/test-suite/groups/blocks/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "()", - "data": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/blocks/case001.json b/test/test-suite/groups/blocks/case001.json deleted file mode 100644 index 9eb5c521..00000000 --- a/test/test-suite/groups/blocks/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(1; 2; 3)", - "data": null, - "bindings": {}, - "result": 3 -} \ No newline at end of file diff --git a/test/test-suite/groups/blocks/case002.json b/test/test-suite/groups/blocks/case002.json deleted file mode 100644 index f62f0b7f..00000000 --- a/test/test-suite/groups/blocks/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(1; 2; 3;)", - "data": null, - "bindings": {}, - "result": 3 -} \ No newline at end of file diff --git a/test/test-suite/groups/blocks/case003.json b/test/test-suite/groups/blocks/case003.json deleted file mode 100644 index d526f9f0..00000000 --- a/test/test-suite/groups/blocks/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($a:=1; $b:=2; $c:=($a:=4; $a+$b); $a+$c)", - "data": null, - "bindings": {}, - "result": 7 -} \ No newline at end of file diff --git a/test/test-suite/groups/blocks/case004.json b/test/test-suite/groups/blocks/case004.json deleted file mode 100644 index a0d609c2..00000000 --- a/test/test-suite/groups/blocks/case004.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product.($var1 := Price ; $var2:=Quantity; $var1 * $var2)", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 68.9, - 21.67, - 137.8, - 107.99 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/blocks/case005.json b/test/test-suite/groups/blocks/case005.json deleted file mode 100644 index 13606e62..00000000 --- a/test/test-suite/groups/blocks/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $func := function($arg) {$arg.Account.Order[0].OrderID}; $func($))", - "dataset": "dataset5", - "bindings": {}, - "result": "order103" -} \ No newline at end of file diff --git a/test/test-suite/groups/blocks/case006.json b/test/test-suite/groups/blocks/case006.json deleted file mode 100644 index 965a244f..00000000 --- a/test/test-suite/groups/blocks/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $func := function($arg) {$arg.Account.Order[0]}; $func($).OrderID)", - "dataset": "dataset5", - "bindings": {}, - "result": "order103" -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case000.json b/test/test-suite/groups/boolean-expresssions/case000.json deleted file mode 100644 index 0a6bd70d..00000000 --- a/test/test-suite/groups/boolean-expresssions/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "true", - "dataset": "dataset0", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case001.json b/test/test-suite/groups/boolean-expresssions/case001.json deleted file mode 100644 index da9d4a3b..00000000 --- a/test/test-suite/groups/boolean-expresssions/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "false", - "dataset": "dataset0", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case002.json b/test/test-suite/groups/boolean-expresssions/case002.json deleted file mode 100644 index b6733de0..00000000 --- a/test/test-suite/groups/boolean-expresssions/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "false or false", - "dataset": "dataset0", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case003.json b/test/test-suite/groups/boolean-expresssions/case003.json deleted file mode 100644 index fc182c69..00000000 --- a/test/test-suite/groups/boolean-expresssions/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "false or true", - "dataset": "dataset0", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case004.json b/test/test-suite/groups/boolean-expresssions/case004.json deleted file mode 100644 index 6f9132a7..00000000 --- a/test/test-suite/groups/boolean-expresssions/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "true or false", - "dataset": "dataset0", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case005.json b/test/test-suite/groups/boolean-expresssions/case005.json deleted file mode 100644 index 421e501f..00000000 --- a/test/test-suite/groups/boolean-expresssions/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "true or true", - "dataset": "dataset0", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case006.json b/test/test-suite/groups/boolean-expresssions/case006.json deleted file mode 100644 index 63ac5b71..00000000 --- a/test/test-suite/groups/boolean-expresssions/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "false and false", - "dataset": "dataset0", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case007.json b/test/test-suite/groups/boolean-expresssions/case007.json deleted file mode 100644 index a39f56f6..00000000 --- a/test/test-suite/groups/boolean-expresssions/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "false and true", - "dataset": "dataset0", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case008.json b/test/test-suite/groups/boolean-expresssions/case008.json deleted file mode 100644 index b024fdde..00000000 --- a/test/test-suite/groups/boolean-expresssions/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "true and false", - "dataset": "dataset0", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case009.json b/test/test-suite/groups/boolean-expresssions/case009.json deleted file mode 100644 index fc02ebae..00000000 --- a/test/test-suite/groups/boolean-expresssions/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "true and true", - "dataset": "dataset0", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case010.json b/test/test-suite/groups/boolean-expresssions/case010.json deleted file mode 100644 index 223246b9..00000000 --- a/test/test-suite/groups/boolean-expresssions/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$not(false)", - "dataset": "dataset0", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case011.json b/test/test-suite/groups/boolean-expresssions/case011.json deleted file mode 100644 index 7b9c611c..00000000 --- a/test/test-suite/groups/boolean-expresssions/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$not(true)", - "dataset": "dataset0", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case012.json b/test/test-suite/groups/boolean-expresssions/case012.json deleted file mode 100644 index c48fdb44..00000000 --- a/test/test-suite/groups/boolean-expresssions/case012.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "and=1 and or=2", - "data": { - "and": 1, - "or": 2 - }, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case013.json b/test/test-suite/groups/boolean-expresssions/case013.json deleted file mode 100644 index e668d273..00000000 --- a/test/test-suite/groups/boolean-expresssions/case013.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "and>1 or or<=2", - "data": { - "and": 1, - "or": 2 - }, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case014.json b/test/test-suite/groups/boolean-expresssions/case014.json deleted file mode 100644 index b71e2f01..00000000 --- a/test/test-suite/groups/boolean-expresssions/case014.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "and>1 or or!=2", - "data": { - "and": 1, - "or": 2 - }, - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case015.json b/test/test-suite/groups/boolean-expresssions/case015.json deleted file mode 100644 index 8188b72f..00000000 --- a/test/test-suite/groups/boolean-expresssions/case015.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "and and and", - "data": { - "and": 1, - "or": 2 - }, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/boolean-expresssions/case016.json b/test/test-suite/groups/boolean-expresssions/case016.json deleted file mode 100644 index 2aab8bfb..00000000 --- a/test/test-suite/groups/boolean-expresssions/case016.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "$[].content.origin.$lowercase(name)", - "dataset": "dataset11", - "bindings": {}, - "result": [ - "fakeintegrationname" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/closures/case000.json b/test/test-suite/groups/closures/case000.json deleted file mode 100644 index 105d8829..00000000 --- a/test/test-suite/groups/closures/case000.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "Account.( $AccName := function() { $.\"Account Name\" }; Order[OrderID = \"order104\"].Product{ \"Account\": $AccName(), \"SKU-\" & $string(ProductID): $.\"Product Name\" } )", - "dataset": "dataset5", - "bindings": {}, - "result": { - "Account": "Firefly", - "SKU-858383": "Bowler Hat", - "SKU-345664": "Cloak" - } -} \ No newline at end of file diff --git a/test/test-suite/groups/closures/case001.json b/test/test-suite/groups/closures/case001.json deleted file mode 100644 index 5cb1c225..00000000 --- a/test/test-suite/groups/closures/case001.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "Account.( $AccName := function() { `Account Name` }; Order[OrderID = \"order104\"].Product{ \"Account\": $AccName(), \"SKU-\" & $string(ProductID): `Product Name` } )", - "dataset": "dataset5", - "bindings": {}, - "result": { - "Account": "Firefly", - "SKU-858383": "Bowler Hat", - "SKU-345664": "Cloak" - } -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case000.json b/test/test-suite/groups/comparison-operators/case000.json deleted file mode 100644 index 3df6398d..00000000 --- a/test/test-suite/groups/comparison-operators/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "3>-3", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case001.json b/test/test-suite/groups/comparison-operators/case001.json deleted file mode 100644 index acb4e627..00000000 --- a/test/test-suite/groups/comparison-operators/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "3>3", - "dataset": null, - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case002.json b/test/test-suite/groups/comparison-operators/case002.json deleted file mode 100644 index 4e4607a7..00000000 --- a/test/test-suite/groups/comparison-operators/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "3=3", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case003.json b/test/test-suite/groups/comparison-operators/case003.json deleted file mode 100644 index 7fe0c0e6..00000000 --- a/test/test-suite/groups/comparison-operators/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"3\"=\"3\"", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case004.json b/test/test-suite/groups/comparison-operators/case004.json deleted file mode 100644 index 046a44e9..00000000 --- a/test/test-suite/groups/comparison-operators/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"3\"=3", - "dataset": null, - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case005.json b/test/test-suite/groups/comparison-operators/case005.json deleted file mode 100644 index c749368a..00000000 --- a/test/test-suite/groups/comparison-operators/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"hello\" = \"hello\"", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case006.json b/test/test-suite/groups/comparison-operators/case006.json deleted file mode 100644 index c4833a90..00000000 --- a/test/test-suite/groups/comparison-operators/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"hello\" != \"world\"", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case007.json b/test/test-suite/groups/comparison-operators/case007.json deleted file mode 100644 index f676b386..00000000 --- a/test/test-suite/groups/comparison-operators/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"hello\" < \"world\"", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case008.json b/test/test-suite/groups/comparison-operators/case008.json deleted file mode 100644 index d4013b25..00000000 --- a/test/test-suite/groups/comparison-operators/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"32\" < 42", - "dataset": null, - "bindings": {}, - "code": "T2009" -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case009.json b/test/test-suite/groups/comparison-operators/case009.json deleted file mode 100644 index 2b795f31..00000000 --- a/test/test-suite/groups/comparison-operators/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "null <= \"world\"", - "dataset": null, - "bindings": {}, - "code": "T2010" -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case010.json b/test/test-suite/groups/comparison-operators/case010.json deleted file mode 100644 index a5d247a9..00000000 --- a/test/test-suite/groups/comparison-operators/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "3 >= true", - "dataset": null, - "bindings": {}, - "code": "T2010" -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case011.json b/test/test-suite/groups/comparison-operators/case011.json deleted file mode 100644 index a6713d19..00000000 --- a/test/test-suite/groups/comparison-operators/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.bar > bar", - "dataset": "dataset0", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case012.json b/test/test-suite/groups/comparison-operators/case012.json deleted file mode 100644 index d26994fa..00000000 --- a/test/test-suite/groups/comparison-operators/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.bar >= bar", - "dataset": "dataset0", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case013.json b/test/test-suite/groups/comparison-operators/case013.json deleted file mode 100644 index 202c44f2..00000000 --- a/test/test-suite/groups/comparison-operators/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.barfoo.bar", - "dataset": "dataset0", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case016.json b/test/test-suite/groups/comparison-operators/case016.json deleted file mode 100644 index dbdb9102..00000000 --- a/test/test-suite/groups/comparison-operators/case016.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "bar < foo.bar", - "dataset": "dataset0", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case017.json b/test/test-suite/groups/comparison-operators/case017.json deleted file mode 100644 index d5bd5184..00000000 --- a/test/test-suite/groups/comparison-operators/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.bar = bar", - "dataset": "dataset0", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case018.json b/test/test-suite/groups/comparison-operators/case018.json deleted file mode 100644 index 59d39f37..00000000 --- a/test/test-suite/groups/comparison-operators/case018.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.bar!= bar", - "dataset": "dataset0", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case019.json b/test/test-suite/groups/comparison-operators/case019.json deleted file mode 100644 index 4b4293c5..00000000 --- a/test/test-suite/groups/comparison-operators/case019.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "bar = foo.bar + 56", - "dataset": "dataset0", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case020.json b/test/test-suite/groups/comparison-operators/case020.json deleted file mode 100644 index f793fb09..00000000 --- a/test/test-suite/groups/comparison-operators/case020.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "bar !=foo.bar + 56", - "dataset": "dataset0", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case021.json b/test/test-suite/groups/comparison-operators/case021.json deleted file mode 100644 index 204eee59..00000000 --- a/test/test-suite/groups/comparison-operators/case021.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "foo.blah.baz[fud = \"hello\"]", - "dataset": "dataset0", - "bindings": {}, - "result": { - "fud": "hello" - } -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case022.json b/test/test-suite/groups/comparison-operators/case022.json deleted file mode 100644 index 9c3bf138..00000000 --- a/test/test-suite/groups/comparison-operators/case022.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "foo.blah.baz[fud != \"world\"]", - "dataset": "dataset0", - "bindings": {}, - "result": { - "fud": "hello" - } -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case023.json b/test/test-suite/groups/comparison-operators/case023.json deleted file mode 100644 index b83f0a32..00000000 --- a/test/test-suite/groups/comparison-operators/case023.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "Account.Order.Product[Price > 30].Price", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 34.45, - 34.45, - 107.99 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/comparison-operators/case024.json b/test/test-suite/groups/comparison-operators/case024.json deleted file mode 100644 index 43d8a23b..00000000 --- a/test/test-suite/groups/comparison-operators/case024.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "Account.Order.Product.Price[$<=35]", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 34.45, - 21.67, - 34.45 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/conditionals/case000.json b/test/test-suite/groups/conditionals/case000.json deleted file mode 100644 index 1e94cde7..00000000 --- a/test/test-suite/groups/conditionals/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[\"Red\"[$$=\"Bus\"], \"White\"[$$=\"Police Car\"]][0]", - "data": "Bus", - "bindings": {}, - "result": "Red" -} \ No newline at end of file diff --git a/test/test-suite/groups/conditionals/case001.json b/test/test-suite/groups/conditionals/case001.json deleted file mode 100644 index bd643e90..00000000 --- a/test/test-suite/groups/conditionals/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[\"Red\"[$$=\"Bus\"], \"White\"[$$=\"Police Car\"]][0]", - "data": "Police Car", - "bindings": {}, - "result": "White" -} \ No newline at end of file diff --git a/test/test-suite/groups/conditionals/case002.json b/test/test-suite/groups/conditionals/case002.json deleted file mode 100644 index d263776e..00000000 --- a/test/test-suite/groups/conditionals/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[\"Red\"[$$=\"Bus\"], \"White\"[$$=\"Police Car\"]][0]", - "data": "Tuk tuk", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/conditionals/case003.json b/test/test-suite/groups/conditionals/case003.json deleted file mode 100644 index 4e88489f..00000000 --- a/test/test-suite/groups/conditionals/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lookup({\"Bus\": \"Red\", \"Police Car\": \"White\"}, $$)", - "data": "Bus", - "bindings": {}, - "result": "Red" -} \ No newline at end of file diff --git a/test/test-suite/groups/conditionals/case004.json b/test/test-suite/groups/conditionals/case004.json deleted file mode 100644 index c40de4dd..00000000 --- a/test/test-suite/groups/conditionals/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lookup({\"Bus\": \"Red\", \"Police Car\": \"White\"}, $$)", - "data": "Police Car", - "bindings": {}, - "result": "White" -} \ No newline at end of file diff --git a/test/test-suite/groups/conditionals/case005.json b/test/test-suite/groups/conditionals/case005.json deleted file mode 100644 index 8fb3c288..00000000 --- a/test/test-suite/groups/conditionals/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lookup({\"Bus\": \"Red\", \"Police Car\": \"White\"}, $$)", - "data": "Tuk tuk", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/conditionals/case006.json b/test/test-suite/groups/conditionals/case006.json deleted file mode 100644 index f7278804..00000000 --- a/test/test-suite/groups/conditionals/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order.Product.(Price < 30 ? \"Cheap\")", - "dataset": "dataset5", - "bindings": {}, - "result": "Cheap" -} \ No newline at end of file diff --git a/test/test-suite/groups/conditionals/case007.json b/test/test-suite/groups/conditionals/case007.json deleted file mode 100644 index 287f4088..00000000 --- a/test/test-suite/groups/conditionals/case007.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product.(Price < 30 ? \"Cheap\" : \"Expensive\")", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "Expensive", - "Cheap", - "Expensive", - "Expensive" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/conditionals/case008.json b/test/test-suite/groups/conditionals/case008.json deleted file mode 100644 index 32a3be90..00000000 --- a/test/test-suite/groups/conditionals/case008.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product.(Price < 30 ? \"Cheap\" : Price < 100 ? \"Expensive\" : \"Rip off\")", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "Expensive", - "Cheap", - "Expensive", - "Rip off" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/context/case000.json b/test/test-suite/groups/context/case000.json deleted file mode 100644 index 269fa629..00000000 --- a/test/test-suite/groups/context/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number()", - "data": "5", - "bindings": {}, - "result": 5 -} \ No newline at end of file diff --git a/test/test-suite/groups/context/case001.json b/test/test-suite/groups/context/case001.json deleted file mode 100644 index 48034b3b..00000000 --- a/test/test-suite/groups/context/case001.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "[1..5].$string()", - "dataset": null, - "bindings": {}, - "result": [ - "1", - "2", - "3", - "4", - "5" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/context/case002.json b/test/test-suite/groups/context/case002.json deleted file mode 100644 index e555ae6a..00000000 --- a/test/test-suite/groups/context/case002.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "[1..5].(\"Item \" & $string())", - "dataset": null, - "bindings": {}, - "result": [ - "Item 1", - "Item 2", - "Item 3", - "Item 4", - "Item 5" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/context/case003.json b/test/test-suite/groups/context/case003.json deleted file mode 100644 index 5a15fd7f..00000000 --- a/test/test-suite/groups/context/case003.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product.\"Product Name\".$uppercase().$substringBefore(\" \")", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "BOWLER", - "TRILBY", - "BOWLER", - "CLOAK" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case000.json b/test/test-suite/groups/descendent-operator/case000.json deleted file mode 100644 index 7f7497bc..00000000 --- a/test/test-suite/groups/descendent-operator/case000.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "expr": "foo.**.blah", - "dataset": "dataset0", - "bindings": {}, - "result": [ - { - "baz": { - "fud": "hello" - } - }, - { - "baz": { - "fud": "world" - } - }, - { - "bazz": "gotcha" - } - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case001.json b/test/test-suite/groups/descendent-operator/case001.json deleted file mode 100644 index 096c880b..00000000 --- a/test/test-suite/groups/descendent-operator/case001.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "expr": "foo.**.baz", - "dataset": "dataset0", - "bindings": {}, - "result": [ - { - "fud": "hello" - }, - { - "fud": "world" - } - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case002.json b/test/test-suite/groups/descendent-operator/case002.json deleted file mode 100644 index a1f78079..00000000 --- a/test/test-suite/groups/descendent-operator/case002.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.**.fud", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case003.json b/test/test-suite/groups/descendent-operator/case003.json deleted file mode 100644 index b12d7fa6..00000000 --- a/test/test-suite/groups/descendent-operator/case003.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "\"foo\".**.fud", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case004.json b/test/test-suite/groups/descendent-operator/case004.json deleted file mode 100644 index 69b56532..00000000 --- a/test/test-suite/groups/descendent-operator/case004.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.**.\"fud\"", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case005.json b/test/test-suite/groups/descendent-operator/case005.json deleted file mode 100644 index f686c6bd..00000000 --- a/test/test-suite/groups/descendent-operator/case005.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "\"foo\".**.\"fud\"", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case006.json b/test/test-suite/groups/descendent-operator/case006.json deleted file mode 100644 index e22f0bdd..00000000 --- a/test/test-suite/groups/descendent-operator/case006.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.*.**.fud", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case007.json b/test/test-suite/groups/descendent-operator/case007.json deleted file mode 100644 index 606706f0..00000000 --- a/test/test-suite/groups/descendent-operator/case007.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.**.*.fud", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case008.json b/test/test-suite/groups/descendent-operator/case008.json deleted file mode 100644 index 4d93f1bc..00000000 --- a/test/test-suite/groups/descendent-operator/case008.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.**.Colour", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "Purple", - "Orange", - "Purple", - "Black" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case009.json b/test/test-suite/groups/descendent-operator/case009.json deleted file mode 100644 index 2f2e551b..00000000 --- a/test/test-suite/groups/descendent-operator/case009.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.**.fud[0]", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case010.json b/test/test-suite/groups/descendent-operator/case010.json deleted file mode 100644 index e892a141..00000000 --- a/test/test-suite/groups/descendent-operator/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(foo.**.fud)[0]", - "dataset": "dataset0", - "bindings": {}, - "result": "hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case011.json b/test/test-suite/groups/descendent-operator/case011.json deleted file mode 100644 index 4cc02167..00000000 --- a/test/test-suite/groups/descendent-operator/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(**.fud)[0]", - "dataset": "dataset0", - "bindings": {}, - "result": "hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case012.json b/test/test-suite/groups/descendent-operator/case012.json deleted file mode 100644 index e548946f..00000000 --- a/test/test-suite/groups/descendent-operator/case012.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "**.Price", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 34.45, - 21.67, - 34.45, - 107.99 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case013.json b/test/test-suite/groups/descendent-operator/case013.json deleted file mode 100644 index 7d6ba049..00000000 --- a/test/test-suite/groups/descendent-operator/case013.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "**.Price[0]", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 34.45, - 21.67, - 34.45, - 107.99 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case014.json b/test/test-suite/groups/descendent-operator/case014.json deleted file mode 100644 index e29d5521..00000000 --- a/test/test-suite/groups/descendent-operator/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(**.Price)[0]", - "dataset": "dataset5", - "bindings": {}, - "result": 34.45 -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case015.json b/test/test-suite/groups/descendent-operator/case015.json deleted file mode 100644 index 9ba73fd5..00000000 --- a/test/test-suite/groups/descendent-operator/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "**[2]", - "dataset": "dataset5", - "bindings": {}, - "result": "Firefly" -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case016.json b/test/test-suite/groups/descendent-operator/case016.json deleted file mode 100644 index 8198a9fa..00000000 --- a/test/test-suite/groups/descendent-operator/case016.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order.blah.**", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/descendent-operator/case017.json b/test/test-suite/groups/descendent-operator/case017.json deleted file mode 100644 index 9f862356..00000000 --- a/test/test-suite/groups/descendent-operator/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "**", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/encoding/case000.json b/test/test-suite/groups/encoding/case000.json deleted file mode 100644 index 97048b15..00000000 --- a/test/test-suite/groups/encoding/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$base64encode(\"hello:world\")", - "dataset": null, - "bindings": {}, - "result": "aGVsbG86d29ybGQ=" -} \ No newline at end of file diff --git a/test/test-suite/groups/encoding/case001.json b/test/test-suite/groups/encoding/case001.json deleted file mode 100644 index 4cdefa61..00000000 --- a/test/test-suite/groups/encoding/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$base64encode()", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/encoding/case002.json b/test/test-suite/groups/encoding/case002.json deleted file mode 100644 index d50d59a1..00000000 --- a/test/test-suite/groups/encoding/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$base64decode(\"aGVsbG86d29ybGQ=\")", - "dataset": null, - "bindings": {}, - "result": "hello:world" -} \ No newline at end of file diff --git a/test/test-suite/groups/encoding/case003.json b/test/test-suite/groups/encoding/case003.json deleted file mode 100644 index 4d41ba57..00000000 --- a/test/test-suite/groups/encoding/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$base64decode()", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case000.json b/test/test-suite/groups/errors/case000.json deleted file mode 100644 index 2d3a45a2..00000000 --- a/test/test-suite/groups/errors/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"s\" - 1", - "dataset": "dataset5", - "bindings": {}, - "code": "T2001" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case001.json b/test/test-suite/groups/errors/case001.json deleted file mode 100644 index 7c86c92d..00000000 --- a/test/test-suite/groups/errors/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "1 + null", - "dataset": "dataset5", - "bindings": {}, - "code": "T2002" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case002.json b/test/test-suite/groups/errors/case002.json deleted file mode 100644 index 5204467a..00000000 --- a/test/test-suite/groups/errors/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"no closing quote", - "dataset": "dataset5", - "bindings": {}, - "code": "S0101" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case003.json b/test/test-suite/groups/errors/case003.json deleted file mode 100644 index a3686193..00000000 --- a/test/test-suite/groups/errors/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "`no closing backtick", - "dataset": "dataset5", - "bindings": {}, - "code": "S0105" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case004.json b/test/test-suite/groups/errors/case004.json deleted file mode 100644 index 82b7bde3..00000000 --- a/test/test-suite/groups/errors/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "- \"s\"", - "dataset": "dataset5", - "bindings": {}, - "code": "D1002" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case005.json b/test/test-suite/groups/errors/case005.json deleted file mode 100644 index c2b542ac..00000000 --- a/test/test-suite/groups/errors/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "unknown(function)", - "dataset": "dataset5", - "bindings": {}, - "code": "T1006" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case006.json b/test/test-suite/groups/errors/case006.json deleted file mode 100644 index e050281d..00000000 --- a/test/test-suite/groups/errors/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "sum(Account.Order.OrderID)", - "dataset": "dataset5", - "bindings": {}, - "code": "T1005" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case007.json b/test/test-suite/groups/errors/case007.json deleted file mode 100644 index 6da5e7e8..00000000 --- a/test/test-suite/groups/errors/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[1,2)", - "data": {}, - "bindings": {}, - "code": "S0202" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case008.json b/test/test-suite/groups/errors/case008.json deleted file mode 100644 index b4a368f7..00000000 --- a/test/test-suite/groups/errors/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[1:2]", - "data": {}, - "bindings": {}, - "code": "S0202" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case009.json b/test/test-suite/groups/errors/case009.json deleted file mode 100644 index e284c4ee..00000000 --- a/test/test-suite/groups/errors/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"foo\", \"o, \"rr\")", - "data": {}, - "bindings": {}, - "code": "S0202" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case010.json b/test/test-suite/groups/errors/case010.json deleted file mode 100644 index 463b3e5f..00000000 --- a/test/test-suite/groups/errors/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[1!2]", - "data": {}, - "bindings": {}, - "code": "S0204" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case011.json b/test/test-suite/groups/errors/case011.json deleted file mode 100644 index f72a2921..00000000 --- a/test/test-suite/groups/errors/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "@ bar", - "data": {}, - "bindings": {}, - "code": "S0204" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case012.json b/test/test-suite/groups/errors/case012.json deleted file mode 100644 index 59afe122..00000000 --- a/test/test-suite/groups/errors/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "2(blah)", - "dataset": null, - "bindings": {}, - "code": "T1006" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case013.json b/test/test-suite/groups/errors/case013.json deleted file mode 100644 index 6fbf5db7..00000000 --- a/test/test-suite/groups/errors/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "2()", - "dataset": null, - "bindings": {}, - "code": "T1006" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case014.json b/test/test-suite/groups/errors/case014.json deleted file mode 100644 index 69c3acfa..00000000 --- a/test/test-suite/groups/errors/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "3(?)", - "dataset": null, - "bindings": {}, - "code": "T1008" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case015.json b/test/test-suite/groups/errors/case015.json deleted file mode 100644 index f9b525b9..00000000 --- a/test/test-suite/groups/errors/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "1=", - "data": {}, - "bindings": {}, - "code": "S0207" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case016.json b/test/test-suite/groups/errors/case016.json deleted file mode 100644 index a5dcaac0..00000000 --- a/test/test-suite/groups/errors/case016.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "function(x){$x}(3)", - "data": {}, - "bindings": {}, - "code": "S0208" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case017.json b/test/test-suite/groups/errors/case017.json deleted file mode 100644 index ffbe4d03..00000000 --- a/test/test-suite/groups/errors/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "x:=1", - "dataset": null, - "bindings": {}, - "code": "D2005" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case018.json b/test/test-suite/groups/errors/case018.json deleted file mode 100644 index 247ae999..00000000 --- a/test/test-suite/groups/errors/case018.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "2:=1", - "dataset": null, - "bindings": {}, - "code": "D2005" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case019.json b/test/test-suite/groups/errors/case019.json deleted file mode 100644 index 43dd4c08..00000000 --- a/test/test-suite/groups/errors/case019.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$foo()", - "dataset": null, - "bindings": {}, - "code": "T1006" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case020.json b/test/test-suite/groups/errors/case020.json deleted file mode 100644 index f793ad9d..00000000 --- a/test/test-suite/groups/errors/case020.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "55=>5", - "dataset": null, - "bindings": {}, - "code": "S0211" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case021.json b/test/test-suite/groups/errors/case021.json deleted file mode 100644 index 7bd14cf7..00000000 --- a/test/test-suite/groups/errors/case021.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Ssum(:)", - "dataset": null, - "bindings": {}, - "code": "S0211" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case022.json b/test/test-suite/groups/errors/case022.json deleted file mode 100644 index aa68e24c..00000000 --- a/test/test-suite/groups/errors/case022.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[1,2,3]{\"num\": $}[true]", - "dataset": null, - "bindings": {}, - "code": "S0209" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case023.json b/test/test-suite/groups/errors/case023.json deleted file mode 100644 index d4c9bacd..00000000 --- a/test/test-suite/groups/errors/case023.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[1,2,3]{\"num\": $}{\"num\": $}", - "dataset": null, - "bindings": {}, - "code": "S0210" -} \ No newline at end of file diff --git a/test/test-suite/groups/errors/case024.json b/test/test-suite/groups/errors/case024.json deleted file mode 100644 index da477475..00000000 --- a/test/test-suite/groups/errors/case024.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order[0].Product;", - "dataset": null, - "bindings": {}, - "code": "S0201" -} \ No newline at end of file diff --git a/test/test-suite/groups/fields/case000.json b/test/test-suite/groups/fields/case000.json deleted file mode 100644 index b5a81dcc..00000000 --- a/test/test-suite/groups/fields/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.bar", - "dataset": "dataset0", - "bindings": {}, - "result": 42 -} \ No newline at end of file diff --git a/test/test-suite/groups/fields/case001.json b/test/test-suite/groups/fields/case001.json deleted file mode 100644 index 8f8dbec8..00000000 --- a/test/test-suite/groups/fields/case001.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "expr": "foo.blah", - "dataset": "dataset0", - "bindings": {}, - "result": [ - { - "baz": { - "fud": "hello" - } - }, - { - "baz": { - "fud": "world" - } - }, - { - "bazz": "gotcha" - } - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/fields/case002.json b/test/test-suite/groups/fields/case002.json deleted file mode 100644 index c456bfac..00000000 --- a/test/test-suite/groups/fields/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.blah.bazz", - "dataset": "dataset0", - "bindings": {}, - "result": "gotcha" -} \ No newline at end of file diff --git a/test/test-suite/groups/fields/case003.json b/test/test-suite/groups/fields/case003.json deleted file mode 100644 index 414b5f19..00000000 --- a/test/test-suite/groups/fields/case003.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "expr": "foo.blah.baz", - "dataset": "dataset0", - "bindings": {}, - "result": [ - { - "fud": "hello" - }, - { - "fud": "world" - } - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/fields/case004.json b/test/test-suite/groups/fields/case004.json deleted file mode 100644 index aced61f5..00000000 --- a/test/test-suite/groups/fields/case004.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.blah.baz.fud", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/fields/case005.json b/test/test-suite/groups/fields/case005.json deleted file mode 100644 index 1fbc91c1..00000000 --- a/test/test-suite/groups/fields/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Other.Misc", - "dataset": "dataset1", - "bindings": {}, - "result": null -} \ No newline at end of file diff --git a/test/test-suite/groups/fields/case006.json b/test/test-suite/groups/fields/case006.json deleted file mode 100644 index a793dd3c..00000000 --- a/test/test-suite/groups/fields/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "bazz", - "dataset": "dataset2", - "bindings": {}, - "result": "gotcha" -} \ No newline at end of file diff --git a/test/test-suite/groups/fields/case007.json b/test/test-suite/groups/fields/case007.json deleted file mode 100644 index e2789348..00000000 --- a/test/test-suite/groups/fields/case007.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "fud", - "dataset": "dataset3", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case000.json b/test/test-suite/groups/flattening/case000.json deleted file mode 100644 index dde9f488..00000000 --- a/test/test-suite/groups/flattening/case000.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "expr": "Account.Order.[Product.Price]", - "dataset": "dataset5", - "bindings": {}, - "result": [ - [ - 34.45, - 21.67 - ], - [ - 34.45, - 107.99 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case001.json b/test/test-suite/groups/flattening/case001.json deleted file mode 100644 index 673a995c..00000000 --- a/test/test-suite/groups/flattening/case001.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "expr": "$.nest0", - "data": [ - { - "nest0": [ - 1, - 2 - ] - }, - { - "nest0": [ - 3, - 4 - ] - } - ], - "bindings": {}, - "result": [ - 1, - 2, - 3, - 4 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case002.json b/test/test-suite/groups/flattening/case002.json deleted file mode 100644 index 515d8ed5..00000000 --- a/test/test-suite/groups/flattening/case002.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "expr": "nest0", - "data": [ - { - "nest0": [ - 1, - 2 - ] - }, - { - "nest0": [ - 3, - 4 - ] - } - ], - "bindings": {}, - "result": [ - 1, - 2, - 3, - 4 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case003.json b/test/test-suite/groups/flattening/case003.json deleted file mode 100644 index 5ce282b2..00000000 --- a/test/test-suite/groups/flattening/case003.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "expr": "$[0]", - "data": [ - { - "nest0": [ - 1, - 2 - ] - }, - { - "nest0": [ - 3, - 4 - ] - } - ], - "bindings": {}, - "result": { - "nest0": [ - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case004.json b/test/test-suite/groups/flattening/case004.json deleted file mode 100644 index 87bfaf01..00000000 --- a/test/test-suite/groups/flattening/case004.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "expr": "$[1]", - "data": [ - { - "nest0": [ - 1, - 2 - ] - }, - { - "nest0": [ - 3, - 4 - ] - } - ], - "bindings": {}, - "result": { - "nest0": [ - 3, - 4 - ] - } -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case005.json b/test/test-suite/groups/flattening/case005.json deleted file mode 100644 index c7c99722..00000000 --- a/test/test-suite/groups/flattening/case005.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "expr": "$[-1]", - "data": [ - { - "nest0": [ - 1, - 2 - ] - }, - { - "nest0": [ - 3, - 4 - ] - } - ], - "bindings": {}, - "result": { - "nest0": [ - 3, - 4 - ] - } -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case006.json b/test/test-suite/groups/flattening/case006.json deleted file mode 100644 index 04152479..00000000 --- a/test/test-suite/groups/flattening/case006.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "expr": "$[0].nest0", - "data": [ - { - "nest0": [ - 1, - 2 - ] - }, - { - "nest0": [ - 3, - 4 - ] - } - ], - "bindings": {}, - "result": [ - 1, - 2 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case007.json b/test/test-suite/groups/flattening/case007.json deleted file mode 100644 index 5d3c541d..00000000 --- a/test/test-suite/groups/flattening/case007.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "expr": "$[1].nest0", - "data": [ - { - "nest0": [ - 1, - 2 - ] - }, - { - "nest0": [ - 3, - 4 - ] - } - ], - "bindings": {}, - "result": [ - 3, - 4 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case008.json b/test/test-suite/groups/flattening/case008.json deleted file mode 100644 index c29941da..00000000 --- a/test/test-suite/groups/flattening/case008.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "expr": "$[0].nest0[0]", - "data": [ - { - "nest0": [ - 1, - 2 - ] - }, - { - "nest0": [ - 3, - 4 - ] - } - ], - "bindings": {}, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case009.json b/test/test-suite/groups/flattening/case009.json deleted file mode 100644 index 13711805..00000000 --- a/test/test-suite/groups/flattening/case009.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "expr": "nest0.[nest1.[nest2.[nest3]]]", - "dataset": "dataset8", - "bindings": {}, - "result": [ - [ - [ - [ - 1 - ], - [ - 2 - ] - ], - [ - [ - 3 - ], - [ - 4 - ] - ] - ], - [ - [ - [ - 5 - ], - [ - 6 - ] - ], - [ - [ - 7 - ], - [ - 8 - ] - ] - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case010.json b/test/test-suite/groups/flattening/case010.json deleted file mode 100644 index bc80e3db..00000000 --- a/test/test-suite/groups/flattening/case010.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "expr": "nest0.nest1.[nest2.[nest3]]", - "dataset": "dataset8", - "bindings": {}, - "result": [ - [ - [ - 1 - ], - [ - 2 - ] - ], - [ - [ - 3 - ], - [ - 4 - ] - ], - [ - [ - 5 - ], - [ - 6 - ] - ], - [ - [ - 7 - ], - [ - 8 - ] - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case011.json b/test/test-suite/groups/flattening/case011.json deleted file mode 100644 index b346bf97..00000000 --- a/test/test-suite/groups/flattening/case011.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "expr": "nest0.[nest1.nest2.[nest3]]", - "dataset": "dataset8", - "bindings": {}, - "result": [ - [ - [ - 1 - ], - [ - 2 - ], - [ - 3 - ], - [ - 4 - ] - ], - [ - [ - 5 - ], - [ - 6 - ], - [ - 7 - ], - [ - 8 - ] - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case012.json b/test/test-suite/groups/flattening/case012.json deleted file mode 100644 index e9077d46..00000000 --- a/test/test-suite/groups/flattening/case012.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "expr": "nest0.[nest1.[nest2.nest3]]", - "dataset": "dataset8", - "bindings": {}, - "result": [ - [ - [ - 1, - 2 - ], - [ - 3, - 4 - ] - ], - [ - [ - 5, - 6 - ], - [ - 7, - 8 - ] - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case013.json b/test/test-suite/groups/flattening/case013.json deleted file mode 100644 index a63b4a6f..00000000 --- a/test/test-suite/groups/flattening/case013.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "expr": "nest0.[nest1.nest2.nest3]", - "dataset": "dataset8", - "bindings": {}, - "result": [ - [ - 1, - 2, - 3, - 4 - ], - [ - 5, - 6, - 7, - 8 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case014.json b/test/test-suite/groups/flattening/case014.json deleted file mode 100644 index 5d9d4026..00000000 --- a/test/test-suite/groups/flattening/case014.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "expr": "nest0.nest1.[nest2.nest3]", - "dataset": "dataset8", - "bindings": {}, - "result": [ - [ - 1, - 2 - ], - [ - 3, - 4 - ], - [ - 5, - 6 - ], - [ - 7, - 8 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case015.json b/test/test-suite/groups/flattening/case015.json deleted file mode 100644 index fb3f8b29..00000000 --- a/test/test-suite/groups/flattening/case015.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "expr": "nest0.nest1.nest2.[nest3]", - "dataset": "dataset8", - "bindings": {}, - "result": [ - [ - 1 - ], - [ - 2 - ], - [ - 3 - ], - [ - 4 - ], - [ - 5 - ], - [ - 6 - ], - [ - 7 - ], - [ - 8 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case016.json b/test/test-suite/groups/flattening/case016.json deleted file mode 100644 index a570b110..00000000 --- a/test/test-suite/groups/flattening/case016.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "expr": "nest0.nest1.nest2.nest3", - "dataset": "dataset8", - "bindings": {}, - "result": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case017.json b/test/test-suite/groups/flattening/case017.json deleted file mode 100644 index 456a55e9..00000000 --- a/test/test-suite/groups/flattening/case017.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "expr": "nest0.[nest1.[nest2.[nest3]]]", - "dataset": "dataset24", - "bindings": {}, - "result": [ - [ - [ - [ - 1 - ], - [ - 2 - ] - ], - [ - [ - 3 - ], - [ - 4 - ] - ] - ], - [ - [ - [ - 5 - ], - [ - 6 - ] - ], - [ - [ - 7 - ], - [ - 8 - ] - ] - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case018.json b/test/test-suite/groups/flattening/case018.json deleted file mode 100644 index 070df6ae..00000000 --- a/test/test-suite/groups/flattening/case018.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "expr": "nest0.nest1.[nest2.[nest3]]", - "dataset": "dataset24", - "bindings": {}, - "result": [ - [ - [ - 1 - ], - [ - 2 - ] - ], - [ - [ - 3 - ], - [ - 4 - ] - ], - [ - [ - 5 - ], - [ - 6 - ] - ], - [ - [ - 7 - ], - [ - 8 - ] - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case019.json b/test/test-suite/groups/flattening/case019.json deleted file mode 100644 index 615c645e..00000000 --- a/test/test-suite/groups/flattening/case019.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "expr": "nest0.[nest1.nest2.[nest3]]", - "dataset": "dataset24", - "bindings": {}, - "result": [ - [ - [ - 1 - ], - [ - 2 - ], - [ - 3 - ], - [ - 4 - ] - ], - [ - [ - 5 - ], - [ - 6 - ], - [ - 7 - ], - [ - 8 - ] - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case020.json b/test/test-suite/groups/flattening/case020.json deleted file mode 100644 index ff13168e..00000000 --- a/test/test-suite/groups/flattening/case020.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "expr": "nest0.[nest1.[nest2.nest3]]", - "dataset": "dataset24", - "bindings": {}, - "result": [ - [ - [ - 1, - 2 - ], - [ - 3, - 4 - ] - ], - [ - [ - 5, - 6 - ], - [ - 7, - 8 - ] - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case021.json b/test/test-suite/groups/flattening/case021.json deleted file mode 100644 index 3967a137..00000000 --- a/test/test-suite/groups/flattening/case021.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "expr": "nest0.[nest1.nest2.nest3]", - "dataset": "dataset24", - "bindings": {}, - "result": [ - [ - 1, - 2, - 3, - 4 - ], - [ - 5, - 6, - 7, - 8 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case022.json b/test/test-suite/groups/flattening/case022.json deleted file mode 100644 index 73de95a7..00000000 --- a/test/test-suite/groups/flattening/case022.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "expr": "nest0.nest1.[nest2.nest3]", - "dataset": "dataset24", - "bindings": {}, - "result": [ - [ - 1, - 2 - ], - [ - 3, - 4 - ], - [ - 5, - 6 - ], - [ - 7, - 8 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case023.json b/test/test-suite/groups/flattening/case023.json deleted file mode 100644 index c0bce282..00000000 --- a/test/test-suite/groups/flattening/case023.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "expr": "nest0.nest1.nest2.[nest3]", - "dataset": "dataset24", - "bindings": {}, - "result": [ - [ - 1 - ], - [ - 2 - ], - [ - 3 - ], - [ - 4 - ], - [ - 5 - ], - [ - 6 - ], - [ - 7 - ], - [ - 8 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case024.json b/test/test-suite/groups/flattening/case024.json deleted file mode 100644 index bd6a781c..00000000 --- a/test/test-suite/groups/flattening/case024.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "expr": "nest0.nest1.nest2.nest3", - "dataset": "dataset24", - "bindings": {}, - "result": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case025.json b/test/test-suite/groups/flattening/case025.json deleted file mode 100644 index 12305ff1..00000000 --- a/test/test-suite/groups/flattening/case025.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "expr": "{\"a\": 1 }.a", - "dataset": null, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case026.json b/test/test-suite/groups/flattening/case026.json deleted file mode 100644 index f94f8596..00000000 --- a/test/test-suite/groups/flattening/case026.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "expr": "a", - "data": { - "a": 1 - }, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case027.json b/test/test-suite/groups/flattening/case027.json deleted file mode 100644 index f2c16168..00000000 --- a/test/test-suite/groups/flattening/case027.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "expr": "{\"a\": [1] }.a", - "dataset": null, - "result": [ - 1 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case028.json b/test/test-suite/groups/flattening/case028.json deleted file mode 100644 index ed37e221..00000000 --- a/test/test-suite/groups/flattening/case028.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "a", - "data": { - "a": [ - 1 - ] - }, - "result": [ - 1 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case029.json b/test/test-suite/groups/flattening/case029.json deleted file mode 100644 index b963e4ed..00000000 --- a/test/test-suite/groups/flattening/case029.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "{\"a\": [[1]] }.a", - "dataset": null, - "result": [ - [ - 1 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case030.json b/test/test-suite/groups/flattening/case030.json deleted file mode 100644 index 0bfdcc02..00000000 --- a/test/test-suite/groups/flattening/case030.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "expr": "a", - "data": { - "a": [ - [ - 1 - ] - ] - }, - "result": [ - [ - 1 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case031.json b/test/test-suite/groups/flattening/case031.json deleted file mode 100644 index 6e3dc72a..00000000 --- a/test/test-suite/groups/flattening/case031.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "[{\"a\":[1,2]}, {\"a\":[3]}].a", - "dataset": null, - "result": [ - 1, - 2, - 3 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case032.json b/test/test-suite/groups/flattening/case032.json deleted file mode 100644 index df002d28..00000000 --- a/test/test-suite/groups/flattening/case032.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "expr": "a", - "data": [ - { - "a": [ - 1, - 2 - ] - }, - { - "a": [ - 3 - ] - } - ], - "result": [ - 1, - 2, - 3 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case033.json b/test/test-suite/groups/flattening/case033.json deleted file mode 100644 index 1626496b..00000000 --- a/test/test-suite/groups/flattening/case033.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "[{\"a\":[{\"b\":[1]}, {\"b\":[2]}]}, {\"a\":[{\"b\":[3]}, {\"b\":[4]}]}].a[0].b", - "dataset": null, - "result": [ - 1, - 3 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case034.json b/test/test-suite/groups/flattening/case034.json deleted file mode 100644 index 5557f6d9..00000000 --- a/test/test-suite/groups/flattening/case034.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "expr": "a[0].b", - "data": [ - { - "a": [ - { - "b": [ - 1 - ] - }, - { - "b": [ - 2 - ] - } - ] - }, - { - "a": [ - { - "b": [ - 3 - ] - }, - { - "b": [ - 4 - ] - } - ] - } - ], - "result": [ - 1, - 3 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case035.json b/test/test-suite/groups/flattening/case035.json deleted file mode 100644 index f0165bf6..00000000 --- a/test/test-suite/groups/flattening/case035.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "expr": "a.b[0]", - "data": [ - { - "a": [ - { - "b": [ - 1 - ] - }, - { - "b": [ - 2 - ] - } - ] - }, - { - "a": [ - { - "b": [ - 3 - ] - }, - { - "b": [ - 4 - ] - } - ] - } - ], - "result": [ - 1, - 2, - 3, - 4 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case036.json b/test/test-suite/groups/flattening/case036.json deleted file mode 100644 index 04401be5..00000000 --- a/test/test-suite/groups/flattening/case036.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Phone[type=\"mobile\"].number", - "dataset": "dataset1", - "bindings": {}, - "result": "077 7700 1234" -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case037.json b/test/test-suite/groups/flattening/case037.json deleted file mode 100644 index 7a688cac..00000000 --- a/test/test-suite/groups/flattening/case037.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "Phone[type=\"mobile\"][].number", - "dataset": "dataset1", - "bindings": {}, - "result": [ - "077 7700 1234" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case038.json b/test/test-suite/groups/flattening/case038.json deleted file mode 100644 index 6436f632..00000000 --- a/test/test-suite/groups/flattening/case038.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "Phone[][type=\"mobile\"].number", - "dataset": "dataset1", - "bindings": {}, - "result": [ - "077 7700 1234" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case039.json b/test/test-suite/groups/flattening/case039.json deleted file mode 100644 index 04a0b10f..00000000 --- a/test/test-suite/groups/flattening/case039.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Phone[type=\"office\"][].number", - "dataset": "dataset1", - "bindings": {}, - "result": [ - "01962 001234", - "01962 001235" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case040.json b/test/test-suite/groups/flattening/case040.json deleted file mode 100644 index 59d99cee..00000000 --- a/test/test-suite/groups/flattening/case040.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "expr": "Phone{type: number}", - "dataset": "dataset1", - "bindings": {}, - "result": { - "home": "0203 544 1234", - "office": [ - "01962 001234", - "01962 001235" - ], - "mobile": "077 7700 1234" - } -} \ No newline at end of file diff --git a/test/test-suite/groups/flattening/case041.json b/test/test-suite/groups/flattening/case041.json deleted file mode 100644 index c331d01d..00000000 --- a/test/test-suite/groups/flattening/case041.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "expr": "Phone{type: number[]}", - "dataset": "dataset1", - "bindings": {}, - "result": { - "home": [ - "0203 544 1234" - ], - "office": [ - "01962 001234", - "01962 001235" - ], - "mobile": [ - "077 7700 1234" - ] - } -} \ No newline at end of file diff --git a/test/test-suite/groups/function-abs/case000.json b/test/test-suite/groups/function-abs/case000.json deleted file mode 100644 index 16f91690..00000000 --- a/test/test-suite/groups/function-abs/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$abs(3.7)", - "dataset": null, - "bindings": {}, - "result": 3.7 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-abs/case001.json b/test/test-suite/groups/function-abs/case001.json deleted file mode 100644 index 86e6ab5c..00000000 --- a/test/test-suite/groups/function-abs/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$abs(-3.7)", - "dataset": null, - "bindings": {}, - "result": 3.7 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-abs/case002.json b/test/test-suite/groups/function-abs/case002.json deleted file mode 100644 index 29153ed7..00000000 --- a/test/test-suite/groups/function-abs/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$abs(0)", - "dataset": null, - "bindings": {}, - "result": 0 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-abs/case003.json b/test/test-suite/groups/function-abs/case003.json deleted file mode 100644 index 0ad8ef0a..00000000 --- a/test/test-suite/groups/function-abs/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$abs(nothing)", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-append/case000.json b/test/test-suite/groups/function-append/case000.json deleted file mode 100644 index ab552cc7..00000000 --- a/test/test-suite/groups/function-append/case000.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "$append([1,2], [3,4])", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 1, - 2, - 3, - 4 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-append/case001.json b/test/test-suite/groups/function-append/case001.json deleted file mode 100644 index 6f105951..00000000 --- a/test/test-suite/groups/function-append/case001.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "$append(1, [3,4])", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 1, - 3, - 4 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-append/case002.json b/test/test-suite/groups/function-append/case002.json deleted file mode 100644 index eb23f9a2..00000000 --- a/test/test-suite/groups/function-append/case002.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "$append(1,2)", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 1, - 2 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-append/case003.json b/test/test-suite/groups/function-append/case003.json deleted file mode 100644 index c4d550d1..00000000 --- a/test/test-suite/groups/function-append/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$append(1,notexist)", - "dataset": "dataset5", - "bindings": {}, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-append/case004.json b/test/test-suite/groups/function-append/case004.json deleted file mode 100644 index 9a1a3608..00000000 --- a/test/test-suite/groups/function-append/case004.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "$append(notexist, [2,3,4])", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 2, - 3, - 4 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case000.json b/test/test-suite/groups/function-applications/case000.json deleted file mode 100644 index 4a5e0c8c..00000000 --- a/test/test-suite/groups/function-applications/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order[0].OrderID ~> $uppercase()", - "dataset": "dataset5", - "bindings": {}, - "result": "ORDER103" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case001.json b/test/test-suite/groups/function-applications/case001.json deleted file mode 100644 index 3604b641..00000000 --- a/test/test-suite/groups/function-applications/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order[0].OrderID ~> $uppercase() ~> $lowercase()", - "dataset": "dataset5", - "bindings": {}, - "result": "order103" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case002.json b/test/test-suite/groups/function-applications/case002.json deleted file mode 100644 index 60672a28..00000000 --- a/test/test-suite/groups/function-applications/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order.OrderID ~> $join()", - "dataset": "dataset5", - "bindings": {}, - "result": "order103order104" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case003.json b/test/test-suite/groups/function-applications/case003.json deleted file mode 100644 index c45e765f..00000000 --- a/test/test-suite/groups/function-applications/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order.OrderID ~> $join(\", \")", - "dataset": "dataset5", - "bindings": {}, - "result": "order103, order104" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case004.json b/test/test-suite/groups/function-applications/case004.json deleted file mode 100644 index 5b7b175a..00000000 --- a/test/test-suite/groups/function-applications/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order.Product.(Price * Quantity) ~> $sum()", - "dataset": "dataset5", - "bindings": {}, - "result": 336.36 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case005.json b/test/test-suite/groups/function-applications/case005.json deleted file mode 100644 index 1f011be6..00000000 --- a/test/test-suite/groups/function-applications/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $uppertrim := $trim ~> $uppercase; $uppertrim(\" Hello World \") )", - "dataset": null, - "bindings": {}, - "result": "HELLO WORLD" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case006.json b/test/test-suite/groups/function-applications/case006.json deleted file mode 100644 index 4027d07e..00000000 --- a/test/test-suite/groups/function-applications/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"john@example.com\" ~> $substringAfter(\"@\") ~> $substringBefore(\".\") ", - "dataset": null, - "bindings": {}, - "result": "example" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case007.json b/test/test-suite/groups/function-applications/case007.json deleted file mode 100644 index a9063d05..00000000 --- a/test/test-suite/groups/function-applications/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"\" ~> $substringAfter(\"@\") ~> $substringBefore(\".\") ", - "data": "test", - "bindings": {}, - "result": "" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case008.json b/test/test-suite/groups/function-applications/case008.json deleted file mode 100644 index ec33446f..00000000 --- a/test/test-suite/groups/function-applications/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo ~> $substringAfter(\"@\") ~> $substringBefore(\".\") ", - "data": "test", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case009.json b/test/test-suite/groups/function-applications/case009.json deleted file mode 100644 index 1bbdc173..00000000 --- a/test/test-suite/groups/function-applications/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $domain := $substringAfter(?,\"@\") ~> $substringBefore(?,\".\"); $domain(\"john@example.com\") )", - "dataset": null, - "bindings": {}, - "result": "example" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case010.json b/test/test-suite/groups/function-applications/case010.json deleted file mode 100644 index 436fa531..00000000 --- a/test/test-suite/groups/function-applications/case010.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "( $square := function($x){$x*$x}; [1..5] ~> $map($square) ) ", - "dataset": null, - "bindings": {}, - "result": [ - 1, - 4, - 9, - 16, - 25 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case011.json b/test/test-suite/groups/function-applications/case011.json deleted file mode 100644 index 657b9ecd..00000000 --- a/test/test-suite/groups/function-applications/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $square := function($x){$x*$x}; [1..5] ~> $map($square) ~> $sum() ) ", - "dataset": null, - "bindings": {}, - "result": 55 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case012.json b/test/test-suite/groups/function-applications/case012.json deleted file mode 100644 index 754ec004..00000000 --- a/test/test-suite/groups/function-applications/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($betweenBackets := $substringAfter(?, \"(\") ~> $substringBefore(?, \")\");$betweenBackets(\"test(foo)bar\")) ", - "dataset": null, - "bindings": {}, - "result": "foo" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case013.json b/test/test-suite/groups/function-applications/case013.json deleted file mode 100644 index 669ff4cc..00000000 --- a/test/test-suite/groups/function-applications/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($square := function($x){$x*$x};$chain := λ($f, $g){λ($x){$g($f($x))}};$instructions := [$sum, $square];$sumsq := $instructions ~> $reduce($chain);[1..5] ~> $sumsq()) ", - "dataset": null, - "bindings": {}, - "result": 225 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case014.json b/test/test-suite/groups/function-applications/case014.json deleted file mode 100644 index 71525489..00000000 --- a/test/test-suite/groups/function-applications/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($square := function($x){$x*$x};$chain := λ($f, $g){λ($x){ $x ~> $f ~> $g }};$instructions := [$sum, $square, $string];$sumsq := $instructions ~> $reduce($chain);[1..5] ~> $sumsq()) ", - "dataset": null, - "bindings": {}, - "result": "225" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case015.json b/test/test-suite/groups/function-applications/case015.json deleted file mode 100644 index 8ac24e8a..00000000 --- a/test/test-suite/groups/function-applications/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($square := function($x){$x*$x};$instructions := $sum ~> $square;[1..5] ~> $instructions()) ", - "dataset": null, - "bindings": {}, - "result": 225 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case016.json b/test/test-suite/groups/function-applications/case016.json deleted file mode 100644 index 8a5daf94..00000000 --- a/test/test-suite/groups/function-applications/case016.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($square := function($x){$x*$x};$sum_of_squares := $map(?, $square) ~> $sum;[1..5] ~> $sum_of_squares()) ", - "dataset": null, - "bindings": {}, - "result": 55 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case017.json b/test/test-suite/groups/function-applications/case017.json deleted file mode 100644 index 929fadc8..00000000 --- a/test/test-suite/groups/function-applications/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($times := λ($x, $y) { $x * $y };$product := $reduce(?, $times);$square := function($x){$x*$x};$product_of_squares := $map(?, $square) ~> $product;[1..5] ~> $product_of_squares())", - "dataset": null, - "bindings": {}, - "result": 14400 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case018.json b/test/test-suite/groups/function-applications/case018.json deleted file mode 100644 index dfa983b0..00000000 --- a/test/test-suite/groups/function-applications/case018.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($square := function($x){$x*$x};[1..5] ~> $map($square) ~> $reduce(λ($x, $y) { $x * $y });)", - "dataset": null, - "bindings": {}, - "result": 14400 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case019.json b/test/test-suite/groups/function-applications/case019.json deleted file mode 100644 index fb6a8ae2..00000000 --- a/test/test-suite/groups/function-applications/case019.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($prices := Account.Order.Product.Price;$quantities := Account.Order.Product.Quantity;$product := λ($arr) { $arr[0] * $arr[1] };$zip($prices, $quantities) ~> $map($product) ~> $sum())", - "dataset": "dataset5", - "bindings": {}, - "result": 336.36 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case020.json b/test/test-suite/groups/function-applications/case020.json deleted file mode 100644 index 294be121..00000000 --- a/test/test-suite/groups/function-applications/case020.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "42 ~> \"hello\"", - "dataset": "dataset5", - "bindings": {}, - "code": "T2006" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-applications/case021.json b/test/test-suite/groups/function-applications/case021.json deleted file mode 100644 index 809af8ae..00000000 --- a/test/test-suite/groups/function-applications/case021.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "Account.Order.Product[$.\"Product Name\" ~> /hat/i].ProductID", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 858383, - 858236, - 858383 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-average/case000.json b/test/test-suite/groups/function-average/case000.json deleted file mode 100644 index b11893cd..00000000 --- a/test/test-suite/groups/function-average/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$average(Account.Order.Product.(Price * Quantity))", - "dataset": "dataset5", - "bindings": {}, - "result": 84.09 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-average/case001.json b/test/test-suite/groups/function-average/case001.json deleted file mode 100644 index d1987fdf..00000000 --- a/test/test-suite/groups/function-average/case001.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Account.Order.$average(Product.(Price * Quantity))", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 45.285000000000004, - 122.89500000000001 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-average/case002.json b/test/test-suite/groups/function-average/case002.json deleted file mode 100644 index 9ba37778..00000000 --- a/test/test-suite/groups/function-average/case002.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Account.Order.(OrderID & \": \" & $average(Product.(Price*Quantity)))", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "order103: 45.285", - "order104: 122.895" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-average/case003.json b/test/test-suite/groups/function-average/case003.json deleted file mode 100644 index 6c126577..00000000 --- a/test/test-suite/groups/function-average/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$average([])", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-average/case004.json b/test/test-suite/groups/function-average/case004.json deleted file mode 100644 index f1c0ea7c..00000000 --- a/test/test-suite/groups/function-average/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$average([1,2,3])", - "dataset": null, - "bindings": {}, - "result": 2 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-average/case005.json b/test/test-suite/groups/function-average/case005.json deleted file mode 100644 index 01a2b441..00000000 --- a/test/test-suite/groups/function-average/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$average([\"1\",\"2\",\"3\"])", - "dataset": null, - "bindings": {}, - "code": "T0412" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-average/case006.json b/test/test-suite/groups/function-average/case006.json deleted file mode 100644 index b4966838..00000000 --- a/test/test-suite/groups/function-average/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$average([\"1\",\"2\",3])", - "dataset": null, - "bindings": {}, - "code": "T0412" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-average/case007.json b/test/test-suite/groups/function-average/case007.json deleted file mode 100644 index 0c9098b7..00000000 --- a/test/test-suite/groups/function-average/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$average(1)", - "dataset": null, - "bindings": {}, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-average/case008.json b/test/test-suite/groups/function-average/case008.json deleted file mode 100644 index 884bfe38..00000000 --- a/test/test-suite/groups/function-average/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$average([],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-average/case009.json b/test/test-suite/groups/function-average/case009.json deleted file mode 100644 index e44cb8d8..00000000 --- a/test/test-suite/groups/function-average/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$average([1,2,3],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-average/case010.json b/test/test-suite/groups/function-average/case010.json deleted file mode 100644 index bbfa6e46..00000000 --- a/test/test-suite/groups/function-average/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$average([],[],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-average/case011.json b/test/test-suite/groups/function-average/case011.json deleted file mode 100644 index 161b0538..00000000 --- a/test/test-suite/groups/function-average/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$average([1,2],[],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-average/case012.json b/test/test-suite/groups/function-average/case012.json deleted file mode 100644 index 43e5a408..00000000 --- a/test/test-suite/groups/function-average/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$average(undefined)", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case000.json b/test/test-suite/groups/function-boolean/case000.json deleted file mode 100644 index 9947faaa..00000000 --- a/test/test-suite/groups/function-boolean/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean(\"Hello World\")", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case001.json b/test/test-suite/groups/function-boolean/case001.json deleted file mode 100644 index df60a330..00000000 --- a/test/test-suite/groups/function-boolean/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean(\"\")", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case002.json b/test/test-suite/groups/function-boolean/case002.json deleted file mode 100644 index 742b5af6..00000000 --- a/test/test-suite/groups/function-boolean/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean(true)", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case003.json b/test/test-suite/groups/function-boolean/case003.json deleted file mode 100644 index 514f8865..00000000 --- a/test/test-suite/groups/function-boolean/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean(false)", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case004.json b/test/test-suite/groups/function-boolean/case004.json deleted file mode 100644 index b7e466ec..00000000 --- a/test/test-suite/groups/function-boolean/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean(0)", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case005.json b/test/test-suite/groups/function-boolean/case005.json deleted file mode 100644 index b7aa0e4e..00000000 --- a/test/test-suite/groups/function-boolean/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean(10)", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case006.json b/test/test-suite/groups/function-boolean/case006.json deleted file mode 100644 index c093f463..00000000 --- a/test/test-suite/groups/function-boolean/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean(-0.5)", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case007.json b/test/test-suite/groups/function-boolean/case007.json deleted file mode 100644 index 365a75f3..00000000 --- a/test/test-suite/groups/function-boolean/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean(null)", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case008.json b/test/test-suite/groups/function-boolean/case008.json deleted file mode 100644 index b5db4aac..00000000 --- a/test/test-suite/groups/function-boolean/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean([])", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case009.json b/test/test-suite/groups/function-boolean/case009.json deleted file mode 100644 index e6f49ec2..00000000 --- a/test/test-suite/groups/function-boolean/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean([0])", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case010.json b/test/test-suite/groups/function-boolean/case010.json deleted file mode 100644 index f07f610a..00000000 --- a/test/test-suite/groups/function-boolean/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean([1])", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case011.json b/test/test-suite/groups/function-boolean/case011.json deleted file mode 100644 index 909beb5c..00000000 --- a/test/test-suite/groups/function-boolean/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean([1,2,3])", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case012.json b/test/test-suite/groups/function-boolean/case012.json deleted file mode 100644 index 4bde64ab..00000000 --- a/test/test-suite/groups/function-boolean/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean([0,0])", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case013.json b/test/test-suite/groups/function-boolean/case013.json deleted file mode 100644 index 67d5fe7d..00000000 --- a/test/test-suite/groups/function-boolean/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean([[]])", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case014.json b/test/test-suite/groups/function-boolean/case014.json deleted file mode 100644 index 92a20060..00000000 --- a/test/test-suite/groups/function-boolean/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean([[null]])", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case015.json b/test/test-suite/groups/function-boolean/case015.json deleted file mode 100644 index 8def2c46..00000000 --- a/test/test-suite/groups/function-boolean/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean([[[true]]])", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case016.json b/test/test-suite/groups/function-boolean/case016.json deleted file mode 100644 index 562744d7..00000000 --- a/test/test-suite/groups/function-boolean/case016.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean({})", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case017.json b/test/test-suite/groups/function-boolean/case017.json deleted file mode 100644 index 985ae08e..00000000 --- a/test/test-suite/groups/function-boolean/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean({\"hello\":\"world\"})", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case018.json b/test/test-suite/groups/function-boolean/case018.json deleted file mode 100644 index 230b89e0..00000000 --- a/test/test-suite/groups/function-boolean/case018.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean(Account)", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case019.json b/test/test-suite/groups/function-boolean/case019.json deleted file mode 100644 index 62422af5..00000000 --- a/test/test-suite/groups/function-boolean/case019.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean(Account.Order.Product.Price)", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case020.json b/test/test-suite/groups/function-boolean/case020.json deleted file mode 100644 index 62f79c36..00000000 --- a/test/test-suite/groups/function-boolean/case020.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean(Account.blah)", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case021.json b/test/test-suite/groups/function-boolean/case021.json deleted file mode 100644 index 5c39a33e..00000000 --- a/test/test-suite/groups/function-boolean/case021.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean($boolean)", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case022.json b/test/test-suite/groups/function-boolean/case022.json deleted file mode 100644 index ea676fa1..00000000 --- a/test/test-suite/groups/function-boolean/case022.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean(function(){true})", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-boolean/case023.json b/test/test-suite/groups/function-boolean/case023.json deleted file mode 100644 index c02af74e..00000000 --- a/test/test-suite/groups/function-boolean/case023.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$boolean(2,3)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-ceil/case000.json b/test/test-suite/groups/function-ceil/case000.json deleted file mode 100644 index dd6a6b53..00000000 --- a/test/test-suite/groups/function-ceil/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$ceil(3.7)", - "dataset": null, - "bindings": {}, - "result": 4 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-ceil/case001.json b/test/test-suite/groups/function-ceil/case001.json deleted file mode 100644 index 8a9dae94..00000000 --- a/test/test-suite/groups/function-ceil/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$ceil(-3.7)", - "dataset": null, - "bindings": {}, - "result": -3 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-ceil/case002.json b/test/test-suite/groups/function-ceil/case002.json deleted file mode 100644 index b8d49a24..00000000 --- a/test/test-suite/groups/function-ceil/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$ceil(0)", - "dataset": null, - "bindings": {}, - "result": 0 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-ceil/case003.json b/test/test-suite/groups/function-ceil/case003.json deleted file mode 100644 index 249f9002..00000000 --- a/test/test-suite/groups/function-ceil/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$ceil(nothing)", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-clone/case000.json b/test/test-suite/groups/function-clone/case000.json deleted file mode 100644 index 40075ab8..00000000 --- a/test/test-suite/groups/function-clone/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$clone(foo)", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-clone/case001.json b/test/test-suite/groups/function-clone/case001.json deleted file mode 100644 index 4a1c8b73..00000000 --- a/test/test-suite/groups/function-clone/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$clone({})", - "dataset": "dataset5", - "bindings": {}, - "result": {} -} \ No newline at end of file diff --git a/test/test-suite/groups/function-clone/case002.json b/test/test-suite/groups/function-clone/case002.json deleted file mode 100644 index d597af71..00000000 --- a/test/test-suite/groups/function-clone/case002.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "$clone({\"a\": 1})", - "dataset": "dataset5", - "bindings": {}, - "result": { - "a": 1 - } -} \ No newline at end of file diff --git a/test/test-suite/groups/function-contains/case000.json b/test/test-suite/groups/function-contains/case000.json deleted file mode 100644 index 9cf6db3d..00000000 --- a/test/test-suite/groups/function-contains/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$contains(\"Hello World\", \"lo\")", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-contains/case001.json b/test/test-suite/groups/function-contains/case001.json deleted file mode 100644 index 5eb63dae..00000000 --- a/test/test-suite/groups/function-contains/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$contains(\"Hello World\", \"World\")", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-contains/case002.json b/test/test-suite/groups/function-contains/case002.json deleted file mode 100644 index 8b9676cc..00000000 --- a/test/test-suite/groups/function-contains/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$contains(\"Hello World\", \"world\")", - "dataset": null, - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-contains/case003.json b/test/test-suite/groups/function-contains/case003.json deleted file mode 100644 index 4002ab67..00000000 --- a/test/test-suite/groups/function-contains/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$contains(\"Hello World\", \"Word\")", - "dataset": null, - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-contains/case004.json b/test/test-suite/groups/function-contains/case004.json deleted file mode 100644 index 8ae7f828..00000000 --- a/test/test-suite/groups/function-contains/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$contains(nothing, \"World\")", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-contains/case005.json b/test/test-suite/groups/function-contains/case005.json deleted file mode 100644 index baca1ae1..00000000 --- a/test/test-suite/groups/function-contains/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$contains(23, 3)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-contains/case006.json b/test/test-suite/groups/function-contains/case006.json deleted file mode 100644 index 94085bf1..00000000 --- a/test/test-suite/groups/function-contains/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$contains(\"23\", 3)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-count/case000.json b/test/test-suite/groups/function-count/case000.json deleted file mode 100644 index 736f91e6..00000000 --- a/test/test-suite/groups/function-count/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$count(Account.Order.Product.(Price * Quantity))", - "dataset": "dataset5", - "bindings": {}, - "result": 4 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-count/case001.json b/test/test-suite/groups/function-count/case001.json deleted file mode 100644 index d27256a5..00000000 --- a/test/test-suite/groups/function-count/case001.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Account.Order.$count(Product.(Price * Quantity))", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 2, - 2 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-count/case002.json b/test/test-suite/groups/function-count/case002.json deleted file mode 100644 index 9ec0f151..00000000 --- a/test/test-suite/groups/function-count/case002.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Account.Order.(OrderID & \": \" & $count(Product.(Price*Quantity)))", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "order103: 2", - "order104: 2" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-count/case003.json b/test/test-suite/groups/function-count/case003.json deleted file mode 100644 index e6b356eb..00000000 --- a/test/test-suite/groups/function-count/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$count([])", - "dataset": null, - "bindings": {}, - "result": 0 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-count/case004.json b/test/test-suite/groups/function-count/case004.json deleted file mode 100644 index 2a2f3ae9..00000000 --- a/test/test-suite/groups/function-count/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$count([1,2,3])", - "dataset": null, - "bindings": {}, - "result": 3 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-count/case005.json b/test/test-suite/groups/function-count/case005.json deleted file mode 100644 index e4304849..00000000 --- a/test/test-suite/groups/function-count/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$count([\"1\",\"2\",\"3\"])", - "dataset": null, - "bindings": {}, - "result": 3 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-count/case006.json b/test/test-suite/groups/function-count/case006.json deleted file mode 100644 index 46219706..00000000 --- a/test/test-suite/groups/function-count/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$count([\"1\",\"2\",3])", - "dataset": null, - "bindings": {}, - "result": 3 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-count/case007.json b/test/test-suite/groups/function-count/case007.json deleted file mode 100644 index d387bde2..00000000 --- a/test/test-suite/groups/function-count/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$count(1)", - "dataset": null, - "bindings": {}, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-count/case008.json b/test/test-suite/groups/function-count/case008.json deleted file mode 100644 index 7f210176..00000000 --- a/test/test-suite/groups/function-count/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$count([],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-count/case009.json b/test/test-suite/groups/function-count/case009.json deleted file mode 100644 index 114c41a1..00000000 --- a/test/test-suite/groups/function-count/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$count([1,2,3],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-count/case010.json b/test/test-suite/groups/function-count/case010.json deleted file mode 100644 index 2fda57cf..00000000 --- a/test/test-suite/groups/function-count/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$count([],[],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-count/case011.json b/test/test-suite/groups/function-count/case011.json deleted file mode 100644 index e93d8e4e..00000000 --- a/test/test-suite/groups/function-count/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$count([1,2],[],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-count/case012.json b/test/test-suite/groups/function-count/case012.json deleted file mode 100644 index eb691912..00000000 --- a/test/test-suite/groups/function-count/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$count(undefined)", - "dataset": null, - "bindings": {}, - "result": 0 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-count/case013.json b/test/test-suite/groups/function-count/case013.json deleted file mode 100644 index e7fa8d6f..00000000 --- a/test/test-suite/groups/function-count/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$count([1,2,3,4]) / 2", - "dataset": null, - "bindings": {}, - "result": 2 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-each/case000.json b/test/test-suite/groups/function-each/case000.json deleted file mode 100644 index 970b4b1d..00000000 --- a/test/test-suite/groups/function-each/case000.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "$each(Address, λ($v, $k) {$k & \": \" & $v})", - "dataset": "dataset1", - "bindings": {}, - "result": [ - "Street: Hursley Park", - "City: Winchester", - "Postcode: SO21 2JN" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-each/case001.json b/test/test-suite/groups/function-each/case001.json deleted file mode 100644 index fb112cfa..00000000 --- a/test/test-suite/groups/function-each/case001.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "$reverse([1..5])", - "dataset": "dataset1", - "bindings": {}, - "result": [ - 5, - 4, - 3, - 2, - 1 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-each/case002.json b/test/test-suite/groups/function-each/case002.json deleted file mode 100644 index ae40617f..00000000 --- a/test/test-suite/groups/function-each/case002.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "expr": "[[$], [$reverse($)], [$]]", - "data": [ - 1, - 2, - 3 - ], - "bindings": {}, - "result": [ - [ - 1, - 2, - 3 - ], - [ - 3, - 2, - 1 - ], - [ - 1, - 2, - 3 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-each/case003.json b/test/test-suite/groups/function-each/case003.json deleted file mode 100644 index 6967223c..00000000 --- a/test/test-suite/groups/function-each/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$reverse(nothing)", - "dataset": "dataset1", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-each/case004.json b/test/test-suite/groups/function-each/case004.json deleted file mode 100644 index 58982632..00000000 --- a/test/test-suite/groups/function-each/case004.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "$reverse([1])", - "dataset": "dataset1", - "bindings": {}, - "result": [ - 1 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case000.json b/test/test-suite/groups/function-exists/case000.json deleted file mode 100644 index 241d79e6..00000000 --- a/test/test-suite/groups/function-exists/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists(\"Hello World\")", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case001.json b/test/test-suite/groups/function-exists/case001.json deleted file mode 100644 index 52759bfd..00000000 --- a/test/test-suite/groups/function-exists/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists(\"\")", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case002.json b/test/test-suite/groups/function-exists/case002.json deleted file mode 100644 index 7d950a90..00000000 --- a/test/test-suite/groups/function-exists/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists(true)", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case003.json b/test/test-suite/groups/function-exists/case003.json deleted file mode 100644 index dddee531..00000000 --- a/test/test-suite/groups/function-exists/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists(false)", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case004.json b/test/test-suite/groups/function-exists/case004.json deleted file mode 100644 index ca7ab5c4..00000000 --- a/test/test-suite/groups/function-exists/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists(0)", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case005.json b/test/test-suite/groups/function-exists/case005.json deleted file mode 100644 index 29c0274b..00000000 --- a/test/test-suite/groups/function-exists/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists(-0.5)", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case006.json b/test/test-suite/groups/function-exists/case006.json deleted file mode 100644 index 8de43dd3..00000000 --- a/test/test-suite/groups/function-exists/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists(null)", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case007.json b/test/test-suite/groups/function-exists/case007.json deleted file mode 100644 index c0ca0a79..00000000 --- a/test/test-suite/groups/function-exists/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists([])", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case008.json b/test/test-suite/groups/function-exists/case008.json deleted file mode 100644 index 24b88a46..00000000 --- a/test/test-suite/groups/function-exists/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists([0])", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case009.json b/test/test-suite/groups/function-exists/case009.json deleted file mode 100644 index 9240dc54..00000000 --- a/test/test-suite/groups/function-exists/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists([1,2,3])", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case010.json b/test/test-suite/groups/function-exists/case010.json deleted file mode 100644 index fe45826a..00000000 --- a/test/test-suite/groups/function-exists/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists([[]])", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case011.json b/test/test-suite/groups/function-exists/case011.json deleted file mode 100644 index 17ccfc9d..00000000 --- a/test/test-suite/groups/function-exists/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists([[null]])", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case012.json b/test/test-suite/groups/function-exists/case012.json deleted file mode 100644 index 2c7d3c4d..00000000 --- a/test/test-suite/groups/function-exists/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists([[[true]]])", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case013.json b/test/test-suite/groups/function-exists/case013.json deleted file mode 100644 index ec2503bc..00000000 --- a/test/test-suite/groups/function-exists/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists({})", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case014.json b/test/test-suite/groups/function-exists/case014.json deleted file mode 100644 index e613fa4e..00000000 --- a/test/test-suite/groups/function-exists/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists({\"hello\":\"world\"})", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case015.json b/test/test-suite/groups/function-exists/case015.json deleted file mode 100644 index 27e949fa..00000000 --- a/test/test-suite/groups/function-exists/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists(Account)", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case016.json b/test/test-suite/groups/function-exists/case016.json deleted file mode 100644 index fcc61d6f..00000000 --- a/test/test-suite/groups/function-exists/case016.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists(Account.Order.Product.Price)", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case017.json b/test/test-suite/groups/function-exists/case017.json deleted file mode 100644 index 6f6148ab..00000000 --- a/test/test-suite/groups/function-exists/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists($exists)", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case018.json b/test/test-suite/groups/function-exists/case018.json deleted file mode 100644 index ec9a02df..00000000 --- a/test/test-suite/groups/function-exists/case018.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists(function(){true})", - "dataset": "dataset5", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case019.json b/test/test-suite/groups/function-exists/case019.json deleted file mode 100644 index 453e5b6c..00000000 --- a/test/test-suite/groups/function-exists/case019.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists(blah)", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case020.json b/test/test-suite/groups/function-exists/case020.json deleted file mode 100644 index 4c04cfa1..00000000 --- a/test/test-suite/groups/function-exists/case020.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists(Account.blah)", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case021.json b/test/test-suite/groups/function-exists/case021.json deleted file mode 100644 index 60f3dc82..00000000 --- a/test/test-suite/groups/function-exists/case021.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists(Account.Order[2])", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case022.json b/test/test-suite/groups/function-exists/case022.json deleted file mode 100644 index 7b395d5d..00000000 --- a/test/test-suite/groups/function-exists/case022.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists(Account.Order[0].blah)", - "dataset": "dataset5", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case023.json b/test/test-suite/groups/function-exists/case023.json deleted file mode 100644 index b4641a9d..00000000 --- a/test/test-suite/groups/function-exists/case023.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists(2,3)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-exists/case024.json b/test/test-suite/groups/function-exists/case024.json deleted file mode 100644 index 6955902a..00000000 --- a/test/test-suite/groups/function-exists/case024.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$exists()", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-floor/case000.json b/test/test-suite/groups/function-floor/case000.json deleted file mode 100644 index c8650941..00000000 --- a/test/test-suite/groups/function-floor/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$floor(3.7)", - "dataset": null, - "bindings": {}, - "result": 3 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-floor/case001.json b/test/test-suite/groups/function-floor/case001.json deleted file mode 100644 index ce9aa9f4..00000000 --- a/test/test-suite/groups/function-floor/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$floor(-3.7)", - "dataset": null, - "bindings": {}, - "result": -4 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-floor/case002.json b/test/test-suite/groups/function-floor/case002.json deleted file mode 100644 index 2f97c4e9..00000000 --- a/test/test-suite/groups/function-floor/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$floor(0)", - "dataset": null, - "bindings": {}, - "result": 0 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-floor/case003.json b/test/test-suite/groups/function-floor/case003.json deleted file mode 100644 index e424a3e3..00000000 --- a/test/test-suite/groups/function-floor/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$floor(nothing)", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatBase/case000.json b/test/test-suite/groups/function-formatBase/case000.json deleted file mode 100644 index 90a91021..00000000 --- a/test/test-suite/groups/function-formatBase/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatBase(100)", - "dataset": null, - "bindings": {}, - "result": "100" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatBase/case001.json b/test/test-suite/groups/function-formatBase/case001.json deleted file mode 100644 index 64380a3a..00000000 --- a/test/test-suite/groups/function-formatBase/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatBase(nothing)", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatBase/case002.json b/test/test-suite/groups/function-formatBase/case002.json deleted file mode 100644 index 1ebf1873..00000000 --- a/test/test-suite/groups/function-formatBase/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatBase(100, 2)", - "dataset": null, - "bindings": {}, - "result": "1100100" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatBase/case003.json b/test/test-suite/groups/function-formatBase/case003.json deleted file mode 100644 index 634802cc..00000000 --- a/test/test-suite/groups/function-formatBase/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatBase(-100, 2)", - "dataset": null, - "bindings": {}, - "result": "-1100100" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatBase/case004.json b/test/test-suite/groups/function-formatBase/case004.json deleted file mode 100644 index 82e6ae23..00000000 --- a/test/test-suite/groups/function-formatBase/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatBase(100, 36)", - "dataset": null, - "bindings": {}, - "result": "2s" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatBase/case005.json b/test/test-suite/groups/function-formatBase/case005.json deleted file mode 100644 index bc79f2cb..00000000 --- a/test/test-suite/groups/function-formatBase/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatBase(99.5, 2.5)", - "dataset": null, - "bindings": {}, - "result": "1100100" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatBase/case006.json b/test/test-suite/groups/function-formatBase/case006.json deleted file mode 100644 index f8f33641..00000000 --- a/test/test-suite/groups/function-formatBase/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatBase(100, 1)", - "dataset": null, - "bindings": {}, - "code": "D3100" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatBase/case007.json b/test/test-suite/groups/function-formatBase/case007.json deleted file mode 100644 index c2aad9ec..00000000 --- a/test/test-suite/groups/function-formatBase/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatBase(100, 37)", - "dataset": null, - "bindings": {}, - "code": "D3100" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case000.json b/test/test-suite/groups/function-formatNumber/case000.json deleted file mode 100644 index 89426477..00000000 --- a/test/test-suite/groups/function-formatNumber/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(12345.6, \"#,###.00\")", - "dataset": null, - "bindings": {}, - "result": "12,345.60" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case001.json b/test/test-suite/groups/function-formatNumber/case001.json deleted file mode 100644 index 28eeff7e..00000000 --- a/test/test-suite/groups/function-formatNumber/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(12345678.9, \"9,999.99\")", - "dataset": null, - "bindings": {}, - "result": "12,345,678.90" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case002.json b/test/test-suite/groups/function-formatNumber/case002.json deleted file mode 100644 index daaa39ea..00000000 --- a/test/test-suite/groups/function-formatNumber/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(123412345678.9, \"9,9,99.99\")", - "dataset": null, - "bindings": {}, - "result": "123412345,6,78.90" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case003.json b/test/test-suite/groups/function-formatNumber/case003.json deleted file mode 100644 index fbe29cb0..00000000 --- a/test/test-suite/groups/function-formatNumber/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(1234.56789, \"9,999.999,999\")", - "dataset": null, - "bindings": {}, - "result": "1,234.567,890" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case004.json b/test/test-suite/groups/function-formatNumber/case004.json deleted file mode 100644 index 98313549..00000000 --- a/test/test-suite/groups/function-formatNumber/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(123.9, \"9999\")", - "dataset": null, - "bindings": {}, - "result": "0124" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case005.json b/test/test-suite/groups/function-formatNumber/case005.json deleted file mode 100644 index 6241c55f..00000000 --- a/test/test-suite/groups/function-formatNumber/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(0.14, \"01%\")", - "dataset": null, - "bindings": {}, - "result": "14%" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case006.json b/test/test-suite/groups/function-formatNumber/case006.json deleted file mode 100644 index 13a5c8b2..00000000 --- a/test/test-suite/groups/function-formatNumber/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(0.4857,\"###.###‰\")", - "dataset": null, - "bindings": {}, - "result": "485.7‰" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case007.json b/test/test-suite/groups/function-formatNumber/case007.json deleted file mode 100644 index f3869870..00000000 --- a/test/test-suite/groups/function-formatNumber/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(0.14, \"###pm\", {\"per-mille\": \"pm\"})", - "dataset": null, - "bindings": {}, - "result": "140pm" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case008.json b/test/test-suite/groups/function-formatNumber/case008.json deleted file mode 100644 index 31843ac2..00000000 --- a/test/test-suite/groups/function-formatNumber/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(-6, \"000\")", - "dataset": null, - "bindings": {}, - "result": "-006" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case009.json b/test/test-suite/groups/function-formatNumber/case009.json deleted file mode 100644 index 707d190d..00000000 --- a/test/test-suite/groups/function-formatNumber/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(1234.5678, \"00.000e0\")", - "dataset": null, - "bindings": {}, - "result": "12.346e2" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case010.json b/test/test-suite/groups/function-formatNumber/case010.json deleted file mode 100644 index 9a5e35b9..00000000 --- a/test/test-suite/groups/function-formatNumber/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(1234.5678, \"00.000e000\")", - "dataset": null, - "bindings": {}, - "result": "12.346e002" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case011.json b/test/test-suite/groups/function-formatNumber/case011.json deleted file mode 100644 index 3cf8465d..00000000 --- a/test/test-suite/groups/function-formatNumber/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(1234.5678, \"①①.①①①e①\", {\"zero-digit\": \"⑟\"})", - "dataset": null, - "bindings": {}, - "result": "①②.③④⑥e②" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case012.json b/test/test-suite/groups/function-formatNumber/case012.json deleted file mode 100644 index f8808b45..00000000 --- a/test/test-suite/groups/function-formatNumber/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(0.234, \"0.0e0\")", - "dataset": null, - "bindings": {}, - "result": "2.3e-1" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case013.json b/test/test-suite/groups/function-formatNumber/case013.json deleted file mode 100644 index bce24c87..00000000 --- a/test/test-suite/groups/function-formatNumber/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(0.234, \"#.00e0\")", - "dataset": null, - "bindings": {}, - "result": "0.23e0" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case014.json b/test/test-suite/groups/function-formatNumber/case014.json deleted file mode 100644 index b2e2f15a..00000000 --- a/test/test-suite/groups/function-formatNumber/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(0.123, \"#.e9\")", - "dataset": null, - "bindings": {}, - "result": "0.1e0" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case015.json b/test/test-suite/groups/function-formatNumber/case015.json deleted file mode 100644 index ef90eb16..00000000 --- a/test/test-suite/groups/function-formatNumber/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(0.234, \".00e0\")", - "dataset": null, - "bindings": {}, - "result": ".23e0" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case016.json b/test/test-suite/groups/function-formatNumber/case016.json deleted file mode 100644 index 82f1b924..00000000 --- a/test/test-suite/groups/function-formatNumber/case016.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(2392.14*(-36.58), \"000,000.000###;###,###.000###\")", - "dataset": null, - "bindings": {}, - "result": "87,504.4812" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case017.json b/test/test-suite/groups/function-formatNumber/case017.json deleted file mode 100644 index 38f9e6e2..00000000 --- a/test/test-suite/groups/function-formatNumber/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(2.14*86.58,\"PREFIX##00.000###SUFFIX\")", - "dataset": null, - "bindings": {}, - "result": "PREFIX185.2812SUFFIX" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case018.json b/test/test-suite/groups/function-formatNumber/case018.json deleted file mode 100644 index 8745366b..00000000 --- a/test/test-suite/groups/function-formatNumber/case018.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(1E20,\"#,######\")", - "dataset": null, - "bindings": {}, - "result": "100,000000,000000,000000" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case019.json b/test/test-suite/groups/function-formatNumber/case019.json deleted file mode 100644 index 36e04a24..00000000 --- a/test/test-suite/groups/function-formatNumber/case019.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(20,\"#;#;#\")", - "dataset": null, - "bindings": {}, - "code": "D3080" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case020.json b/test/test-suite/groups/function-formatNumber/case020.json deleted file mode 100644 index 19e400f3..00000000 --- a/test/test-suite/groups/function-formatNumber/case020.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(20,\"#.0.0\")", - "dataset": null, - "bindings": {}, - "code": "D3081" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case021.json b/test/test-suite/groups/function-formatNumber/case021.json deleted file mode 100644 index 007d9380..00000000 --- a/test/test-suite/groups/function-formatNumber/case021.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(20,\"#0%%\")", - "dataset": null, - "bindings": {}, - "code": "D3082" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case022.json b/test/test-suite/groups/function-formatNumber/case022.json deleted file mode 100644 index 2ec5141d..00000000 --- a/test/test-suite/groups/function-formatNumber/case022.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(20,\"#0‰‰\")", - "dataset": null, - "bindings": {}, - "code": "D3083" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case023.json b/test/test-suite/groups/function-formatNumber/case023.json deleted file mode 100644 index ddea4c20..00000000 --- a/test/test-suite/groups/function-formatNumber/case023.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(20,\"#0%‰\")", - "dataset": null, - "bindings": {}, - "code": "D3084" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case024.json b/test/test-suite/groups/function-formatNumber/case024.json deleted file mode 100644 index 43cbb66b..00000000 --- a/test/test-suite/groups/function-formatNumber/case024.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(20,\".e0\")", - "dataset": null, - "bindings": {}, - "code": "D3085" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case025.json b/test/test-suite/groups/function-formatNumber/case025.json deleted file mode 100644 index 814e2d59..00000000 --- a/test/test-suite/groups/function-formatNumber/case025.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(20,\"0+.e0\")", - "dataset": null, - "bindings": {}, - "code": "D3086" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case026.json b/test/test-suite/groups/function-formatNumber/case026.json deleted file mode 100644 index fe73e520..00000000 --- a/test/test-suite/groups/function-formatNumber/case026.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(20,\"0,.e0\")", - "dataset": null, - "bindings": {}, - "code": "D3087" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case027.json b/test/test-suite/groups/function-formatNumber/case027.json deleted file mode 100644 index 5ab38d95..00000000 --- a/test/test-suite/groups/function-formatNumber/case027.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(20,\"0,\")", - "dataset": null, - "bindings": {}, - "code": "D3088" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case028.json b/test/test-suite/groups/function-formatNumber/case028.json deleted file mode 100644 index 945ae0bc..00000000 --- a/test/test-suite/groups/function-formatNumber/case028.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(20,\"0,,0\")", - "dataset": null, - "bindings": {}, - "code": "D3089" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case029.json b/test/test-suite/groups/function-formatNumber/case029.json deleted file mode 100644 index d8b7ec21..00000000 --- a/test/test-suite/groups/function-formatNumber/case029.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(20,\"0#.e0\")", - "dataset": null, - "bindings": {}, - "code": "D3090" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case030.json b/test/test-suite/groups/function-formatNumber/case030.json deleted file mode 100644 index dae1eb45..00000000 --- a/test/test-suite/groups/function-formatNumber/case030.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(20,\"#0.#0e0\")", - "dataset": null, - "bindings": {}, - "code": "D3091" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case031.json b/test/test-suite/groups/function-formatNumber/case031.json deleted file mode 100644 index 8f3bc92b..00000000 --- a/test/test-suite/groups/function-formatNumber/case031.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(20,\"#0.0e0%\")", - "dataset": null, - "bindings": {}, - "code": "D3092" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-formatNumber/case032.json b/test/test-suite/groups/function-formatNumber/case032.json deleted file mode 100644 index fdffc78b..00000000 --- a/test/test-suite/groups/function-formatNumber/case032.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$formatNumber(20,\"#0.0e0,0\")", - "dataset": null, - "bindings": {}, - "code": "D3093" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-fromMillis/case000.json b/test/test-suite/groups/function-fromMillis/case000.json deleted file mode 100644 index ca08c4f6..00000000 --- a/test/test-suite/groups/function-fromMillis/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$fromMillis(1)", - "dataset": "dataset5", - "bindings": {}, - "result": "1970-01-01T00:00:00.001Z" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-fromMillis/case001.json b/test/test-suite/groups/function-fromMillis/case001.json deleted file mode 100644 index ff59f2e5..00000000 --- a/test/test-suite/groups/function-fromMillis/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$fromMillis(1509380732935)", - "dataset": "dataset5", - "bindings": {}, - "result": "2017-10-30T16:25:32.935Z" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-fromMillis/case002.json b/test/test-suite/groups/function-fromMillis/case002.json deleted file mode 100644 index 9975c636..00000000 --- a/test/test-suite/groups/function-fromMillis/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$fromMillis(foo)", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-join/case000.json b/test/test-suite/groups/function-join/case000.json deleted file mode 100644 index df0ae720..00000000 --- a/test/test-suite/groups/function-join/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$join(\"hello\")", - "dataset": null, - "bindings": {}, - "result": "hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-join/case001.json b/test/test-suite/groups/function-join/case001.json deleted file mode 100644 index 13a2e717..00000000 --- a/test/test-suite/groups/function-join/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$join([\"hello\"])", - "dataset": null, - "bindings": {}, - "result": "hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-join/case002.json b/test/test-suite/groups/function-join/case002.json deleted file mode 100644 index 7711aa96..00000000 --- a/test/test-suite/groups/function-join/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$join([\"hello\", \"world\"])", - "dataset": null, - "bindings": {}, - "result": "helloworld" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-join/case003.json b/test/test-suite/groups/function-join/case003.json deleted file mode 100644 index e04cd30f..00000000 --- a/test/test-suite/groups/function-join/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$join([\"hello\", \"world\"], \", \")", - "dataset": null, - "bindings": {}, - "result": "hello, world" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-join/case004.json b/test/test-suite/groups/function-join/case004.json deleted file mode 100644 index 8281010a..00000000 --- a/test/test-suite/groups/function-join/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$join([], \", \")", - "dataset": null, - "bindings": {}, - "result": "" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-join/case005.json b/test/test-suite/groups/function-join/case005.json deleted file mode 100644 index c7580df4..00000000 --- a/test/test-suite/groups/function-join/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$join(Account.Order.Product.Description.Colour, \", \")", - "dataset": "dataset5", - "bindings": {}, - "result": "Purple, Orange, Purple, Black" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-join/case006.json b/test/test-suite/groups/function-join/case006.json deleted file mode 100644 index 32342a4d..00000000 --- a/test/test-suite/groups/function-join/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$join(Account.Order.Product.Description.Colour, no.sep)", - "dataset": "dataset5", - "bindings": {}, - "result": "PurpleOrangePurpleBlack" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-join/case007.json b/test/test-suite/groups/function-join/case007.json deleted file mode 100644 index 8dcd5d1c..00000000 --- a/test/test-suite/groups/function-join/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$join(Account.blah.Product.Description.Colour, \", \")", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-join/case008.json b/test/test-suite/groups/function-join/case008.json deleted file mode 100644 index 6548fa59..00000000 --- a/test/test-suite/groups/function-join/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$join(true, \", \")", - "dataset": null, - "bindings": {}, - "code": "T0412" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-join/case009.json b/test/test-suite/groups/function-join/case009.json deleted file mode 100644 index ac5cd27f..00000000 --- a/test/test-suite/groups/function-join/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$join([1,2,3], \", \")", - "dataset": null, - "bindings": {}, - "code": "T0412" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-join/case010.json b/test/test-suite/groups/function-join/case010.json deleted file mode 100644 index d9dbbee6..00000000 --- a/test/test-suite/groups/function-join/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$join([\"hello\"], 3)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-join/case011.json b/test/test-suite/groups/function-join/case011.json deleted file mode 100644 index 6f84e0b0..00000000 --- a/test/test-suite/groups/function-join/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$join()", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-keys/case000.json b/test/test-suite/groups/function-keys/case000.json deleted file mode 100644 index 71e9c29f..00000000 --- a/test/test-suite/groups/function-keys/case000.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "$keys(Account)", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "Account Name", - "Order" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-keys/case001.json b/test/test-suite/groups/function-keys/case001.json deleted file mode 100644 index f813e486..00000000 --- a/test/test-suite/groups/function-keys/case001.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "expr": "$keys(Account.Order.Product)", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "Product Name", - "ProductID", - "SKU", - "Description", - "Price", - "Quantity" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-keys/case002.json b/test/test-suite/groups/function-keys/case002.json deleted file mode 100644 index fde16468..00000000 --- a/test/test-suite/groups/function-keys/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$keys({})", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-keys/case003.json b/test/test-suite/groups/function-keys/case003.json deleted file mode 100644 index e3463230..00000000 --- a/test/test-suite/groups/function-keys/case003.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "$keys({\"foo\":{}})", - "dataset": null, - "bindings": {}, - "result": [ - "foo" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-keys/case004.json b/test/test-suite/groups/function-keys/case004.json deleted file mode 100644 index ded845ec..00000000 --- a/test/test-suite/groups/function-keys/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$keys(\"foo\")", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-keys/case005.json b/test/test-suite/groups/function-keys/case005.json deleted file mode 100644 index 57f00aa7..00000000 --- a/test/test-suite/groups/function-keys/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$keys(function(){1})", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-keys/case006.json b/test/test-suite/groups/function-keys/case006.json deleted file mode 100644 index 47979881..00000000 --- a/test/test-suite/groups/function-keys/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$keys([\"foo\", \"bar\"])", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case000.json b/test/test-suite/groups/function-length/case000.json deleted file mode 100644 index ba27a8ec..00000000 --- a/test/test-suite/groups/function-length/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length(\"\")", - "dataset": null, - "bindings": {}, - "result": 0 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case001.json b/test/test-suite/groups/function-length/case001.json deleted file mode 100644 index 27c2442e..00000000 --- a/test/test-suite/groups/function-length/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length(\"hello\")", - "dataset": null, - "bindings": {}, - "result": 5 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case002.json b/test/test-suite/groups/function-length/case002.json deleted file mode 100644 index 4fc1f26f..00000000 --- a/test/test-suite/groups/function-length/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length(missing)", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case003.json b/test/test-suite/groups/function-length/case003.json deleted file mode 100644 index 29829684..00000000 --- a/test/test-suite/groups/function-length/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length(\"\\u03BB-calculus\")", - "dataset": null, - "bindings": {}, - "result": 10 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case004.json b/test/test-suite/groups/function-length/case004.json deleted file mode 100644 index 13d616f3..00000000 --- a/test/test-suite/groups/function-length/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length(\"\\uD834\\uDD1E\")", - "dataset": null, - "bindings": {}, - "result": 2 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case005.json b/test/test-suite/groups/function-length/case005.json deleted file mode 100644 index cd47df84..00000000 --- a/test/test-suite/groups/function-length/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length(\"𝄞\")", - "dataset": null, - "bindings": {}, - "result": 2 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case006.json b/test/test-suite/groups/function-length/case006.json deleted file mode 100644 index 35c7e1e1..00000000 --- a/test/test-suite/groups/function-length/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length(\"超明體繁\")", - "dataset": null, - "bindings": {}, - "result": 4 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case007.json b/test/test-suite/groups/function-length/case007.json deleted file mode 100644 index d33c1ea3..00000000 --- a/test/test-suite/groups/function-length/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length(\"\\t\")", - "dataset": null, - "bindings": {}, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case008.json b/test/test-suite/groups/function-length/case008.json deleted file mode 100644 index f856dcc4..00000000 --- a/test/test-suite/groups/function-length/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length(\"\\n\")", - "dataset": null, - "bindings": {}, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case009.json b/test/test-suite/groups/function-length/case009.json deleted file mode 100644 index 70d4b18b..00000000 --- a/test/test-suite/groups/function-length/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length(1234)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case010.json b/test/test-suite/groups/function-length/case010.json deleted file mode 100644 index 6160ab69..00000000 --- a/test/test-suite/groups/function-length/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length(null)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case011.json b/test/test-suite/groups/function-length/case011.json deleted file mode 100644 index a41c8493..00000000 --- a/test/test-suite/groups/function-length/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length(true)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case012.json b/test/test-suite/groups/function-length/case012.json deleted file mode 100644 index 9a51f691..00000000 --- a/test/test-suite/groups/function-length/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length([\"str\"])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case013.json b/test/test-suite/groups/function-length/case013.json deleted file mode 100644 index aac3bb39..00000000 --- a/test/test-suite/groups/function-length/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length()", - "data": 23, - "bindings": {}, - "code": "T0411" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case014.json b/test/test-suite/groups/function-length/case014.json deleted file mode 100644 index 7b77ce50..00000000 --- a/test/test-suite/groups/function-length/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length()", - "dataset": "dataset5", - "bindings": {}, - "code": "T0411" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-length/case015.json b/test/test-suite/groups/function-length/case015.json deleted file mode 100644 index 2835b1b0..00000000 --- a/test/test-suite/groups/function-length/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$length(\"Hello\", \"World\")", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-lookup/case000.json b/test/test-suite/groups/function-lookup/case000.json deleted file mode 100644 index b539cd07..00000000 --- a/test/test-suite/groups/function-lookup/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lookup(Account, \"Account Name\")", - "dataset": "dataset5", - "bindings": {}, - "result": "Firefly" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-lookup/case001.json b/test/test-suite/groups/function-lookup/case001.json deleted file mode 100644 index 8c4f88ca..00000000 --- a/test/test-suite/groups/function-lookup/case001.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "$lookup(Account.Order.Product, \"Product Name\")", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "Bowler Hat", - "Trilby hat", - "Bowler Hat", - "Cloak" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-lookup/case002.json b/test/test-suite/groups/function-lookup/case002.json deleted file mode 100644 index b308fab9..00000000 --- a/test/test-suite/groups/function-lookup/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lookup(Account.Order.Product.ProductID, \"Product Name\")", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-lookup/case003.json b/test/test-suite/groups/function-lookup/case003.json deleted file mode 100644 index 2091120e..00000000 --- a/test/test-suite/groups/function-lookup/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lookup($$, \"gust\")", - "dataset": "dataset9", - "bindings": {}, - "result": null -} \ No newline at end of file diff --git a/test/test-suite/groups/function-lowercase/case000.json b/test/test-suite/groups/function-lowercase/case000.json deleted file mode 100644 index 9973d46b..00000000 --- a/test/test-suite/groups/function-lowercase/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lowercase(\"Hello World\")", - "dataset": "dataset5", - "bindings": {}, - "result": "hello world" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-lowercase/case001.json b/test/test-suite/groups/function-lowercase/case001.json deleted file mode 100644 index 1efa5256..00000000 --- a/test/test-suite/groups/function-lowercase/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lowercase(blah)", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case000.json b/test/test-suite/groups/function-max/case000.json deleted file mode 100644 index 8670957e..00000000 --- a/test/test-suite/groups/function-max/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$max(Account.Order.Product.(Price * Quantity))", - "dataset": "dataset5", - "bindings": {}, - "result": 137.8 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case001.json b/test/test-suite/groups/function-max/case001.json deleted file mode 100644 index c3418e9b..00000000 --- a/test/test-suite/groups/function-max/case001.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Account.Order.$max(Product.(Price * Quantity))", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 68.9, - 137.8 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case002.json b/test/test-suite/groups/function-max/case002.json deleted file mode 100644 index 9ec0f151..00000000 --- a/test/test-suite/groups/function-max/case002.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Account.Order.(OrderID & \": \" & $count(Product.(Price*Quantity)))", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "order103: 2", - "order104: 2" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case003.json b/test/test-suite/groups/function-max/case003.json deleted file mode 100644 index 2b1132eb..00000000 --- a/test/test-suite/groups/function-max/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$max([])", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case004.json b/test/test-suite/groups/function-max/case004.json deleted file mode 100644 index 7441d533..00000000 --- a/test/test-suite/groups/function-max/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$max([1,2,3])", - "dataset": null, - "bindings": {}, - "result": 3 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case005.json b/test/test-suite/groups/function-max/case005.json deleted file mode 100644 index 0c4ac6fe..00000000 --- a/test/test-suite/groups/function-max/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$max([\"1\",\"2\",\"3\"])", - "dataset": null, - "bindings": {}, - "code": "T0412" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case006.json b/test/test-suite/groups/function-max/case006.json deleted file mode 100644 index 53145ee7..00000000 --- a/test/test-suite/groups/function-max/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$max([\"1\",\"2\",3])", - "dataset": null, - "bindings": {}, - "code": "T0412" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case007.json b/test/test-suite/groups/function-max/case007.json deleted file mode 100644 index de447e86..00000000 --- a/test/test-suite/groups/function-max/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$max(1)", - "dataset": null, - "bindings": {}, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case008.json b/test/test-suite/groups/function-max/case008.json deleted file mode 100644 index 0772716d..00000000 --- a/test/test-suite/groups/function-max/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$max([-1,-5])", - "dataset": null, - "bindings": {}, - "result": -1 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case009.json b/test/test-suite/groups/function-max/case009.json deleted file mode 100644 index 9d322eb7..00000000 --- a/test/test-suite/groups/function-max/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$max([],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case010.json b/test/test-suite/groups/function-max/case010.json deleted file mode 100644 index bd9fc50e..00000000 --- a/test/test-suite/groups/function-max/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$max([1,2,3],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case011.json b/test/test-suite/groups/function-max/case011.json deleted file mode 100644 index bb96993d..00000000 --- a/test/test-suite/groups/function-max/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$max([],[],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case012.json b/test/test-suite/groups/function-max/case012.json deleted file mode 100644 index 7ce53d4e..00000000 --- a/test/test-suite/groups/function-max/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$max([1,2],[],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case013.json b/test/test-suite/groups/function-max/case013.json deleted file mode 100644 index e74815b6..00000000 --- a/test/test-suite/groups/function-max/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$max(undefined)", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case014.json b/test/test-suite/groups/function-max/case014.json deleted file mode 100644 index 59fbd0b2..00000000 --- a/test/test-suite/groups/function-max/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$min(Account.Order.Product.(Price * Quantity))", - "dataset": "dataset5", - "bindings": {}, - "result": 21.67 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case015.json b/test/test-suite/groups/function-max/case015.json deleted file mode 100644 index 5f4c1a88..00000000 --- a/test/test-suite/groups/function-max/case015.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Account.Order.$min(Product.(Price * Quantity))", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 21.67, - 107.99 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case016.json b/test/test-suite/groups/function-max/case016.json deleted file mode 100644 index f48409f4..00000000 --- a/test/test-suite/groups/function-max/case016.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Account.Order.(OrderID & \": \" & $min(Product.(Price*Quantity)))", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "order103: 21.67", - "order104: 107.99" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case017.json b/test/test-suite/groups/function-max/case017.json deleted file mode 100644 index 166c123b..00000000 --- a/test/test-suite/groups/function-max/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$min([])", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case018.json b/test/test-suite/groups/function-max/case018.json deleted file mode 100644 index 9902c373..00000000 --- a/test/test-suite/groups/function-max/case018.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$min([1,2,3])", - "dataset": null, - "bindings": {}, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case019.json b/test/test-suite/groups/function-max/case019.json deleted file mode 100644 index e257905f..00000000 --- a/test/test-suite/groups/function-max/case019.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$min([\"1\",\"2\",\"3\"])", - "dataset": null, - "bindings": {}, - "code": "T0412" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case020.json b/test/test-suite/groups/function-max/case020.json deleted file mode 100644 index 7c5b3100..00000000 --- a/test/test-suite/groups/function-max/case020.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$min([\"1\",\"2\",3])", - "dataset": null, - "bindings": {}, - "code": "T0412" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case021.json b/test/test-suite/groups/function-max/case021.json deleted file mode 100644 index 8a2d1fba..00000000 --- a/test/test-suite/groups/function-max/case021.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$min(1)", - "dataset": null, - "bindings": {}, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case022.json b/test/test-suite/groups/function-max/case022.json deleted file mode 100644 index f4caf21d..00000000 --- a/test/test-suite/groups/function-max/case022.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$min([],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case023.json b/test/test-suite/groups/function-max/case023.json deleted file mode 100644 index f6e6efb8..00000000 --- a/test/test-suite/groups/function-max/case023.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$min([1,2,3],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case024.json b/test/test-suite/groups/function-max/case024.json deleted file mode 100644 index bd6d263a..00000000 --- a/test/test-suite/groups/function-max/case024.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$min([],[],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case025.json b/test/test-suite/groups/function-max/case025.json deleted file mode 100644 index 7fea0739..00000000 --- a/test/test-suite/groups/function-max/case025.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$min([1,2],[],[])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-max/case026.json b/test/test-suite/groups/function-max/case026.json deleted file mode 100644 index 1b83ef5d..00000000 --- a/test/test-suite/groups/function-max/case026.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$min(undefined)", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-merge/case000.json b/test/test-suite/groups/function-merge/case000.json deleted file mode 100644 index 6234a17c..00000000 --- a/test/test-suite/groups/function-merge/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$merge(nothing)", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-merge/case001.json b/test/test-suite/groups/function-merge/case001.json deleted file mode 100644 index ddaa10ce..00000000 --- a/test/test-suite/groups/function-merge/case001.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "$merge({\"a\":1})", - "dataset": "dataset5", - "bindings": {}, - "result": { - "a": 1 - } -} \ No newline at end of file diff --git a/test/test-suite/groups/function-merge/case002.json b/test/test-suite/groups/function-merge/case002.json deleted file mode 100644 index ff679a5a..00000000 --- a/test/test-suite/groups/function-merge/case002.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "$merge([{\"a\":1}, {\"b\":2}])", - "dataset": "dataset5", - "bindings": {}, - "result": { - "a": 1, - "b": 2 - } -} \ No newline at end of file diff --git a/test/test-suite/groups/function-merge/case003.json b/test/test-suite/groups/function-merge/case003.json deleted file mode 100644 index 8c1c581c..00000000 --- a/test/test-suite/groups/function-merge/case003.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "$merge([{\"a\": 1}, {\"b\": 2, \"c\": 3}])", - "dataset": "dataset5", - "bindings": {}, - "result": { - "a": 1, - "b": 2, - "c": 3 - } -} \ No newline at end of file diff --git a/test/test-suite/groups/function-merge/case004.json b/test/test-suite/groups/function-merge/case004.json deleted file mode 100644 index d320ee3d..00000000 --- a/test/test-suite/groups/function-merge/case004.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "$merge([{\"a\": 1}, {\"b\": 2, \"a\": 3}])", - "dataset": "dataset5", - "bindings": {}, - "result": { - "a": 3, - "b": 2 - } -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case000.json b/test/test-suite/groups/function-number/case000.json deleted file mode 100644 index 6f1919d2..00000000 --- a/test/test-suite/groups/function-number/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(0)", - "dataset": null, - "bindings": {}, - "result": 0 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case001.json b/test/test-suite/groups/function-number/case001.json deleted file mode 100644 index 35d1ca10..00000000 --- a/test/test-suite/groups/function-number/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(10)", - "dataset": null, - "bindings": {}, - "result": 10 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case002.json b/test/test-suite/groups/function-number/case002.json deleted file mode 100644 index 2f58611a..00000000 --- a/test/test-suite/groups/function-number/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(-0.05)", - "dataset": null, - "bindings": {}, - "result": -0.05 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case003.json b/test/test-suite/groups/function-number/case003.json deleted file mode 100644 index a4057b35..00000000 --- a/test/test-suite/groups/function-number/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(\"0\")", - "dataset": null, - "bindings": {}, - "result": 0 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case004.json b/test/test-suite/groups/function-number/case004.json deleted file mode 100644 index 052f18a2..00000000 --- a/test/test-suite/groups/function-number/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(\"-0.05\")", - "dataset": null, - "bindings": {}, - "result": -0.05 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case005.json b/test/test-suite/groups/function-number/case005.json deleted file mode 100644 index 8df81dcb..00000000 --- a/test/test-suite/groups/function-number/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(\"1e2\")", - "dataset": null, - "bindings": {}, - "result": 100 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case006.json b/test/test-suite/groups/function-number/case006.json deleted file mode 100644 index d963271b..00000000 --- a/test/test-suite/groups/function-number/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(\"1.0e-2\")", - "dataset": null, - "bindings": {}, - "result": 0.01 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case007.json b/test/test-suite/groups/function-number/case007.json deleted file mode 100644 index 2cb5a084..00000000 --- a/test/test-suite/groups/function-number/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(\"1e0\")", - "dataset": null, - "bindings": {}, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case008.json b/test/test-suite/groups/function-number/case008.json deleted file mode 100644 index 388abd06..00000000 --- a/test/test-suite/groups/function-number/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(\"10e500\")", - "dataset": null, - "bindings": {}, - "code": "D3030" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case009.json b/test/test-suite/groups/function-number/case009.json deleted file mode 100644 index 7f45fad5..00000000 --- a/test/test-suite/groups/function-number/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(\"Hello world\")", - "dataset": null, - "bindings": {}, - "code": "D3030" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case010.json b/test/test-suite/groups/function-number/case010.json deleted file mode 100644 index cc05e9b6..00000000 --- a/test/test-suite/groups/function-number/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(\"1/2\")", - "dataset": null, - "bindings": {}, - "code": "D3030" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case011.json b/test/test-suite/groups/function-number/case011.json deleted file mode 100644 index 80d7b483..00000000 --- a/test/test-suite/groups/function-number/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(\"1234 hello\")", - "dataset": null, - "bindings": {}, - "code": "D3030" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case012.json b/test/test-suite/groups/function-number/case012.json deleted file mode 100644 index 14130ed9..00000000 --- a/test/test-suite/groups/function-number/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(\"\")", - "dataset": null, - "bindings": {}, - "code": "D3030" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case013.json b/test/test-suite/groups/function-number/case013.json deleted file mode 100644 index b860fc1a..00000000 --- a/test/test-suite/groups/function-number/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(true)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case014.json b/test/test-suite/groups/function-number/case014.json deleted file mode 100644 index aeb487fc..00000000 --- a/test/test-suite/groups/function-number/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(false)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case015.json b/test/test-suite/groups/function-number/case015.json deleted file mode 100644 index e16c182c..00000000 --- a/test/test-suite/groups/function-number/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(Account.blah)", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case016.json b/test/test-suite/groups/function-number/case016.json deleted file mode 100644 index 1680999c..00000000 --- a/test/test-suite/groups/function-number/case016.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(null)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case017.json b/test/test-suite/groups/function-number/case017.json deleted file mode 100644 index 93b816bf..00000000 --- a/test/test-suite/groups/function-number/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number([])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case018.json b/test/test-suite/groups/function-number/case018.json deleted file mode 100644 index bbe61052..00000000 --- a/test/test-suite/groups/function-number/case018.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(\"[1]\")", - "dataset": null, - "bindings": {}, - "code": "D3030" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case019.json b/test/test-suite/groups/function-number/case019.json deleted file mode 100644 index 8bdd9280..00000000 --- a/test/test-suite/groups/function-number/case019.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number([1,2])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case020.json b/test/test-suite/groups/function-number/case020.json deleted file mode 100644 index e129f4b8..00000000 --- a/test/test-suite/groups/function-number/case020.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number([\"hello\"])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case021.json b/test/test-suite/groups/function-number/case021.json deleted file mode 100644 index 6b6c01a9..00000000 --- a/test/test-suite/groups/function-number/case021.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number([\"2\"])", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case022.json b/test/test-suite/groups/function-number/case022.json deleted file mode 100644 index c2139b2d..00000000 --- a/test/test-suite/groups/function-number/case022.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number({})", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case023.json b/test/test-suite/groups/function-number/case023.json deleted file mode 100644 index 3703606c..00000000 --- a/test/test-suite/groups/function-number/case023.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number({\"hello\":\"world\"})", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case024.json b/test/test-suite/groups/function-number/case024.json deleted file mode 100644 index a576ea29..00000000 --- a/test/test-suite/groups/function-number/case024.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number($number)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case025.json b/test/test-suite/groups/function-number/case025.json deleted file mode 100644 index 50ab2d81..00000000 --- a/test/test-suite/groups/function-number/case025.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(function(){5})", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-number/case026.json b/test/test-suite/groups/function-number/case026.json deleted file mode 100644 index b7c32c5d..00000000 --- a/test/test-suite/groups/function-number/case026.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$number(1,2)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-pad/case000.json b/test/test-suite/groups/function-pad/case000.json deleted file mode 100644 index da8cc9ef..00000000 --- a/test/test-suite/groups/function-pad/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$pad(\"foo\", 5)", - "dataset": null, - "bindings": {}, - "result": "foo " -} \ No newline at end of file diff --git a/test/test-suite/groups/function-pad/case001.json b/test/test-suite/groups/function-pad/case001.json deleted file mode 100644 index 9e1bab44..00000000 --- a/test/test-suite/groups/function-pad/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$pad(\"foo\", -5)", - "dataset": null, - "bindings": {}, - "result": " foo" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-pad/case002.json b/test/test-suite/groups/function-pad/case002.json deleted file mode 100644 index 5416b19b..00000000 --- a/test/test-suite/groups/function-pad/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$pad(\"foo\", -5, \"#\")", - "dataset": null, - "bindings": {}, - "result": "##foo" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-pad/case003.json b/test/test-suite/groups/function-pad/case003.json deleted file mode 100644 index a5aca10b..00000000 --- a/test/test-suite/groups/function-pad/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$pad(\"foo\", 5, \"\")", - "dataset": null, - "bindings": {}, - "result": "foo " -} \ No newline at end of file diff --git a/test/test-suite/groups/function-pad/case004.json b/test/test-suite/groups/function-pad/case004.json deleted file mode 100644 index 5746999f..00000000 --- a/test/test-suite/groups/function-pad/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$pad(\"foo\", 1)", - "dataset": null, - "bindings": {}, - "result": "foo" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-pad/case005.json b/test/test-suite/groups/function-pad/case005.json deleted file mode 100644 index b1cf709a..00000000 --- a/test/test-suite/groups/function-pad/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$pad(\"foo\", 8, \"-+\")", - "dataset": null, - "bindings": {}, - "result": "foo-+-+-" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-pad/case006.json b/test/test-suite/groups/function-pad/case006.json deleted file mode 100644 index ccc5fba7..00000000 --- a/test/test-suite/groups/function-pad/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$pad(nothing, 1)", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-power/case000.json b/test/test-suite/groups/function-power/case000.json deleted file mode 100644 index 9ae3cbbc..00000000 --- a/test/test-suite/groups/function-power/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$power(4, 2)", - "dataset": null, - "bindings": {}, - "result": 16 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-power/case001.json b/test/test-suite/groups/function-power/case001.json deleted file mode 100644 index ddf93cbd..00000000 --- a/test/test-suite/groups/function-power/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$power(4, 0.5)", - "dataset": null, - "bindings": {}, - "result": 2 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-power/case002.json b/test/test-suite/groups/function-power/case002.json deleted file mode 100644 index 99902571..00000000 --- a/test/test-suite/groups/function-power/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$power(10, -2)", - "dataset": null, - "bindings": {}, - "result": 0.01 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-power/case003.json b/test/test-suite/groups/function-power/case003.json deleted file mode 100644 index 78edf382..00000000 --- a/test/test-suite/groups/function-power/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$power(-2, 3)", - "dataset": null, - "bindings": {}, - "result": -8 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-power/case004.json b/test/test-suite/groups/function-power/case004.json deleted file mode 100644 index bc846195..00000000 --- a/test/test-suite/groups/function-power/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$power(nothing, 3)", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-power/case005.json b/test/test-suite/groups/function-power/case005.json deleted file mode 100644 index b7df4c3e..00000000 --- a/test/test-suite/groups/function-power/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$power(-2, 1/3)", - "dataset": null, - "bindings": {}, - "code": "D3061" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-power/case006.json b/test/test-suite/groups/function-power/case006.json deleted file mode 100644 index 8dd0319d..00000000 --- a/test/test-suite/groups/function-power/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$power(100, 1000)", - "dataset": null, - "bindings": {}, - "code": "D3061" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-replace/case000.json b/test/test-suite/groups/function-replace/case000.json deleted file mode 100644 index fd5c7cc8..00000000 --- a/test/test-suite/groups/function-replace/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"Hello World\", \"World\", \"Everyone\")", - "dataset": null, - "bindings": {}, - "result": "Hello Everyone" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-replace/case001.json b/test/test-suite/groups/function-replace/case001.json deleted file mode 100644 index ac172554..00000000 --- a/test/test-suite/groups/function-replace/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"the cat sat on the mat\", \"at\", \"it\")", - "dataset": null, - "bindings": {}, - "result": "the cit sit on the mit" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-replace/case002.json b/test/test-suite/groups/function-replace/case002.json deleted file mode 100644 index 6fda4a96..00000000 --- a/test/test-suite/groups/function-replace/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"the cat sat on the mat\", \"at\", \"it\", 0)", - "dataset": null, - "bindings": {}, - "result": "the cat sat on the mat" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-replace/case003.json b/test/test-suite/groups/function-replace/case003.json deleted file mode 100644 index 6b286b8b..00000000 --- a/test/test-suite/groups/function-replace/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"the cat sat on the mat\", \"at\", \"it\", 2)", - "dataset": null, - "bindings": {}, - "result": "the cit sit on the mat" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-replace/case004.json b/test/test-suite/groups/function-replace/case004.json deleted file mode 100644 index 605fdd60..00000000 --- a/test/test-suite/groups/function-replace/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(nothing, \"at\", \"it\", 2)", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-replace/case005.json b/test/test-suite/groups/function-replace/case005.json deleted file mode 100644 index 48b1a98b..00000000 --- a/test/test-suite/groups/function-replace/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"hello\")", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-replace/case006.json b/test/test-suite/groups/function-replace/case006.json deleted file mode 100644 index 77637007..00000000 --- a/test/test-suite/groups/function-replace/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"hello\", \"l\", \"1\", null)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-replace/case007.json b/test/test-suite/groups/function-replace/case007.json deleted file mode 100644 index 8698a9b2..00000000 --- a/test/test-suite/groups/function-replace/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"hello\", \"l\", \"1\", -2)", - "dataset": null, - "bindings": {}, - "code": "D3011" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-replace/case008.json b/test/test-suite/groups/function-replace/case008.json deleted file mode 100644 index 39ce3d9a..00000000 --- a/test/test-suite/groups/function-replace/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"hello\", 1)", - "data": "hello", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-replace/case009.json b/test/test-suite/groups/function-replace/case009.json deleted file mode 100644 index df53f340..00000000 --- a/test/test-suite/groups/function-replace/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"hello\", \"\", \"bye\")", - "dataset": null, - "bindings": {}, - "code": "D3010" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-replace/case010.json b/test/test-suite/groups/function-replace/case010.json deleted file mode 100644 index a632c57b..00000000 --- a/test/test-suite/groups/function-replace/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"hello\", 2, 1)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-replace/case011.json b/test/test-suite/groups/function-replace/case011.json deleted file mode 100644 index 5721cbd2..00000000 --- a/test/test-suite/groups/function-replace/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(123, 2, 1)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case000.json b/test/test-suite/groups/function-round/case000.json deleted file mode 100644 index 3fb324bb..00000000 --- a/test/test-suite/groups/function-round/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(4)", - "dataset": null, - "bindings": {}, - "result": 4 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case001.json b/test/test-suite/groups/function-round/case001.json deleted file mode 100644 index 0c95344d..00000000 --- a/test/test-suite/groups/function-round/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(2.3)", - "dataset": null, - "bindings": {}, - "result": 2 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case002.json b/test/test-suite/groups/function-round/case002.json deleted file mode 100644 index ff0b2360..00000000 --- a/test/test-suite/groups/function-round/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(2.7)", - "dataset": null, - "bindings": {}, - "result": 3 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case003.json b/test/test-suite/groups/function-round/case003.json deleted file mode 100644 index 7f61c2e4..00000000 --- a/test/test-suite/groups/function-round/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(2.5)", - "dataset": null, - "bindings": {}, - "result": 2 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case004.json b/test/test-suite/groups/function-round/case004.json deleted file mode 100644 index caee2a2d..00000000 --- a/test/test-suite/groups/function-round/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(3.5)", - "dataset": null, - "bindings": {}, - "result": 4 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case005.json b/test/test-suite/groups/function-round/case005.json deleted file mode 100644 index 4e4372da..00000000 --- a/test/test-suite/groups/function-round/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(-0.5)", - "dataset": null, - "bindings": {}, - "result": 0 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case006.json b/test/test-suite/groups/function-round/case006.json deleted file mode 100644 index 328f83a1..00000000 --- a/test/test-suite/groups/function-round/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(-0.3)", - "dataset": null, - "bindings": {}, - "result": 0 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case007.json b/test/test-suite/groups/function-round/case007.json deleted file mode 100644 index c41daf81..00000000 --- a/test/test-suite/groups/function-round/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(0.5)", - "dataset": null, - "bindings": {}, - "result": 0 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case008.json b/test/test-suite/groups/function-round/case008.json deleted file mode 100644 index d67d8700..00000000 --- a/test/test-suite/groups/function-round/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(-7.5)", - "dataset": null, - "bindings": {}, - "result": -8 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case009.json b/test/test-suite/groups/function-round/case009.json deleted file mode 100644 index 76ebb59a..00000000 --- a/test/test-suite/groups/function-round/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(-8.5)", - "dataset": null, - "bindings": {}, - "result": -8 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case010.json b/test/test-suite/groups/function-round/case010.json deleted file mode 100644 index 4d529a97..00000000 --- a/test/test-suite/groups/function-round/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(4.49, 1)", - "dataset": null, - "bindings": {}, - "result": 4.5 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case011.json b/test/test-suite/groups/function-round/case011.json deleted file mode 100644 index a92e6f32..00000000 --- a/test/test-suite/groups/function-round/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(4.525, 2)", - "dataset": null, - "bindings": {}, - "result": 4.52 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case012.json b/test/test-suite/groups/function-round/case012.json deleted file mode 100644 index 566a5f49..00000000 --- a/test/test-suite/groups/function-round/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(4.515, 2)", - "dataset": null, - "bindings": {}, - "result": 4.52 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case013.json b/test/test-suite/groups/function-round/case013.json deleted file mode 100644 index 48af7220..00000000 --- a/test/test-suite/groups/function-round/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(12345, -2)", - "dataset": null, - "bindings": {}, - "result": 12300 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case014.json b/test/test-suite/groups/function-round/case014.json deleted file mode 100644 index 81e09308..00000000 --- a/test/test-suite/groups/function-round/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(12450, -2)", - "dataset": null, - "bindings": {}, - "result": 12400 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case015.json b/test/test-suite/groups/function-round/case015.json deleted file mode 100644 index ae6d765e..00000000 --- a/test/test-suite/groups/function-round/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(12350, -2)", - "dataset": null, - "bindings": {}, - "result": 12400 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case016.json b/test/test-suite/groups/function-round/case016.json deleted file mode 100644 index d36fd7b0..00000000 --- a/test/test-suite/groups/function-round/case016.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(6.022e-23, 24)", - "dataset": null, - "bindings": {}, - "result": 6e-23 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-round/case017.json b/test/test-suite/groups/function-round/case017.json deleted file mode 100644 index 7932b336..00000000 --- a/test/test-suite/groups/function-round/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$round(unknown)", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-shuffle/case000.json b/test/test-suite/groups/function-shuffle/case000.json deleted file mode 100644 index beb37983..00000000 --- a/test/test-suite/groups/function-shuffle/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$count($shuffle([1..10]))", - "dataset": "dataset1", - "bindings": {}, - "result": 10 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-shuffle/case001.json b/test/test-suite/groups/function-shuffle/case001.json deleted file mode 100644 index 56635dbe..00000000 --- a/test/test-suite/groups/function-shuffle/case001.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "expr": "$sort($shuffle([1..10]))", - "dataset": "dataset1", - "bindings": {}, - "result": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-shuffle/case002.json b/test/test-suite/groups/function-shuffle/case002.json deleted file mode 100644 index 5ed7c35d..00000000 --- a/test/test-suite/groups/function-shuffle/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$shuffle(nothing)", - "dataset": "dataset1", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-shuffle/case003.json b/test/test-suite/groups/function-shuffle/case003.json deleted file mode 100644 index 4b89b592..00000000 --- a/test/test-suite/groups/function-shuffle/case003.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "$shuffle([1])", - "dataset": "dataset1", - "bindings": {}, - "result": [ - 1 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sift/case000.json b/test/test-suite/groups/function-sift/case000.json deleted file mode 100644 index ea945f4e..00000000 --- a/test/test-suite/groups/function-sift/case000.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "expr": "$sift(λ($v){$v.**.Postcode})", - "dataset": "dataset1", - "bindings": {}, - "result": { - "Address": { - "Street": "Hursley Park", - "City": "Winchester", - "Postcode": "SO21 2JN" - }, - "Other": { - "Over 18 ?": true, - "Misc": null, - "Alternative.Address": { - "Street": "Brick Lane", - "City": "London", - "Postcode": "E1 6RF" - } - } - } -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sift/case001.json b/test/test-suite/groups/function-sift/case001.json deleted file mode 100644 index b5c0bbd5..00000000 --- a/test/test-suite/groups/function-sift/case001.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "expr": "**[*].$sift(λ($v){$v.Postcode})", - "dataset": "dataset1", - "bindings": {}, - "result": [ - { - "Address": { - "Street": "Hursley Park", - "City": "Winchester", - "Postcode": "SO21 2JN" - } - }, - { - "Alternative.Address": { - "Street": "Brick Lane", - "City": "London", - "Postcode": "E1 6RF" - } - } - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sift/case002.json b/test/test-suite/groups/function-sift/case002.json deleted file mode 100644 index 7c46a08c..00000000 --- a/test/test-suite/groups/function-sift/case002.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "expr": "$sift(λ($v, $k){$k ~> /^A/})", - "dataset": "dataset1", - "bindings": {}, - "result": { - "Age": 28, - "Address": { - "Street": "Hursley Park", - "City": "Winchester", - "Postcode": "SO21 2JN" - } - } -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sift/case003.json b/test/test-suite/groups/function-sift/case003.json deleted file mode 100644 index 7a89d895..00000000 --- a/test/test-suite/groups/function-sift/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$toMillis(\"1970-01-01T00:00:00.001Z\")", - "dataset": "dataset5", - "bindings": {}, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sift/case004.json b/test/test-suite/groups/function-sift/case004.json deleted file mode 100644 index 9e4617d0..00000000 --- a/test/test-suite/groups/function-sift/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$toMillis(\"2017-10-30T16:25:32.935Z\")", - "dataset": "dataset5", - "bindings": {}, - "result": 1509380732935 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sift/case005.json b/test/test-suite/groups/function-sift/case005.json deleted file mode 100644 index 7c07971e..00000000 --- a/test/test-suite/groups/function-sift/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$toMillis(foo)", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sift/case006.json b/test/test-suite/groups/function-sift/case006.json deleted file mode 100644 index 0bc9327d..00000000 --- a/test/test-suite/groups/function-sift/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$toMillis(\"foo\")", - "dataset": "dataset5", - "bindings": {}, - "code": "D3110" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case000.json b/test/test-suite/groups/function-signatures/case000.json deleted file mode 100644 index 6dff6f1f..00000000 --- a/test/test-suite/groups/function-signatures/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arg){$not($arg)}(true)", - "dataset": null, - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case001.json b/test/test-suite/groups/function-signatures/case001.json deleted file mode 100644 index 6ffc0644..00000000 --- a/test/test-suite/groups/function-signatures/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arg){$not($arg)}(foo)", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case002.json b/test/test-suite/groups/function-signatures/case002.json deleted file mode 100644 index d96823af..00000000 --- a/test/test-suite/groups/function-signatures/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arg){$not($arg)}(null)", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case003.json b/test/test-suite/groups/function-signatures/case003.json deleted file mode 100644 index 0d5b2213..00000000 --- a/test/test-suite/groups/function-signatures/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "function($x,$y){$x+$y}(2, 6)", - "dataset": null, - "bindings": {}, - "result": 8 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case004.json b/test/test-suite/groups/function-signatures/case004.json deleted file mode 100644 index 28f25484..00000000 --- a/test/test-suite/groups/function-signatures/case004.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "[1..5].function($x,$y){$x+$y}(6)", - "dataset": null, - "bindings": {}, - "result": [ - 7, - 8, - 9, - 10, - 11 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case005.json b/test/test-suite/groups/function-signatures/case005.json deleted file mode 100644 index e7618ff7..00000000 --- a/test/test-suite/groups/function-signatures/case005.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "[1..5].function($x,$y){$x+$y}(2, 6)", - "dataset": null, - "bindings": {}, - "result": [ - 8, - 8, - 8, - 8, - 8 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case006.json b/test/test-suite/groups/function-signatures/case006.json deleted file mode 100644 index 78e84f94..00000000 --- a/test/test-suite/groups/function-signatures/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Age.function($x,$y){$x+$y}(6)", - "dataset": "dataset1", - "bindings": {}, - "result": 34 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case007.json b/test/test-suite/groups/function-signatures/case007.json deleted file mode 100644 index c7d0b599..00000000 --- a/test/test-suite/groups/function-signatures/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($str){$uppercase($str)}(\"hello\")", - "dataset": null, - "bindings": {}, - "result": "HELLO" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case008.json b/test/test-suite/groups/function-signatures/case008.json deleted file mode 100644 index a6e04802..00000000 --- a/test/test-suite/groups/function-signatures/case008.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product.Description.Colour.λ($str){$uppercase($str)}()", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "PURPLE", - "ORANGE", - "PURPLE", - "BLACK" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case009.json b/test/test-suite/groups/function-signatures/case009.json deleted file mode 100644 index 8dd08bb6..00000000 --- a/test/test-suite/groups/function-signatures/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($str, $prefix){$prefix & $str}(\"World\", \"Hello \")", - "dataset": null, - "bindings": {}, - "result": "Hello World" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case010.json b/test/test-suite/groups/function-signatures/case010.json deleted file mode 100644 index 051f2cfb..00000000 --- a/test/test-suite/groups/function-signatures/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "FirstName.λ($str, $prefix){$prefix & $str}(\"Hello \")", - "dataset": "dataset1", - "bindings": {}, - "result": "Hello Fred" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case011.json b/test/test-suite/groups/function-signatures/case011.json deleted file mode 100644 index 6aedc198..00000000 --- a/test/test-suite/groups/function-signatures/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arr, $sep)s?:s>{$join($arr, $sep)}(\"a\")", - "dataset": null, - "bindings": {}, - "result": "a" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case012.json b/test/test-suite/groups/function-signatures/case012.json deleted file mode 100644 index d04bb8f3..00000000 --- a/test/test-suite/groups/function-signatures/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arr, $sep)s?:s>{$join($arr, $sep)}([\"a\"])", - "dataset": "dataset1", - "bindings": {}, - "result": "a" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case013.json b/test/test-suite/groups/function-signatures/case013.json deleted file mode 100644 index 6b30da4f..00000000 --- a/test/test-suite/groups/function-signatures/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arr, $sep)s?:s>{$join($arr, $sep)}(\"a\", \"-\")", - "dataset": null, - "bindings": {}, - "result": "a" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case014.json b/test/test-suite/groups/function-signatures/case014.json deleted file mode 100644 index 1a7a7358..00000000 --- a/test/test-suite/groups/function-signatures/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arr, $sep)s?:s>{$join($arr, $sep)}([\"a\"], \"-\")", - "dataset": null, - "bindings": {}, - "result": "a" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case015.json b/test/test-suite/groups/function-signatures/case015.json deleted file mode 100644 index e21e2841..00000000 --- a/test/test-suite/groups/function-signatures/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arr, $sep)s?:s>{$join($arr, $sep)}([\"a\", \"b\"], \"-\")", - "dataset": null, - "bindings": {}, - "result": "a-b" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case016.json b/test/test-suite/groups/function-signatures/case016.json deleted file mode 100644 index 85d3b64b..00000000 --- a/test/test-suite/groups/function-signatures/case016.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arr, $sep){$join($arr, $sep)}([\"a\", \"b\"], \"-\")", - "dataset": null, - "bindings": {}, - "result": "a-b" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case017.json b/test/test-suite/groups/function-signatures/case017.json deleted file mode 100644 index 43e3912d..00000000 --- a/test/test-suite/groups/function-signatures/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arr, $sep)s?:s>{$join($arr, $sep)}([], \"-\")", - "dataset": null, - "bindings": {}, - "result": "" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case018.json b/test/test-suite/groups/function-signatures/case018.json deleted file mode 100644 index 1b16e7c1..00000000 --- a/test/test-suite/groups/function-signatures/case018.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arr, $sep)s?:s>{$join($arr, $sep)}(foo, \"-\")", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case019.json b/test/test-suite/groups/function-signatures/case019.json deleted file mode 100644 index 3f341f4d..00000000 --- a/test/test-suite/groups/function-signatures/case019.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "λ($obj){$obj}({\"hello\": \"world\"})", - "dataset": null, - "bindings": {}, - "result": { - "hello": "world" - } -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case020.json b/test/test-suite/groups/function-signatures/case020.json deleted file mode 100644 index 6ee1d7d7..00000000 --- a/test/test-suite/groups/function-signatures/case020.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "λ($arr)>>{$arr}([[1]])", - "dataset": null, - "bindings": {}, - "result": [ - [ - 1 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case021.json b/test/test-suite/groups/function-signatures/case021.json deleted file mode 100644 index 2bb52bb4..00000000 --- a/test/test-suite/groups/function-signatures/case021.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($num)<(ns)-:n>{$number($num)}(5)", - "dataset": null, - "bindings": {}, - "result": 5 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case022.json b/test/test-suite/groups/function-signatures/case022.json deleted file mode 100644 index e68909c1..00000000 --- a/test/test-suite/groups/function-signatures/case022.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($num)<(ns)-:n>{$number($num)}(\"5\")", - "dataset": null, - "bindings": {}, - "result": 5 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case023.json b/test/test-suite/groups/function-signatures/case023.json deleted file mode 100644 index f6d63c8b..00000000 --- a/test/test-suite/groups/function-signatures/case023.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "[1..5].λ($num)<(ns)-:n>{$number($num)}()", - "dataset": null, - "bindings": {}, - "result": [ - 1, - 2, - 3, - 4, - 5 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case024.json b/test/test-suite/groups/function-signatures/case024.json deleted file mode 100644 index 12959f73..00000000 --- a/test/test-suite/groups/function-signatures/case024.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($twice := function($f){function($x){$f($f($x))}};$add2 := function($x){$x+2};$add4 := $twice($add2);$add4(5))", - "dataset": null, - "bindings": {}, - "result": 9 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case025.json b/test/test-suite/groups/function-signatures/case025.json deleted file mode 100644 index 08ee9055..00000000 --- a/test/test-suite/groups/function-signatures/case025.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($twice := function($f):f>{function($x){$f($f($x))}};$add2 := function($x){$x+2};$add4 := $twice($add2);$add4(5))", - "dataset": null, - "bindings": {}, - "result": 9 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case026.json b/test/test-suite/groups/function-signatures/case026.json deleted file mode 100644 index a7a768bb..00000000 --- a/test/test-suite/groups/function-signatures/case026.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arg)>{$arg}(5)", - "dataset": null, - "bindings": {}, - "code": "S0401" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case027.json b/test/test-suite/groups/function-signatures/case027.json deleted file mode 100644 index 29d1f908..00000000 --- a/test/test-suite/groups/function-signatures/case027.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arg1, $arg2){[$arg1, $arg2]}(1,\"2\")", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case028.json b/test/test-suite/groups/function-signatures/case028.json deleted file mode 100644 index 45f8f2ea..00000000 --- a/test/test-suite/groups/function-signatures/case028.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arg1, $arg2){[$arg1, $arg2]}(1,3,\"2\")", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case029.json b/test/test-suite/groups/function-signatures/case029.json deleted file mode 100644 index 371f9b5f..00000000 --- a/test/test-suite/groups/function-signatures/case029.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arg1, $arg2){[$arg1, $arg2]}(1,3, 2,\"g\")", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case030.json b/test/test-suite/groups/function-signatures/case030.json deleted file mode 100644 index 826758d4..00000000 --- a/test/test-suite/groups/function-signatures/case030.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arr)>{$arr}([\"3\"]) ", - "dataset": null, - "bindings": {}, - "code": "T0412" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case031.json b/test/test-suite/groups/function-signatures/case031.json deleted file mode 100644 index ca76b79a..00000000 --- a/test/test-suite/groups/function-signatures/case031.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arr)>{$arr}([1, 2, \"3\"]) ", - "dataset": null, - "bindings": {}, - "code": "T0412" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case032.json b/test/test-suite/groups/function-signatures/case032.json deleted file mode 100644 index 05ec369b..00000000 --- a/test/test-suite/groups/function-signatures/case032.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arr)>{$arr}(\"f\")", - "dataset": null, - "bindings": {}, - "code": "T0412" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case033.json b/test/test-suite/groups/function-signatures/case033.json deleted file mode 100644 index ca40bb74..00000000 --- a/test/test-suite/groups/function-signatures/case033.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($fun := λ($arr)>{$arr};$fun(\"f\"))", - "dataset": null, - "bindings": {}, - "code": "T0412" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-signatures/case034.json b/test/test-suite/groups/function-signatures/case034.json deleted file mode 100644 index 5c073cf0..00000000 --- a/test/test-suite/groups/function-signatures/case034.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($arr)<(sa)>>{$arr}([[1]])", - "dataset": null, - "bindings": {}, - "code": "S0402" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sort/case000.json b/test/test-suite/groups/function-sort/case000.json deleted file mode 100644 index 4decca4d..00000000 --- a/test/test-suite/groups/function-sort/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$sort(nothing)", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sort/case001.json b/test/test-suite/groups/function-sort/case001.json deleted file mode 100644 index 352999f2..00000000 --- a/test/test-suite/groups/function-sort/case001.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "$sort(1)", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 1 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sort/case002.json b/test/test-suite/groups/function-sort/case002.json deleted file mode 100644 index 2b07a91a..00000000 --- a/test/test-suite/groups/function-sort/case002.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "$sort([1,3,2])", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 1, - 2, - 3 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sort/case003.json b/test/test-suite/groups/function-sort/case003.json deleted file mode 100644 index d4ec2c00..00000000 --- a/test/test-suite/groups/function-sort/case003.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "$sort([1,3,22,11])", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 1, - 3, - 11, - 22 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sort/case004.json b/test/test-suite/groups/function-sort/case004.json deleted file mode 100644 index 67f7db40..00000000 --- a/test/test-suite/groups/function-sort/case004.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "expr": "[[$], [$sort($)], [$]]", - "data": [ - 1, - 3, - 2 - ], - "bindings": {}, - "result": [ - [ - 1, - 3, - 2 - ], - [ - 1, - 2, - 3 - ], - [ - 1, - 3, - 2 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sort/case005.json b/test/test-suite/groups/function-sort/case005.json deleted file mode 100644 index 18d674b6..00000000 --- a/test/test-suite/groups/function-sort/case005.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "$sort(Account.Order.Product.Price)", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 21.67, - 34.45, - 34.45, - 107.99 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sort/case006.json b/test/test-suite/groups/function-sort/case006.json deleted file mode 100644 index e6115431..00000000 --- a/test/test-suite/groups/function-sort/case006.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "$sort(Account.Order.Product.\"Product Name\")", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "Bowler Hat", - "Bowler Hat", - "Cloak", - "Trilby hat" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sort/case007.json b/test/test-suite/groups/function-sort/case007.json deleted file mode 100644 index 74bfadb5..00000000 --- a/test/test-suite/groups/function-sort/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$sort(Account.Order.Product)", - "dataset": "dataset5", - "bindings": {}, - "code": "D3070" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sort/case008.json b/test/test-suite/groups/function-sort/case008.json deleted file mode 100644 index 0302b9cd..00000000 --- a/test/test-suite/groups/function-sort/case008.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "$sort(Account.Order.Product, function($a, $b) { $a.(Price * Quantity) > $b.(Price * Quantity) }).(Price & \" x \" & Quantity)", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "21.67 x 1", - "34.45 x 2", - "107.99 x 1", - "34.45 x 4" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sort/case009.json b/test/test-suite/groups/function-sort/case009.json deleted file mode 100644 index 299d0ee5..00000000 --- a/test/test-suite/groups/function-sort/case009.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "$sort(Account.Order.Product, function($a, $b) { $a.Price > $b.Price }).SKU", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "0406634348", - "0406654608", - "040657863", - "0406654603" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sort/case010.json b/test/test-suite/groups/function-sort/case010.json deleted file mode 100644 index 9264be59..00000000 --- a/test/test-suite/groups/function-sort/case010.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "\n (Account.Order.Product\n ~> $sort(λ($a,$b){$a.Quantity < $b.Quantity})\n ~> $sort(λ($a,$b){$a.Price > $b.Price})\n ).SKU\n ", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "0406634348", - "040657863", - "0406654608", - "0406654603" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case000.json b/test/test-suite/groups/function-split/case000.json deleted file mode 100644 index 6d9f7105..00000000 --- a/test/test-suite/groups/function-split/case000.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "$split(\"Hello World\", \" \")", - "dataset": null, - "bindings": {}, - "result": [ - "Hello", - "World" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case001.json b/test/test-suite/groups/function-split/case001.json deleted file mode 100644 index 063b23bf..00000000 --- a/test/test-suite/groups/function-split/case001.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "$split(\"Hello\", \" \")", - "dataset": null, - "bindings": {}, - "result": [ - "Hello" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case002.json b/test/test-suite/groups/function-split/case002.json deleted file mode 100644 index 5a10a788..00000000 --- a/test/test-suite/groups/function-split/case002.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "$split(\"Hello World\", \" \")", - "dataset": null, - "bindings": {}, - "result": [ - "Hello", - "", - "World" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case003.json b/test/test-suite/groups/function-split/case003.json deleted file mode 100644 index d5a0450d..00000000 --- a/test/test-suite/groups/function-split/case003.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "$split(\"Hello\", \"\")", - "dataset": null, - "bindings": {}, - "result": [ - "H", - "e", - "l", - "l", - "o" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case004.json b/test/test-suite/groups/function-split/case004.json deleted file mode 100644 index 414906ba..00000000 --- a/test/test-suite/groups/function-split/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$sum($split(\"12345\", \"\").$number($))", - "dataset": null, - "bindings": {}, - "result": 15 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case005.json b/test/test-suite/groups/function-split/case005.json deleted file mode 100644 index 98b8a91e..00000000 --- a/test/test-suite/groups/function-split/case005.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "$split(\"a, b, c, d\", \", \")", - "dataset": null, - "bindings": {}, - "result": [ - "a", - "b", - "c", - "d" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case006.json b/test/test-suite/groups/function-split/case006.json deleted file mode 100644 index d7b263f6..00000000 --- a/test/test-suite/groups/function-split/case006.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "$split(\"a, b, c, d\", \", \", 2)", - "dataset": null, - "bindings": {}, - "result": [ - "a", - "b" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case007.json b/test/test-suite/groups/function-split/case007.json deleted file mode 100644 index 4ad95d81..00000000 --- a/test/test-suite/groups/function-split/case007.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "$split(\"a, b, c, d\", \", \", 2.5)", - "dataset": null, - "bindings": {}, - "result": [ - "a", - "b" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case008.json b/test/test-suite/groups/function-split/case008.json deleted file mode 100644 index 43e7c94c..00000000 --- a/test/test-suite/groups/function-split/case008.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "$split(\"a, b, c, d\", \", \", 10)", - "dataset": null, - "bindings": {}, - "result": [ - "a", - "b", - "c", - "d" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case009.json b/test/test-suite/groups/function-split/case009.json deleted file mode 100644 index 30302ab1..00000000 --- a/test/test-suite/groups/function-split/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$split(\"a, b, c, d\", \", \", 0)", - "dataset": null, - "bindings": {}, - "result": [] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case010.json b/test/test-suite/groups/function-split/case010.json deleted file mode 100644 index 2c8a0293..00000000 --- a/test/test-suite/groups/function-split/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$split(nothing, \" \")", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case011.json b/test/test-suite/groups/function-split/case011.json deleted file mode 100644 index 22d8ef05..00000000 --- a/test/test-suite/groups/function-split/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$split(\"a, b, c, d\", \", \", -3)", - "dataset": null, - "bindings": {}, - "code": "D3020" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case012.json b/test/test-suite/groups/function-split/case012.json deleted file mode 100644 index 366d8c91..00000000 --- a/test/test-suite/groups/function-split/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$split(\"a, b, c, d\", \", \", null)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case013.json b/test/test-suite/groups/function-split/case013.json deleted file mode 100644 index c36b981d..00000000 --- a/test/test-suite/groups/function-split/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$split(\"a, b, c, d\", \", \", -5)", - "dataset": null, - "bindings": {}, - "code": "D3020" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case014.json b/test/test-suite/groups/function-split/case014.json deleted file mode 100644 index 2d7ba6dd..00000000 --- a/test/test-suite/groups/function-split/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$split(\"a, b, c, d\", \", \", \"2\")", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case015.json b/test/test-suite/groups/function-split/case015.json deleted file mode 100644 index e0ee44b5..00000000 --- a/test/test-suite/groups/function-split/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$split(\"a, b, c, d\", true)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case016.json b/test/test-suite/groups/function-split/case016.json deleted file mode 100644 index a7d6292b..00000000 --- a/test/test-suite/groups/function-split/case016.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$split(12345, 3)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-split/case017.json b/test/test-suite/groups/function-split/case017.json deleted file mode 100644 index 87fd295c..00000000 --- a/test/test-suite/groups/function-split/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$split(12345)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-spread/case000.json b/test/test-suite/groups/function-spread/case000.json deleted file mode 100644 index ddcd40fa..00000000 --- a/test/test-suite/groups/function-spread/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$spread(\"Hello World\")", - "dataset": "dataset5", - "bindings": {}, - "result": "Hello World" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-spread/case001.json b/test/test-suite/groups/function-spread/case001.json deleted file mode 100644 index be3cbb76..00000000 --- a/test/test-suite/groups/function-spread/case001.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "expr": "$spread((Account.Order.Product.Description))", - "dataset": "dataset5", - "bindings": {}, - "result": [ - { - "Colour": "Purple" - }, - { - "Width": 300 - }, - { - "Height": 200 - }, - { - "Depth": 210 - }, - { - "Weight": 0.75 - }, - { - "Colour": "Orange" - }, - { - "Width": 300 - }, - { - "Height": 200 - }, - { - "Depth": 210 - }, - { - "Weight": 0.6 - }, - { - "Colour": "Purple" - }, - { - "Width": 300 - }, - { - "Height": 200 - }, - { - "Depth": 210 - }, - { - "Weight": 0.75 - }, - { - "Colour": "Black" - }, - { - "Width": 30 - }, - { - "Height": 20 - }, - { - "Depth": 210 - }, - { - "Weight": 2 - } - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-spread/case002.json b/test/test-suite/groups/function-spread/case002.json deleted file mode 100644 index 9fbbd000..00000000 --- a/test/test-suite/groups/function-spread/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$spread(blah)", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-spread/case003.json b/test/test-suite/groups/function-spread/case003.json deleted file mode 100644 index 5a5bfb41..00000000 --- a/test/test-suite/groups/function-spread/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string($spread(function($x){$x*$x}))", - "dataset": "dataset5", - "bindings": {}, - "result": "" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sqrt/case000.json b/test/test-suite/groups/function-sqrt/case000.json deleted file mode 100644 index 3eb89600..00000000 --- a/test/test-suite/groups/function-sqrt/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$sqrt(4)", - "dataset": null, - "bindings": {}, - "result": 2 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sqrt/case001.json b/test/test-suite/groups/function-sqrt/case001.json deleted file mode 100644 index f5500d30..00000000 --- a/test/test-suite/groups/function-sqrt/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$sqrt(2)", - "dataset": null, - "bindings": {}, - "result": 1.4142135623730951 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sqrt/case002.json b/test/test-suite/groups/function-sqrt/case002.json deleted file mode 100644 index 14483407..00000000 --- a/test/test-suite/groups/function-sqrt/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$sqrt(nothing)", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sqrt/case003.json b/test/test-suite/groups/function-sqrt/case003.json deleted file mode 100644 index ef292b96..00000000 --- a/test/test-suite/groups/function-sqrt/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$sqrt(-2)", - "dataset": null, - "bindings": {}, - "code": "D3060" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case000.json b/test/test-suite/groups/function-string/case000.json deleted file mode 100644 index e2132b8b..00000000 --- a/test/test-suite/groups/function-string/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(5)", - "dataset": "dataset5", - "bindings": {}, - "result": "5" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case001.json b/test/test-suite/groups/function-string/case001.json deleted file mode 100644 index e8318299..00000000 --- a/test/test-suite/groups/function-string/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(22/7)", - "dataset": "dataset5", - "bindings": {}, - "result": "3.142857142857" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case002.json b/test/test-suite/groups/function-string/case002.json deleted file mode 100644 index 34cae35f..00000000 --- a/test/test-suite/groups/function-string/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(1e100)", - "dataset": "dataset5", - "bindings": {}, - "result": "1e+100" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case003.json b/test/test-suite/groups/function-string/case003.json deleted file mode 100644 index 638e461f..00000000 --- a/test/test-suite/groups/function-string/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(1e-100)", - "dataset": null, - "bindings": {}, - "result": "1e-100" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case004.json b/test/test-suite/groups/function-string/case004.json deleted file mode 100644 index 813d0c20..00000000 --- a/test/test-suite/groups/function-string/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(1e-6)", - "dataset": null, - "bindings": {}, - "result": "0.000001" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case005.json b/test/test-suite/groups/function-string/case005.json deleted file mode 100644 index 734e8b2f..00000000 --- a/test/test-suite/groups/function-string/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(1e-7)", - "dataset": null, - "bindings": {}, - "result": "1e-7" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case006.json b/test/test-suite/groups/function-string/case006.json deleted file mode 100644 index a695d38a..00000000 --- a/test/test-suite/groups/function-string/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(1e20)", - "dataset": null, - "bindings": {}, - "result": "100000000000000000000" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case007.json b/test/test-suite/groups/function-string/case007.json deleted file mode 100644 index 863b2ff6..00000000 --- a/test/test-suite/groups/function-string/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(1e21)", - "dataset": null, - "bindings": {}, - "result": "1e+21" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case008.json b/test/test-suite/groups/function-string/case008.json deleted file mode 100644 index f09f25d0..00000000 --- a/test/test-suite/groups/function-string/case008.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Account.Order.$string($sum(Product.(Price* Quantity)))", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "90.57", - "245.79" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case009.json b/test/test-suite/groups/function-string/case009.json deleted file mode 100644 index 3c0bb9ad..00000000 --- a/test/test-suite/groups/function-string/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(true)", - "dataset": "dataset5", - "bindings": {}, - "result": "true" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case010.json b/test/test-suite/groups/function-string/case010.json deleted file mode 100644 index a3bb8c6d..00000000 --- a/test/test-suite/groups/function-string/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(false)", - "dataset": "dataset5", - "bindings": {}, - "result": "false" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case011.json b/test/test-suite/groups/function-string/case011.json deleted file mode 100644 index 0ee660f3..00000000 --- a/test/test-suite/groups/function-string/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(null)", - "dataset": "dataset5", - "bindings": {}, - "result": "null" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case012.json b/test/test-suite/groups/function-string/case012.json deleted file mode 100644 index 988bdc1b..00000000 --- a/test/test-suite/groups/function-string/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(blah)", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case013.json b/test/test-suite/groups/function-string/case013.json deleted file mode 100644 index 419ced7b..00000000 --- a/test/test-suite/groups/function-string/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string($string)", - "dataset": "dataset5", - "bindings": {}, - "result": "" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case014.json b/test/test-suite/groups/function-string/case014.json deleted file mode 100644 index 01b32f4a..00000000 --- a/test/test-suite/groups/function-string/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(function(){true})", - "dataset": "dataset5", - "bindings": {}, - "result": "" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case015.json b/test/test-suite/groups/function-string/case015.json deleted file mode 100644 index 67453c4b..00000000 --- a/test/test-suite/groups/function-string/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(function(){1})", - "dataset": "dataset5", - "bindings": {}, - "result": "" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case016.json b/test/test-suite/groups/function-string/case016.json deleted file mode 100644 index 32f6413b..00000000 --- a/test/test-suite/groups/function-string/case016.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string({\"string\": \"hello\"})", - "dataset": null, - "bindings": {}, - "result": "{\"string\":\"hello\"}" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case017.json b/test/test-suite/groups/function-string/case017.json deleted file mode 100644 index 07b40927..00000000 --- a/test/test-suite/groups/function-string/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string([\"string\", 5])", - "dataset": null, - "bindings": {}, - "result": "[\"string\",5]" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case018.json b/test/test-suite/groups/function-string/case018.json deleted file mode 100644 index 5b944c4d..00000000 --- a/test/test-suite/groups/function-string/case018.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string({ \"string\": \"hello\", \"number\": 78.8 / 2, \"null\":null, \"boolean\": false, \"function\": $sum, \"lambda\": function(){true}, \"object\": { \"str\": \"another\", \"lambda2\": function($n){$n} }, \"array\": []})", - "dataset": null, - "bindings": {}, - "result": "{\"string\":\"hello\",\"number\":39.4,\"null\":null,\"boolean\":false,\"function\":\"\",\"lambda\":\"\",\"object\":{\"str\":\"another\",\"lambda2\":\"\"},\"array\":[]}" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case019.json b/test/test-suite/groups/function-string/case019.json deleted file mode 100644 index b2d8ff7f..00000000 --- a/test/test-suite/groups/function-string/case019.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(1/0)", - "dataset": null, - "bindings": {}, - "code": "D3001" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case020.json b/test/test-suite/groups/function-string/case020.json deleted file mode 100644 index 5a633c88..00000000 --- a/test/test-suite/groups/function-string/case020.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string({\"inf\": 1/0})", - "dataset": null, - "bindings": {}, - "code": "D1001" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case021.json b/test/test-suite/groups/function-string/case021.json deleted file mode 100644 index b3c18316..00000000 --- a/test/test-suite/groups/function-string/case021.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string(2,3)", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-string/case022.json b/test/test-suite/groups/function-string/case022.json deleted file mode 100644 index e3b80c10..00000000 --- a/test/test-suite/groups/function-string/case022.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$string()", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-substring/case000.json b/test/test-suite/groups/function-substring/case000.json deleted file mode 100644 index a8e21470..00000000 --- a/test/test-suite/groups/function-substring/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(\"hello world\", 0, 5)", - "dataset": "dataset5", - "bindings": {}, - "result": "hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-substring/case001.json b/test/test-suite/groups/function-substring/case001.json deleted file mode 100644 index 1514752e..00000000 --- a/test/test-suite/groups/function-substring/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(\"hello world\", -5, 5)", - "dataset": "dataset5", - "bindings": {}, - "result": "world" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-substring/case002.json b/test/test-suite/groups/function-substring/case002.json deleted file mode 100644 index b713e831..00000000 --- a/test/test-suite/groups/function-substring/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(\"hello world\", 6)", - "dataset": "dataset5", - "bindings": {}, - "result": "world" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-substring/case003.json b/test/test-suite/groups/function-substring/case003.json deleted file mode 100644 index 747fa65e..00000000 --- a/test/test-suite/groups/function-substring/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(blah, 6)", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-substringAfter/case000.json b/test/test-suite/groups/function-substringAfter/case000.json deleted file mode 100644 index 2f809c4c..00000000 --- a/test/test-suite/groups/function-substringAfter/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(\"Hello World\", \" \")", - "dataset": "dataset5", - "bindings": {}, - "result": "World" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-substringAfter/case001.json b/test/test-suite/groups/function-substringAfter/case001.json deleted file mode 100644 index eb8f3703..00000000 --- a/test/test-suite/groups/function-substringAfter/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(\"Hello World\", \"l\")", - "dataset": "dataset5", - "bindings": {}, - "result": "lo World" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-substringAfter/case002.json b/test/test-suite/groups/function-substringAfter/case002.json deleted file mode 100644 index 018a82b7..00000000 --- a/test/test-suite/groups/function-substringAfter/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(\"Hello World\", \"f\")", - "dataset": "dataset5", - "bindings": {}, - "result": "Hello World" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-substringAfter/case003.json b/test/test-suite/groups/function-substringAfter/case003.json deleted file mode 100644 index 69ef4f99..00000000 --- a/test/test-suite/groups/function-substringAfter/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(\"Hello World\", \"ld\")", - "dataset": "dataset5", - "bindings": {}, - "result": "" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-substringAfter/case004.json b/test/test-suite/groups/function-substringAfter/case004.json deleted file mode 100644 index 311ba660..00000000 --- a/test/test-suite/groups/function-substringAfter/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(blah, \"ld\")", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-substringBefore/case000.json b/test/test-suite/groups/function-substringBefore/case000.json deleted file mode 100644 index 6803995f..00000000 --- a/test/test-suite/groups/function-substringBefore/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(\"Hello World\", \" \")", - "dataset": "dataset5", - "bindings": {}, - "result": "Hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-substringBefore/case001.json b/test/test-suite/groups/function-substringBefore/case001.json deleted file mode 100644 index a652dd6e..00000000 --- a/test/test-suite/groups/function-substringBefore/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(\"Hello World\", \"l\")", - "dataset": "dataset5", - "bindings": {}, - "result": "He" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-substringBefore/case002.json b/test/test-suite/groups/function-substringBefore/case002.json deleted file mode 100644 index 69cb659c..00000000 --- a/test/test-suite/groups/function-substringBefore/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(\"Hello World\", \"f\")", - "dataset": "dataset5", - "bindings": {}, - "result": "Hello World" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-substringBefore/case003.json b/test/test-suite/groups/function-substringBefore/case003.json deleted file mode 100644 index b1b73d63..00000000 --- a/test/test-suite/groups/function-substringBefore/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(\"Hello World\", \"He\")", - "dataset": "dataset5", - "bindings": {}, - "result": "" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-substringBefore/case004.json b/test/test-suite/groups/function-substringBefore/case004.json deleted file mode 100644 index 7693dbf6..00000000 --- a/test/test-suite/groups/function-substringBefore/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(blah, \"He\")", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sum/case000.json b/test/test-suite/groups/function-sum/case000.json deleted file mode 100644 index 6c9fe9f0..00000000 --- a/test/test-suite/groups/function-sum/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$sum(Account.Order.Product.(Price * Quantity))", - "dataset": "dataset5", - "bindings": {}, - "result": 336.36 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sum/case001.json b/test/test-suite/groups/function-sum/case001.json deleted file mode 100644 index b0023de1..00000000 --- a/test/test-suite/groups/function-sum/case001.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Account.Order.$sum(Product.(Price * Quantity))", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 90.57000000000001, - 245.79000000000002 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sum/case002.json b/test/test-suite/groups/function-sum/case002.json deleted file mode 100644 index 57e18b19..00000000 --- a/test/test-suite/groups/function-sum/case002.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Account.Order.(OrderID & \": \" & $sum(Product.(Price*Quantity)))", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "order103: 90.57", - "order104: 245.79" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sum/case003.json b/test/test-suite/groups/function-sum/case003.json deleted file mode 100644 index b7606001..00000000 --- a/test/test-suite/groups/function-sum/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$sum()", - "dataset": "dataset5", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sum/case004.json b/test/test-suite/groups/function-sum/case004.json deleted file mode 100644 index a44a4aa4..00000000 --- a/test/test-suite/groups/function-sum/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$sum(1)", - "dataset": null, - "bindings": {}, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sum/case005.json b/test/test-suite/groups/function-sum/case005.json deleted file mode 100644 index ca7b9643..00000000 --- a/test/test-suite/groups/function-sum/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$sum(Account.Order)", - "dataset": "dataset5", - "bindings": {}, - "code": "T0412" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-sum/case006.json b/test/test-suite/groups/function-sum/case006.json deleted file mode 100644 index 3350cc6c..00000000 --- a/test/test-suite/groups/function-sum/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$sum(undefined)", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-trim/case000.json b/test/test-suite/groups/function-trim/case000.json deleted file mode 100644 index 9dd7a3ed..00000000 --- a/test/test-suite/groups/function-trim/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$trim(\"Hello World\")", - "dataset": null, - "bindings": {}, - "result": "Hello World" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-trim/case001.json b/test/test-suite/groups/function-trim/case001.json deleted file mode 100644 index d85e870d..00000000 --- a/test/test-suite/groups/function-trim/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$trim(\" Hello \n \t World \t \")", - "dataset": null, - "bindings": {}, - "result": "Hello World" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-trim/case002.json b/test/test-suite/groups/function-trim/case002.json deleted file mode 100644 index 614df8e2..00000000 --- a/test/test-suite/groups/function-trim/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$trim()", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-uppercase/case000.json b/test/test-suite/groups/function-uppercase/case000.json deleted file mode 100644 index fa826b21..00000000 --- a/test/test-suite/groups/function-uppercase/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(\"Hello World\")", - "dataset": "dataset5", - "bindings": {}, - "result": "HELLO WORLD" -} \ No newline at end of file diff --git a/test/test-suite/groups/function-uppercase/case001.json b/test/test-suite/groups/function-uppercase/case001.json deleted file mode 100644 index 9cae9963..00000000 --- a/test/test-suite/groups/function-uppercase/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(blah)", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/function-zip/case000.json b/test/test-suite/groups/function-zip/case000.json deleted file mode 100644 index f8fa5cd3..00000000 --- a/test/test-suite/groups/function-zip/case000.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "expr": "$zip([1,2,3],[4,5,6])", - "dataset": null, - "bindings": {}, - "result": [ - [ - 1, - 4 - ], - [ - 2, - 5 - ], - [ - 3, - 6 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-zip/case001.json b/test/test-suite/groups/function-zip/case001.json deleted file mode 100644 index 9e4647e0..00000000 --- a/test/test-suite/groups/function-zip/case001.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "expr": "$zip([1,2,3],[4,5,6],[7,8,9])", - "dataset": null, - "bindings": {}, - "result": [ - [ - 1, - 4, - 7 - ], - [ - 2, - 5, - 8 - ], - [ - 3, - 6, - 9 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-zip/case002.json b/test/test-suite/groups/function-zip/case002.json deleted file mode 100644 index 7a97fed5..00000000 --- a/test/test-suite/groups/function-zip/case002.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "expr": "$zip([1,2,3],[4,5],[7,8,9])", - "dataset": null, - "bindings": {}, - "result": [ - [ - 1, - 4, - 7 - ], - [ - 2, - 5, - 8 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-zip/case003.json b/test/test-suite/groups/function-zip/case003.json deleted file mode 100644 index 1f924e15..00000000 --- a/test/test-suite/groups/function-zip/case003.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "expr": "$zip([1,2,3])", - "dataset": null, - "bindings": {}, - "result": [ - [ - 1 - ], - [ - 2 - ], - [ - 3 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-zip/case004.json b/test/test-suite/groups/function-zip/case004.json deleted file mode 100644 index 2398ef69..00000000 --- a/test/test-suite/groups/function-zip/case004.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "$zip(1,2,3)", - "dataset": null, - "bindings": {}, - "result": [ - [ - 1, - 2, - 3 - ] - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/function-zip/case005.json b/test/test-suite/groups/function-zip/case005.json deleted file mode 100644 index aebf6189..00000000 --- a/test/test-suite/groups/function-zip/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$zip([1,2,3], [4,5,6], nothing)", - "dataset": null, - "bindings": {}, - "result": [] -} \ No newline at end of file diff --git a/test/test-suite/groups/higher-order-functions/case000.json b/test/test-suite/groups/higher-order-functions/case000.json deleted file mode 100644 index 47433959..00000000 --- a/test/test-suite/groups/higher-order-functions/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($twice:=function($f){function($x){$f($f($x))}}; $add3:=function($y){$y+3}; $add6:=$twice($add3); $add6(7))", - "data": null, - "bindings": {}, - "result": 13 -} \ No newline at end of file diff --git a/test/test-suite/groups/higher-order-functions/case001.json b/test/test-suite/groups/higher-order-functions/case001.json deleted file mode 100644 index f36dc9ab..00000000 --- a/test/test-suite/groups/higher-order-functions/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($f) { λ($x) { $x($x) }( λ($g) { $f( (λ($a) {$g($g)($a)}))})}(λ($f) { λ($n) { $n < 2 ? 1 : $n * $f($n - 1) } })(6)", - "data": null, - "bindings": {}, - "result": 720 -} \ No newline at end of file diff --git a/test/test-suite/groups/higher-order-functions/case002.json b/test/test-suite/groups/higher-order-functions/case002.json deleted file mode 100644 index a84c3b59..00000000 --- a/test/test-suite/groups/higher-order-functions/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "λ($f) { λ($x) { $x($x) }( λ($g) { $f( (λ($a) {$g($g)($a)}))})}(λ($f) { λ($n) { $n <= 1 ? $n : $f($n-1) + $f($n-2) } })(6) ", - "data": null, - "bindings": {}, - "result": 8 -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-filter/case000.json b/test/test-suite/groups/hof-filter/case000.json deleted file mode 100644 index 837f088c..00000000 --- a/test/test-suite/groups/hof-filter/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(library.books~>$filter(λ($v, $i, $a) {$v.price = $max($a.price)})).isbn", - "dataset": "dataset6", - "bindings": {}, - "result": "9780262510875" -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-filter/case001.json b/test/test-suite/groups/hof-filter/case001.json deleted file mode 100644 index 60d331b2..00000000 --- a/test/test-suite/groups/hof-filter/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "nothing~>$filter(λ($v, $i, $a) {$v.price = $max($a.price)})", - "dataset": "dataset6", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-map/case000.json b/test/test-suite/groups/hof-map/case000.json deleted file mode 100644 index 1806455a..00000000 --- a/test/test-suite/groups/hof-map/case000.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "( $data := { \"one\": [1,2,3,4,5], \"two\": [5,4,3,2,1] }; $add := function($x){$x*$x}; $map($data.one, $add) ) ", - "data": null, - "bindings": {}, - "result": [ - 1, - 4, - 9, - 16, - 25 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-map/case001.json b/test/test-suite/groups/hof-map/case001.json deleted file mode 100644 index b4c8e5c0..00000000 --- a/test/test-suite/groups/hof-map/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $data := { \"one\": [1,2,3,4,5], \"two\": [5,4,3,2,1] }; $add := function($x){$x*$x}; $map($add) ) ", - "dataset": null, - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-map/case002.json b/test/test-suite/groups/hof-map/case002.json deleted file mode 100644 index 44aceb3a..00000000 --- a/test/test-suite/groups/hof-map/case002.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "$map([1,2,3], $string)", - "data": null, - "bindings": {}, - "result": [ - "1", - "2", - "3" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-map/case003.json b/test/test-suite/groups/hof-map/case003.json deleted file mode 100644 index 6d557ab0..00000000 --- a/test/test-suite/groups/hof-map/case003.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product ~> $map(λ($prod, $index) { $index+1 & \": \" & $prod.\"Product Name\" })", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "1: Bowler Hat", - "2: Trilby hat", - "3: Bowler Hat", - "4: Cloak" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-map/case004.json b/test/test-suite/groups/hof-map/case004.json deleted file mode 100644 index 7b17ba4e..00000000 --- a/test/test-suite/groups/hof-map/case004.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product ~> $map(λ($prod, $index, $arr) { $index+1 & \"/\" & $count($arr) & \": \" & $prod.\"Product Name\" })", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "1/4: Bowler Hat", - "2/4: Trilby hat", - "3/4: Bowler Hat", - "4/4: Cloak" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-map/case005.json b/test/test-suite/groups/hof-map/case005.json deleted file mode 100644 index db3989e7..00000000 --- a/test/test-suite/groups/hof-map/case005.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "$map(Phone, function($v, $i) {$i[$v.type=\"office\"]})", - "dataset": "dataset1", - "bindings": {}, - "result": [ - 1, - 2 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-map/case006.json b/test/test-suite/groups/hof-map/case006.json deleted file mode 100644 index cf579bae..00000000 --- a/test/test-suite/groups/hof-map/case006.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "$map(Phone, function($v, $i) {$v.type=\"office\" ? $i})", - "dataset": "dataset1", - "bindings": {}, - "result": [ - 1, - 2 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-map/case007.json b/test/test-suite/groups/hof-map/case007.json deleted file mode 100644 index b8481271..00000000 --- a/test/test-suite/groups/hof-map/case007.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "$map(Phone, function($v, $i) {$v.type=\"office\" ? $i: null})", - "dataset": "dataset1", - "bindings": {}, - "result": [ - null, - 1, - 2, - null - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-map/case008.json b/test/test-suite/groups/hof-map/case008.json deleted file mode 100644 index 64c8e4ba..00000000 --- a/test/test-suite/groups/hof-map/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$map(Phone, function($v, $i) {$v.type=\"office\" ? $i: null})", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-reduce/case000.json b/test/test-suite/groups/hof-reduce/case000.json deleted file mode 100644 index 6035ecc3..00000000 --- a/test/test-suite/groups/hof-reduce/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $seq := [1,2,3,4,5]; $reduce($seq, function($x, $y){$x+$y})) ", - "data": null, - "bindings": {}, - "result": 15 -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-reduce/case001.json b/test/test-suite/groups/hof-reduce/case001.json deleted file mode 100644 index d7bec078..00000000 --- a/test/test-suite/groups/hof-reduce/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $concat := function($s){function($a, $b){$string($a) & $s & $string($b)}}; $comma_join := $concat(' ... '); $reduce([1,2,3,4,5], $comma_join)) ", - "data": null, - "bindings": {}, - "result": "1 ... 2 ... 3 ... 4 ... 5" -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-reduce/case002.json b/test/test-suite/groups/hof-reduce/case002.json deleted file mode 100644 index 31af1d4d..00000000 --- a/test/test-suite/groups/hof-reduce/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $seq := [1,2,3,4,5]; $reduce($seq, function($x, $y){$x+$y}, 2))", - "data": null, - "bindings": {}, - "result": 17 -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-reduce/case003.json b/test/test-suite/groups/hof-reduce/case003.json deleted file mode 100644 index e3bc3078..00000000 --- a/test/test-suite/groups/hof-reduce/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $seq := 1; $reduce($seq, function($x, $y){$x+$y}))", - "data": null, - "bindings": {}, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-reduce/case004.json b/test/test-suite/groups/hof-reduce/case004.json deleted file mode 100644 index e3bc3078..00000000 --- a/test/test-suite/groups/hof-reduce/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $seq := 1; $reduce($seq, function($x, $y){$x+$y}))", - "data": null, - "bindings": {}, - "result": 1 -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-reduce/case005.json b/test/test-suite/groups/hof-reduce/case005.json deleted file mode 100644 index ae52d156..00000000 --- a/test/test-suite/groups/hof-reduce/case005.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "$reduce(Account.Order.Product.Quantity, $append)", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 2, - 1, - 4, - 1 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-reduce/case006.json b/test/test-suite/groups/hof-reduce/case006.json deleted file mode 100644 index 1aecc3be..00000000 --- a/test/test-suite/groups/hof-reduce/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$reduce(Account.Order.Product.Quantity, $append)", - "dataset": "dataset1", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-reduce/case007.json b/test/test-suite/groups/hof-reduce/case007.json deleted file mode 100644 index 9abf42f3..00000000 --- a/test/test-suite/groups/hof-reduce/case007.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "expr": "($product := function($a, $b) { $a * $b };$power := function($x, $n) { $n = 0 ? 1 : $reduce([1..$n].($x), $product) };[0..5].$power(2, $))", - "dataset": null, - "bindings": {}, - "result": [ - 1, - 2, - 4, - 8, - 16, - 32 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-reduce/case008.json b/test/test-suite/groups/hof-reduce/case008.json deleted file mode 100644 index d65b9d77..00000000 --- a/test/test-suite/groups/hof-reduce/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $seq := 1; $reduce($seq, function($x){$x}))", - "dataset": null, - "bindings": {}, - "code": "D3050" -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-zip-map/case000.json b/test/test-suite/groups/hof-zip-map/case000.json deleted file mode 100644 index 8e88b2ca..00000000 --- a/test/test-suite/groups/hof-zip-map/case000.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "( $data := { \"one\": [1,2,3,4,5], \"two\": [5,4,3,2,1] }; $map($zip($data.one, $data.two), $sum)) ", - "data": null, - "bindings": {}, - "result": [ - 6, - 6, - 6, - 6, - 6 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-zip-map/case001.json b/test/test-suite/groups/hof-zip-map/case001.json deleted file mode 100644 index c95ca042..00000000 --- a/test/test-suite/groups/hof-zip-map/case001.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "( $data := { \"one\": [1,2,3,4,5], \"two\": [5,4,3,2,1] }; $data.$zip(one, two) ~> $map($sum)) ", - "data": null, - "bindings": {}, - "result": [ - 6, - 6, - 6, - 6, - 6 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-zip-map/case002.json b/test/test-suite/groups/hof-zip-map/case002.json deleted file mode 100644 index ed40fa81..00000000 --- a/test/test-suite/groups/hof-zip-map/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $data := { \"one\": [1], \"two\": [5] }; $data[].$zip(one, two) ~> $map($sum)) ", - "data": null, - "bindings": {}, - "result": 6 -} \ No newline at end of file diff --git a/test/test-suite/groups/hof-zip-map/case003.json b/test/test-suite/groups/hof-zip-map/case003.json deleted file mode 100644 index b46d1f0c..00000000 --- a/test/test-suite/groups/hof-zip-map/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $data := { \"one\": 1, \"two\": 5 }; $data[].$zip(one, two) ~> $map($sum)) ", - "data": null, - "bindings": {}, - "result": 6 -} \ No newline at end of file diff --git a/test/test-suite/groups/inclusion-operator/case000.json b/test/test-suite/groups/inclusion-operator/case000.json deleted file mode 100644 index 344ba612..00000000 --- a/test/test-suite/groups/inclusion-operator/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "1 in [1,2]", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/inclusion-operator/case001.json b/test/test-suite/groups/inclusion-operator/case001.json deleted file mode 100644 index c307d616..00000000 --- a/test/test-suite/groups/inclusion-operator/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "3 in [1,2]", - "dataset": null, - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/inclusion-operator/case002.json b/test/test-suite/groups/inclusion-operator/case002.json deleted file mode 100644 index 5fe38bad..00000000 --- a/test/test-suite/groups/inclusion-operator/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"hello\" in [1,2]", - "dataset": null, - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/inclusion-operator/case003.json b/test/test-suite/groups/inclusion-operator/case003.json deleted file mode 100644 index d63a4165..00000000 --- a/test/test-suite/groups/inclusion-operator/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"world\" in [\"hello\", \"world\"]", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/inclusion-operator/case004.json b/test/test-suite/groups/inclusion-operator/case004.json deleted file mode 100644 index 71c65d67..00000000 --- a/test/test-suite/groups/inclusion-operator/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "in in [\"hello\", \"world\"]", - "dataset": null, - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/inclusion-operator/case005.json b/test/test-suite/groups/inclusion-operator/case005.json deleted file mode 100644 index f4616343..00000000 --- a/test/test-suite/groups/inclusion-operator/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"world\" in in", - "dataset": null, - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/inclusion-operator/case006.json b/test/test-suite/groups/inclusion-operator/case006.json deleted file mode 100644 index 5c25fd45..00000000 --- a/test/test-suite/groups/inclusion-operator/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"hello\" in \"hello\"", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/inclusion-operator/case007.json b/test/test-suite/groups/inclusion-operator/case007.json deleted file mode 100644 index 908041f0..00000000 --- a/test/test-suite/groups/inclusion-operator/case007.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "library.books[\"Aho\" in authors].title", - "dataset": "dataset6", - "bindings": {}, - "result": [ - "The AWK Programming Language", - "Compilers: Principles, Techniques, and Tools" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/inclusion-operator/case008.json b/test/test-suite/groups/inclusion-operator/case008.json deleted file mode 100644 index 4d082c9b..00000000 --- a/test/test-suite/groups/inclusion-operator/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "content.integration.$lowercase(name)", - "dataset": "dataset7", - "bindings": {}, - "result": "fakeintegrationname" -} \ No newline at end of file diff --git a/test/test-suite/groups/lambdas/case000.json b/test/test-suite/groups/lambdas/case000.json deleted file mode 100644 index 1728d04b..00000000 --- a/test/test-suite/groups/lambdas/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "function($x){$x*$x}(5)", - "data": null, - "bindings": {}, - "result": 25 -} \ No newline at end of file diff --git a/test/test-suite/groups/lambdas/case001.json b/test/test-suite/groups/lambdas/case001.json deleted file mode 100644 index 200f31ef..00000000 --- a/test/test-suite/groups/lambdas/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "function($x){$x>5 ? \"foo\"}(6)", - "data": null, - "bindings": {}, - "result": "foo" -} \ No newline at end of file diff --git a/test/test-suite/groups/lambdas/case002.json b/test/test-suite/groups/lambdas/case002.json deleted file mode 100644 index 2903130b..00000000 --- a/test/test-suite/groups/lambdas/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "function($x){$x>5 ? \"foo\"}(3)", - "data": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/lambdas/case003.json b/test/test-suite/groups/lambdas/case003.json deleted file mode 100644 index db6bad93..00000000 --- a/test/test-suite/groups/lambdas/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($factorial:= function($x){$x <= 1 ? 1 : $x * $factorial($x-1)}; $factorial(4))", - "data": null, - "bindings": {}, - "result": 24 -} \ No newline at end of file diff --git a/test/test-suite/groups/lambdas/case004.json b/test/test-suite/groups/lambdas/case004.json deleted file mode 100644 index 632bcc48..00000000 --- a/test/test-suite/groups/lambdas/case004.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "expr": "($fibonacci := function($x){$x <= 1 ? $x : $fibonacci($x-1) + $fibonacci($x-2)}; [1,2,3,4,5,6,7,8,9].$fibonacci($))", - "data": null, - "bindings": {}, - "result": [ - 1, - 1, - 2, - 3, - 5, - 8, - 13, - 21, - 34 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/lambdas/case005.json b/test/test-suite/groups/lambdas/case005.json deleted file mode 100644 index f88503d4..00000000 --- a/test/test-suite/groups/lambdas/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($nth_price := function($n) { (Account.Order.Product.Price)[$n] }; $nth_price(1) )", - "dataset": "dataset5", - "bindings": {}, - "result": 21.67 -} \ No newline at end of file diff --git a/test/test-suite/groups/lambdas/case006.json b/test/test-suite/groups/lambdas/case006.json deleted file mode 100644 index da7c15ee..00000000 --- a/test/test-suite/groups/lambdas/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": " ( $even := function($n) { $n = 0 ? true : $odd($n-1) }; $odd := function($n) { $n = 0 ? false : $even($n-1) }; $even(82) )", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/lambdas/case007.json b/test/test-suite/groups/lambdas/case007.json deleted file mode 100644 index e4426046..00000000 --- a/test/test-suite/groups/lambdas/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": " ( $even := function($n) { $n = 0 ? true : $odd($n-1) }; $odd := function($n) { $n = 0 ? false : $even($n-1) }; $even(65) )", - "dataset": null, - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/lambdas/case008.json b/test/test-suite/groups/lambdas/case008.json deleted file mode 100644 index 1d87522c..00000000 --- a/test/test-suite/groups/lambdas/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": " ( $even := function($n) { $n = 0 ? true : $odd($n-1) }; $odd := function($n) { $n = 0 ? false : $even($n-1) }; $odd(65) )", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/lambdas/case009.json b/test/test-suite/groups/lambdas/case009.json deleted file mode 100644 index 42a7d6cb..00000000 --- a/test/test-suite/groups/lambdas/case009.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "( $gcd := λ($a, $b){$b = 0 ? $a : $gcd($b, $a%$b) }; [$gcd(8,12), $gcd(9,12)])", - "dataset": null, - "bindings": {}, - "result": [ - 4, - 3 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/lambdas/case010.json b/test/test-suite/groups/lambdas/case010.json deleted file mode 100644 index b6f60fb9..00000000 --- a/test/test-suite/groups/lambdas/case010.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "expr": "( $range := function($start, $end, $step) { ( $step:=($step?$step:1); $start+$step > $end ? $start : $append($start, $range($start+$step, $end, $step)) )}; $range(0,15)) ", - "dataset": null, - "bindings": {}, - "result": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/lambdas/case011.json b/test/test-suite/groups/lambdas/case011.json deleted file mode 100644 index 9685cbac..00000000 --- a/test/test-suite/groups/lambdas/case011.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "expr": "( $range := function($start, $end, $step) { ( $step:=($step?$step:1); $start+$step > $end ? $start : $append($start, $range($start+$step, $end, $step)) )}; $range(0,15,2)) ", - "dataset": null, - "bindings": {}, - "result": [ - 0, - 2, - 4, - 6, - 8, - 10, - 12, - 14 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case000.json b/test/test-suite/groups/literals/case000.json deleted file mode 100644 index 8e0d8731..00000000 --- a/test/test-suite/groups/literals/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"hello\"", - "dataset": "dataset0", - "bindings": {}, - "result": "hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case001.json b/test/test-suite/groups/literals/case001.json deleted file mode 100644 index 2ee68e49..00000000 --- a/test/test-suite/groups/literals/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "'hello'", - "dataset": "dataset0", - "bindings": {}, - "result": "hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case002.json b/test/test-suite/groups/literals/case002.json deleted file mode 100644 index 970592ab..00000000 --- a/test/test-suite/groups/literals/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"Wayne's World\"", - "dataset": "dataset0", - "bindings": {}, - "result": "Wayne's World" -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case003.json b/test/test-suite/groups/literals/case003.json deleted file mode 100644 index 28e9c4df..00000000 --- a/test/test-suite/groups/literals/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "42", - "dataset": "dataset0", - "bindings": {}, - "result": 42 -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case004.json b/test/test-suite/groups/literals/case004.json deleted file mode 100644 index 25962ce6..00000000 --- a/test/test-suite/groups/literals/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "-42", - "dataset": "dataset0", - "bindings": {}, - "result": -42 -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case005.json b/test/test-suite/groups/literals/case005.json deleted file mode 100644 index a1358d55..00000000 --- a/test/test-suite/groups/literals/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "3.14159", - "dataset": "dataset0", - "bindings": {}, - "result": 3.14159 -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case006.json b/test/test-suite/groups/literals/case006.json deleted file mode 100644 index 373fddc8..00000000 --- a/test/test-suite/groups/literals/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "6.022e23", - "dataset": "dataset0", - "bindings": {}, - "result": 6.022e+23 -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case007.json b/test/test-suite/groups/literals/case007.json deleted file mode 100644 index 4a7e70a2..00000000 --- a/test/test-suite/groups/literals/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "1.602E-19", - "dataset": "dataset0", - "bindings": {}, - "result": 1.602e-19 -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case008.json b/test/test-suite/groups/literals/case008.json deleted file mode 100644 index 6d3508ca..00000000 --- a/test/test-suite/groups/literals/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "10e1000", - "data": {}, - "bindings": {}, - "code": "S0102" -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case009.json b/test/test-suite/groups/literals/case009.json deleted file mode 100644 index f41dd107..00000000 --- a/test/test-suite/groups/literals/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"hello\\tworld\"", - "dataset": "dataset0", - "bindings": {}, - "result": "hello\tworld" -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case010.json b/test/test-suite/groups/literals/case010.json deleted file mode 100644 index abde2d82..00000000 --- a/test/test-suite/groups/literals/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"hello\\nworld\"", - "dataset": "dataset0", - "bindings": {}, - "result": "hello\nworld" -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case011.json b/test/test-suite/groups/literals/case011.json deleted file mode 100644 index a0e434b3..00000000 --- a/test/test-suite/groups/literals/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"hello \\\"world\\\"\"", - "dataset": "dataset0", - "bindings": {}, - "result": "hello \"world\"" -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case012.json b/test/test-suite/groups/literals/case012.json deleted file mode 100644 index 3e4606ff..00000000 --- a/test/test-suite/groups/literals/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"C:\\\\Test\\\\test.txt\"", - "dataset": "dataset0", - "bindings": {}, - "result": "C:\\Test\\test.txt" -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case013.json b/test/test-suite/groups/literals/case013.json deleted file mode 100644 index 0aa156e2..00000000 --- a/test/test-suite/groups/literals/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"\\u03BB-calculus rocks\"", - "dataset": "dataset0", - "bindings": {}, - "result": "λ-calculus rocks" -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case014.json b/test/test-suite/groups/literals/case014.json deleted file mode 100644 index 784bc387..00000000 --- a/test/test-suite/groups/literals/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"𝄞\"", - "dataset": "dataset0", - "bindings": {}, - "result": "𝄞" -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case015.json b/test/test-suite/groups/literals/case015.json deleted file mode 100644 index ca9009e5..00000000 --- a/test/test-suite/groups/literals/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"\\y\"", - "data": {}, - "bindings": {}, - "code": "S0103" -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case016.json b/test/test-suite/groups/literals/case016.json deleted file mode 100644 index a3f167b3..00000000 --- a/test/test-suite/groups/literals/case016.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"\\u\"", - "data": {}, - "bindings": {}, - "code": "S0104" -} \ No newline at end of file diff --git a/test/test-suite/groups/literals/case017.json b/test/test-suite/groups/literals/case017.json deleted file mode 100644 index 51ac0217..00000000 --- a/test/test-suite/groups/literals/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"\\u123t\"", - "data": {}, - "bindings": {}, - "code": "S0104" -} \ No newline at end of file diff --git a/test/test-suite/groups/missing-paths/case000.json b/test/test-suite/groups/missing-paths/case000.json deleted file mode 100644 index 3a4d1b28..00000000 --- a/test/test-suite/groups/missing-paths/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "fdf", - "dataset": "dataset0", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/missing-paths/case001.json b/test/test-suite/groups/missing-paths/case001.json deleted file mode 100644 index 9e704791..00000000 --- a/test/test-suite/groups/missing-paths/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "fdf.ett", - "dataset": "dataset0", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/missing-paths/case002.json b/test/test-suite/groups/missing-paths/case002.json deleted file mode 100644 index 39a7a895..00000000 --- a/test/test-suite/groups/missing-paths/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "fdf.ett[10]", - "dataset": "dataset0", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/missing-paths/case003.json b/test/test-suite/groups/missing-paths/case003.json deleted file mode 100644 index ce1055c8..00000000 --- a/test/test-suite/groups/missing-paths/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "fdf.ett[vc > 10]", - "dataset": "dataset0", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/missing-paths/case004.json b/test/test-suite/groups/missing-paths/case004.json deleted file mode 100644 index 4fcca814..00000000 --- a/test/test-suite/groups/missing-paths/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "fdf.ett + 27", - "dataset": "dataset0", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/missing-paths/case005.json b/test/test-suite/groups/missing-paths/case005.json deleted file mode 100644 index ef17318b..00000000 --- a/test/test-suite/groups/missing-paths/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$fdsd", - "dataset": "dataset0", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/multiple-array-selectors/case000.json b/test/test-suite/groups/multiple-array-selectors/case000.json deleted file mode 100644 index 2ca49863..00000000 --- a/test/test-suite/groups/multiple-array-selectors/case000.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "[1..10][[1..3,8,-1]]", - "dataset": null, - "bindings": {}, - "result": [ - 2, - 3, - 4, - 9, - 10 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/multiple-array-selectors/case001.json b/test/test-suite/groups/multiple-array-selectors/case001.json deleted file mode 100644 index e2fdc63e..00000000 --- a/test/test-suite/groups/multiple-array-selectors/case001.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "[1..10][[1..3,8,5]]", - "dataset": null, - "bindings": {}, - "result": [ - 2, - 3, - 4, - 6, - 9 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/multiple-array-selectors/case002.json b/test/test-suite/groups/multiple-array-selectors/case002.json deleted file mode 100644 index a3366c21..00000000 --- a/test/test-suite/groups/multiple-array-selectors/case002.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "expr": "[1..10][[1..3,8,false]]", - "dataset": null, - "bindings": {}, - "result": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/null/case000.json b/test/test-suite/groups/null/case000.json deleted file mode 100644 index 438ac119..00000000 --- a/test/test-suite/groups/null/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "null", - "dataset": "dataset0", - "bindings": {}, - "result": null -} \ No newline at end of file diff --git a/test/test-suite/groups/null/case001.json b/test/test-suite/groups/null/case001.json deleted file mode 100644 index dbaa4ce1..00000000 --- a/test/test-suite/groups/null/case001.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "[null]", - "dataset": "dataset0", - "bindings": {}, - "result": [ - null - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/null/case002.json b/test/test-suite/groups/null/case002.json deleted file mode 100644 index 6b24d722..00000000 --- a/test/test-suite/groups/null/case002.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "[null, null]", - "dataset": "dataset0", - "bindings": {}, - "result": [ - null, - null - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/null/case003.json b/test/test-suite/groups/null/case003.json deleted file mode 100644 index 616b4996..00000000 --- a/test/test-suite/groups/null/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$not(null)", - "dataset": "dataset0", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/null/case004.json b/test/test-suite/groups/null/case004.json deleted file mode 100644 index fccd8304..00000000 --- a/test/test-suite/groups/null/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "null = null", - "dataset": "dataset0", - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/null/case005.json b/test/test-suite/groups/null/case005.json deleted file mode 100644 index 2f4b12fb..00000000 --- a/test/test-suite/groups/null/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "null != null", - "dataset": "dataset0", - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/null/case006.json b/test/test-suite/groups/null/case006.json deleted file mode 100644 index 9e9a8107..00000000 --- a/test/test-suite/groups/null/case006.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "{\"true\": true, \"false\":false, \"null\": null}", - "dataset": "dataset0", - "bindings": {}, - "result": { - "true": true, - "false": false, - "null": null - } -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case000.json b/test/test-suite/groups/numeric-operators/case000.json deleted file mode 100644 index 9c4702f3..00000000 --- a/test/test-suite/groups/numeric-operators/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.bar + bar", - "dataset": "dataset0", - "bindings": {}, - "result": 140 -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case001.json b/test/test-suite/groups/numeric-operators/case001.json deleted file mode 100644 index 97d716de..00000000 --- a/test/test-suite/groups/numeric-operators/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "bar + foo.bar", - "dataset": "dataset0", - "bindings": {}, - "result": 140 -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case002.json b/test/test-suite/groups/numeric-operators/case002.json deleted file mode 100644 index 4176239f..00000000 --- a/test/test-suite/groups/numeric-operators/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.bar - bar", - "dataset": "dataset0", - "bindings": {}, - "result": -56 -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case003.json b/test/test-suite/groups/numeric-operators/case003.json deleted file mode 100644 index b9edda4b..00000000 --- a/test/test-suite/groups/numeric-operators/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "bar - foo.bar", - "dataset": "dataset0", - "bindings": {}, - "result": 56 -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case004.json b/test/test-suite/groups/numeric-operators/case004.json deleted file mode 100644 index 0cc0d260..00000000 --- a/test/test-suite/groups/numeric-operators/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.bar * bar", - "dataset": "dataset0", - "bindings": {}, - "result": 4116 -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case005.json b/test/test-suite/groups/numeric-operators/case005.json deleted file mode 100644 index d59ffdf7..00000000 --- a/test/test-suite/groups/numeric-operators/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "bar * foo.bar", - "dataset": "dataset0", - "bindings": {}, - "result": 4116 -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case006.json b/test/test-suite/groups/numeric-operators/case006.json deleted file mode 100644 index 33ee2998..00000000 --- a/test/test-suite/groups/numeric-operators/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.bar / bar", - "dataset": "dataset0", - "bindings": {}, - "result": 0.42857142857142855 -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case007.json b/test/test-suite/groups/numeric-operators/case007.json deleted file mode 100644 index 7a4baab5..00000000 --- a/test/test-suite/groups/numeric-operators/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "bar / foo.bar", - "dataset": "dataset0", - "bindings": {}, - "result": 2.3333333333333335 -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case008.json b/test/test-suite/groups/numeric-operators/case008.json deleted file mode 100644 index c45d682e..00000000 --- a/test/test-suite/groups/numeric-operators/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.bar % bar", - "dataset": "dataset0", - "bindings": {}, - "result": 42 -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case009.json b/test/test-suite/groups/numeric-operators/case009.json deleted file mode 100644 index 02cb23ba..00000000 --- a/test/test-suite/groups/numeric-operators/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "bar % foo.bar", - "dataset": "dataset0", - "bindings": {}, - "result": 14 -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case010.json b/test/test-suite/groups/numeric-operators/case010.json deleted file mode 100644 index 3b4567b7..00000000 --- a/test/test-suite/groups/numeric-operators/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "bar + foo.bar * bar", - "dataset": "dataset0", - "bindings": {}, - "result": 4214 -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case011.json b/test/test-suite/groups/numeric-operators/case011.json deleted file mode 100644 index 92076c87..00000000 --- a/test/test-suite/groups/numeric-operators/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.bar * bar + bar", - "dataset": "dataset0", - "bindings": {}, - "result": 4214 -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case012.json b/test/test-suite/groups/numeric-operators/case012.json deleted file mode 100644 index cf6c21f7..00000000 --- a/test/test-suite/groups/numeric-operators/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "24 * notexist", - "dataset": "dataset0", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case013.json b/test/test-suite/groups/numeric-operators/case013.json deleted file mode 100644 index 8c5d24d7..00000000 --- a/test/test-suite/groups/numeric-operators/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "notexist + 1", - "dataset": "dataset0", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case014.json b/test/test-suite/groups/numeric-operators/case014.json deleted file mode 100644 index c6e67e62..00000000 --- a/test/test-suite/groups/numeric-operators/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "1/(10e300 * 10e100) ", - "dataset": null, - "bindings": {}, - "code": "D1001" -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case015.json b/test/test-suite/groups/numeric-operators/case015.json deleted file mode 100644 index 027614ee..00000000 --- a/test/test-suite/groups/numeric-operators/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"5\" + \"5\"", - "dataset": null, - "bindings": {}, - "code": "T2001" -} \ No newline at end of file diff --git a/test/test-suite/groups/numeric-operators/case016.json b/test/test-suite/groups/numeric-operators/case016.json deleted file mode 100644 index 2668ba3d..00000000 --- a/test/test-suite/groups/numeric-operators/case016.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "- notexist", - "dataset": "dataset0", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case000.json b/test/test-suite/groups/object-constructor/case000.json deleted file mode 100644 index 10215dbe..00000000 --- a/test/test-suite/groups/object-constructor/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "{}", - "dataset": "dataset0", - "bindings": {}, - "result": {} -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case001.json b/test/test-suite/groups/object-constructor/case001.json deleted file mode 100644 index d2a92fff..00000000 --- a/test/test-suite/groups/object-constructor/case001.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "{\"key\": \"value\"}", - "dataset": "dataset0", - "bindings": {}, - "result": { - "key": "value" - } -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case002.json b/test/test-suite/groups/object-constructor/case002.json deleted file mode 100644 index e6c0b635..00000000 --- a/test/test-suite/groups/object-constructor/case002.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "{\"one\": 1, \"two\": 2}", - "dataset": "dataset0", - "bindings": {}, - "result": { - "one": 1, - "two": 2 - } -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case003.json b/test/test-suite/groups/object-constructor/case003.json deleted file mode 100644 index 855f4497..00000000 --- a/test/test-suite/groups/object-constructor/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "{\"one\": 1, \"two\": 2}.two", - "dataset": "dataset0", - "bindings": {}, - "result": 2 -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case004.json b/test/test-suite/groups/object-constructor/case004.json deleted file mode 100644 index c275df16..00000000 --- a/test/test-suite/groups/object-constructor/case004.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "{\"one\": 1, \"two\": {\"three\": 3, \"four\": \"4\"}}", - "dataset": "dataset0", - "bindings": {}, - "result": { - "one": 1, - "two": { - "three": 3, - "four": "4" - } - } -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case005.json b/test/test-suite/groups/object-constructor/case005.json deleted file mode 100644 index c5a5425c..00000000 --- a/test/test-suite/groups/object-constructor/case005.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "{\"one\": 1, \"two\": [3, \"four\"]}", - "dataset": "dataset0", - "bindings": {}, - "result": { - "one": 1, - "two": [ - 3, - "four" - ] - } -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case006.json b/test/test-suite/groups/object-constructor/case006.json deleted file mode 100644 index 2d95e2a7..00000000 --- a/test/test-suite/groups/object-constructor/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "{\"test\": ()}", - "data": null, - "bindings": {}, - "result": {} -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case007.json b/test/test-suite/groups/object-constructor/case007.json deleted file mode 100644 index 9ffcf1e2..00000000 --- a/test/test-suite/groups/object-constructor/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "blah.{}", - "dataset": "dataset0", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case008.json b/test/test-suite/groups/object-constructor/case008.json deleted file mode 100644 index a991c358..00000000 --- a/test/test-suite/groups/object-constructor/case008.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "expr": "Account.Order{OrderID: Product.\"Product Name\"}", - "dataset": "dataset5", - "bindings": {}, - "result": { - "order103": [ - "Bowler Hat", - "Trilby hat" - ], - "order104": [ - "Bowler Hat", - "Cloak" - ] - } -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case009.json b/test/test-suite/groups/object-constructor/case009.json deleted file mode 100644 index 088f9720..00000000 --- a/test/test-suite/groups/object-constructor/case009.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "expr": "Account.Order.{OrderID: Product.\"Product Name\"}", - "dataset": "dataset5", - "bindings": {}, - "result": [ - { - "order103": [ - "Bowler Hat", - "Trilby hat" - ] - }, - { - "order104": [ - "Bowler Hat", - "Cloak" - ] - } - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case010.json b/test/test-suite/groups/object-constructor/case010.json deleted file mode 100644 index 31d5b6ac..00000000 --- a/test/test-suite/groups/object-constructor/case010.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "expr": "Account.Order.Product{$string(ProductID): Price}", - "dataset": "dataset5", - "bindings": {}, - "result": { - "345664": 107.99, - "858236": 21.67, - "858383": [ - 34.45, - 34.45 - ] - } -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case011.json b/test/test-suite/groups/object-constructor/case011.json deleted file mode 100644 index 40910321..00000000 --- a/test/test-suite/groups/object-constructor/case011.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "Account.Order.Product{$string(ProductID): (Price)[0]}", - "dataset": "dataset5", - "bindings": {}, - "result": { - "345664": 107.99, - "858236": 21.67, - "858383": 34.45 - } -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case012.json b/test/test-suite/groups/object-constructor/case012.json deleted file mode 100644 index 9b7f7d22..00000000 --- a/test/test-suite/groups/object-constructor/case012.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "expr": "Account.Order.Product.{$string(ProductID): Price}", - "dataset": "dataset5", - "bindings": {}, - "result": [ - { - "858383": 34.45 - }, - { - "858236": 21.67 - }, - { - "858383": 34.45 - }, - { - "345664": 107.99 - } - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case013.json b/test/test-suite/groups/object-constructor/case013.json deleted file mode 100644 index 857c5568..00000000 --- a/test/test-suite/groups/object-constructor/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order.Product{ProductID: \"Product Name\"}", - "dataset": "dataset5", - "bindings": {}, - "code": "T1003" -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case014.json b/test/test-suite/groups/object-constructor/case014.json deleted file mode 100644 index 766b9137..00000000 --- a/test/test-suite/groups/object-constructor/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order.Product.{ProductID: \"Product Name\"}", - "dataset": "dataset5", - "bindings": {}, - "code": "T1003" -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case015.json b/test/test-suite/groups/object-constructor/case015.json deleted file mode 100644 index 9fab7277..00000000 --- a/test/test-suite/groups/object-constructor/case015.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Account.Order{OrderID: $sum(Product.(Price*Quantity))}", - "dataset": "dataset5", - "bindings": {}, - "result": { - "order103": 90.57000000000001, - "order104": 245.79000000000002 - } -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case016.json b/test/test-suite/groups/object-constructor/case016.json deleted file mode 100644 index fe90ddf9..00000000 --- a/test/test-suite/groups/object-constructor/case016.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "expr": "Account.Order.{OrderID: $sum(Product.(Price*Quantity))}", - "dataset": "dataset5", - "bindings": {}, - "result": [ - { - "order103": 90.57000000000001 - }, - { - "order104": 245.79000000000002 - } - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case017.json b/test/test-suite/groups/object-constructor/case017.json deleted file mode 100644 index a0cf596a..00000000 --- a/test/test-suite/groups/object-constructor/case017.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "expr": "Account.Order.Product{$.\"Product Name\": Price, $.\"Product Name\": Price}", - "dataset": "dataset5", - "bindings": {}, - "result": { - "Bowler Hat": [ - 34.45, - 34.45, - 34.45, - 34.45 - ], - "Trilby hat": [ - 21.67, - 21.67 - ], - "Cloak": [ - 107.99, - 107.99 - ] - } -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case018.json b/test/test-suite/groups/object-constructor/case018.json deleted file mode 100644 index 69086d8d..00000000 --- a/test/test-suite/groups/object-constructor/case018.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "expr": "Account.Order.Product{`Product Name`: Price, `Product Name`: Price}", - "dataset": "dataset5", - "bindings": {}, - "result": { - "Bowler Hat": [ - 34.45, - 34.45, - 34.45, - 34.45 - ], - "Trilby hat": [ - 21.67, - 21.67 - ], - "Cloak": [ - 107.99, - 107.99 - ] - } -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case019.json b/test/test-suite/groups/object-constructor/case019.json deleted file mode 100644 index ce88d38e..00000000 --- a/test/test-suite/groups/object-constructor/case019.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "expr": "Account.Order{ OrderID: { \"TotalPrice\":$sum(Product.(Price * Quantity)), \"Items\": Product.\"Product Name\" }}", - "dataset": "dataset5", - "bindings": {}, - "result": { - "order103": { - "TotalPrice": 90.57000000000001, - "Items": [ - "Bowler Hat", - "Trilby hat" - ] - }, - "order104": { - "TotalPrice": 245.79000000000002, - "Items": [ - "Bowler Hat", - "Cloak" - ] - } - } -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case020.json b/test/test-suite/groups/object-constructor/case020.json deleted file mode 100644 index 9128c0c7..00000000 --- a/test/test-suite/groups/object-constructor/case020.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "expr": "{ \"Order\": Account.Order.{ \"ID\": OrderID, \"Product\": Product.{ \"Name\": $.\"Product Name\", \"SKU\": ProductID, \"Details\": { \"Weight\": Description.Weight, \"Dimensions\": Description.(Width & \" x \" & Height & \" x \" & Depth) } }, \"Total Price\": $sum(Product.(Price * Quantity)) }}", - "dataset": "dataset5", - "bindings": {}, - "result": { - "Order": [ - { - "ID": "order103", - "Product": [ - { - "Name": "Bowler Hat", - "SKU": 858383, - "Details": { - "Weight": 0.75, - "Dimensions": "300 x 200 x 210" - } - }, - { - "Name": "Trilby hat", - "SKU": 858236, - "Details": { - "Weight": 0.6, - "Dimensions": "300 x 200 x 210" - } - } - ], - "Total Price": 90.57000000000001 - }, - { - "ID": "order104", - "Product": [ - { - "Name": "Bowler Hat", - "SKU": 858383, - "Details": { - "Weight": 0.75, - "Dimensions": "300 x 200 x 210" - } - }, - { - "Name": "Cloak", - "SKU": 345664, - "Details": { - "Weight": 2, - "Dimensions": "30 x 20 x 210" - } - } - ], - "Total Price": 245.79000000000002 - } - ] - } -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case021.json b/test/test-suite/groups/object-constructor/case021.json deleted file mode 100644 index 24868a5a..00000000 --- a/test/test-suite/groups/object-constructor/case021.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "expr": "{ \"Order\": Account.Order.{ \"ID\": OrderID, \"Product\": Product.{ \"Name\": `Product Name`, \"SKU\": ProductID, \"Details\": { \"Weight\": Description.Weight, \"Dimensions\": Description.(Width & \" x \" & Height & \" x \" & Depth) } }, \"Total Price\": $sum(Product.(Price * Quantity)) }}", - "dataset": "dataset5", - "bindings": {}, - "result": { - "Order": [ - { - "ID": "order103", - "Product": [ - { - "Name": "Bowler Hat", - "SKU": 858383, - "Details": { - "Weight": 0.75, - "Dimensions": "300 x 200 x 210" - } - }, - { - "Name": "Trilby hat", - "SKU": 858236, - "Details": { - "Weight": 0.6, - "Dimensions": "300 x 200 x 210" - } - } - ], - "Total Price": 90.57000000000001 - }, - { - "ID": "order104", - "Product": [ - { - "Name": "Bowler Hat", - "SKU": 858383, - "Details": { - "Weight": 0.75, - "Dimensions": "300 x 200 x 210" - } - }, - { - "Name": "Cloak", - "SKU": 345664, - "Details": { - "Weight": 2, - "Dimensions": "30 x 20 x 210" - } - } - ], - "Total Price": 245.79000000000002 - } - ] - } -} \ No newline at end of file diff --git a/test/test-suite/groups/object-constructor/case022.json b/test/test-suite/groups/object-constructor/case022.json deleted file mode 100644 index 61df7e7f..00000000 --- a/test/test-suite/groups/object-constructor/case022.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "expr": "Phone{type: $join(number, \", \"), \"phone\":number}", - "dataset": "dataset1", - "bindings": {}, - "result": { - "home": "0203 544 1234", - "phone": [ - "0203 544 1234", - "01962 001234", - "01962 001235", - "077 7700 1234" - ], - "office": "01962 001234, 01962 001235", - "mobile": "077 7700 1234" - } -} \ No newline at end of file diff --git a/test/test-suite/groups/parentheses/case000.json b/test/test-suite/groups/parentheses/case000.json deleted file mode 100644 index 724dfc81..00000000 --- a/test/test-suite/groups/parentheses/case000.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.(blah).baz.fud", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/parentheses/case001.json b/test/test-suite/groups/parentheses/case001.json deleted file mode 100644 index 05e67e0b..00000000 --- a/test/test-suite/groups/parentheses/case001.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.(blah.baz).fud", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/parentheses/case002.json b/test/test-suite/groups/parentheses/case002.json deleted file mode 100644 index 2a0bcf15..00000000 --- a/test/test-suite/groups/parentheses/case002.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "(foo.blah.baz).fud", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/parentheses/case003.json b/test/test-suite/groups/parentheses/case003.json deleted file mode 100644 index fe6eaccf..00000000 --- a/test/test-suite/groups/parentheses/case003.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.blah.(baz.fud)", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/parentheses/case004.json b/test/test-suite/groups/parentheses/case004.json deleted file mode 100644 index 8c74c05a..00000000 --- a/test/test-suite/groups/parentheses/case004.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "(foo.blah.baz.fud)", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/parentheses/case005.json b/test/test-suite/groups/parentheses/case005.json deleted file mode 100644 index 8463b53b..00000000 --- a/test/test-suite/groups/parentheses/case005.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "(foo).(blah).baz.(fud)", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/parentheses/case006.json b/test/test-suite/groups/parentheses/case006.json deleted file mode 100644 index 18e1b1af..00000000 --- a/test/test-suite/groups/parentheses/case006.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "(foo.(blah).baz.fud)", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/parentheses/case007.json b/test/test-suite/groups/parentheses/case007.json deleted file mode 100644 index b4aa7021..00000000 --- a/test/test-suite/groups/parentheses/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(4 + 2) / 2", - "dataset": "dataset0", - "bindings": {}, - "result": 3 -} \ No newline at end of file diff --git a/test/test-suite/groups/partial-application/case000.json b/test/test-suite/groups/partial-application/case000.json deleted file mode 100644 index 5cde05d4..00000000 --- a/test/test-suite/groups/partial-application/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $add := function($x, $y){$x+$y}; $add2 := $add(?, 2); $add2(3))", - "dataset": "dataset5", - "bindings": {}, - "result": 5 -} \ No newline at end of file diff --git a/test/test-suite/groups/partial-application/case001.json b/test/test-suite/groups/partial-application/case001.json deleted file mode 100644 index d37a42fc..00000000 --- a/test/test-suite/groups/partial-application/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $add := function($x, $y){$x+$y}; $add2 := $add(2, ?); $add2(4))", - "dataset": "dataset5", - "bindings": {}, - "result": 6 -} \ No newline at end of file diff --git a/test/test-suite/groups/partial-application/case002.json b/test/test-suite/groups/partial-application/case002.json deleted file mode 100644 index 49df73fc..00000000 --- a/test/test-suite/groups/partial-application/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $firstn := $substring(?, 0, ?); $first5 := $firstn(?, 5); $first5(\"Hello World\"))", - "dataset": "dataset5", - "bindings": {}, - "result": "Hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/partial-application/case003.json b/test/test-suite/groups/partial-application/case003.json deleted file mode 100644 index a5f12a9f..00000000 --- a/test/test-suite/groups/partial-application/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "substring(?, 0, ?)", - "data": {}, - "bindings": {}, - "code": "T1007" -} \ No newline at end of file diff --git a/test/test-suite/groups/partial-application/case004.json b/test/test-suite/groups/partial-application/case004.json deleted file mode 100644 index 4f6c40fb..00000000 --- a/test/test-suite/groups/partial-application/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "unknown(?)", - "data": {}, - "bindings": {}, - "code": "T1008" -} \ No newline at end of file diff --git a/test/test-suite/groups/predicates/case000.json b/test/test-suite/groups/predicates/case000.json deleted file mode 100644 index b9393e32..00000000 --- a/test/test-suite/groups/predicates/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "nothing[x=6][y=3].number", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/predicates/case001.json b/test/test-suite/groups/predicates/case001.json deleted file mode 100644 index 976448b8..00000000 --- a/test/test-suite/groups/predicates/case001.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "expr": "clues[x=6][y=3].number", - "data": { - "clues": [ - { - "x": 6, - "y": 3, - "number": 7 - } - ] - }, - "bindings": {}, - "result": 7 -} \ No newline at end of file diff --git a/test/test-suite/groups/predicates/case002.json b/test/test-suite/groups/predicates/case002.json deleted file mode 100644 index 5f8724e3..00000000 --- a/test/test-suite/groups/predicates/case002.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "$[x=6][y=3].number", - "data": [ - { - "x": 6, - "y": 2, - "number": 7 - } - ], - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/predicates/case003.json b/test/test-suite/groups/predicates/case003.json deleted file mode 100644 index 1a37de83..00000000 --- a/test/test-suite/groups/predicates/case003.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Account.Order.Product[$lowercase(Description.Colour) = \"purple\"][0].Price", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 34.45, - 34.45 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/quoted-selectors/case000.json b/test/test-suite/groups/quoted-selectors/case000.json deleted file mode 100644 index 616b6f64..00000000 --- a/test/test-suite/groups/quoted-selectors/case000.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "expr": "foo.\"blah\"", - "dataset": "dataset0", - "bindings": {}, - "result": [ - { - "baz": { - "fud": "hello" - } - }, - { - "baz": { - "fud": "world" - } - }, - { - "bazz": "gotcha" - } - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/quoted-selectors/case001.json b/test/test-suite/groups/quoted-selectors/case001.json deleted file mode 100644 index 8846899f..00000000 --- a/test/test-suite/groups/quoted-selectors/case001.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.\"blah\".baz.'fud'", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/quoted-selectors/case002.json b/test/test-suite/groups/quoted-selectors/case002.json deleted file mode 100644 index 94435934..00000000 --- a/test/test-suite/groups/quoted-selectors/case002.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "\"foo\".\"blah\".\"baz\".\"fud\"", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/quoted-selectors/case003.json b/test/test-suite/groups/quoted-selectors/case003.json deleted file mode 100644 index e283b269..00000000 --- a/test/test-suite/groups/quoted-selectors/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.\"blah.baz\"", - "dataset": "dataset0", - "bindings": {}, - "result": "here" -} \ No newline at end of file diff --git a/test/test-suite/groups/quoted-selectors/case004.json b/test/test-suite/groups/quoted-selectors/case004.json deleted file mode 100644 index f29097f6..00000000 --- a/test/test-suite/groups/quoted-selectors/case004.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "expr": "foo.`blah`", - "dataset": "dataset0", - "bindings": {}, - "result": [ - { - "baz": { - "fud": "hello" - } - }, - { - "baz": { - "fud": "world" - } - }, - { - "bazz": "gotcha" - } - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/quoted-selectors/case005.json b/test/test-suite/groups/quoted-selectors/case005.json deleted file mode 100644 index f9ff36c0..00000000 --- a/test/test-suite/groups/quoted-selectors/case005.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.`blah`.baz.'fud'", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/quoted-selectors/case006.json b/test/test-suite/groups/quoted-selectors/case006.json deleted file mode 100644 index ac529231..00000000 --- a/test/test-suite/groups/quoted-selectors/case006.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "`foo`.`blah`.`baz`.`fud`", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/quoted-selectors/case007.json b/test/test-suite/groups/quoted-selectors/case007.json deleted file mode 100644 index 59c73b66..00000000 --- a/test/test-suite/groups/quoted-selectors/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.`blah.baz`", - "dataset": "dataset0", - "bindings": {}, - "result": "here" -} \ No newline at end of file diff --git a/test/test-suite/groups/range-operator/case000.json b/test/test-suite/groups/range-operator/case000.json deleted file mode 100644 index 48476972..00000000 --- a/test/test-suite/groups/range-operator/case000.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "expr": "[0..9]", - "dataset": "dataset0", - "bindings": {}, - "result": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/range-operator/case001.json b/test/test-suite/groups/range-operator/case001.json deleted file mode 100644 index e494512c..00000000 --- a/test/test-suite/groups/range-operator/case001.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "[0..9][$ % 2 = 0]", - "dataset": "dataset0", - "bindings": {}, - "result": [ - 0, - 2, - 4, - 6, - 8 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/range-operator/case002.json b/test/test-suite/groups/range-operator/case002.json deleted file mode 100644 index b8dfbc08..00000000 --- a/test/test-suite/groups/range-operator/case002.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "expr": "[0, 4..9, 20, 22]", - "dataset": "dataset0", - "bindings": {}, - "result": [ - 0, - 4, - 5, - 6, - 7, - 8, - 9, - 20, - 22 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/range-operator/case003.json b/test/test-suite/groups/range-operator/case003.json deleted file mode 100644 index 86e9b329..00000000 --- a/test/test-suite/groups/range-operator/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[5..2]", - "dataset": "dataset0", - "bindings": {}, - "result": [] -} \ No newline at end of file diff --git a/test/test-suite/groups/range-operator/case004.json b/test/test-suite/groups/range-operator/case004.json deleted file mode 100644 index cbc9d8c3..00000000 --- a/test/test-suite/groups/range-operator/case004.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "[5..2, 2..5]", - "dataset": "dataset0", - "bindings": {}, - "result": [ - 2, - 3, - 4, - 5 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/range-operator/case005.json b/test/test-suite/groups/range-operator/case005.json deleted file mode 100644 index 2cd8fee9..00000000 --- a/test/test-suite/groups/range-operator/case005.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "[-2..2]", - "dataset": "dataset0", - "bindings": {}, - "result": [ - -2, - -1, - 0, - 1, - 2 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/range-operator/case006.json b/test/test-suite/groups/range-operator/case006.json deleted file mode 100644 index 22b52704..00000000 --- a/test/test-suite/groups/range-operator/case006.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "[-2..2].($*$)", - "dataset": "dataset0", - "bindings": {}, - "result": [ - 4, - 1, - 0, - 1, - 4 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/range-operator/case007.json b/test/test-suite/groups/range-operator/case007.json deleted file mode 100644 index 19b0c00e..00000000 --- a/test/test-suite/groups/range-operator/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[-2..blah]", - "dataset": null, - "bindings": {}, - "result": [] -} \ No newline at end of file diff --git a/test/test-suite/groups/range-operator/case008.json b/test/test-suite/groups/range-operator/case008.json deleted file mode 100644 index 4b5b0964..00000000 --- a/test/test-suite/groups/range-operator/case008.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "[blah..5, 3, -2..blah]", - "dataset": null, - "bindings": {}, - "result": [ - 3 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/range-operator/case009.json b/test/test-suite/groups/range-operator/case009.json deleted file mode 100644 index 5b2f0044..00000000 --- a/test/test-suite/groups/range-operator/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[1.1 .. 5]", - "dataset": null, - "bindings": {}, - "code": "T2003" -} \ No newline at end of file diff --git a/test/test-suite/groups/range-operator/case010.json b/test/test-suite/groups/range-operator/case010.json deleted file mode 100644 index 8a205a17..00000000 --- a/test/test-suite/groups/range-operator/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[1 .. 5.5]", - "dataset": null, - "bindings": {}, - "code": "T2004" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case000.json b/test/test-suite/groups/regex/case000.json deleted file mode 100644 index 25ed470a..00000000 --- a/test/test-suite/groups/regex/case000.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "$split(\"ababbxabbcc\",/b+/)", - "dataset": null, - "bindings": {}, - "result": [ - "a", - "a", - "xa", - "cc" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case001.json b/test/test-suite/groups/regex/case001.json deleted file mode 100644 index 52839a9e..00000000 --- a/test/test-suite/groups/regex/case001.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "$split(\"ababbxabbcc\",/b+/, 2)", - "dataset": null, - "bindings": {}, - "result": [ - "a", - "a" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case002.json b/test/test-suite/groups/regex/case002.json deleted file mode 100644 index 1662c0c2..00000000 --- a/test/test-suite/groups/regex/case002.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "$split(\"ababbxabbcc\",/d+/)", - "dataset": null, - "bindings": {}, - "result": [ - "ababbxabbcc" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case003.json b/test/test-suite/groups/regex/case003.json deleted file mode 100644 index 0cf77135..00000000 --- a/test/test-suite/groups/regex/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$contains(\"ababbxabbcc\",/ab+/)", - "dataset": null, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case004.json b/test/test-suite/groups/regex/case004.json deleted file mode 100644 index 3bd42dc7..00000000 --- a/test/test-suite/groups/regex/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$contains(\"ababbxabbcc\",/ax+/)", - "dataset": null, - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case005.json b/test/test-suite/groups/regex/case005.json deleted file mode 100644 index 4d72c834..00000000 --- a/test/test-suite/groups/regex/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order.Product[$contains($.\"Product Name\", /hat/)].ProductID", - "dataset": "dataset5", - "bindings": {}, - "result": 858236 -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case006.json b/test/test-suite/groups/regex/case006.json deleted file mode 100644 index be1825d8..00000000 --- a/test/test-suite/groups/regex/case006.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "Account.Order.Product[$contains($.\"Product Name\", /hat/i)].ProductID", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 858383, - 858236, - 858383 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case007.json b/test/test-suite/groups/regex/case007.json deleted file mode 100644 index 8a808f54..00000000 --- a/test/test-suite/groups/regex/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"ababbxabbcc\",/b+/, \"yy\")", - "dataset": null, - "bindings": {}, - "result": "ayyayyxayycc" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case008.json b/test/test-suite/groups/regex/case008.json deleted file mode 100644 index 3c07354c..00000000 --- a/test/test-suite/groups/regex/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"ababbxabbcc\",/b+/, \"yy\", 2)", - "dataset": null, - "bindings": {}, - "result": "ayyayyxabbcc" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case009.json b/test/test-suite/groups/regex/case009.json deleted file mode 100644 index 1b9cf938..00000000 --- a/test/test-suite/groups/regex/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"ababbxabbcc\",/b+/, \"yy\", 0)", - "dataset": null, - "bindings": {}, - "result": "ababbxabbcc" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case010.json b/test/test-suite/groups/regex/case010.json deleted file mode 100644 index 8f00e8dd..00000000 --- a/test/test-suite/groups/regex/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"ababbxabbcc\",/d+/, \"yy\")", - "dataset": null, - "bindings": {}, - "result": "ababbxabbcc" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case011.json b/test/test-suite/groups/regex/case011.json deleted file mode 100644 index de84123f..00000000 --- a/test/test-suite/groups/regex/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"John Smith\", /(\\w+)\\s(\\w+)/, \"$2, $1\")", - "dataset": null, - "bindings": {}, - "result": "Smith, John" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case012.json b/test/test-suite/groups/regex/case012.json deleted file mode 100644 index 9dd2ac32..00000000 --- a/test/test-suite/groups/regex/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"265USD\", /([0-9]+)USD/, \"$$$1\")", - "dataset": null, - "bindings": {}, - "result": "$265" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case013.json b/test/test-suite/groups/regex/case013.json deleted file mode 100644 index 9044a1d0..00000000 --- a/test/test-suite/groups/regex/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"265USD\", /([0-9]+)USD/, \"$w\")", - "dataset": null, - "bindings": {}, - "result": "$w" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case014.json b/test/test-suite/groups/regex/case014.json deleted file mode 100644 index cef5081d..00000000 --- a/test/test-suite/groups/regex/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"265USD\", /([0-9]+)USD/, \"$0 -> $$$1\")", - "dataset": null, - "bindings": {}, - "result": "265USD -> $265" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case015.json b/test/test-suite/groups/regex/case015.json deleted file mode 100644 index 91fd7914..00000000 --- a/test/test-suite/groups/regex/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"265USD\", /([0-9]+)USD/, \"$0$1$2\")", - "dataset": null, - "bindings": {}, - "result": "265USD265" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case016.json b/test/test-suite/groups/regex/case016.json deleted file mode 100644 index 2a21dc7e..00000000 --- a/test/test-suite/groups/regex/case016.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"abcd\", /(ab)|(a)/, \"[1=$1][2=$2]\")", - "dataset": null, - "bindings": {}, - "result": "[1=ab][2=]cd" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case017.json b/test/test-suite/groups/regex/case017.json deleted file mode 100644 index a2708e48..00000000 --- a/test/test-suite/groups/regex/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"abracadabra\", /bra/, \"*\")", - "dataset": null, - "bindings": {}, - "result": "a*cada*" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case018.json b/test/test-suite/groups/regex/case018.json deleted file mode 100644 index 836feac3..00000000 --- a/test/test-suite/groups/regex/case018.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"abracadabra\", /a.*a/, \"*\")", - "dataset": null, - "bindings": {}, - "result": "*" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case019.json b/test/test-suite/groups/regex/case019.json deleted file mode 100644 index 3f58fc4d..00000000 --- a/test/test-suite/groups/regex/case019.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"abracadabra\", /a.*?a/, \"*\")", - "dataset": null, - "bindings": {}, - "result": "*c*bra" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case020.json b/test/test-suite/groups/regex/case020.json deleted file mode 100644 index a81b32cc..00000000 --- a/test/test-suite/groups/regex/case020.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"abracadabra\", /a/, \"\")", - "dataset": null, - "bindings": {}, - "result": "brcdbr" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case021.json b/test/test-suite/groups/regex/case021.json deleted file mode 100644 index e5501c73..00000000 --- a/test/test-suite/groups/regex/case021.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"abracadabra\", /a(.)/, \"a$1$1\")", - "dataset": null, - "bindings": {}, - "result": "abbraccaddabbra" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case022.json b/test/test-suite/groups/regex/case022.json deleted file mode 100644 index 8b2e6c54..00000000 --- a/test/test-suite/groups/regex/case022.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"abracadabra\", /.*?/, \"$1\")", - "dataset": null, - "bindings": {}, - "code": "D1004" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case023.json b/test/test-suite/groups/regex/case023.json deleted file mode 100644 index d3b3c5b8..00000000 --- a/test/test-suite/groups/regex/case023.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"AAAA\", /A+/, \"b\")", - "dataset": null, - "bindings": {}, - "result": "b" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case024.json b/test/test-suite/groups/regex/case024.json deleted file mode 100644 index c1901394..00000000 --- a/test/test-suite/groups/regex/case024.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"AAAA\", /A+?/, \"b\")", - "dataset": null, - "bindings": {}, - "result": "bbbb" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case025.json b/test/test-suite/groups/regex/case025.json deleted file mode 100644 index 027e272b..00000000 --- a/test/test-suite/groups/regex/case025.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"darted\", /^(.*?)d(.*)$/, \"$1c$2\")", - "dataset": null, - "bindings": {}, - "result": "carted" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case026.json b/test/test-suite/groups/regex/case026.json deleted file mode 100644 index 2352d700..00000000 --- a/test/test-suite/groups/regex/case026.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"abcdefghijklmno\", /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)/, \"$8$5$12$12$18$123\")", - "dataset": null, - "bindings": {}, - "result": "hella8l3no" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case027.json b/test/test-suite/groups/regex/case027.json deleted file mode 100644 index 8e0d07e0..00000000 --- a/test/test-suite/groups/regex/case027.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"abcdefghijklmno\", /xyz/, \"$8$5$12$12$18$123\")", - "dataset": null, - "bindings": {}, - "result": "abcdefghijklmno" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case028.json b/test/test-suite/groups/regex/case028.json deleted file mode 100644 index a1827527..00000000 --- a/test/test-suite/groups/regex/case028.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"abcdefghijklmno\", /ijk/, \"$8$5$12$12$18$123\")", - "dataset": null, - "bindings": {}, - "result": "abcdefgh22823lmno" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case029.json b/test/test-suite/groups/regex/case029.json deleted file mode 100644 index 49fc506d..00000000 --- a/test/test-suite/groups/regex/case029.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"abcdefghijklmno\", /(ijk)/, \"$8$5$12$12$18$123\")", - "dataset": null, - "bindings": {}, - "result": "abcdefghijk2ijk2ijk8ijk23lmno" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case030.json b/test/test-suite/groups/regex/case030.json deleted file mode 100644 index 20d3403c..00000000 --- a/test/test-suite/groups/regex/case030.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"abcdefghijklmno\", /ijk/, \"$x\")", - "dataset": null, - "bindings": {}, - "result": "abcdefgh$xlmno" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case031.json b/test/test-suite/groups/regex/case031.json deleted file mode 100644 index 2fa4134d..00000000 --- a/test/test-suite/groups/regex/case031.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"abcdefghijklmno\", /(ijk)/, \"$x$\")", - "dataset": null, - "bindings": {}, - "result": "abcdefgh$x$lmno" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case032.json b/test/test-suite/groups/regex/case032.json deleted file mode 100644 index c61f90cc..00000000 --- a/test/test-suite/groups/regex/case032.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product.$replace($.\"Product Name\", /hat/i, function($match) { \"foo\" })", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "Bowler foo", - "Trilby foo", - "Bowler foo", - "Cloak" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case033.json b/test/test-suite/groups/regex/case033.json deleted file mode 100644 index 06f4f0a3..00000000 --- a/test/test-suite/groups/regex/case033.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product.$replace($.\"Product Name\", /(h)(at)/i, function($match) { $uppercase($match.match) })", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "Bowler HAT", - "Trilby HAT", - "Bowler HAT", - "Cloak" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case034.json b/test/test-suite/groups/regex/case034.json deleted file mode 100644 index 19b03ead..00000000 --- a/test/test-suite/groups/regex/case034.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$replace(\"temperature = 68F today\", /(-?\\d+(?:\\.\\d*)?)F\\b/, function($m) { ($number($m.groups[0]) - 32) * 5/9 & \"C\" })", - "dataset": null, - "bindings": {}, - "result": "temperature = 20C today" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case035.json b/test/test-suite/groups/regex/case035.json deleted file mode 100644 index bd020504..00000000 --- a/test/test-suite/groups/regex/case035.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order.Product.$replace($.\"Product Name\", /hat/i, function($match) { true })", - "dataset": "dataset5", - "bindings": {}, - "code": "D3012" -} \ No newline at end of file diff --git a/test/test-suite/groups/regex/case036.json b/test/test-suite/groups/regex/case036.json deleted file mode 100644 index 57e9ac38..00000000 --- a/test/test-suite/groups/regex/case036.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order.Product.$replace($.\"Product Name\", /hat/i, function($match) { 42 })", - "dataset": "dataset5", - "bindings": {}, - "code": "D3012" -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case000.json b/test/test-suite/groups/simple-array-selectors/case000.json deleted file mode 100644 index 44d888df..00000000 --- a/test/test-suite/groups/simple-array-selectors/case000.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "nest0.nest1[0]", - "dataset": "dataset4", - "bindings": {}, - "result": [ - 1, - 3, - 5, - 6 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case001.json b/test/test-suite/groups/simple-array-selectors/case001.json deleted file mode 100644 index 7b5addf0..00000000 --- a/test/test-suite/groups/simple-array-selectors/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.blah[0].baz.fud", - "dataset": "dataset0", - "bindings": {}, - "result": "hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case002.json b/test/test-suite/groups/simple-array-selectors/case002.json deleted file mode 100644 index af7af8c2..00000000 --- a/test/test-suite/groups/simple-array-selectors/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.blah[1].baz.fud", - "dataset": "dataset0", - "bindings": {}, - "result": "world" -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case003.json b/test/test-suite/groups/simple-array-selectors/case003.json deleted file mode 100644 index a3e2ea5c..00000000 --- a/test/test-suite/groups/simple-array-selectors/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.blah[-1].bazz", - "dataset": "dataset0", - "bindings": {}, - "result": "gotcha" -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case004.json b/test/test-suite/groups/simple-array-selectors/case004.json deleted file mode 100644 index 9aa53675..00000000 --- a/test/test-suite/groups/simple-array-selectors/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(foo.blah)[1].baz.fud", - "dataset": "dataset0", - "bindings": {}, - "result": "world" -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case005.json b/test/test-suite/groups/simple-array-selectors/case005.json deleted file mode 100644 index 0aa5a580..00000000 --- a/test/test-suite/groups/simple-array-selectors/case005.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.blah.baz.fud[0]", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case006.json b/test/test-suite/groups/simple-array-selectors/case006.json deleted file mode 100644 index 31e0b549..00000000 --- a/test/test-suite/groups/simple-array-selectors/case006.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.blah.baz.fud[-1]", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case007.json b/test/test-suite/groups/simple-array-selectors/case007.json deleted file mode 100644 index 61a16048..00000000 --- a/test/test-suite/groups/simple-array-selectors/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(foo.blah.baz.fud)[0]", - "dataset": "dataset0", - "bindings": {}, - "result": "hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case008.json b/test/test-suite/groups/simple-array-selectors/case008.json deleted file mode 100644 index 535ab2b7..00000000 --- a/test/test-suite/groups/simple-array-selectors/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(foo.blah.baz.fud)[1]", - "dataset": "dataset0", - "bindings": {}, - "result": "world" -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case009.json b/test/test-suite/groups/simple-array-selectors/case009.json deleted file mode 100644 index 4813c5f9..00000000 --- a/test/test-suite/groups/simple-array-selectors/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(foo.blah.baz.fud)[5 * 0.2]", - "dataset": "dataset0", - "bindings": {}, - "result": "world" -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case010.json b/test/test-suite/groups/simple-array-selectors/case010.json deleted file mode 100644 index 5622986a..00000000 --- a/test/test-suite/groups/simple-array-selectors/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(foo.blah.baz.fud)[-1]", - "dataset": "dataset0", - "bindings": {}, - "result": "world" -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case011.json b/test/test-suite/groups/simple-array-selectors/case011.json deleted file mode 100644 index 7eb02e61..00000000 --- a/test/test-suite/groups/simple-array-selectors/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(foo.blah.baz.fud)[-2]", - "dataset": "dataset0", - "bindings": {}, - "result": "hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case012.json b/test/test-suite/groups/simple-array-selectors/case012.json deleted file mode 100644 index 856bb7e1..00000000 --- a/test/test-suite/groups/simple-array-selectors/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(foo.blah.baz.fud)[2-4]", - "dataset": "dataset0", - "bindings": {}, - "result": "hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case013.json b/test/test-suite/groups/simple-array-selectors/case013.json deleted file mode 100644 index 53928eea..00000000 --- a/test/test-suite/groups/simple-array-selectors/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(foo.blah.baz.fud)[-(4-2)]", - "dataset": "dataset0", - "bindings": {}, - "result": "hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case014.json b/test/test-suite/groups/simple-array-selectors/case014.json deleted file mode 100644 index 08194c71..00000000 --- a/test/test-suite/groups/simple-array-selectors/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "(foo.blah.baz.fud)[$$.foo.bar / 30]", - "dataset": "dataset0", - "bindings": {}, - "result": "world" -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case015.json b/test/test-suite/groups/simple-array-selectors/case015.json deleted file mode 100644 index 6a4edc42..00000000 --- a/test/test-suite/groups/simple-array-selectors/case015.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "foo.blah[0].baz", - "dataset": "dataset0", - "bindings": {}, - "result": { - "fud": "hello" - } -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case016.json b/test/test-suite/groups/simple-array-selectors/case016.json deleted file mode 100644 index 9f9ddc87..00000000 --- a/test/test-suite/groups/simple-array-selectors/case016.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "expr": "foo.blah.baz[0]", - "dataset": "dataset0", - "bindings": {}, - "result": [ - { - "fud": "hello" - }, - { - "fud": "world" - } - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case017.json b/test/test-suite/groups/simple-array-selectors/case017.json deleted file mode 100644 index fd6271a6..00000000 --- a/test/test-suite/groups/simple-array-selectors/case017.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "(foo.blah.baz)[0]", - "dataset": "dataset0", - "bindings": {}, - "result": { - "fud": "hello" - } -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case018.json b/test/test-suite/groups/simple-array-selectors/case018.json deleted file mode 100644 index d6dbfffb..00000000 --- a/test/test-suite/groups/simple-array-selectors/case018.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "expr": "$[0]", - "data": [ - [ - 1, - 2 - ], - [ - 3, - 4 - ] - ], - "bindings": {}, - "result": [ - 1, - 2 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case019.json b/test/test-suite/groups/simple-array-selectors/case019.json deleted file mode 100644 index 7a5f8e76..00000000 --- a/test/test-suite/groups/simple-array-selectors/case019.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "expr": "$[1]", - "data": [ - [ - 1, - 2 - ], - [ - 3, - 4 - ] - ], - "bindings": {}, - "result": [ - 3, - 4 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case020.json b/test/test-suite/groups/simple-array-selectors/case020.json deleted file mode 100644 index c560dd30..00000000 --- a/test/test-suite/groups/simple-array-selectors/case020.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "expr": "$[-1]", - "data": [ - [ - 1, - 2 - ], - [ - 3, - 4 - ] - ], - "bindings": {}, - "result": [ - 3, - 4 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case021.json b/test/test-suite/groups/simple-array-selectors/case021.json deleted file mode 100644 index e6b7d8c0..00000000 --- a/test/test-suite/groups/simple-array-selectors/case021.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "expr": "$[1][0]", - "data": [ - [ - 1, - 2 - ], - [ - 3, - 4 - ] - ], - "bindings": {}, - "result": 3 -} \ No newline at end of file diff --git a/test/test-suite/groups/simple-array-selectors/case022.json b/test/test-suite/groups/simple-array-selectors/case022.json deleted file mode 100644 index 86e58183..00000000 --- a/test/test-suite/groups/simple-array-selectors/case022.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "expr": "$[1.1][0.9]", - "data": [ - [ - 1, - 2 - ], - [ - 3, - 4 - ] - ], - "bindings": {}, - "result": 3 -} \ No newline at end of file diff --git a/test/test-suite/groups/sorting/case000.json b/test/test-suite/groups/sorting/case000.json deleted file mode 100644 index a7e65756..00000000 --- a/test/test-suite/groups/sorting/case000.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product.Price^($)", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 21.67, - 34.45, - 34.45, - 107.99 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/sorting/case001.json b/test/test-suite/groups/sorting/case001.json deleted file mode 100644 index bbf32042..00000000 --- a/test/test-suite/groups/sorting/case001.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product.Price^(<$)", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 21.67, - 34.45, - 34.45, - 107.99 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/sorting/case002.json b/test/test-suite/groups/sorting/case002.json deleted file mode 100644 index ad16fc59..00000000 --- a/test/test-suite/groups/sorting/case002.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product.Price^(>$)", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 107.99, - 34.45, - 34.45, - 21.67 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/sorting/case003.json b/test/test-suite/groups/sorting/case003.json deleted file mode 100644 index 70118fa7..00000000 --- a/test/test-suite/groups/sorting/case003.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product^(Price).Description.Colour", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "Orange", - "Purple", - "Purple", - "Black" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/sorting/case004.json b/test/test-suite/groups/sorting/case004.json deleted file mode 100644 index 6f0e6804..00000000 --- a/test/test-suite/groups/sorting/case004.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product^(Price).SKU", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "0406634348", - "0406654608", - "040657863", - "0406654603" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/sorting/case005.json b/test/test-suite/groups/sorting/case005.json deleted file mode 100644 index a4800728..00000000 --- a/test/test-suite/groups/sorting/case005.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product^(Price * Quantity).Description.Colour", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "Orange", - "Purple", - "Black", - "Purple" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/sorting/case006.json b/test/test-suite/groups/sorting/case006.json deleted file mode 100644 index bdd6ea01..00000000 --- a/test/test-suite/groups/sorting/case006.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product^(Quantity, Description.Colour).Description.Colour", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "Black", - "Orange", - "Purple", - "Purple" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/sorting/case007.json b/test/test-suite/groups/sorting/case007.json deleted file mode 100644 index 5a36e689..00000000 --- a/test/test-suite/groups/sorting/case007.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product^(Quantity, >Description.Colour).Description.Colour", - "dataset": "dataset5", - "bindings": {}, - "result": [ - "Orange", - "Black", - "Purple", - "Purple" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/sorting/case008.json b/test/test-suite/groups/sorting/case008.json deleted file mode 100644 index f92b8dd9..00000000 --- a/test/test-suite/groups/sorting/case008.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product^(Price).SKU", - "dataset": "dataset12", - "bindings": {}, - "result": [ - "0406634348", - "040657863", - "0406654603", - "0406654608" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/sorting/case009.json b/test/test-suite/groups/sorting/case009.json deleted file mode 100644 index fc5b6f33..00000000 --- a/test/test-suite/groups/sorting/case009.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product^(Price).SKU", - "dataset": "dataset13", - "bindings": {}, - "result": [ - "0406654608", - "040657863", - "0406654603", - "0406634348" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/sorting/case010.json b/test/test-suite/groups/sorting/case010.json deleted file mode 100644 index 590a7751..00000000 --- a/test/test-suite/groups/sorting/case010.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "expr": "Account.Order.Product^(Price).SKU", - "dataset": "dataset14", - "bindings": {}, - "result": [ - "040657863", - "0406654603", - "0406654608", - "0406634348" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/sorting/case011.json b/test/test-suite/groups/sorting/case011.json deleted file mode 100644 index 27fa1b47..00000000 --- a/test/test-suite/groups/sorting/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order.Product^(Price).SKU", - "dataset": "dataset15", - "bindings": {}, - "code": "T2007" -} \ No newline at end of file diff --git a/test/test-suite/groups/sorting/case012.json b/test/test-suite/groups/sorting/case012.json deleted file mode 100644 index fcd8172d..00000000 --- a/test/test-suite/groups/sorting/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order.Product^(Price).SKU", - "dataset": "dataset16", - "bindings": {}, - "code": "T2008" -} \ No newline at end of file diff --git a/test/test-suite/groups/sorting/case013.json b/test/test-suite/groups/sorting/case013.json deleted file mode 100644 index ff70b9f6..00000000 --- a/test/test-suite/groups/sorting/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account.Order.Product^(Price).SKU", - "dataset": "dataset17", - "bindings": {}, - "code": "T2008" -} \ No newline at end of file diff --git a/test/test-suite/groups/string-concat/case000.json b/test/test-suite/groups/string-concat/case000.json deleted file mode 100644 index 91a5c7f3..00000000 --- a/test/test-suite/groups/string-concat/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"foo\" & \"bar\"", - "dataset": "dataset0", - "bindings": {}, - "result": "foobar" -} \ No newline at end of file diff --git a/test/test-suite/groups/string-concat/case001.json b/test/test-suite/groups/string-concat/case001.json deleted file mode 100644 index 18dfd62e..00000000 --- a/test/test-suite/groups/string-concat/case001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"foo\"&\"bar\"", - "dataset": "dataset0", - "bindings": {}, - "result": "foobar" -} \ No newline at end of file diff --git a/test/test-suite/groups/string-concat/case002.json b/test/test-suite/groups/string-concat/case002.json deleted file mode 100644 index 9fe51781..00000000 --- a/test/test-suite/groups/string-concat/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.blah[0].baz.fud &foo.blah[1].baz.fud", - "dataset": "dataset0", - "bindings": {}, - "result": "helloworld" -} \ No newline at end of file diff --git a/test/test-suite/groups/string-concat/case003.json b/test/test-suite/groups/string-concat/case003.json deleted file mode 100644 index 728cdedc..00000000 --- a/test/test-suite/groups/string-concat/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.(blah[0].baz.fud & blah[1].baz.fud)", - "dataset": "dataset0", - "bindings": {}, - "result": "helloworld" -} \ No newline at end of file diff --git a/test/test-suite/groups/string-concat/case004.json b/test/test-suite/groups/string-concat/case004.json deleted file mode 100644 index 2c5c3d50..00000000 --- a/test/test-suite/groups/string-concat/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.(blah[0].baz.fud & none)", - "dataset": "dataset0", - "bindings": {}, - "result": "hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/string-concat/case005.json b/test/test-suite/groups/string-concat/case005.json deleted file mode 100644 index c5793c4d..00000000 --- a/test/test-suite/groups/string-concat/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.(none.here & blah[1].baz.fud)", - "dataset": "dataset0", - "bindings": {}, - "result": "world" -} \ No newline at end of file diff --git a/test/test-suite/groups/string-concat/case006.json b/test/test-suite/groups/string-concat/case006.json deleted file mode 100644 index a2620487..00000000 --- a/test/test-suite/groups/string-concat/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[1,2]&[3,4]", - "dataset": "dataset0", - "bindings": {}, - "result": "[1,2][3,4]" -} \ No newline at end of file diff --git a/test/test-suite/groups/string-concat/case007.json b/test/test-suite/groups/string-concat/case007.json deleted file mode 100644 index a1fc0c0f..00000000 --- a/test/test-suite/groups/string-concat/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "[1,2]&3", - "dataset": "dataset0", - "bindings": {}, - "result": "[1,2]3" -} \ No newline at end of file diff --git a/test/test-suite/groups/string-concat/case008.json b/test/test-suite/groups/string-concat/case008.json deleted file mode 100644 index 291e8153..00000000 --- a/test/test-suite/groups/string-concat/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "1&2", - "dataset": "dataset0", - "bindings": {}, - "result": "12" -} \ No newline at end of file diff --git a/test/test-suite/groups/string-concat/case009.json b/test/test-suite/groups/string-concat/case009.json deleted file mode 100644 index 01e98b95..00000000 --- a/test/test-suite/groups/string-concat/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "1&[2]", - "dataset": "dataset0", - "bindings": {}, - "result": "1[2]" -} \ No newline at end of file diff --git a/test/test-suite/groups/string-concat/case010.json b/test/test-suite/groups/string-concat/case010.json deleted file mode 100644 index c952fec3..00000000 --- a/test/test-suite/groups/string-concat/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"hello\"&5", - "dataset": "dataset0", - "bindings": {}, - "result": "hello5" -} \ No newline at end of file diff --git a/test/test-suite/groups/string-concat/case011.json b/test/test-suite/groups/string-concat/case011.json deleted file mode 100644 index 4ad5f6ff..00000000 --- a/test/test-suite/groups/string-concat/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"Prices: \" & Account.Order.Product.Price", - "dataset": "dataset5", - "bindings": {}, - "result": "Prices: [34.45,21.67,34.45,107.99]" -} \ No newline at end of file diff --git a/test/test-suite/groups/tail-recursion/case000.json b/test/test-suite/groups/tail-recursion/case000.json deleted file mode 100644 index 464c20ee..00000000 --- a/test/test-suite/groups/tail-recursion/case000.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": " ( $f := function($n){()}; $f(1) ) ", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/tail-recursion/case001.json b/test/test-suite/groups/tail-recursion/case001.json deleted file mode 100644 index 15ef1d31..00000000 --- a/test/test-suite/groups/tail-recursion/case001.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "( $factorial := function($n){$n = 0 ? 1 : $n * $factorial($n - 1)}; $factorial(99)) ", - "dataset": null, - "timelimit": 2000, - "depth": 302, - "bindings": {}, - "result": 9.33262154439441e+155 -} \ No newline at end of file diff --git a/test/test-suite/groups/tail-recursion/case002.json b/test/test-suite/groups/tail-recursion/case002.json deleted file mode 100644 index b39c3e88..00000000 --- a/test/test-suite/groups/tail-recursion/case002.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "( $factorial := function($n){$n = 0 ? 1 : $n * $factorial($n - 1)}; $factorial(100)) ", - "dataset": null, - "timelimit": 1000, - "depth": 302, - "bindings": {}, - "code": "U1001" -} \ No newline at end of file diff --git a/test/test-suite/groups/tail-recursion/case003.json b/test/test-suite/groups/tail-recursion/case003.json deleted file mode 100644 index f901215c..00000000 --- a/test/test-suite/groups/tail-recursion/case003.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $factorial := function($n){( $iter := function($n, $acc) { $n = 0 ? $acc : $iter($n - 1, $n * $acc) }; $iter($n, 1) )}; $factorial(5)) ", - "dataset": null, - "bindings": {}, - "result": 120 -} \ No newline at end of file diff --git a/test/test-suite/groups/tail-recursion/case004.json b/test/test-suite/groups/tail-recursion/case004.json deleted file mode 100644 index fbb1bc47..00000000 --- a/test/test-suite/groups/tail-recursion/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $factorial := function($n){( $iter := function($n, $acc) { $n = 0 ? $acc : $iter($n - 1, $n * $acc) }; $iter($n, 1) )}; $factorial(150)) ", - "dataset": null, - "bindings": {}, - "result": 5.7133839564458575e+262 -} \ No newline at end of file diff --git a/test/test-suite/groups/tail-recursion/case005.json b/test/test-suite/groups/tail-recursion/case005.json deleted file mode 100644 index 10b0a385..00000000 --- a/test/test-suite/groups/tail-recursion/case005.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "( $inf := function($n){$n+$inf($n-1)}; $inf(5))", - "dataset": null, - "timelimit": 1000, - "depth": 300, - "bindings": {}, - "code": "U1001" -} \ No newline at end of file diff --git a/test/test-suite/groups/tail-recursion/case006.json b/test/test-suite/groups/tail-recursion/case006.json deleted file mode 100644 index 0a1b706d..00000000 --- a/test/test-suite/groups/tail-recursion/case006.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "( $inf := function(){$inf()}; $inf())", - "dataset": null, - "timelimit": 1000, - "depth": 500, - "bindings": {}, - "code": "U1001" -} \ No newline at end of file diff --git a/test/test-suite/groups/tail-recursion/case007.json b/test/test-suite/groups/tail-recursion/case007.json deleted file mode 100644 index 9d21f36b..00000000 --- a/test/test-suite/groups/tail-recursion/case007.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": " ( $even := function($n) { $n = 0 ? true : $odd($n-1) }; $odd := function($n) { $n = 0 ? false : $even($n-1) }; $odd(6555) )", - "dataset": null, - "timelimit": 9000, - "depth": 500, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case000.json b/test/test-suite/groups/transform/case000.json deleted file mode 100644 index 936579e3..00000000 --- a/test/test-suite/groups/transform/case000.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "expr": "{'Order': Account.Order.{ 'ID': OrderID, 'Product': Product.{ 'SKU': ProductID, 'Details': { 'Weight': Description.Weight, 'Dimensions': Description.(Width & ' x ' & Height & ' x ' & Depth) } }, 'Total Price': $sum(Product.(Price * Quantity))}}", - "dataset": "dataset5", - "bindings": {}, - "result": { - "Order": [ - { - "ID": "order103", - "Product": [ - { - "SKU": 858383, - "Details": { - "Weight": 0.75, - "Dimensions": "300 x 200 x 210" - } - }, - { - "SKU": 858236, - "Details": { - "Weight": 0.6, - "Dimensions": "300 x 200 x 210" - } - } - ], - "Total Price": 90.57000000000001 - }, - { - "ID": "order104", - "Product": [ - { - "SKU": 858383, - "Details": { - "Weight": 0.75, - "Dimensions": "300 x 200 x 210" - } - }, - { - "SKU": 345664, - "Details": { - "Weight": 2, - "Dimensions": "30 x 20 x 210" - } - } - ], - "Total Price": 245.79000000000002 - } - ] - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case001.json b/test/test-suite/groups/transform/case001.json deleted file mode 100644 index 39b1e56c..00000000 --- a/test/test-suite/groups/transform/case001.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "expr": "\n (\n $tempReadings := $count(state.tempReadings) = 5 ?\n [state.tempReadings[[1..4]], event.t] :\n [state.tempReadings, event.t];\n \n {\n \"tempReadings\": $tempReadings,\n \"sumTemperatures\": $sum($tempReadings),\n \"avgTemperature\": $average($tempReadings) ~> $round(2),\n \"maxTemperature\": $max($tempReadings),\n \"minTemperature\": $min($tempReadings)\n }\n )", - "dataset": "dataset18", - "bindings": {}, - "result": { - "tempReadings": [ - 28.9, - 28, - 28.2, - 28.4, - 28.4 - ], - "sumTemperatures": 141.9, - "avgTemperature": 28.38, - "maxTemperature": 28.9, - "minTemperature": 28 - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case002.json b/test/test-suite/groups/transform/case002.json deleted file mode 100644 index 74d2a1a9..00000000 --- a/test/test-suite/groups/transform/case002.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "expr": "$", - "dataset": "dataset19", - "bindings": {}, - "result": { - "output": { - "is": { - "same": { - "as": "input" - } - } - } - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case003.json b/test/test-suite/groups/transform/case003.json deleted file mode 100644 index b6c1530a..00000000 --- a/test/test-suite/groups/transform/case003.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "foo", - "data": { - "foo": { - "bar": 42 - } - }, - "bindings": {}, - "result": { - "bar": 42 - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case004.json b/test/test-suite/groups/transform/case004.json deleted file mode 100644 index c1616032..00000000 --- a/test/test-suite/groups/transform/case004.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "expr": "baz", - "data": { - "foo": { - "bar": 42 - }, - "baz": { - "gar": 50 - } - }, - "bindings": {}, - "result": { - "gar": 50 - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case005.json b/test/test-suite/groups/transform/case005.json deleted file mode 100644 index f305012b..00000000 --- a/test/test-suite/groups/transform/case005.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "expr": "Foo", - "data": { - "foo": { - "lala": 42 - }, - "Foo": { - "mama": 45 - } - }, - "bindings": {}, - "result": { - "mama": 45 - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case006.json b/test/test-suite/groups/transform/case006.json deleted file mode 100644 index f18fadd3..00000000 --- a/test/test-suite/groups/transform/case006.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "expr": "food", - "data": { - "foo": { - "food": 2 - }, - "food": { - "wa": "hume" - } - }, - "bindings": {}, - "result": { - "wa": "hume" - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case007.json b/test/test-suite/groups/transform/case007.json deleted file mode 100644 index 270c6a74..00000000 --- a/test/test-suite/groups/transform/case007.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "expr": "maz.rar", - "data": { - "maz": { - "rar": 42 - } - }, - "bindings": {}, - "result": 42 -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case008.json b/test/test-suite/groups/transform/case008.json deleted file mode 100644 index c7c4494f..00000000 --- a/test/test-suite/groups/transform/case008.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "jee.par.waa", - "dataset": "dataset20", - "bindings": {}, - "result": { - "bar": 87 - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case009.json b/test/test-suite/groups/transform/case009.json deleted file mode 100644 index 58d2d01b..00000000 --- a/test/test-suite/groups/transform/case009.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "foo", - "data": { - "stuff": 4 - }, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case010.json b/test/test-suite/groups/transform/case010.json deleted file mode 100644 index 1a1803e4..00000000 --- a/test/test-suite/groups/transform/case010.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "foo.bar", - "data": { - "stuff": 4 - }, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case011.json b/test/test-suite/groups/transform/case011.json deleted file mode 100644 index 00eacecf..00000000 --- a/test/test-suite/groups/transform/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$", - "data": "foo", - "bindings": {}, - "result": "foo" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case012.json b/test/test-suite/groups/transform/case012.json deleted file mode 100644 index e9249fa8..00000000 --- a/test/test-suite/groups/transform/case012.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "bar", - "data": { - "bar": "foo" - }, - "bindings": {}, - "result": "foo" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case013.json b/test/test-suite/groups/transform/case013.json deleted file mode 100644 index 41b21460..00000000 --- a/test/test-suite/groups/transform/case013.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$", - "data": 6754322, - "bindings": {}, - "result": 6754322 -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case014.json b/test/test-suite/groups/transform/case014.json deleted file mode 100644 index d128c60d..00000000 --- a/test/test-suite/groups/transform/case014.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$", - "data": 0, - "bindings": {}, - "result": 0 -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case015.json b/test/test-suite/groups/transform/case015.json deleted file mode 100644 index 417cf028..00000000 --- a/test/test-suite/groups/transform/case015.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$", - "data": -24, - "bindings": {}, - "result": -24 -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case016.json b/test/test-suite/groups/transform/case016.json deleted file mode 100644 index 2f15befc..00000000 --- a/test/test-suite/groups/transform/case016.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "bar", - "data": { - "bar": 6.54 - }, - "bindings": {}, - "result": 6.54 -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case017.json b/test/test-suite/groups/transform/case017.json deleted file mode 100644 index d404b638..00000000 --- a/test/test-suite/groups/transform/case017.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$", - "data": true, - "bindings": {}, - "result": true -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case018.json b/test/test-suite/groups/transform/case018.json deleted file mode 100644 index fd67948c..00000000 --- a/test/test-suite/groups/transform/case018.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "bar", - "data": { - "bar": false - }, - "bindings": {}, - "result": false -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case019.json b/test/test-suite/groups/transform/case019.json deleted file mode 100644 index 0295d00f..00000000 --- a/test/test-suite/groups/transform/case019.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$", - "data": null, - "bindings": {}, - "result": null -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case020.json b/test/test-suite/groups/transform/case020.json deleted file mode 100644 index 00b6515a..00000000 --- a/test/test-suite/groups/transform/case020.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "bar", - "data": { - "bar": null - }, - "bindings": {}, - "result": null -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case021.json b/test/test-suite/groups/transform/case021.json deleted file mode 100644 index c2eaa4d3..00000000 --- a/test/test-suite/groups/transform/case021.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "bar", - "data": {}, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case022.json b/test/test-suite/groups/transform/case022.json deleted file mode 100644 index 30880bed..00000000 --- a/test/test-suite/groups/transform/case022.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case023.json b/test/test-suite/groups/transform/case023.json deleted file mode 100644 index f362eedf..00000000 --- a/test/test-suite/groups/transform/case023.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "bar", - "data": { - "bar": "\"Hello\"" - }, - "bindings": {}, - "result": "\"Hello\"" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case024.json b/test/test-suite/groups/transform/case024.json deleted file mode 100644 index 5fe8bb2d..00000000 --- a/test/test-suite/groups/transform/case024.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$", - "data": "\"Hello\"", - "bindings": {}, - "result": "\"Hello\"" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case025.json b/test/test-suite/groups/transform/case025.json deleted file mode 100644 index 08ca999f..00000000 --- a/test/test-suite/groups/transform/case025.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "bar", - "data": { - "bar": "'Hello'" - }, - "bindings": {}, - "result": "'Hello'" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case026.json b/test/test-suite/groups/transform/case026.json deleted file mode 100644 index 682d8e1a..00000000 --- a/test/test-suite/groups/transform/case026.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$", - "data": "'Hello'", - "bindings": {}, - "result": "'Hello'" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case027.json b/test/test-suite/groups/transform/case027.json deleted file mode 100644 index 13f45462..00000000 --- a/test/test-suite/groups/transform/case027.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lowercase(Salutation)", - "dataset": "dataset21", - "bindings": {}, - "result": "mr" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case028.json b/test/test-suite/groups/transform/case028.json deleted file mode 100644 index bd53c6fd..00000000 --- a/test/test-suite/groups/transform/case028.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lowercase(敷)", - "dataset": "dataset21", - "bindings": {}, - "result": "steve" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case029.json b/test/test-suite/groups/transform/case029.json deleted file mode 100644 index d47301af..00000000 --- a/test/test-suite/groups/transform/case029.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lowercase(Español)", - "dataset": "dataset21", - "bindings": {}, - "result": "/ˈspænɪʃ/" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case030.json b/test/test-suite/groups/transform/case030.json deleted file mode 100644 index b9430976..00000000 --- a/test/test-suite/groups/transform/case030.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lowercase($.\"NI.Number\")", - "dataset": "dataset21", - "bindings": {}, - "result": "no10furbzness" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case031.json b/test/test-suite/groups/transform/case031.json deleted file mode 100644 index 11ccd2fc..00000000 --- a/test/test-suite/groups/transform/case031.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lowercase(\"COMPENSATION IS : \" & Employment.\"Executive.Compensation\")", - "dataset": "dataset21", - "bindings": {}, - "result": "compensation is : 1400000" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case032.json b/test/test-suite/groups/transform/case032.json deleted file mode 100644 index a00bddc0..00000000 --- a/test/test-suite/groups/transform/case032.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "\"Hello\"", - "dataset": "dataset21", - "bindings": {}, - "result": "Hello" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case033.json b/test/test-suite/groups/transform/case033.json deleted file mode 100644 index 15965640..00000000 --- a/test/test-suite/groups/transform/case033.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(Salutation)", - "dataset": "dataset21", - "bindings": {}, - "result": "MR" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case034.json b/test/test-suite/groups/transform/case034.json deleted file mode 100644 index a1d1cdad..00000000 --- a/test/test-suite/groups/transform/case034.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(\"Hello World\")", - "dataset": "dataset21", - "bindings": {}, - "result": "HELLO WORLD" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case035.json b/test/test-suite/groups/transform/case035.json deleted file mode 100644 index b8da2cd0..00000000 --- a/test/test-suite/groups/transform/case035.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(\"鯵噂ソ竹\")", - "dataset": "dataset21", - "bindings": {}, - "result": "鯵噂ソ竹" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case036.json b/test/test-suite/groups/transform/case036.json deleted file mode 100644 index 46f505e1..00000000 --- a/test/test-suite/groups/transform/case036.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Employment.Name & \" is happy\"", - "dataset": "dataset21", - "bindings": {}, - "result": "IBM UK is happy" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case037.json b/test/test-suite/groups/transform/case037.json deleted file mode 100644 index d276bf78..00000000 --- a/test/test-suite/groups/transform/case037.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Employment.Name & \" is pleased to employ \" & Salutation & \" \" & Surname", - "dataset": "dataset21", - "bindings": {}, - "result": "IBM UK is pleased to employ Mr Smith" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case038.json b/test/test-suite/groups/transform/case038.json deleted file mode 100644 index d8e3a845..00000000 --- a/test/test-suite/groups/transform/case038.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(\"Hello \" & Salutation & \" \" & Surname)", - "dataset": "dataset21", - "bindings": {}, - "result": "HELLO MR SMITH" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case039.json b/test/test-suite/groups/transform/case039.json deleted file mode 100644 index 92b566c0..00000000 --- a/test/test-suite/groups/transform/case039.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(Salutation & \" \" & Surname & \" - has \" & Cars & \" registered cars\")", - "dataset": "dataset21", - "bindings": {}, - "result": "MR SMITH - HAS 3 REGISTERED CARS" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case040.json b/test/test-suite/groups/transform/case040.json deleted file mode 100644 index b04aa856..00000000 --- a/test/test-suite/groups/transform/case040.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(Employment.ContractType)", - "dataset": "dataset21", - "bindings": {}, - "result": "PERMANENT" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case041.json b/test/test-suite/groups/transform/case041.json deleted file mode 100644 index 5ccf1478..00000000 --- a/test/test-suite/groups/transform/case041.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(\"Hola\", \"l\")", - "dataset": "dataset21", - "bindings": {}, - "result": "Ho" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case042.json b/test/test-suite/groups/transform/case042.json deleted file mode 100644 index fd2230f3..00000000 --- a/test/test-suite/groups/transform/case042.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(\"Hola\", 'l')", - "dataset": "dataset21", - "bindings": {}, - "result": "Ho" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case043.json b/test/test-suite/groups/transform/case043.json deleted file mode 100644 index fa2fcd99..00000000 --- a/test/test-suite/groups/transform/case043.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(\"Hola\", \"Q\")", - "dataset": "dataset21", - "bindings": {}, - "result": "Hola" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case044.json b/test/test-suite/groups/transform/case044.json deleted file mode 100644 index 55b59b1c..00000000 --- a/test/test-suite/groups/transform/case044.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(\"Hola\", \"\")", - "dataset": "dataset21", - "bindings": {}, - "result": "" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case045.json b/test/test-suite/groups/transform/case045.json deleted file mode 100644 index 72064c76..00000000 --- a/test/test-suite/groups/transform/case045.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(\"鯵噂ソ竹\", \"ソ\")", - "dataset": "dataset21", - "bindings": {}, - "result": "鯵噂" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case046.json b/test/test-suite/groups/transform/case046.json deleted file mode 100644 index bb6822d4..00000000 --- a/test/test-suite/groups/transform/case046.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(\"Coca\" & \"Cola\", \"ca\")", - "dataset": "dataset21", - "bindings": {}, - "result": "Cola" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case047.json b/test/test-suite/groups/transform/case047.json deleted file mode 100644 index 1828a10b..00000000 --- a/test/test-suite/groups/transform/case047.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(Salutation & \" \" & MiddleName &\" \" & Surname, MiddleName)", - "dataset": "dataset21", - "bindings": {}, - "result": " Smith" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case048.json b/test/test-suite/groups/transform/case048.json deleted file mode 100644 index 39c71af9..00000000 --- a/test/test-suite/groups/transform/case048.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(Salutation & \" \" & Employment.Role, Salutation)", - "dataset": "dataset21", - "bindings": {}, - "result": " Senior Physician" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case049.json b/test/test-suite/groups/transform/case049.json deleted file mode 100644 index 15a414e2..00000000 --- a/test/test-suite/groups/transform/case049.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(\"Hola\", 'l')", - "dataset": "dataset21", - "bindings": {}, - "result": "a" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case050.json b/test/test-suite/groups/transform/case050.json deleted file mode 100644 index eb24d68e..00000000 --- a/test/test-suite/groups/transform/case050.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(\"Hola\", \"Q\")", - "dataset": "dataset21", - "bindings": {}, - "result": "Hola" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case051.json b/test/test-suite/groups/transform/case051.json deleted file mode 100644 index 8971ee64..00000000 --- a/test/test-suite/groups/transform/case051.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lowercase(Employment.Role) & \" (\" & Employment.Role & \")\"", - "dataset": "dataset21", - "bindings": {}, - "result": "senior physician (Senior Physician)" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case052.json b/test/test-suite/groups/transform/case052.json deleted file mode 100644 index 8a8f0df2..00000000 --- a/test/test-suite/groups/transform/case052.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Employment.Years & \" years of employment\"", - "dataset": "dataset21", - "bindings": {}, - "result": "12 years of employment" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case053.json b/test/test-suite/groups/transform/case053.json deleted file mode 100644 index 9abf5107..00000000 --- a/test/test-suite/groups/transform/case053.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(Salutation & \" \" & Surname & \" - has \" & Employment.Years & \" years of employment\")", - "dataset": "dataset21", - "bindings": {}, - "result": "MR SMITH - HAS 12 YEARS OF EMPLOYMENT" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case054.json b/test/test-suite/groups/transform/case054.json deleted file mode 100644 index 17912a4b..00000000 --- a/test/test-suite/groups/transform/case054.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(Employment.Role, 7,4)", - "dataset": "dataset21", - "bindings": {}, - "result": "Phys" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case055.json b/test/test-suite/groups/transform/case055.json deleted file mode 100644 index bcb7e172..00000000 --- a/test/test-suite/groups/transform/case055.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(Employment.Role, -4,4)", - "dataset": "dataset21", - "bindings": {}, - "result": "cian" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case056.json b/test/test-suite/groups/transform/case056.json deleted file mode 100644 index b6bd470d..00000000 --- a/test/test-suite/groups/transform/case056.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(\"Hello World\",Cars,5)", - "dataset": "dataset21", - "bindings": {}, - "result": "lo Wo" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case057.json b/test/test-suite/groups/transform/case057.json deleted file mode 100644 index 4ded6366..00000000 --- a/test/test-suite/groups/transform/case057.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lowercase(\"Missing close brackets\"", - "dataset": "dataset21", - "bindings": {}, - "code": "S0203" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case058.json b/test/test-suite/groups/transform/case058.json deleted file mode 100644 index fdaed6fc..00000000 --- a/test/test-suite/groups/transform/case058.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$unknown(Salutation)", - "dataset": "dataset21", - "bindings": {}, - "code": "T1006" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case059.json b/test/test-suite/groups/transform/case059.json deleted file mode 100644 index 26453f52..00000000 --- a/test/test-suite/groups/transform/case059.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$decrypt(Salutation)", - "dataset": "dataset21", - "bindings": {}, - "code": "T1006" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case060.json b/test/test-suite/groups/transform/case060.json deleted file mode 100644 index d45b2481..00000000 --- a/test/test-suite/groups/transform/case060.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Employment.authentication(Salutation)", - "dataset": "dataset21", - "bindings": {}, - "code": "T1006" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case061.json b/test/test-suite/groups/transform/case061.json deleted file mode 100644 index 5e1a1ef2..00000000 --- a/test/test-suite/groups/transform/case061.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(Invalid)", - "dataset": "dataset21", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case062.json b/test/test-suite/groups/transform/case062.json deleted file mode 100644 index 01b2613f..00000000 --- a/test/test-suite/groups/transform/case062.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(Employment.Invalid)", - "dataset": "dataset21", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case063.json b/test/test-suite/groups/transform/case063.json deleted file mode 100644 index 4b66dc5b..00000000 --- a/test/test-suite/groups/transform/case063.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lowercase(\"Coca\", \"Cola\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case064.json b/test/test-suite/groups/transform/case064.json deleted file mode 100644 index 45ef8bf8..00000000 --- a/test/test-suite/groups/transform/case064.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lowercase(Salary)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case065.json b/test/test-suite/groups/transform/case065.json deleted file mode 100644 index 1c5784dc..00000000 --- a/test/test-suite/groups/transform/case065.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lowercase(20)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case066.json b/test/test-suite/groups/transform/case066.json deleted file mode 100644 index c4620ed9..00000000 --- a/test/test-suite/groups/transform/case066.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lowercase(20.55)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case067.json b/test/test-suite/groups/transform/case067.json deleted file mode 100644 index ffb4bc4f..00000000 --- a/test/test-suite/groups/transform/case067.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lowercase(Employment)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case068.json b/test/test-suite/groups/transform/case068.json deleted file mode 100644 index 1a1136a7..00000000 --- a/test/test-suite/groups/transform/case068.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$lowercase(Qualifications)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case069.json b/test/test-suite/groups/transform/case069.json deleted file mode 100644 index 54cbf83d..00000000 --- a/test/test-suite/groups/transform/case069.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(\"Coca\", \"Cola\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case070.json b/test/test-suite/groups/transform/case070.json deleted file mode 100644 index 39ba5e45..00000000 --- a/test/test-suite/groups/transform/case070.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(Salary)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case071.json b/test/test-suite/groups/transform/case071.json deleted file mode 100644 index 6612f4cc..00000000 --- a/test/test-suite/groups/transform/case071.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(28)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case072.json b/test/test-suite/groups/transform/case072.json deleted file mode 100644 index b3349d9c..00000000 --- a/test/test-suite/groups/transform/case072.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(20.55)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case073.json b/test/test-suite/groups/transform/case073.json deleted file mode 100644 index 371e258e..00000000 --- a/test/test-suite/groups/transform/case073.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(Cars)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case074.json b/test/test-suite/groups/transform/case074.json deleted file mode 100644 index cf7b676e..00000000 --- a/test/test-suite/groups/transform/case074.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(Employment)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case075.json b/test/test-suite/groups/transform/case075.json deleted file mode 100644 index 4698d58e..00000000 --- a/test/test-suite/groups/transform/case075.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$uppercase(Qualifications)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case076.json b/test/test-suite/groups/transform/case076.json deleted file mode 100644 index 9d8ab55e..00000000 --- a/test/test-suite/groups/transform/case076.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(\"Coca\" & \"ca\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0411" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case077.json b/test/test-suite/groups/transform/case077.json deleted file mode 100644 index 20f402ff..00000000 --- a/test/test-suite/groups/transform/case077.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(Salary,\"xx\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case078.json b/test/test-suite/groups/transform/case078.json deleted file mode 100644 index 59cd3bf1..00000000 --- a/test/test-suite/groups/transform/case078.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(22,\"xx\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case079.json b/test/test-suite/groups/transform/case079.json deleted file mode 100644 index c73c607c..00000000 --- a/test/test-suite/groups/transform/case079.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(22.55,\"xx\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case080.json b/test/test-suite/groups/transform/case080.json deleted file mode 100644 index 6f4ec257..00000000 --- a/test/test-suite/groups/transform/case080.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(\"22\",2)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case081.json b/test/test-suite/groups/transform/case081.json deleted file mode 100644 index 4dcf23d4..00000000 --- a/test/test-suite/groups/transform/case081.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(\"22.55\",5)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case082.json b/test/test-suite/groups/transform/case082.json deleted file mode 100644 index 72dcadbf..00000000 --- a/test/test-suite/groups/transform/case082.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(Employment,\"xx\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case083.json b/test/test-suite/groups/transform/case083.json deleted file mode 100644 index 0f6c51c1..00000000 --- a/test/test-suite/groups/transform/case083.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringBefore(Qualifications,\"xx\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case084.json b/test/test-suite/groups/transform/case084.json deleted file mode 100644 index 7754d57c..00000000 --- a/test/test-suite/groups/transform/case084.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(\"Coca\" & \"ca\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0411" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case085.json b/test/test-suite/groups/transform/case085.json deleted file mode 100644 index e0c09a8c..00000000 --- a/test/test-suite/groups/transform/case085.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(Salary,\"xx\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case086.json b/test/test-suite/groups/transform/case086.json deleted file mode 100644 index 4ba2fb73..00000000 --- a/test/test-suite/groups/transform/case086.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(22,\"xx\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case087.json b/test/test-suite/groups/transform/case087.json deleted file mode 100644 index 6d134831..00000000 --- a/test/test-suite/groups/transform/case087.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(22.55,\"xx\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case088.json b/test/test-suite/groups/transform/case088.json deleted file mode 100644 index 144a4cbc..00000000 --- a/test/test-suite/groups/transform/case088.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(\"22\",2)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case089.json b/test/test-suite/groups/transform/case089.json deleted file mode 100644 index d27f9f47..00000000 --- a/test/test-suite/groups/transform/case089.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(\"22.55\",5)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case090.json b/test/test-suite/groups/transform/case090.json deleted file mode 100644 index e2e9997e..00000000 --- a/test/test-suite/groups/transform/case090.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(Employment,\"xx\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case091.json b/test/test-suite/groups/transform/case091.json deleted file mode 100644 index 47c225c0..00000000 --- a/test/test-suite/groups/transform/case091.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substringAfter(Qualifications,\"xx\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case092.json b/test/test-suite/groups/transform/case092.json deleted file mode 100644 index 1f9d4a53..00000000 --- a/test/test-suite/groups/transform/case092.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(\"Coca\" & \"ca\", 2, 4, 5)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case093.json b/test/test-suite/groups/transform/case093.json deleted file mode 100644 index 51c9f0b7..00000000 --- a/test/test-suite/groups/transform/case093.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(\"Coca\", \"Mr\", 4)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case094.json b/test/test-suite/groups/transform/case094.json deleted file mode 100644 index 6ab8e821..00000000 --- a/test/test-suite/groups/transform/case094.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(\"Coca\", 3, \"Whoops\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case095.json b/test/test-suite/groups/transform/case095.json deleted file mode 100644 index 1d21f9ef..00000000 --- a/test/test-suite/groups/transform/case095.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(Salary,2,4)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case096.json b/test/test-suite/groups/transform/case096.json deleted file mode 100644 index 61c71a0f..00000000 --- a/test/test-suite/groups/transform/case096.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(\"Hello\",\"World\",5)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case097.json b/test/test-suite/groups/transform/case097.json deleted file mode 100644 index a44c0016..00000000 --- a/test/test-suite/groups/transform/case097.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(\"Hello\",5,\"World\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case098.json b/test/test-suite/groups/transform/case098.json deleted file mode 100644 index f80ce285..00000000 --- a/test/test-suite/groups/transform/case098.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(\"Hello World\",5.5,5)", - "dataset": "dataset21", - "bindings": {}, - "result": " Worl" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case099.json b/test/test-suite/groups/transform/case099.json deleted file mode 100644 index 85b26a8d..00000000 --- a/test/test-suite/groups/transform/case099.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(Employment,\"xx\")", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case100.json b/test/test-suite/groups/transform/case100.json deleted file mode 100644 index 5822a263..00000000 --- a/test/test-suite/groups/transform/case100.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$substring(Qualifications,6,5)", - "dataset": "dataset21", - "bindings": {}, - "code": "T0410" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case101.json b/test/test-suite/groups/transform/case101.json deleted file mode 100644 index 0a3ce55a..00000000 --- a/test/test-suite/groups/transform/case101.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "detail.contents", - "dataset": "dataset22", - "bindings": {}, - "result": "stuff" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case102.json b/test/test-suite/groups/transform/case102.json deleted file mode 100644 index cdd4107c..00000000 --- a/test/test-suite/groups/transform/case102.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "detail.meta", - "dataset": "dataset23", - "bindings": {}, - "result": "boo" -} \ No newline at end of file diff --git a/test/test-suite/groups/transform/case103.json b/test/test-suite/groups/transform/case103.json deleted file mode 100644 index 351f6bd9..00000000 --- a/test/test-suite/groups/transform/case103.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "detail.meta", - "dataset": "dataset22", - "bindings": {}, - "result": 5 -} \ No newline at end of file diff --git a/test/test-suite/groups/transforms/case000.json b/test/test-suite/groups/transforms/case000.json deleted file mode 100644 index 86e4aa4c..00000000 --- a/test/test-suite/groups/transforms/case000.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "expr": "$ ~> |Account.Order.Product|{\"Total\":Price*Quantity},[\"Description\", \"SKU\"]|", - "dataset": "dataset5", - "bindings": {}, - "result": { - "Account": { - "Account Name": "Firefly", - "Order": [ - { - "OrderID": "order103", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "Price": 34.45, - "Quantity": 2, - "Total": 68.9 - }, - { - "Product Name": "Trilby hat", - "ProductID": 858236, - "Price": 21.67, - "Quantity": 1, - "Total": 21.67 - } - ] - }, - { - "OrderID": "order104", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "Price": 34.45, - "Quantity": 4, - "Total": 137.8 - }, - { - "ProductID": 345664, - "Product Name": "Cloak", - "Price": 107.99, - "Quantity": 1, - "Total": 107.99 - } - ] - } - ] - } - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transforms/case001.json b/test/test-suite/groups/transforms/case001.json deleted file mode 100644 index 97416b0e..00000000 --- a/test/test-suite/groups/transforms/case001.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "expr": "Account.Order ~> |Product|{\"Total\":Price*Quantity},[\"Description\", \"SKU\"]|", - "dataset": "dataset5", - "bindings": {}, - "result": [ - { - "OrderID": "order103", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "Price": 34.45, - "Quantity": 2, - "Total": 68.9 - }, - { - "Product Name": "Trilby hat", - "ProductID": 858236, - "Price": 21.67, - "Quantity": 1, - "Total": 21.67 - } - ] - }, - { - "OrderID": "order104", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "Price": 34.45, - "Quantity": 4, - "Total": 137.8 - }, - { - "ProductID": 345664, - "Product Name": "Cloak", - "Price": 107.99, - "Quantity": 1, - "Total": 107.99 - } - ] - } - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/transforms/case002.json b/test/test-suite/groups/transforms/case002.json deleted file mode 100644 index 0312b259..00000000 --- a/test/test-suite/groups/transforms/case002.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "expr": "$ ~> |Account.Order.Product|{\"Total\":Price*Quantity, \"Price\": Price * 1.2}|", - "dataset": "dataset5", - "bindings": {}, - "result": { - "Account": { - "Account Name": "Firefly", - "Order": [ - { - "OrderID": "order103", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "0406654608", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": 41.34, - "Quantity": 2, - "Total": 68.9 - }, - { - "Product Name": "Trilby hat", - "ProductID": 858236, - "SKU": "0406634348", - "Description": { - "Colour": "Orange", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.6 - }, - "Price": 26.004, - "Quantity": 1, - "Total": 21.67 - } - ] - }, - { - "OrderID": "order104", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "040657863", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": 41.34, - "Quantity": 4, - "Total": 137.8 - }, - { - "ProductID": 345664, - "SKU": "0406654603", - "Product Name": "Cloak", - "Description": { - "Colour": "Black", - "Width": 30, - "Height": 20, - "Depth": 210, - "Weight": 2 - }, - "Price": 129.588, - "Quantity": 1, - "Total": 107.99 - } - ] - } - ] - } - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transforms/case003.json b/test/test-suite/groups/transforms/case003.json deleted file mode 100644 index 77fc4bf8..00000000 --- a/test/test-suite/groups/transforms/case003.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "expr": "$ ~> |Account.Order.Product|{},\"Description\"|", - "dataset": "dataset5", - "bindings": {}, - "result": { - "Account": { - "Account Name": "Firefly", - "Order": [ - { - "OrderID": "order103", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "0406654608", - "Price": 34.45, - "Quantity": 2 - }, - { - "Product Name": "Trilby hat", - "ProductID": 858236, - "SKU": "0406634348", - "Price": 21.67, - "Quantity": 1 - } - ] - }, - { - "OrderID": "order104", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "040657863", - "Price": 34.45, - "Quantity": 4 - }, - { - "ProductID": 345664, - "SKU": "0406654603", - "Product Name": "Cloak", - "Price": 107.99, - "Quantity": 1 - } - ] - } - ] - } - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transforms/case004.json b/test/test-suite/groups/transforms/case004.json deleted file mode 100644 index 5df5a019..00000000 --- a/test/test-suite/groups/transforms/case004.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "expr": "$ ~> |Account.Order.Product|nomatch,\"Description\"|", - "dataset": "dataset5", - "bindings": {}, - "result": { - "Account": { - "Account Name": "Firefly", - "Order": [ - { - "OrderID": "order103", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "0406654608", - "Price": 34.45, - "Quantity": 2 - }, - { - "Product Name": "Trilby hat", - "ProductID": 858236, - "SKU": "0406634348", - "Price": 21.67, - "Quantity": 1 - } - ] - }, - { - "OrderID": "order104", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "040657863", - "Price": 34.45, - "Quantity": 4 - }, - { - "ProductID": 345664, - "SKU": "0406654603", - "Product Name": "Cloak", - "Price": 107.99, - "Quantity": 1 - } - ] - } - ] - } - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transforms/case005.json b/test/test-suite/groups/transforms/case005.json deleted file mode 100644 index 33c9db6e..00000000 --- a/test/test-suite/groups/transforms/case005.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "expr": "$ ~> |(Account.Order.Product)[0]|{\"Description\":\"blah\"}|", - "dataset": "dataset5", - "bindings": {}, - "result": { - "Account": { - "Account Name": "Firefly", - "Order": [ - { - "OrderID": "order103", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "0406654608", - "Description": "blah", - "Price": 34.45, - "Quantity": 2 - }, - { - "Product Name": "Trilby hat", - "ProductID": 858236, - "SKU": "0406634348", - "Description": { - "Colour": "Orange", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.6 - }, - "Price": 21.67, - "Quantity": 1 - } - ] - }, - { - "OrderID": "order104", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "040657863", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": 34.45, - "Quantity": 4 - }, - { - "ProductID": 345664, - "SKU": "0406654603", - "Product Name": "Cloak", - "Description": { - "Colour": "Black", - "Width": 30, - "Height": 20, - "Depth": 210, - "Weight": 2 - }, - "Price": 107.99, - "Quantity": 1 - } - ] - } - ] - } - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transforms/case006.json b/test/test-suite/groups/transforms/case006.json deleted file mode 100644 index 6a461c07..00000000 --- a/test/test-suite/groups/transforms/case006.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "expr": "$ ~> |foo.bar|{\"Description\":\"blah\"}|", - "dataset": "dataset5", - "bindings": {}, - "result": { - "Account": { - "Account Name": "Firefly", - "Order": [ - { - "OrderID": "order103", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "0406654608", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": 34.45, - "Quantity": 2 - }, - { - "Product Name": "Trilby hat", - "ProductID": 858236, - "SKU": "0406634348", - "Description": { - "Colour": "Orange", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.6 - }, - "Price": 21.67, - "Quantity": 1 - } - ] - }, - { - "OrderID": "order104", - "Product": [ - { - "Product Name": "Bowler Hat", - "ProductID": 858383, - "SKU": "040657863", - "Description": { - "Colour": "Purple", - "Width": 300, - "Height": 200, - "Depth": 210, - "Weight": 0.75 - }, - "Price": 34.45, - "Quantity": 4 - }, - { - "ProductID": 345664, - "SKU": "0406654603", - "Product Name": "Cloak", - "Description": { - "Colour": "Black", - "Width": 30, - "Height": 20, - "Depth": 210, - "Weight": 2 - }, - "Price": 107.99, - "Quantity": 1 - } - ] - } - ] - } - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transforms/case007.json b/test/test-suite/groups/transforms/case007.json deleted file mode 100644 index 121dee5a..00000000 --- a/test/test-suite/groups/transforms/case007.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "expr": "Account ~> |Order|{\"Product\":\"blah\"},nomatch|", - "dataset": "dataset5", - "bindings": {}, - "result": { - "Account Name": "Firefly", - "Order": [ - { - "OrderID": "order103", - "Product": "blah" - }, - { - "OrderID": "order104", - "Product": "blah" - } - ] - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transforms/case008.json b/test/test-suite/groups/transforms/case008.json deleted file mode 100644 index 5993dd43..00000000 --- a/test/test-suite/groups/transforms/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo ~> |foo.bar|{\"Description\":\"blah\"}|", - "dataset": "dataset5", - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/transforms/case009.json b/test/test-suite/groups/transforms/case009.json deleted file mode 100644 index d0db25b6..00000000 --- a/test/test-suite/groups/transforms/case009.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account ~> |Order|5|", - "dataset": "dataset5", - "bindings": {}, - "code": "T2011" -} \ No newline at end of file diff --git a/test/test-suite/groups/transforms/case010.json b/test/test-suite/groups/transforms/case010.json deleted file mode 100644 index 506b9902..00000000 --- a/test/test-suite/groups/transforms/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "Account ~> |Order|{},5|", - "dataset": "dataset5", - "bindings": {}, - "code": "T2012" -} \ No newline at end of file diff --git a/test/test-suite/groups/transforms/case011.json b/test/test-suite/groups/transforms/case011.json deleted file mode 100644 index 121dee5a..00000000 --- a/test/test-suite/groups/transforms/case011.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "expr": "Account ~> |Order|{\"Product\":\"blah\"},nomatch|", - "dataset": "dataset5", - "bindings": {}, - "result": { - "Account Name": "Firefly", - "Order": [ - { - "OrderID": "order103", - "Product": "blah" - }, - { - "OrderID": "order104", - "Product": "blah" - } - ] - } -} \ No newline at end of file diff --git a/test/test-suite/groups/transforms/case012.json b/test/test-suite/groups/transforms/case012.json deleted file mode 100644 index 6ef5666b..00000000 --- a/test/test-suite/groups/transforms/case012.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $clone := 5; $ ~> |Account.Order.Product|{\"blah\":\"foo\"}| )", - "dataset": "dataset5", - "bindings": {}, - "code": "T2013" -} \ No newline at end of file diff --git a/test/test-suite/groups/variables/case000.json b/test/test-suite/groups/variables/case000.json deleted file mode 100644 index b050c6f7..00000000 --- a/test/test-suite/groups/variables/case000.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "$price.foo.bar", - "dataset": "dataset5", - "bindings": { - "price": { - "foo": { - "bar": 45 - } - } - }, - "result": 45 -} \ No newline at end of file diff --git a/test/test-suite/groups/variables/case001.json b/test/test-suite/groups/variables/case001.json deleted file mode 100644 index b050c6f7..00000000 --- a/test/test-suite/groups/variables/case001.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "$price.foo.bar", - "dataset": "dataset5", - "bindings": { - "price": { - "foo": { - "bar": 45 - } - } - }, - "result": 45 -} \ No newline at end of file diff --git a/test/test-suite/groups/variables/case002.json b/test/test-suite/groups/variables/case002.json deleted file mode 100644 index 368e0df6..00000000 --- a/test/test-suite/groups/variables/case002.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "$var[1]", - "dataset": "dataset5", - "bindings": { - "var": [ - 1, - 2, - 3 - ] - }, - "result": 2 -} \ No newline at end of file diff --git a/test/test-suite/groups/variables/case003.json b/test/test-suite/groups/variables/case003.json deleted file mode 100644 index a65b465d..00000000 --- a/test/test-suite/groups/variables/case003.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "expr": "$.foo.bar", - "dataset": "dataset0", - "bindings": { - "price": { - "foo": { - "bar": 45 - } - } - }, - "result": 42 -} \ No newline at end of file diff --git a/test/test-suite/groups/variables/case004.json b/test/test-suite/groups/variables/case004.json deleted file mode 100644 index f6acf60c..00000000 --- a/test/test-suite/groups/variables/case004.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$a := 5", - "dataset": null, - "bindings": {}, - "result": 5 -} \ No newline at end of file diff --git a/test/test-suite/groups/variables/case005.json b/test/test-suite/groups/variables/case005.json deleted file mode 100644 index 3b3ceddb..00000000 --- a/test/test-suite/groups/variables/case005.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "$a := $b := 5", - "dataset": null, - "bindings": {}, - "result": 5 -} \ No newline at end of file diff --git a/test/test-suite/groups/variables/case006.json b/test/test-suite/groups/variables/case006.json deleted file mode 100644 index 7a8360a7..00000000 --- a/test/test-suite/groups/variables/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($a := $b := 5; $a)", - "dataset": null, - "bindings": {}, - "result": 5 -} \ No newline at end of file diff --git a/test/test-suite/groups/variables/case007.json b/test/test-suite/groups/variables/case007.json deleted file mode 100644 index 4646a709..00000000 --- a/test/test-suite/groups/variables/case007.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "($a := $b := 5; $b)", - "dataset": null, - "bindings": {}, - "result": 5 -} \ No newline at end of file diff --git a/test/test-suite/groups/variables/case008.json b/test/test-suite/groups/variables/case008.json deleted file mode 100644 index 1524e608..00000000 --- a/test/test-suite/groups/variables/case008.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $a := 5; $a := $a + 2; $a )", - "dataset": null, - "bindings": {}, - "result": 7 -} \ No newline at end of file diff --git a/test/test-suite/groups/variables/case009.json b/test/test-suite/groups/variables/case009.json deleted file mode 100644 index e5fac0e1..00000000 --- a/test/test-suite/groups/variables/case009.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "expr": "[1,2,3].$v", - "dataset": null, - "bindings": { - "v": [] - }, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/variables/case010.json b/test/test-suite/groups/variables/case010.json deleted file mode 100644 index e3e9f00f..00000000 --- a/test/test-suite/groups/variables/case010.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $foo := \"defined\"; ( $foo := nothing ); $foo )", - "dataset": null, - "bindings": {}, - "result": "defined" -} \ No newline at end of file diff --git a/test/test-suite/groups/variables/case011.json b/test/test-suite/groups/variables/case011.json deleted file mode 100644 index 5ab1d4f6..00000000 --- a/test/test-suite/groups/variables/case011.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "( $foo := \"defined\"; ( $foo := nothing; $foo ) )", - "dataset": null, - "bindings": {}, - "undefinedResult": true -} \ No newline at end of file diff --git a/test/test-suite/groups/wildcards/case000.json b/test/test-suite/groups/wildcards/case000.json deleted file mode 100644 index 9215ee18..00000000 --- a/test/test-suite/groups/wildcards/case000.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "expr": "foo.*", - "dataset": "dataset0", - "bindings": {}, - "result": [ - 42, - { - "baz": { - "fud": "hello" - } - }, - { - "baz": { - "fud": "world" - } - }, - { - "bazz": "gotcha" - }, - "here" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/wildcards/case001.json b/test/test-suite/groups/wildcards/case001.json deleted file mode 100644 index dc8af3f5..00000000 --- a/test/test-suite/groups/wildcards/case001.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "expr": "foo.*.baz", - "dataset": "dataset0", - "bindings": {}, - "result": [ - { - "fud": "hello" - }, - { - "fud": "world" - } - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/wildcards/case002.json b/test/test-suite/groups/wildcards/case002.json deleted file mode 100644 index f75b1e86..00000000 --- a/test/test-suite/groups/wildcards/case002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.*.bazz", - "dataset": "dataset0", - "bindings": {}, - "result": "gotcha" -} \ No newline at end of file diff --git a/test/test-suite/groups/wildcards/case003.json b/test/test-suite/groups/wildcards/case003.json deleted file mode 100644 index 88833e0d..00000000 --- a/test/test-suite/groups/wildcards/case003.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.*.baz.*", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/wildcards/case004.json b/test/test-suite/groups/wildcards/case004.json deleted file mode 100644 index 88833e0d..00000000 --- a/test/test-suite/groups/wildcards/case004.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.*.baz.*", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/wildcards/case005.json b/test/test-suite/groups/wildcards/case005.json deleted file mode 100644 index 88833e0d..00000000 --- a/test/test-suite/groups/wildcards/case005.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "foo.*.baz.*", - "dataset": "dataset0", - "bindings": {}, - "result": [ - "hello", - "world" - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/wildcards/case006.json b/test/test-suite/groups/wildcards/case006.json deleted file mode 100644 index 6307c4fd..00000000 --- a/test/test-suite/groups/wildcards/case006.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "expr": "foo.*[0]", - "dataset": "dataset0", - "bindings": {}, - "result": 42 -} \ No newline at end of file diff --git a/test/test-suite/groups/wildcards/case007.json b/test/test-suite/groups/wildcards/case007.json deleted file mode 100644 index d59c1f5e..00000000 --- a/test/test-suite/groups/wildcards/case007.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "expr": "*[type=\"home\"]", - "dataset": "dataset1", - "bindings": {}, - "result": [ - { - "type": "home", - "number": "0203 544 1234" - }, - { - "type": "home", - "address": [ - "freddy@my-social.com", - "frederic.smith@very-serious.com" - ] - } - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/wildcards/case008.json b/test/test-suite/groups/wildcards/case008.json deleted file mode 100644 index 092f5972..00000000 --- a/test/test-suite/groups/wildcards/case008.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Account[$$.Account.\"Account Name\" = \"Firefly\"].*[OrderID=\"order104\"].Product.Price", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 34.45, - 107.99 - ] -} \ No newline at end of file diff --git a/test/test-suite/groups/wildcards/case009.json b/test/test-suite/groups/wildcards/case009.json deleted file mode 100644 index 73aa9708..00000000 --- a/test/test-suite/groups/wildcards/case009.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "expr": "Account[$$.Account.`Account Name` = \"Firefly\"].*[OrderID=\"order104\"].Product.Price", - "dataset": "dataset5", - "bindings": {}, - "result": [ - 34.45, - 107.99 - ] -} \ No newline at end of file From 33d5430f356e99afdd9b2bf129d999587d9499f0 Mon Sep 17 00:00:00 2001 From: Michael Tiller Date: Mon, 22 Jan 2018 21:16:34 -0500 Subject: [PATCH 3/4] Downgrade Jest This will allow it to work with Node 4, in theory. --- package.json | 10 +- yarn.lock | 751 ++++++++++++++++++++++----------------------------- 2 files changed, 331 insertions(+), 430 deletions(-) diff --git a/package.json b/package.json index 7ce59ad8..e0a6cf60 100644 --- a/package.json +++ b/package.json @@ -45,13 +45,13 @@ "eslint": "^4.0.0", "eslint-plugin-ideal": "^0.1.3", "istanbul": "^0.4.5", - "jest": "^22.1.3", + "jest": "21.2.1", "jsdoc": "^3.4.0", "mocha": "^5.0.0", "mocha-lcov-reporter": "^1.2.0", "request": "^2.81.0", "rollup": "^0.54.1", - "ts-jest": "^22.0.1", + "ts-jest": "21.2.3", "uglify-es": "^3.0.20" }, "engines": { @@ -67,7 +67,11 @@ "skipBabel": true } }, - "coverageReporters": ["json", "lcov", "text"], + "coverageReporters": [ + "json", + "lcov", + "text" + ], "transform": { "^.+\\.tsx?$": "ts-jest" }, diff --git a/yarn.lock b/yarn.lock index 9dfa4a5e..4dea01ef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,14 +2,6 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0-beta.35": - version "7.0.0-beta.38" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.38.tgz#c0af5930617e55e050336838e3a3670983b0b2b2" - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - "@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" @@ -20,7 +12,7 @@ version "22.0.1" resolved "https://registry.npmjs.org/@types/jest/-/jest-22.0.1.tgz#6370a6d60cce3845e4cd5d00bf65f654264685bc" -"@types/node@*", "@types/node@^9.3.0": +"@types/node@^9.3.0": version "9.3.0" resolved "https://registry.npmjs.org/@types/node/-/node-9.3.0.tgz#3a129cda7c4e5df2409702626892cb4b96546dd5" @@ -43,11 +35,11 @@ abbrev@1.0.x: version "1.0.9" resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" -acorn-globals@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" +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 "^5.0.0" + acorn "^4.0.4" acorn-jsx@^3.0.0: version "3.0.1" @@ -59,11 +51,11 @@ 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.3, acorn@^4.0.4: version "4.0.13" resolved "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" -acorn@^5.0.0, acorn@^5.1.2, acorn@^5.2.1: +acorn@^5.2.1: version "5.3.0" resolved "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" @@ -317,12 +309,12 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-jest@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-22.1.0.tgz#7fae6f655fffe77e818a8c2868c754a42463fdfd" +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.1.5" - babel-preset-jest "^22.1.0" + babel-plugin-istanbul "^4.0.0" + babel-preset-jest "^21.2.0" babel-messages@^6.23.0: version "6.23.0" @@ -330,7 +322,7 @@ babel-messages@^6.23.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-istanbul@^4.1.4, babel-plugin-istanbul@^4.1.5: +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: @@ -338,9 +330,9 @@ babel-plugin-istanbul@^4.1.4, babel-plugin-istanbul@^4.1.5: istanbul-lib-instrument "^1.7.5" test-exclude "^4.1.1" -babel-plugin-jest-hoist@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.1.0.tgz#c1281dd7887d77a1711dc760468c3b8285dde9ee" +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" @@ -362,11 +354,11 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-preset-jest@^22.0.1, babel-preset-jest@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.1.0.tgz#ff4e704102f9642765e2254226050561d8942ec9" +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 "^22.1.0" + babel-plugin-jest-hoist "^21.2.0" babel-plugin-syntax-object-rest-spread "^6.13.0" babel-register@^6.26.0: @@ -509,10 +501,6 @@ browser-pack@^6.0.1: through2 "^2.0.0" umd "^3.0.0" -browser-process-hrtime@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" - 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" @@ -787,6 +775,14 @@ cliui@^2.1.0: 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" @@ -1044,13 +1040,6 @@ default-require-extensions@^1.0.0: dependencies: strip-bom "^2.0.0" -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" - dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" - defined@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" @@ -1101,10 +1090,6 @@ detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - detective@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/detective/-/detective-5.0.2.tgz#84ec2e1c581e74211e2ae4ffce1edf52c3263f84" @@ -1129,7 +1114,7 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -doctrine@^2.0.2: +doctrine@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" dependencies: @@ -1139,10 +1124,6 @@ domain-browser@~1.1.0: version "1.1.7" resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" -domexception@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/domexception/-/domexception-1.0.0.tgz#81fe5df81b3f057052cde3a9fa9bf536a85b9ab0" - 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" @@ -1171,30 +1152,18 @@ elliptic@^6.0.0: 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" -es-abstract@^1.5.1: - version "1.10.0" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" - dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" - dependencies: - is-callable "^1.1.1" - is-date-object "^1.0.1" - is-symbol "^1.0.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" @@ -1210,7 +1179,7 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -escodegen@^1.9.0: +escodegen@^1.6.1: version "1.9.0" resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" dependencies: @@ -1237,8 +1206,8 @@ eslint-visitor-keys@^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.15.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-4.15.0.tgz#89ab38c12713eec3d13afac14e4a89e75ef08145" + 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" @@ -1246,7 +1215,7 @@ eslint@^4.0.0: concat-stream "^1.6.0" cross-spawn "^5.1.0" debug "^3.1.0" - doctrine "^2.0.2" + doctrine "^2.1.0" eslint-scope "^3.7.1" eslint-visitor-keys "^1.0.0" espree "^3.5.2" @@ -1351,10 +1320,6 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" @@ -1367,16 +1332,16 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expect@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/expect/-/expect-22.1.0.tgz#f8f9b019ab275d859cbefed531fbaefe8972431d" +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 "^22.1.0" - jest-get-type "^22.1.0" - jest-matcher-utils "^22.1.0" - jest-message-util "^22.1.0" - jest-regex-util "^22.1.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" @@ -1467,7 +1432,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.1.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: @@ -1492,10 +1457,6 @@ for-own@^0.1.4: dependencies: for-in "^1.0.1" -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -1516,7 +1477,7 @@ form-data@~2.3.1: combined-stream "^1.0.5" mime-types "^2.1.12" -fs-extra@4.0.3: +fs-extra@^4.0.2: version "4.0.3" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" dependencies: @@ -1552,7 +1513,7 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: mkdirp ">=0.5 0" rimraf "2" -function-bind@^1.0.2, function-bind@^1.1.1: +function-bind@^1.0.2: version "1.1.1" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -1712,7 +1673,7 @@ 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, has@^1.0.1: +has@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" dependencies: @@ -1829,13 +1790,6 @@ ignore@^3.3.3: version "3.3.7" resolved "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" -import-local@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" - dependencies: - pkg-dir "^2.0.0" - resolve-cwd "^2.0.0" - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -1931,20 +1885,12 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-callable@^1.1.1, is-callable@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" - 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-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" @@ -1979,10 +1925,6 @@ 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-generator-fn@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" - 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" @@ -2029,24 +1971,14 @@ is-promise@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - dependencies: - has "^1.0.1" - is-resolvable@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz#acca1cd36dbe44b974b924321555a70ba03b1cf4" + 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-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" - is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -2077,7 +2009,7 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul-api@^1.1.14: +istanbul-api@^1.1.1: version "1.2.1" resolved "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620" dependencies: @@ -2093,7 +2025,7 @@ istanbul-api@^1.1.14: mkdirp "^0.5.1" once "^1.4.0" -istanbul-lib-coverage@^1.1.1: +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" @@ -2103,7 +2035,7 @@ istanbul-lib-hook@^1.1.0: dependencies: append-transform "^0.4.0" -istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.8.0, istanbul-lib-instrument@^1.9.1: +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: @@ -2124,7 +2056,7 @@ istanbul-lib-report@^1.1.2: path-parse "^1.0.5" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.2.1, istanbul-lib-source-maps@^1.2.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: @@ -2159,255 +2091,230 @@ istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.0" -jest-changed-files@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.1.0.tgz#586a6164b87255dbd541a8bab880d98f14c99b7d" +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@^22.1.3: - version "22.1.3" - resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-22.1.3.tgz#b4fe4a66f476672924a2093d8ca01f1c227970fc" +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" - exit "^0.1.2" glob "^7.1.2" graceful-fs "^4.1.11" - import-local "^1.0.0" is-ci "^1.0.10" - istanbul-api "^1.1.14" - istanbul-lib-coverage "^1.1.1" - istanbul-lib-instrument "^1.8.0" - istanbul-lib-source-maps "^1.2.1" - jest-changed-files "^22.1.0" - jest-config "^22.1.3" - jest-environment-jsdom "^22.1.2" - jest-get-type "^22.1.0" - jest-haste-map "^22.1.0" - jest-message-util "^22.1.0" - jest-regex-util "^22.1.0" - jest-resolve-dependencies "^22.1.0" - jest-runner "^22.1.3" - jest-runtime "^22.1.3" - jest-snapshot "^22.1.2" - jest-util "^22.1.2" - jest-worker "^22.1.0" + 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.1.2" - realpath-native "^1.0.0" - rimraf "^2.5.4" + 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" - yargs "^10.0.3" + worker-farm "^1.3.1" + yargs "^9.0.0" -jest-config@^22.0.1, jest-config@^22.1.3: - version "22.1.3" - resolved "https://registry.npmjs.org/jest-config/-/jest-config-22.1.3.tgz#1572e214b75a3592c66841db371862ab080662d1" +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 "^22.1.2" - jest-environment-node "^22.1.2" - jest-get-type "^22.1.0" - jest-jasmine2 "^22.1.3" - jest-regex-util "^22.1.0" - jest-resolve "^22.1.0" - jest-util "^22.1.2" - jest-validate "^22.1.2" - pretty-format "^22.1.0" - -jest-diff@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-22.1.0.tgz#0fad9d96c87b453896bf939df3dc8aac6919ac38" + 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 "^22.1.0" - pretty-format "^22.1.0" + jest-get-type "^21.2.0" + pretty-format "^21.2.1" -jest-docblock@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.1.0.tgz#3fe5986d5444cbcb149746eb4b07c57c5a464dfd" - dependencies: - detect-newline "^2.1.0" +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@^22.1.2: - version "22.1.2" - resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.1.2.tgz#4488c629631dd5de9059ec747fcd358735247f70" +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 "^22.1.0" - jest-util "^22.1.2" - jsdom "^11.5.1" + jest-mock "^21.2.0" + jest-util "^21.2.1" + jsdom "^9.12.0" -jest-environment-node@^22.1.2: - version "22.1.2" - resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.1.2.tgz#77dc32fbe08caa03ef2acb0948dce4b25a14633a" +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 "^22.1.0" - jest-util "^22.1.2" + jest-mock "^21.2.0" + jest-util "^21.2.1" -jest-get-type@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.1.0.tgz#4e90af298ed6181edc85d2da500dbd2753e0d5a9" +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@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.1.0.tgz#1174c6ff393f9818ebf1163710d8868b5370da2a" +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 "^22.1.0" - jest-worker "^22.1.0" + jest-docblock "^21.2.0" micromatch "^2.3.11" sane "^2.0.0" + worker-farm "^1.3.1" -jest-jasmine2@^22.1.3: - version "22.1.3" - resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.1.3.tgz#35429cd22e9aed2d234aee48b73734eefc140f96" +jest-jasmine2@^21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz#9cc6fc108accfa97efebce10c4308548a4ea7592" dependencies: - callsites "^2.0.0" chalk "^2.0.1" - co "^4.6.0" - expect "^22.1.0" + expect "^21.2.1" graceful-fs "^4.1.11" - is-generator-fn "^1.0.0" - jest-diff "^22.1.0" - jest-matcher-utils "^22.1.0" - jest-message-util "^22.1.0" - jest-snapshot "^22.1.2" - source-map-support "^0.5.0" - -jest-leak-detector@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.1.0.tgz#08376644cee07103da069baac19adb0299b772c2" - dependencies: - pretty-format "^22.1.0" + 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@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.1.0.tgz#e164665b5d313636ac29f7f6fe9ef0a6ce04febc" +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 "^22.1.0" - pretty-format "^22.1.0" + jest-get-type "^21.2.0" + pretty-format "^21.2.1" -jest-message-util@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.1.0.tgz#51ba0794cb6e579bfc4e9adfac452f9f1a0293fc" +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: - "@babel/code-frame" "^7.0.0-beta.35" chalk "^2.0.1" micromatch "^2.3.11" slash "^1.0.0" - stack-utils "^1.0.1" -jest-mock@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-22.1.0.tgz#87ec21c0599325671c9a23ad0e05c86fb5879b61" +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@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.1.0.tgz#5daf2fe270074b6da63e5d85f1c9acc866768f53" +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@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.1.0.tgz#340e4139fb13315cd43abc054e6c06136be51e31" +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 "^22.1.0" + jest-regex-util "^21.2.0" -jest-resolve@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.1.0.tgz#5f4307f48b93c1abdbeacc9ed80642ffcb246294" +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@^22.1.3: - version "22.1.3" - resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-22.1.3.tgz#8fdd2da200d95a486e5d4b001add061ac4253261" - dependencies: - exit "^0.1.2" - jest-config "^22.1.3" - jest-docblock "^22.1.0" - jest-haste-map "^22.1.0" - jest-jasmine2 "^22.1.3" - jest-leak-detector "^22.1.0" - jest-message-util "^22.1.0" - jest-runtime "^22.1.3" - jest-util "^22.1.2" - jest-worker "^22.1.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@^22.1.3: - version "22.1.3" - resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.1.3.tgz#c807fa91655121e719f51caf01eb4b08b714cb23" +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 "^22.1.0" - babel-plugin-istanbul "^4.1.5" + babel-jest "^21.2.0" + babel-plugin-istanbul "^4.0.0" chalk "^2.0.1" convert-source-map "^1.4.0" - exit "^0.1.2" graceful-fs "^4.1.11" - jest-config "^22.1.3" - jest-haste-map "^22.1.0" - jest-regex-util "^22.1.0" - jest-resolve "^22.1.0" - jest-util "^22.1.2" + 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" - realpath-native "^1.0.0" slash "^1.0.0" strip-bom "3.0.0" write-file-atomic "^2.1.0" - yargs "^10.0.3" + yargs "^9.0.0" -jest-snapshot@^22.1.2: - version "22.1.2" - resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.1.2.tgz#b270cf6e3098f33aceeafda02b13eb0933dc6139" +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 "^22.1.0" - jest-matcher-utils "^22.1.0" + jest-diff "^21.2.1" + jest-matcher-utils "^21.2.1" mkdirp "^0.5.1" natural-compare "^1.4.0" - pretty-format "^22.1.0" + pretty-format "^21.2.1" -jest-util@^22.1.2: - version "22.1.2" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-22.1.2.tgz#4bf098f651e8611d744cefa23fa026c97a6a3d5d" +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" - is-ci "^1.0.10" - jest-message-util "^22.1.0" - jest-validate "^22.1.2" + jest-message-util "^21.2.1" + jest-mock "^21.2.0" + jest-validate "^21.2.1" mkdirp "^0.5.1" -jest-validate@^22.1.2: - version "22.1.2" - resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-22.1.2.tgz#c3b06bcba7bd9a850919fe336b5f2a8c3a239404" +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 "^22.1.0" + jest-get-type "^21.2.0" leven "^2.1.0" - pretty-format "^22.1.0" - -jest-worker@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-22.1.0.tgz#0987832fe58fbdc205357f4c19b992446368cafb" - dependencies: - merge-stream "^1.0.1" + pretty-format "^21.2.1" -jest@^22.1.3: - version "22.1.3" - resolved "https://registry.npmjs.org/jest/-/jest-22.1.3.tgz#59bd66af5e9cd6367cbeeead9de6c3cfdd6d4204" +jest@21.2.1: + version "21.2.1" + resolved "https://registry.npmjs.org/jest/-/jest-21.2.1.tgz#c964e0b47383768a1438e3ccf3c3d470327604e1" dependencies: - jest-cli "^22.1.3" + jest-cli "^21.2.1" js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" @@ -2447,33 +2354,28 @@ jsdoc@^3.4.0: taffydb "2.6.2" underscore "~1.8.3" -jsdom@^11.5.1: - version "11.5.1" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-11.5.1.tgz#5df753b8d0bca20142ce21f4f6c039f99a992929" +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 "^5.1.2" - acorn-globals "^4.0.0" + acorn "^4.0.4" + acorn-globals "^3.1.0" array-equal "^1.0.0" - browser-process-hrtime "^0.1.2" content-type-parser "^1.0.1" cssom ">= 0.3.2 < 0.4.0" cssstyle ">= 0.2.37 < 0.3.0" - domexception "^1.0.0" - escodegen "^1.9.0" + escodegen "^1.6.1" html-encoding-sniffer "^1.0.1" - left-pad "^1.2.0" - nwmatcher "^1.4.3" - parse5 "^3.0.2" - pn "^1.0.0" - request "^2.83.0" - request-promise-native "^1.0.3" + 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.3" - webidl-conversions "^4.0.2" + tough-cookie "^2.3.2" + webidl-conversions "^4.0.0" whatwg-encoding "^1.0.1" - whatwg-url "^6.3.0" + whatwg-url "^4.3.0" xml-name-validator "^2.0.1" jsesc@^1.3.0: @@ -2575,10 +2477,6 @@ lcov-parse@^0.0.10: version "0.0.10" resolved "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" -left-pad@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee" - leven@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" @@ -2606,6 +2504,15 @@ load-json-file@^1.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" @@ -2617,11 +2524,7 @@ lodash.memoize@~3.0.3: version "3.0.4" resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - -lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0: +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" @@ -2669,12 +2572,6 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" -merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - dependencies: - readable-stream "^2.0.1" - merge@^1.1.3: version "1.2.0" resolved "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" @@ -2809,7 +2706,7 @@ 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.1.2: +node-notifier@^5.0.2: version "5.2.1" resolved "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" dependencies: @@ -2881,7 +2778,7 @@ 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.4.3: +"nwmatcher@>= 1.3.9 < 2.0.0": version "1.4.3" resolved "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" @@ -2893,17 +2790,6 @@ 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-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" - -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - object.omit@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -2968,6 +2854,10 @@ osenv@^0.1.4: 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" @@ -3023,11 +2913,9 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" -parse5@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" - dependencies: - "@types/node" "*" +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" @@ -3071,6 +2959,12 @@ path-type@^1.0.0: 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" @@ -3097,6 +2991,10 @@ 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" @@ -3117,10 +3015,6 @@ pluralize@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" -pn@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -3129,9 +3023,9 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -pretty-format@^22.1.0: - version "22.1.0" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-22.1.0.tgz#2277605b40ed4529ae4db51ff62f4be817647914" +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" @@ -3152,6 +3046,10 @@ 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" @@ -3174,10 +3072,6 @@ punycode@^1.3.2, punycode@^1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -punycode@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - qs@~6.4.0: version "6.4.0" resolved "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" @@ -3236,6 +3130,13 @@ read-pkg-up@^1.0.1: 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" @@ -3244,7 +3145,15 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -readable-stream@^2.0.1, 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: +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: @@ -3276,12 +3185,6 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" -realpath-native@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0" - dependencies: - util.promisify "^1.0.0" - regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" @@ -3310,20 +3213,6 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request-promise-core@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" - dependencies: - lodash "^4.13.1" - -request-promise-native@^1.0.3: - version "1.0.5" - resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" - dependencies: - request-promise-core "1.1.1" - stealthy-require "^1.1.0" - tough-cookie ">=2.3.3" - request@2.81.0: version "2.81.0" resolved "https://registry.npmjs.org/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" @@ -3351,7 +3240,7 @@ request@2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" -request@^2.79.0, request@^2.81.0, request@^2.83.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: @@ -3399,20 +3288,10 @@ requizzle@~0.2.1: dependencies: underscore "~1.6.0" -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - dependencies: - resolve-from "^3.0.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-from@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - resolve@1.1.7, resolve@1.1.x: version "1.1.7" resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" @@ -3436,7 +3315,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.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: @@ -3474,8 +3353,8 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" sane@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/sane/-/sane-2.2.0.tgz#d6d2e2fcab00e3d283c93b912b7c3a20846f1d56" + 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" @@ -3504,8 +3383,8 @@ set-immediate-shim@^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.9" - resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d" + 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" @@ -3630,14 +3509,6 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" -stack-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" - -stealthy-require@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - stream-browserify@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" @@ -3717,7 +3588,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-bom@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" @@ -3862,33 +3733,32 @@ 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.3, tough-cookie@^2.3.3, tough-cookie@~2.3.0, tough-cookie@~2.3.3: +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@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - dependencies: - punycode "^2.1.0" +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@^22.0.1: - version "22.0.1" - resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-22.0.1.tgz#48942936a466c2e76e259b02e2f1356f1839afc3" +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 "^22.0.1" + babel-preset-jest "^21.2.0" cpx "^1.5.0" - fs-extra "4.0.3" - jest-config "^22.0.1" + 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" @@ -3926,8 +3796,8 @@ typescript@^2.6.2: resolved "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" uglify-es@^3.0.20: - version "3.3.7" - resolved "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.7.tgz#d1249af668666aba7cb1163e277455be9eb393cf" + 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" @@ -3982,13 +3852,6 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -util.promisify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - util@0.10.3, util@~0.10.1: version "0.10.3" resolved "https://registry.npmjs.org/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" @@ -4033,7 +3896,11 @@ watch@~0.18.0: exec-sh "^0.2.0" minimist "^1.2.0" -webidl-conversions@^4.0.1, webidl-conversions@^4.0.2: +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" @@ -4043,13 +3910,12 @@ whatwg-encoding@^1.0.1: dependencies: iconv-lite "0.4.19" -whatwg-url@^6.3.0: - version "6.4.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08" +whatwg-url@^4.3.0: + version "4.8.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.0" - webidl-conversions "^4.0.1" + tr46 "~0.0.3" + webidl-conversions "^3.0.0" which-module@^2.0.0: version "2.0.0" @@ -4083,6 +3949,13 @@ 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" @@ -4116,7 +3989,7 @@ 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.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" @@ -4128,6 +4001,12 @@ 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" @@ -4151,6 +4030,24 @@ yargs@^10.0.3: 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" From f5420d9383fd61e4889088092c8e3124240eb44a Mon Sep 17 00:00:00 2001 From: Michael Tiller Date: Thu, 25 Jan 2018 10:57:46 -0500 Subject: [PATCH 4/4] More work, mainly on typing related aspects One big priority was removing optional fields from AST nodes and tagging AST nodes with `global` properties (like `keepArray`, see below). I haven't changed the AST definitions at all. The `type` and `value` fields should have the same values they always had. However, in the types I'm using tagged unions for all the AST nodes. Generally, the `type` field is used to narrow the type. But in some cases, I further refine type by `value` (which you can really think of as a subtype for the AST nodes). This basically allows me to narrow the type further in the code and do more static checking during compilation to make sure that the proper fields are being read and/or written. One "breaking change" is with the parser recovery tests. These aren't really breaking in the sense that they would impact most users. They have to do with including some additional lexical information. This information was, generally speaking, already there. But there were cases where it wasn't included for some AST nodes. So the change is really just including it consistently. Another noticeable change is with error handling. Previously, the syntax errors were annotated on the root node of the AST. I've changed that so they don't impact the AST. I've also changed the error semantics very slightly. Now, if there are no errors, the `errors` field in an expression will return an empty array (previously, it returned `undefined`). One completely internal change was the elimination of the `keepArray` attribute on AST nodes. This was added whenever the `[]` was found in an expression. I've changed the handling so that instead of having the parser walk through the AST and find the head of the path that contains the `[]` operator and then set the `keepArray` attribute on it, I'm simply adding a special "decorator" AST node that is optimized away eventually. This keeps the parser focused just on building the initial AST and leaves the semantics of the `SingletonArrayDecorator` (the node that gets inserted as a result of an `[]` in a path) to be handled completely during `ast_optimize`. It is important to note that this special AST node is always optimized away. In `ast_optimize` I generate a new AST node as a result of optimization in each `case` of the `switch` statement. This is mainly to keep the typing clean (so we know precisely what we are working with at any given time). --- __tests__/parser-recovery.ts | 629 +++++++++++++++++++---------------- package.json | 8 +- src/ast.ts | 206 ++++++++++++ src/evaluate.ts | 3 +- src/jsonata.ts | 11 +- src/parser/ast.ts | 130 -------- src/parser/leds.ts | 50 +-- src/parser/nuds.ts | 11 +- src/parser/optimize.ts | 402 +++++++++++++--------- src/parser/parser.ts | 22 +- src/parser/symbols.ts | 4 +- src/parser/tail_call.ts | 56 ++-- src/parser/types.ts | 2 +- src/visitor.ts | 57 ++++ tsconfig-es2015.json | 1 - tsconfig.json | 2 +- 16 files changed, 957 insertions(+), 637 deletions(-) create mode 100644 src/ast.ts delete mode 100644 src/parser/ast.ts create mode 100644 src/visitor.ts diff --git a/__tests__/parser-recovery.ts b/__tests__/parser-recovery.ts index b498e992..da662c89 100644 --- a/__tests__/parser-recovery.ts +++ b/__tests__/parser-recovery.ts @@ -1,443 +1,496 @@ "use strict"; -var jsonata = require('../src').jsonata; -var assert = require('assert'); +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 }); +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": [ + type: "path", + keepSingletonArray: false, + position: 8, + value: ".", + steps: [ { - "value": "Account", - "type": "name", - "position": 7 + value: "Account", + type: "name", + position: 7, }, { - "value": "Order", - "type": "name", - "position": 13, - "predicate": [ + value: "Order", + type: "name", + position: 13, + predicate: [ { - "value": 0, - "type": "literal", - "position": 15 - } - ] - } - ] + value: 0, + type: "literal", + position: 15, + }, + ], + }, + ], }; var errors = expr.errors(); - var expected_errors = undefined; + 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 }); +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": [ + type: "path", + keepSingletonArray: false, + position: 8, + value: ".", + steps: [ { - "value": "Account", - "type": "name", - "position": 7 + value: "Account", + type: "name", + position: 7, }, { - "type": "error", - "error": { - "code": "S0207", - "position": 8, - "token": "(end)" - } - } - ] + 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)" - } + 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 }); + describe("Account[", function() { + it("should return ast", function() { + var expr = jsonata("Account[", { recover: true }); var ast = expr.ast(); var expected_ast = { - "type": "path", - "steps": [ + type: "path", + keepSingletonArray: false, + position: 7, + value: "Account", + steps: [ { - "value": "Account", - "type": "name", - "position": 7, - "predicate": [ + value: "Account", + type: "name", + position: 7, + predicate: [ { - "type": "error", - "error": { - "code": "S0207", - "position": 8, - "token": "(end)" - } - } - ] - } - ] + 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 = [ + var expected_errors = [ { - "code": "S0203", - "position": 8, - "token": "(end)", - "value": "]", - "remaining": [] + code: "S0203", + position: 8, + token: "(end)", + value: "]", + remaining: [], }, { - "code": "S0207", - "position": 8, - "token": "(end)" - } + 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 }); + 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": [ + type: "path", + keepSingletonArray: false, + position: 8, + value: ".", + steps: [ { - "value": "Account", - "type": "name", - "position": 7 + value: "Account", + type: "name", + position: 7, }, { - "value": "Order", - "type": "name", - "position": 13, - "predicate": [ + 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} + 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" - } - ] - } - ] + type: "error", + }, + ], + }, + ], }; var errors = expr.errors(); - var expected_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} + 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" + type: "error", }, { - "code": "S0202", - "position": 16, - "token": "0", - "value": "]", - "remaining": [ + code: "S0202", + position: 16, + token: "0", + value: "]", + remaining: [ { - "value": 0, - "type": "literal", - "position": 16 - } - ] - } + 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 }); + 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": [ + type: "path", + keepSingletonArray: false, + position: 8, + value: ".", + steps: [ { - "value": "Account", - "type": "name", - "position": 7 + value: "Account", + type: "name", + position: 7, }, { - "value": "Order", - "type": "name", - "position": 13, - "predicate": [ + value: "Order", + type: "name", + position: 13, + predicate: [ { - "value": 0, - "type": "literal", - "position": 15 - } - ] - } - ] + value: 0, + type: "literal", + position: 15, + }, + ], + }, + ], }; var errors = expr.errors(); - var expected_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} - ] - } + 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 }); + 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": [ + type: "path", + keepSingletonArray: false, + position: 17, + value: ".", + steps: [ { - "value": "Account", - "type": "name", - "position": 7 + value: "Account", + type: "name", + position: 7, }, { - "value": "Order", - "type": "name", - "position": 13, - "predicate": [ + value: "Order", + type: "name", + position: 13, + predicate: [ { - "value": 0, - "type": "literal", - "position": 15 - } - ] + value: 0, + type: "literal", + position: 15, + }, + ], }, { - "value": "Product", - "type": "name", - "position": 24 - } - ] + value: "Product", + type: "name", + position: 24, + }, + ], }; var errors = expr.errors(); var expected_errors = [ { - "code": "S0201", - "position": 25, - "remaining": [ + code: "S0201", + position: 25, + remaining: [ { - "position": 25, - "type": "operator", - "value": ";" - } + position: 25, + type: "operator", + value: ";", + }, ], - "token": ";" - } + 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 }); + 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": [ + type: "sort", + value: "^", + position: 36, + lhs: { + type: "path", + keepSingletonArray: false, + position: 16, + value: ".", + steps: [ { - "value": "equals3lucy", - "type": "variable", - "position": 12, - "predicate": [ + value: "equals3lucy", + type: "variable", + position: 12, + predicate: [ { - "value": 0, - "type": "literal", - "position": 14 - } - ] + value: 0, + type: "literal", + position: 14, + }, + ], }, { - "value": "UnstructuredAnswers", - "type": "name", - "position": 35 - } - ] + value: "UnstructuredAnswers", + type: "name", + position: 35, + }, + ], }, - "rhs": [ + rhs: [ { - "descending": false, - "expression": { - "code": "S0211", - "token": ")", - "position": 38, - "remaining": [ + descending: false, + expression: { + code: "S0211", + token: ")", + position: 38, + remaining: [ { - "type": "operator", - "value": "[", - "position": 39 + type: "operator", + value: "[", + position: 39, }, { - "type": "number", - "value": 0, - "position": 40 + type: "number", + value: 0, + position: 40, }, { - "type": "operator", - "value": "]", - "position": 41 + type: "operator", + value: "]", + position: 41, }, { - "type": "operator", - "value": ".", - "position": 42 + type: "operator", + value: ".", + position: 42, }, { - "type": "name", - "value": "Text", - "position": 46 - } + type: "name", + value: "Text", + position: 46, + }, ], - "type": "error", - "predicate": [ + type: "error", + predicate: [ { - "type": "error", - "error": { - "code": "S0207", - "position": 46, - "token": "(end)" - } - } - ] - } - } - ] + 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": [ + code: "S0211", + position: 38, + predicate: [ { - "error": { - "code": "S0207", - "position": 46, - "token": "(end)" + error: { + code: "S0207", + position: 46, + token: "(end)", + }, + type: "error", + lhs: { + position: 46, + type: "end", + value: "(end)", }, - "type": "error" - } + position: 46, + remaining: [], + value: "(end)", + }, ], - "remaining": [ + remaining: [ { - "position": 39, - "type": "operator", - "value": "[" + position: 39, + type: "operator", + value: "[", }, { - "position": 40, - "type": "number", - "value": 0 + position: 40, + type: "number", + value: 0, }, { - "position": 41, - "type": "operator", - "value": "]" + position: 41, + type: "operator", + value: "]", }, { - "position": 42, - "type": "operator", - "value": "." + position: 42, + type: "operator", + value: ".", }, { - "position": 46, - "type": "name", - "value": "Text" - } + position: 46, + type: "name", + value: "Text", + }, ], - "token": ")", - "type": "error" + token: ")", + type: "error", }, { - "code": "S0203", - "position": 46, - "remaining": [], - "token": "(end)", - "value": "]" + code: "S0203", + position: 46, + remaining: [], + token: "(end)", + value: "]", }, { - "code": "S0203", - "position": 46, - "remaining": [], - "token": "(end)", - "value": ")" + code: "S0203", + position: 46, + remaining: [], + token: "(end)", + value: ")", }, { - "code": "S0207", - "position": 46, - "token": "(end)" - } + 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 }); + 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) { + } catch (e) { expect(e.position).toEqual(0); expect(e.code).toEqual("S0500"); error = true; @@ -446,6 +499,4 @@ describe('Invoke parser with incomplete expression', function() { }); }); }); - }); - diff --git a/package.json b/package.json index e0a6cf60..5cc69e70 100644 --- a/package.json +++ b/package.json @@ -52,15 +52,13 @@ "request": "^2.81.0", "rollup": "^0.54.1", "ts-jest": "21.2.3", - "uglify-es": "^3.0.20" + "uglify-es": "^3.0.20", + "@types/node": "^9.3.0", + "typescript": "^2.6.2" }, "engines": { "node": ">= 4" }, - "dependencies": { - "@types/node": "^9.3.0", - "typescript": "^2.6.2" - }, "jest": { "globals": { "ts-jest": { 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/evaluate.ts b/src/evaluate.ts index d8763a8c..5834bb3f 100644 --- a/src/evaluate.ts +++ b/src/evaluate.ts @@ -11,8 +11,9 @@ import { toSequence, } from "./utils"; import { defineFunction } from "./signatures"; -import { parser } from "./parser"; +import { parser } from './parser'; import { functionBoolean, functionAppend, functionString, functionSort, createStandardFrame } from "./functions"; +// import * as ast from "./ast"; /** * Evaluate expression against input data diff --git a/src/jsonata.ts b/src/jsonata.ts index 0cc83209..d8210f86 100644 --- a/src/jsonata.ts +++ b/src/jsonata.ts @@ -3,6 +3,7 @@ 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; @@ -27,12 +28,10 @@ export type AST = any; * @returns {{evaluate: evaluate, assign: assign}} Evaluated expression */ export function jsonata(expr: string, options?: Partial): Expression { - var ast; - var errors; + let ast: undefined | ASTNode = undefined; + let errors: string[] = []; try { - ast = parser(expr, options && options.recover); - errors = ast.errors; - delete ast.errors; + ast = parser(expr, errors, options && options.recover); } catch (err) { // insert error message into structure err.message = lookupMessage(err); @@ -59,7 +58,7 @@ export function jsonata(expr: string, options?: Partial): Expression { return { evaluate: function(input, bindings, callback) { // throw if the expression compiled with syntax errors - if (typeof errors !== "undefined") { + if (typeof errors !== "undefined" && errors.length>0) { var err: any = { code: "S0500", position: 0, diff --git a/src/parser/ast.ts b/src/parser/ast.ts deleted file mode 100644 index 3e83c14d..00000000 --- a/src/parser/ast.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { Token } from "../tokenizer"; - -export interface BaseNode { - type: string; - value: any; - keepArray?: boolean; - // TODO: This is only added to the root expression node...should probably be a separate return value from parser - errors?: string[]; -} - -export interface WildcardNode extends BaseNode { - type: "wildcard"; -} - -export interface DescendantNode extends BaseNode { - type: "descendant"; -} - -export interface ErrorNode extends BaseNode { - type: "error"; - // TODO: refine - error: any; - // TODO: refine - lhs: any; - remaining: Token[]; -} - -export interface VariableNode extends BaseNode { - type: "variable"; - position: number; -} - -export interface NameNode extends BaseNode { - type: "name"; - position: number; -} -export interface LiteralNode extends BaseNode { - type: "literal"; - position: number; -} - -export interface RegexNode extends BaseNode { - type: "regex"; - position: number; -} - -export interface OperatorNode extends BaseNode { - type: "operator"; - position: number; -} - -export interface EndNode extends BaseNode { - type: "end"; - value: string; - position: number; -} - -export type TerminalNode = VariableNode | NameNode | LiteralNode | RegexNode | OperatorNode | EndNode; - -export interface UnaryNode extends BaseNode { - type: "unary"; - // TODO: refine - expression?: any; - // TODO: Used by objectParser (should get rid of this eventually) - lhs?: any; - // TODO: Used by array constructor - expressions?: any; -} - -export interface BinaryNode extends BaseNode { - type: "binary"; - value: string; // Could be refined - lhs: any; - rhs: any; - position?: number; // Required for sort operator!?! -} - -export interface TernaryNode extends BaseNode { - type: "condition"; - condition: any; - then: any; - else: any; -} - -export interface BlockNode extends BaseNode { - type: "block"; - // TODO: refine - expressions: any[]; -} - -export interface TransformNode extends BaseNode { - type: "transform"; - // TODO: Refine these - pattern: any; - update: any; - delete?: any; -} - -export interface FunctionInvocationNode extends BaseNode { - type: "function" | "partial"; - procedure: any; - arguments: any; - position: number; -} - -export interface LambdaDefinitionNode extends BaseNode { - type: "lambda"; - body: any; - signature: any; - procedure: any; - arguments: any; -} - -export type ASTNode = - | WildcardNode - | DescendantNode - | ErrorNode - | LiteralNode - | NameNode - | VariableNode - | RegexNode - | OperatorNode - | UnaryNode - | BinaryNode - | TernaryNode - | BlockNode - | TransformNode - | FunctionInvocationNode - | LambdaDefinitionNode - | EndNode; diff --git a/src/parser/leds.ts b/src/parser/leds.ts index 5016ed9f..8cd94880 100644 --- a/src/parser/leds.ts +++ b/src/parser/leds.ts @@ -1,6 +1,6 @@ import { LED, ParserState } from "./types"; import { parseSignature } from "../signatures"; -import * as ast from "./ast"; +import * as ast from "../ast"; import { operators } from "../constants"; export const infixDefaultLED = (bindingPower: number): LED => { @@ -9,6 +9,7 @@ export const infixDefaultLED = (bindingPower: number): LED => { let rhs = state.expression(bindingPower); return { value: initialToken.value, + position: initialToken.position, type: "binary", lhs: left, rhs: rhs, @@ -107,31 +108,33 @@ export const functionLED: LED = ( state.advance("}"); return { value: initialToken.value, + position: initialToken.position, type: "lambda", body: body, signature: signature, - procedure: left, 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 === "]") { - // empty predicate means maintain singleton arrays in the output - var step = left; - while (step && step.type === "binary" && step.value === "[") { - let s = step as ast.BinaryNode; - step = s.lhs; - } - step.keepArray = true; state.advance("]"); - return left; + 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, @@ -140,26 +143,28 @@ export const filterLED: LED = (state: ParserState, left: ast.ASTNode): ast.ASTNo } }; -export const orderByLED: LED = (state: ParserState, left: ast.ASTNode): ast.BinaryNode => { +export const orderByLED: LED = (state: ParserState, left: ast.ASTNode): ast.SortNode => { let initialToken = state.previousToken; state.advance("("); - var terms = []; + var terms: ast.SortTerm[] = []; for (;;) { - var term = { - descending: false, - }; + let descending = false; if (state.symbol.id === "<") { // ascending sort + descending = false; state.advance("<"); } else if (state.symbol.id === ">") { // descending sort - term.descending = true; + descending = true; state.advance(">"); } else { + descending = false; //unspecified - default to ascending } - // TODO: Fix any cast - (term as any).expression = state.expression(0); + let term: ast.SortTerm = { + descending: descending, + expression: state.expression(0), + }; terms.push(term); if (state.symbol.id !== ",") { break; @@ -170,13 +175,13 @@ export const orderByLED: LED = (state: ParserState, left: ast.ASTNode): ast.Bina return { position: initialToken.position, // REQUIRED?!? value: initialToken.value, - type: "binary", + type: "sort", lhs: left, - rhs: terms, // TODO: Not an expression node...different node type recommended + rhs: terms, }; }; -export const objectParserLED: LED = (state: ParserState, left: ast.ASTNode): ast.BinaryNode => { +export const objectParserLED: LED = (state: ParserState, left: ast.ASTNode): ast.BinaryObjectNode => { var a = []; let initialToken = state.previousToken; /* istanbul ignore else */ @@ -195,7 +200,8 @@ export const objectParserLED: LED = (state: ParserState, left: ast.ASTNode): ast state.advance("}", true); // LED - binary infix form return { - value: initialToken.value, + value: "{", + position: initialToken.position, type: "binary", lhs: left, rhs: a, diff --git a/src/parser/nuds.ts b/src/parser/nuds.ts index a6e7acef..0d4c9438 100644 --- a/src/parser/nuds.ts +++ b/src/parser/nuds.ts @@ -1,6 +1,6 @@ import { NUD, ParserState } from "./types"; import { Token } from "../tokenizer"; -import * as ast from "./ast"; +import * as ast from "../ast"; export const defaultNUD = (recover: boolean, errors: string[], remainingTokens: () => Token[]): NUD => { return (state: ParserState): ast.ErrorNode => { @@ -30,6 +30,7 @@ export const prefixDefaultNUD = (bindingPower: number): NUD => { let expr = state.expression(bindingPower); return { value: initialToken.value, + position: initialToken.position, type: "unary", expression: expr, }; @@ -85,6 +86,7 @@ export const terminalNUD: NUD = (state: ParserState): ast.TerminalNode => { export const wildcardNUD = (state: ParserState): ast.WildcardNode => { return { value: state.previousToken.value, + position: state.previousToken.position, type: "wildcard", }; }; @@ -92,6 +94,7 @@ export const wildcardNUD = (state: ParserState): ast.WildcardNode => { export const descendantNUD = (state: ParserState): ast.DescendantNode => { return { value: state.previousToken.value, + position: state.previousToken.position, type: "descendant", }; }; @@ -108,6 +111,7 @@ export const blockNUD = (state: ParserState): ast.BlockNode => { state.advance(")", true); return { value: state.token.value, + position: state.token.position, type: "block", expressions: expressions, }; @@ -142,11 +146,12 @@ export const arrayNUD = (state: ParserState): ast.UnaryNode => { } } state.advance("]", true); - // TODO: Should this be a different type...? (not unary) return { value: initialToken.value, + position: initialToken.position, type: "unary", expressions: a, + consarray: false, }; }; @@ -170,6 +175,7 @@ export const objectParserNUD: NUD = (state: ParserState): ast.UnaryNode => { // NUD - unary prefix form return { value: initialToken.value, + position: initialToken.position, type: "unary", lhs: a, // TODO: use expression }; @@ -188,6 +194,7 @@ export const transformerNUD = (state: ParserState): ast.TransformNode => { state.advance("|"); return { value: initialToken.value, + position: initialToken.position, type: "transform", pattern: expr, update: update, diff --git a/src/parser/optimize.ts b/src/parser/optimize.ts index 2953d708..3d89e726 100644 --- a/src/parser/optimize.ts +++ b/src/parser/optimize.ts @@ -1,75 +1,80 @@ 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. -// TODO: Add types and adjust for errors -export function ast_optimize(expr /* : ast.ASTNode */, collect: undefined | ErrorCollector) { - var result; +export function ast_optimize(expr: ast.ASTNode, collect: undefined | ErrorCollector): ast.ASTNode { switch (expr.type) { - case "binary": + case "binary": { switch (expr.value) { case ".": - var lstep = ast_optimize(expr.lhs, collect); - result = { type: "path", steps: [] }; + let lstep = ast_optimize(expr.lhs, collect); + let steps: ast.ASTNode[] = []; + let keepSA: boolean = false; if (lstep.type === "path") { - Array.prototype.push.apply(result.steps, lstep.steps); + steps = lstep.steps; + if (lstep.keepSingletonArray) keepSA = true; } else { - result.steps = [lstep]; + steps = [lstep]; } - var rest = ast_optimize(expr.rhs, collect); + 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" && - result.steps[result.steps.length - 1].type === "function" + last.type === "function" ) { // next function in chain of functions - will override a thenable - result.steps[result.steps.length - 1].nextFunction = rest.procedure.steps[0].value; + last.nextFunction = rest.procedure.steps[0].value; } - if (rest.type !== "path") { - rest = { type: "path", steps: [rest] }; + + if (rest.type === "path") { + steps = [...steps, ...rest.steps]; + } else { + steps = [...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; + 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]); } - break; - case "[": + + 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 - result = ast_optimize(expr.lhs, collect); - var step = result; - if (result.type === "path") { - step = result.steps[result.steps.length - 1]; + 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 { @@ -78,17 +83,23 @@ export function ast_optimize(expr /* : ast.ASTNode */, collect: undefined | Erro 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)); - break; - case "{": + return node; + } + case "{": { // group-by // LHS is a step or a predicated step // RHS is the object constructor expr - result = ast_optimize(expr.lhs, collect); - if (typeof result.group !== "undefined") { + let node = ast_optimize(expr.lhs, collect); + if (typeof node.group !== "undefined") { throw { code: "S0210", stack: new Error().stack, @@ -96,132 +107,204 @@ export function ast_optimize(expr /* : ast.ASTNode */, collect: undefined | Erro }; } // object constructor - process each pair - result.group = { - lhs: expr.rhs.map(function(pair) { + node.group = { + lhs: expr.rhs.map(pair => { return [ast_optimize(pair[0], collect), ast_optimize(pair[1], collect)]; }), 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, collect); - result.rhs = expr.rhs.map(function(terms) { - return { - descending: terms.descending, - expression: ast_optimize(terms.expression, collect), - }; - }); - break; - case ":=": - result = { type: "bind", value: expr.value, position: expr.position }; - result.lhs = ast_optimize(expr.lhs, collect); - result.rhs = ast_optimize(expr.rhs, collect); - break; - case "~>": - result = { type: "apply", value: expr.value, position: expr.position }; - result.lhs = ast_optimize(expr.lhs, collect); - result.rhs = ast_optimize(expr.rhs, collect); - break; + 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: - result = { type: expr.type, value: expr.value, position: expr.position }; - result.lhs = ast_optimize(expr.lhs, collect); - result.rhs = ast_optimize(expr.rhs, collect); + return { + ...expr, + lhs: ast_optimize(expr.lhs, collect), + rhs: ast_optimize(expr.rhs, collect), + }; } - break; + } + 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": - 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, collect); - }); - } else if (expr.value === "{") { - // object constructor - process each pair - result.lhs = expr.lhs.map(function(pair) { - return [ast_optimize(pair[0], collect), ast_optimize(pair[1], collect)]; - }); - } else { - // all other unary expressions - just process the expression - result.expression = ast_optimize(expr.expression, collect); - // 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; + 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, + }; } } - 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) { + case "partial": { + let args = expr.arguments.map(arg => { return ast_optimize(arg, collect); }); - result.procedure = ast_optimize(expr.procedure, collect); - break; - case "lambda": - result = { - type: expr.type, - arguments: expr.arguments, - signature: expr.signature, - position: expr.position, + let procedure = ast_optimize(expr.procedure, collect); + return { + ...expr, + arguments: args, + procedure: procedure, }; - var body = ast_optimize(expr.body, collect); - result.body = tail_call_optimize(body); - break; - case "condition": - result = { type: expr.type, position: expr.position }; - result.condition = ast_optimize(expr.condition, collect); - // TODO: Yikes! This is very dangerous (might appear like a Promise) - result.then = ast_optimize(expr.then, collect); + } + 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") { - result.else = ast_optimize(expr.else, collect); + otherwise = ast_optimize(expr.else, collect); } - break; - case "transform": - result = { type: expr.type, position: expr.position }; - result.pattern = ast_optimize(expr.pattern, collect); - result.update = ast_optimize(expr.update, 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") { - result.delete = ast_optimize(expr.delete, collect); + del = ast_optimize(expr.delete, collect); } - break; + return { + type: "transform", + position: expr.position, + value: expr.value, + pattern: pattern, + update: update, + delete: del, + }; + } 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, collect); - }); // 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; + let expressions = expr.expressions.map(item => { + return ast_optimize(item, collect); + }); + return { + type: "block", + value: expr.value, + position: expr.position, + expressions: expressions, + }; case "name": - result = { type: "path", steps: [expr] }; - if (expr.keepArray) { - result.keepSingletonArray = true; - } - break; + return { + type: "path", + value: expr.value, + position: expr.position, + keepSingletonArray: false, + steps: [expr], + }; case "literal": case "wildcard": case "descendant": case "variable": case "regex": - result = expr; - break; + 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") { - expr.type = "name"; - result = ast_optimize(expr, collect); + return ast_optimize({ ...expr, type: "name" }, collect); } else { /* istanbul ignore else */ - if (expr.value === "?") { // partial application - result = expr; + return { ...expr }; } else { throw { code: "S0201", @@ -231,31 +314,52 @@ export function ast_optimize(expr /* : ast.ASTNode */, collect: undefined | Erro }; } } - break; case "error": - result = expr; if (expr.lhs) { - result = ast_optimize(expr.lhs, collect); + return ast_optimize(expr.lhs, collect); } - break; + return expr; default: var code = "S0206"; /* istanbul ignore else */ if (expr.type == "end") { code = "S0207"; } - var err = { + var err: ast.ErrorFields = { code: code, position: expr.position, token: expr.value, }; if (collect) { collect(err); - return { type: "error", error: err }; + return { + type: "error", + error: err, + lhs: expr, + remaining: [], + value: expr.value, + position: expr.position, + }; } else { - (err as any).stack = new Error().stack; + err.stack = new Error().stack; throw err; } } - return result; +} + +/** + * 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 index 95b8bc24..580c1c24 100644 --- a/src/parser/parser.ts +++ b/src/parser/parser.ts @@ -1,7 +1,7 @@ import { tokenizer, Tokenizer, Token } from "../tokenizer"; import { ast_optimize } from "./optimize"; import { createTable } from "./symbols"; -import * as ast from "./ast"; +import * as ast from "../ast"; import { Symbol, ParserState, SymbolTable } from "./types"; @@ -12,14 +12,20 @@ import { Symbol, ParserState, SymbolTable } from "./types"; * 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 errors: string[] = []; 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); @@ -41,11 +47,7 @@ class Parser implements ParserState { // 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); - - if (this.errors.length > 0) { - expr.errors = this.errors; - } - + return expr; } @@ -178,8 +180,10 @@ class Parser implements ParserState { // 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, recover?: boolean) { +export function parser(source: string, errors: string[], recover?: boolean): ast.ASTNode { let p = new Parser(source, recover); - return p.parse(); + 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 index 67fe0bf2..763104c4 100644 --- a/src/parser/symbols.ts +++ b/src/parser/symbols.ts @@ -3,7 +3,7 @@ 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"; +import * as ast from "../ast"; export function createTable(recover: boolean, errors: string[], remainingTokens: () => Token[]): SymbolTable { let symbol_table: { [id: string]: Symbol } = {}; @@ -105,6 +105,7 @@ export function createTable(recover: boolean, errors: string[], remainingTokens: 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(), @@ -151,6 +152,7 @@ export function createTable(recover: boolean, errors: string[], remainingTokens: } return { value: initialToken.value, + position: initialToken.position, type: "condition", condition: left, then: then, diff --git a/src/parser/tail_call.ts b/src/parser/tail_call.ts index 9de382d4..6611890a 100644 --- a/src/parser/tail_call.ts +++ b/src/parser/tail_call.ts @@ -1,29 +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) { - var result; - if (expr.type === "function") { - var thunk = { type: "lambda", thunk: true, arguments: [], position: expr.position, 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); +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: [], + }; } - 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]); + 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, + } } - result = expr; - } else { - result = expr; + 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 }; } - return result; } diff --git a/src/parser/types.ts b/src/parser/types.ts index b0a21a78..47f5477c 100644 --- a/src/parser/types.ts +++ b/src/parser/types.ts @@ -1,4 +1,4 @@ -import * as ast from "./ast"; +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; 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/tsconfig-es2015.json b/tsconfig-es2015.json index 37c9b1f1..09e75224 100644 --- a/tsconfig-es2015.json +++ b/tsconfig-es2015.json @@ -1,6 +1,5 @@ { "extends": "./tsconfig", "compilerOptions": { - "moduleResolution": "node" } } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 9e250923..77f29ffb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -36,7 +36,7 @@ "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). */ + "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. */