diff --git a/benchmark/.eslintrc.json b/benchmark/.eslintrc.json
index b93af0c5e..93668d17a 100644
--- a/benchmark/.eslintrc.json
+++ b/benchmark/.eslintrc.json
@@ -1,5 +1,7 @@
{
+ "extends": ["standard"],
"rules": {
- "no-unused-expressions": "off"
+ "no-unused-expressions": "off",
+ "@typescript-eslint/no-var-requires": "off"
}
}
diff --git a/benchmark/demo.ts b/benchmark/demo.js
similarity index 68%
rename from benchmark/demo.ts
rename to benchmark/demo.js
index faf0fec4a..391d3bd66 100644
--- a/benchmark/demo.ts
+++ b/benchmark/demo.js
@@ -1,5 +1,5 @@
-import * as Benchmark from 'benchmark'
-import { Context, TagToken, Liquid } from '../src/liquid'
+const Benchmark = require('benchmark')
+const { Liquid } = require('..')
const engine = new Liquid({
root: __dirname,
@@ -7,11 +7,11 @@ const engine = new Liquid({
})
engine.registerTag('header', {
- parse: function (token: TagToken) {
+ parse: function (token) {
const [key, val] = token.args.split(':')
this[key] = val
},
- render: function (ctx: Context) {
+ render: function (ctx) {
const title = this.liquid.evalValue(this.content, ctx)
return `
${title}
`
}
@@ -32,16 +32,18 @@ const template = `
`
-export function demo () {
+function demo () {
console.log('--- demo ---')
return new Promise(resolve => {
new Benchmark.Suite('demo')
.add('demo', {
defer: true,
- fn: (d: any) => engine.parseAndRender(template, ctx).then((x: any) => d.resolve(x))
+ fn: d => engine.parseAndRender(template, ctx).then(x => d.resolve(x))
})
- .on('cycle', (event: any) => console.log(String(event.target)))
+ .on('cycle', event => console.log(String(event.target)))
.on('complete', resolve)
.run({ 'async': true })
})
}
+
+module.exports = { demo }
diff --git a/benchmark/index.js b/benchmark/index.js
new file mode 100644
index 000000000..44c3db87b
--- /dev/null
+++ b/benchmark/index.js
@@ -0,0 +1,15 @@
+const { output } = require('./output')
+const { tag } = require('./tag')
+const { demo } = require('./demo')
+const { layout } = require('./layout')
+const { memory } = require('./memory')
+
+async function main () {
+ // await output()
+ // await tag()
+ // await demo()
+ // await layout()
+ await memory()
+}
+
+main()
diff --git a/benchmark/index.ts b/benchmark/index.ts
deleted file mode 100644
index 8f524d7ce..000000000
--- a/benchmark/index.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { output } from './output'
-import { tag } from './tag'
-import { demo } from './demo'
-import { layout } from './layout'
-import { memory } from './memory'
-
-async function main () {
- await output()
- await tag()
- await demo()
- await layout()
- await memory()
-}
-
-main()
diff --git a/benchmark/layout.ts b/benchmark/layout.js
similarity index 61%
rename from benchmark/layout.ts
rename to benchmark/layout.js
index bd8bf68e6..4fd866047 100644
--- a/benchmark/layout.ts
+++ b/benchmark/layout.js
@@ -1,5 +1,5 @@
-import * as Benchmark from 'benchmark'
-import { Liquid } from '../src/liquid'
+const Benchmark = require('benchmark')
+const { Liquid } = require('..')
const engineOptions = {
root: __dirname,
@@ -17,20 +17,22 @@ const template = `
{% block body %}a small body{% endblock %}
`
-export function layout () {
+function layout () {
console.log('--- layout ---')
return new Promise(resolve => {
new Benchmark.Suite('layout')
.add('cache=false', {
defer: true,
- fn: (d: any) => engine.parseAndRender(template, {}).then((x: any) => d.resolve(x))
+ fn: d => engine.parseAndRender(template, {}).then(x => d.resolve(x))
})
.add('cache=true', {
defer: true,
- fn: (d: any) => cachingEngine.parseAndRender(template, {}).then((x: any) => d.resolve(x))
+ fn: d => cachingEngine.parseAndRender(template, {}).then(x => d.resolve(x))
})
- .on('cycle', (event: any) => console.log(String(event.target)))
+ .on('cycle', event => console.log(String(event.target)))
.on('complete', resolve)
.run({ 'async': true })
})
}
+
+module.exports = { layout }
diff --git a/benchmark/memory.js b/benchmark/memory.js
new file mode 100644
index 000000000..244f4ef66
--- /dev/null
+++ b/benchmark/memory.js
@@ -0,0 +1,57 @@
+const { join } = require('path')
+const { readFileSync } = require('fs')
+const { getHeapStatistics } = require('v8')
+const { Liquid } = require('..')
+
+const engineOptions = {
+ root: __dirname,
+ extname: '.liquid'
+}
+
+const engine = new Liquid(engineOptions)
+
+const SAMPLE_COUNT = 1024
+
+function memory () {
+ console.log('--- memory ---')
+ html()
+ todolist()
+}
+
+function html () {
+ const str = readFileSync(join(__dirname, 'templates/lorem-html.liquid'), 'utf8')
+
+ global.gc()
+ const base = getHeapStatistics().used_heap_size
+ const templates = []
+
+ for (let i = 0; i < SAMPLE_COUNT; i++) {
+ templates.push(engine.parse(str))
+ }
+ global.gc()
+
+ const diff = (getHeapStatistics().used_heap_size - base) / SAMPLE_COUNT
+ console.log(`${h(str.length)} HTML template x ${h(diff)}/instance (${SAMPLE_COUNT} instances sampled)`)
+}
+
+function todolist () {
+ const str = readFileSync(join(__dirname, 'templates/todolist.liquid'), 'utf8')
+
+ global.gc()
+ const base = getHeapStatistics().used_heap_size
+ const templates = []
+
+ for (let i = 0; i < SAMPLE_COUNT; i++) {
+ templates.push(engine.parse(str))
+ }
+ global.gc()
+
+ const diff = (getHeapStatistics().used_heap_size - base) / SAMPLE_COUNT
+ console.log(`${h(str.length)} Todo template x ${h(diff)}/instance (${SAMPLE_COUNT} instances sampled)`)
+}
+
+function h (size) {
+ return (size / 1024).toFixed(3) + ' kB'
+}
+
+module.exports = { memory }
diff --git a/benchmark/memory.ts b/benchmark/memory.ts
deleted file mode 100644
index af70e36c5..000000000
--- a/benchmark/memory.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { join } from 'path'
-import { readFileSync } from 'fs'
-import { getHeapStatistics } from 'v8'
-import { Liquid } from '../src/liquid'
-
-const engineOptions = {
- root: __dirname,
- extname: '.liquid'
-}
-
-const engine = new Liquid(engineOptions)
-
-const templateString = readFileSync(join(__dirname, 'templates/lorem-html.liquid'), 'utf8')
-const templateSizeKb = templateString.length / 1024
-
-const NB_INSTANCES_TO_RETAIN = 250
-
-export function memory () {
- console.log('--- memory ---')
- const initialUsedHeapSize = getHeapStatistics().used_heap_size
- const templates = []
-
- for (let i = 0; i < NB_INSTANCES_TO_RETAIN; i++) {
- templates.push(engine.parse(templateString))
- }
-
- const finalUsedHeapSize = getHeapStatistics().used_heap_size
- const heapDifference = finalUsedHeapSize - initialUsedHeapSize
- const avgRetainedPerTemplate = (heapDifference / NB_INSTANCES_TO_RETAIN) / 1024
-
- console.log(`retained memory for a ${templateSizeKb}KB template: ${avgRetainedPerTemplate}KB (${NB_INSTANCES_TO_RETAIN} samples)`)
-}
diff --git a/benchmark/output.ts b/benchmark/output.js
similarity index 64%
rename from benchmark/output.ts
rename to benchmark/output.js
index 539eabebe..e083cc80d 100644
--- a/benchmark/output.ts
+++ b/benchmark/output.js
@@ -1,9 +1,9 @@
-import * as Benchmark from 'benchmark'
-import { Liquid } from '../src/liquid'
+const Benchmark = require('benchmark')
+const { Liquid } = require('..')
const liquid = new Liquid()
-export function output () {
+function output () {
console.log('--- output ---')
return new Promise(resolve => {
new Benchmark.Suite('output')
@@ -12,15 +12,17 @@ export function output () {
.add('date', test('{{"now" | date: "%d%Y%m"}}'))
.add('escape', test('{{"1<2" | escape}}'))
.add('default', test('{{"" | default: 3}}'))
- .on('cycle', (event: any) => console.log(String(event.target)))
+ .on('cycle', (event) => console.log(String(event.target)))
.on('complete', resolve)
.run({ 'async': true })
})
}
-function test (str: string) {
+function test (str) {
return {
defer: true,
- fn: (d: any) => liquid.parseAndRender(str).then((x: any) => d.resolve(x))
+ fn: d => liquid.parseAndRender(str).then(x => d.resolve(x))
}
}
+
+module.exports = { output }
diff --git a/benchmark/tag.ts b/benchmark/tag.js
similarity index 74%
rename from benchmark/tag.ts
rename to benchmark/tag.js
index 2cc0024ab..4c7521886 100644
--- a/benchmark/tag.ts
+++ b/benchmark/tag.js
@@ -1,9 +1,9 @@
-import * as Benchmark from 'benchmark'
-import { Liquid } from '../src/liquid'
+const Benchmark = require('benchmark')
+const { Liquid } = require('..')
const liquid = new Liquid()
-export function tag () {
+function tag () {
console.log('--- tag ---')
return new Promise(resolve => {
new Benchmark.Suite('tag')
@@ -16,15 +16,17 @@ export function tag () {
.add('increment', test('{%increment a%}'))
.add('decrement', test('{%decrement a%}'))
.add('tablerow', test('{%tablerow i in (1..10) cols:3%}{%endtablerow%}'))
- .on('cycle', (event: any) => console.log(String(event.target)))
+ .on('cycle', (event) => console.log(String(event.target)))
.on('complete', resolve)
.run({ 'async': true })
})
}
-function test (str: string) {
+function test (str) {
return {
defer: true,
- fn: (d: any) => liquid.parseAndRender(str).then((x: any) => d.resolve(x))
+ fn: d => liquid.parseAndRender(str).then(x => d.resolve(x))
}
}
+
+module.exports = { tag }
diff --git a/benchmark/templates/todolist.liquid b/benchmark/templates/todolist.liquid
new file mode 100644
index 000000000..010ec93f2
--- /dev/null
+++ b/benchmark/templates/todolist.liquid
@@ -0,0 +1,49 @@
+
+
+ posuere cubilia Curae; Vestibulum hendrerit malesuada odio. Fusce ut elit
+ ut augue sollicitudin blandit. Phasellus volutpat lorem. Duis non pede et
+ neque luctus tincidunt. Duis interdum tempus elit.
+ Aenean metus. Vestibulum ac lacus. Vivamus porttitor, massa ut.
+
+ Add Todo
+
+ {% for i in (0..categories.length) %}
+ {% assign item=categories[i] %}
+ -
+ {{ item.title }}
+
+ {% endfor %}
+
+ {% for todo in todos %}
+
+
+ Todo {{ forloop.index }}:
+
+ {{ todo.title | prepend: 'TODO: ' | upcase }}
+
+
+
+

+
+
+ Purus eu mi. Proin commodo, massa commodo dapibus elementum,
+ libero lacus pulvinar eros, ut tincidunt nisl elit ut velit. Cras rutrum
+ porta purus. Vivamus lorem. Sed turpis enim, faucibus quis, pharetra in,
+ sagittis sed, magna. Curabitur ultricies felis ut libero. Nullam tincidunt
+ enim eu nibh. Nunc eget ipsum in sem facilisis convallis. Proin fermentum
+
+
+
+ {% if todo.category %}
+ {{ todo.category.title | capitalize }}
+ {% endif %}
+
+
Edit
+
Check
+
Trash
+
+ {% endfor %}
+
diff --git a/package-lock.json b/package-lock.json
index bbbe95e4e..676417e29 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -929,6 +929,12 @@
"@types/chai": "*"
}
},
+ "@types/color-name": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
+ "dev": true
+ },
"@types/connect": {
"version": "3.4.33",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz",
@@ -1453,9 +1459,9 @@
}
},
"acorn-jsx": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz",
- "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
+ "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
"dev": true
},
"acorn-walk": {
@@ -3564,49 +3570,107 @@
}
},
"eslint": {
- "version": "5.16.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz",
- "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==",
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
+ "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "ajv": "^6.9.1",
+ "ajv": "^6.10.0",
"chalk": "^2.1.0",
"cross-spawn": "^6.0.5",
"debug": "^4.0.1",
"doctrine": "^3.0.0",
- "eslint-scope": "^4.0.3",
- "eslint-utils": "^1.3.1",
- "eslint-visitor-keys": "^1.0.0",
- "espree": "^5.0.1",
+ "eslint-scope": "^5.0.0",
+ "eslint-utils": "^1.4.3",
+ "eslint-visitor-keys": "^1.1.0",
+ "espree": "^6.1.2",
"esquery": "^1.0.1",
"esutils": "^2.0.2",
"file-entry-cache": "^5.0.1",
"functional-red-black-tree": "^1.0.1",
- "glob": "^7.1.2",
- "globals": "^11.7.0",
+ "glob-parent": "^5.0.0",
+ "globals": "^12.1.0",
"ignore": "^4.0.6",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
- "inquirer": "^6.2.2",
- "js-yaml": "^3.13.0",
+ "inquirer": "^7.0.0",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.3.0",
- "lodash": "^4.17.11",
+ "lodash": "^4.17.14",
"minimatch": "^3.0.4",
"mkdirp": "^0.5.1",
"natural-compare": "^1.4.0",
- "optionator": "^0.8.2",
- "path-is-inside": "^1.0.2",
+ "optionator": "^0.8.3",
"progress": "^2.0.0",
"regexpp": "^2.0.1",
- "semver": "^5.5.1",
- "strip-ansi": "^4.0.0",
- "strip-json-comments": "^2.0.1",
+ "semver": "^6.1.2",
+ "strip-ansi": "^5.2.0",
+ "strip-json-comments": "^3.0.1",
"table": "^5.2.3",
- "text-table": "^0.2.0"
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
},
"dependencies": {
+ "ansi-escapes": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+ "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.11.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+ "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+ "dev": true
+ }
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^3.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
"doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@@ -3616,20 +3680,217 @@
"esutils": "^2.0.2"
}
},
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "eslint-scope": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
+ "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
+ "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
+ "dev": true
+ },
+ "figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "^1.0.5"
+ }
+ },
+ "globals": {
+ "version": "12.3.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz",
+ "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
"ignore": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
"dev": true
},
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "inquirer": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.6.tgz",
+ "integrity": "sha512-7SVO4h+QIdMq6XcqIqrNte3gS5MzCCKZdsq9DO4PJziBFNYzP3PGFbDjgadDb//MCahzgjCxvQ/O2wa7kx9o4w==",
"dev": true,
"requires": {
- "ansi-regex": "^3.0.0"
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^3.0.0",
+ "cli-cursor": "^3.1.0",
+ "cli-width": "^2.0.0",
+ "external-editor": "^3.0.3",
+ "figures": "^3.0.0",
+ "lodash": "^4.17.15",
+ "mute-stream": "0.0.8",
+ "run-async": "^2.4.0",
+ "rxjs": "^6.5.3",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "through": "^2.3.6"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
}
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
+ "mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "dev": true
+ },
+ "onetime": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+ "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "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",
+ "word-wrap": "~1.2.3"
+ }
+ },
+ "restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "requires": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "run-async": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz",
+ "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==",
+ "dev": true,
+ "requires": {
+ "is-promise": "^2.1.0"
+ }
+ },
+ "rxjs": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
+ "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
+ }
+ },
+ "strip-json-comments": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
+ "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true
}
}
},
@@ -4110,14 +4371,28 @@
"dev": true
},
"espree": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz",
- "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.0.tgz",
+ "integrity": "sha512-Xs8airJ7RQolnDIbLtRutmfvSsAe0xqMMAantCN/GMoqf81TFbeI1T7Jpd56qYu1uuh32dOG5W/X9uO+ghPXzA==",
"dev": true,
"requires": {
- "acorn": "^6.0.7",
- "acorn-jsx": "^5.0.0",
- "eslint-visitor-keys": "^1.0.0"
+ "acorn": "^7.1.0",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz",
+ "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==",
+ "dev": true
+ },
+ "eslint-visitor-keys": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
+ "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
+ "dev": true
+ }
}
},
"esprima": {
@@ -4127,9 +4402,9 @@
"dev": true
},
"esquery": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
- "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz",
+ "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==",
"dev": true,
"requires": {
"estraverse": "^4.0.0"
@@ -12091,12 +12366,6 @@
"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-key": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
@@ -13932,9 +14201,9 @@
"dev": true
},
"table": {
- "version": "5.4.5",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.5.tgz",
- "integrity": "sha512-oGa2Hl7CQjfoaogtrOHEJroOcYILTx7BZWLGsJIlzoWmB2zmguhNfPJZsWPKYek/MgCxfco54gEi31d1uN2hFA==",
+ "version": "5.4.6",
+ "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+ "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
"dev": true,
"requires": {
"ajv": "^6.10.2",
@@ -14484,6 +14753,12 @@
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
"dev": true
},
+ "v8-compile-cache": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
+ "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==",
+ "dev": true
+ },
"validate-npm-package-license": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
@@ -14777,6 +15052,12 @@
"execa": "^1.0.0"
}
},
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
"wordwrap": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
diff --git a/package.json b/package.json
index a24b246f3..d3a6f1721 100644
--- a/package.json
+++ b/package.json
@@ -7,13 +7,13 @@
"browser": "dist/liquid.js",
"types": "dist/liquid.d.ts",
"scripts": {
- "lint": "eslint . --ext .ts",
+ "lint": "eslint .",
"docs": "rm docs -rf && typedoc --gitRevision master --out docs src && cp -r website/. docs/",
"unit": "mocha \"test/unit/**/*.ts\"",
"integration": "mocha \"test/integration/**/*.ts\"",
"e2e": "npm run build && mocha \"test/e2e/**/*.ts\"",
"test": "cross-env BUNDLES=cjs,umd npm run build && mocha \"test/**/*.ts\"",
- "benchmark": "ts-node benchmark",
+ "benchmark": "node --expose-gc benchmark/index",
"coverage": "nyc --reporter=html mocha \"test/{unit,integration}/**/*.ts\"",
"coverage-coveralls": "nyc mocha \"test/{unit,integration}/**/*.ts\" && nyc report --reporter=text-lcov | coveralls",
"build": "rollup -c rollup.config.ts && ls -lh dist",
@@ -80,7 +80,7 @@
"chai-as-promised": "^7.1.1",
"coveralls": "^3.0.2",
"cross-env": "^5.2.0",
- "eslint": "^5.12.1",
+ "eslint": "^6.8.0",
"eslint-config-standard": "^12.0.0",
"eslint-plugin-import": "^2.15.0",
"eslint-plugin-mocha": "^5.3.0",