From 19c3638f9e3ccf2d596b33af10e0965519f4ff6d Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Mon, 18 Jan 2021 18:09:41 -0600 Subject: [PATCH 01/49] Try parallel building --- nuxt.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/nuxt.config.js b/nuxt.config.js index d66fdb0..b183d5b 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -317,6 +317,7 @@ export default { ** Build configuration */ build: { + parallel: true, html: { minify: { minifyCSS: false, From 5785d47607c728c97721d40ca7d1edad97b15639 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Mon, 18 Jan 2021 18:14:10 -0600 Subject: [PATCH 02/49] Try build caching --- nuxt.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/nuxt.config.js b/nuxt.config.js index b183d5b..032672d 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -318,6 +318,7 @@ export default { */ build: { parallel: true, + cache: true, html: { minify: { minifyCSS: false, From 23efdc3dbe201e80c4529041d3ffc09e0d527bf7 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Mon, 18 Jan 2021 18:21:18 -0600 Subject: [PATCH 03/49] Try hardsource --- nuxt.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/nuxt.config.js b/nuxt.config.js index 032672d..6ac0793 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -318,6 +318,7 @@ export default { */ build: { parallel: true, + hardSource: true, cache: true, html: { minify: { From efeb39a07a7696c4448f62fb7973fc3ef6863b5a Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Mon, 18 Jan 2021 18:21:31 -0600 Subject: [PATCH 04/49] Install eleventy --- package-lock.json | 2471 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 2472 insertions(+) diff --git a/package-lock.json b/package-lock.json index 1393938..35431a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,85 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@11ty/dependency-tree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-1.0.0.tgz", + "integrity": "sha512-2FWYlkphQ/83MG7b9qqBJfJJ0K9zupNz/6n4EdDuNLw6hQHGp4Sp4UMDRyBvA/xCTYDBaPSuSjHuu45tSujegg==", + "dev": true + }, + "@11ty/eleventy": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-0.11.1.tgz", + "integrity": "sha512-90iTOifuiRN92gttDFMeGsAuG0/5XwsKvCn/9d5CHYUO80Okq0biSJxr69abYmOstg9jHfkaVxuPkcs4feRb8Q==", + "dev": true, + "requires": { + "@11ty/dependency-tree": "^1.0.0", + "browser-sync": "^2.26.13", + "chalk": "^3.0.0", + "chokidar": "^3.4.0", + "debug": "^4.1.1", + "dependency-graph": "^0.9.0", + "ejs": "^2.7.4", + "fast-glob": "^3.2.2", + "fs-extra": "^8.1.0", + "gray-matter": "^4.0.2", + "hamljs": "^0.6.2", + "handlebars": "^4.7.6", + "javascript-stringify": "^2.0.1", + "liquidjs": "^6.4.3", + "lodash": "^4.17.15", + "luxon": "^1.24.1", + "markdown-it": "^10.0.0", + "minimist": "^1.2.5", + "moo": "^0.5.1", + "multimatch": "^4.0.0", + "mustache": "^2.3.2", + "normalize-path": "^3.0.0", + "nunjucks": "^3.2.1", + "parse-filepath": "^1.0.2", + "please-upgrade-node": "^3.2.0", + "pretty": "^2.0.0", + "pug": "^2.0.4", + "recursive-copy": "^2.0.10", + "semver": "^7.3.2", + "slugify": "^1.4.0", + "time-require": "^0.1.2", + "valid-url": "^1.0.9" + }, + "dependencies": { + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "markdown-it": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "@babel/code-frame": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", @@ -1859,6 +1938,21 @@ "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", "dev": true }, + "@types/babel-types": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.9.tgz", + "integrity": "sha512-qZLoYeXSTgQuK1h7QQS16hqLGdmqtRmN8w/rl3Au/l5x/zkHx+a4VHrHyBsi1I1vtK2oBHxSzKIu0R5p6spdOA==", + "dev": true + }, + "@types/babylon": { + "version": "6.16.5", + "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz", + "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==", + "dev": true, + "requires": { + "@types/babel-types": "*" + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -1877,6 +1971,12 @@ "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, "@types/node": { "version": "14.10.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.10.2.tgz", @@ -2304,6 +2404,12 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2326,6 +2432,23 @@ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "dev": true, + "requires": { + "acorn": "^4.0.4" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, "acorn-jsx": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", @@ -2357,6 +2480,12 @@ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -2391,6 +2520,28 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "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.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.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, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "alphanum-sort": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", @@ -2523,6 +2674,12 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -2535,12 +2692,36 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "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.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -2600,6 +2781,12 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, "async-cache": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/async-cache/-/async-cache-1.1.0.tgz", @@ -2630,6 +2817,12 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "dev": true + }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -2892,12 +3085,56 @@ "object.assign": "^4.1.0" } }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "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 + } + } + }, "babylon": { "version": "7.0.0-beta.44", "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", "dev": true }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -2958,12 +3195,39 @@ } } }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "dev": true + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, "bfj": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", @@ -2998,6 +3262,12 @@ "file-uri-to-path": "1.0.0" } }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -3151,6 +3421,279 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, + "browser-sync": { + "version": "2.26.13", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.13.tgz", + "integrity": "sha512-JPYLTngIzI+Dzx+StSSlMtF+Q9yjdh58HW6bMFqkFXuzQkJL8FCvp4lozlS6BbECZcsM2Gmlgp0uhEjvl18X4w==", + "dev": true, + "requires": { + "browser-sync-client": "^2.26.13", + "browser-sync-ui": "^2.26.13", + "bs-recipes": "1.3.4", + "bs-snippet-injector": "^2.0.1", + "chokidar": "^3.4.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "3.1.0", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.0", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.1.1", + "qs": "6.2.3", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "2.1.1", + "ua-parser-js": "^0.7.18", + "yargs": "^15.4.1" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "dependencies": { + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "browser-sync-client": { + "version": "2.26.13", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.13.tgz", + "integrity": "sha512-p2VbZoYrpuDhkreq+/Sv1MkToHklh7T1OaIntDwpG6Iy2q/XkBcgwPcWjX+WwRNiZjN8MEehxIjEUh12LweLmQ==", + "dev": true, + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3", + "rxjs": "^5.5.6" + }, + "dependencies": { + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + } + } + }, + "browser-sync-ui": { + "version": "2.26.13", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.13.tgz", + "integrity": "sha512-6NJ/pCnhCnBMzaty1opWo7ipDmFAIk8U71JMQGKJxblCUaGfdsbF2shf6XNZSkXYia1yS0vwKu9LIOzpXqQZCA==", + "dev": true, + "requires": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^2.0.4", + "stream-throttle": "^0.1.3" + } + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -3236,6 +3779,18 @@ "node-releases": "^1.1.61" } }, + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "dev": true + }, + "bs-snippet-injector": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", + "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", + "dev": true + }, "buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -3387,6 +3942,12 @@ "caller-callsite": "^2.0.0" } }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3447,6 +4008,16 @@ "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", "dev": true }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, "chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -3499,6 +4070,15 @@ } } }, + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", + "dev": true, + "requires": { + "is-regex": "^1.0.3" + } + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -3681,6 +4261,86 @@ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "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.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "coa": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", @@ -3768,12 +4428,24 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -3881,6 +4553,47 @@ } } }, + "condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "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" + } + } + } + }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, "configstore": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", @@ -3956,6 +4669,12 @@ } } }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, "consola": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.0.tgz", @@ -3976,6 +4695,26 @@ "bluebird": "^3.1.1" } }, + "constantinople": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", + "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", + "dev": true, + "requires": { + "@types/babel-types": "^7.0.0", + "@types/babylon": "^6.16.2", + "babel-types": "^6.26.0", + "babylon": "^6.18.0" + }, + "dependencies": { + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + } + } + }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -4533,6 +5272,12 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, + "date-time": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-0.1.1.tgz", + "integrity": "sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc=", + "dev": true + }, "de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", @@ -4548,6 +5293,12 @@ "ms": "^2.1.1" } }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -4634,12 +5385,70 @@ "integrity": "sha512-8UWj5lNv7HD+kB0e9w77Z7TdQlbUYDVWqITLHNqFIn6khrNHv5WQo38Dcm1f6HeNyZf0U7UbPf6WeZDSdCzGDQ==", "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.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "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.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "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.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, + "dependency-graph": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.9.0.tgz", + "integrity": "sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w==", + "dev": true + }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -4679,6 +5488,12 @@ "minimist": "^1.1.1" } }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "dev": true + }, "devalue": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/devalue/-/devalue-2.0.1.tgz", @@ -4713,6 +5528,12 @@ "path-type": "^4.0.0" } }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -4722,6 +5543,12 @@ "esutils": "^2.0.2" } }, + "doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=", + "dev": true + }, "dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -4869,6 +5696,60 @@ } } }, + "easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "eazy-logger": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz", + "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", + "dev": true, + "requires": { + "tfunk": "^4.0.0" + } + }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4910,6 +5791,12 @@ } } }, + "emitter-mixin": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/emitter-mixin/-/emitter-mixin-0.0.3.tgz", + "integrity": "sha1-WUjLKG8uSO3DslGnz8H3iDOW1lw=", + "dev": true + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4937,6 +5824,134 @@ "once": "^1.4.0" } }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "dependencies": { + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "engine.io-client": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.0.tgz", + "integrity": "sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "ws": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", + "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.4", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, "enhanced-resolve": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", @@ -5389,6 +6404,12 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, "events": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", @@ -6204,6 +7225,12 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "get-intrinsic": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", @@ -6360,6 +7387,18 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, + "gray-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.2.tgz", + "integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==", + "dev": true, + "requires": { + "js-yaml": "^3.11.0", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + } + }, "gzip-size": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", @@ -6376,6 +7415,33 @@ "integrity": "sha512-7+G0/2/COR8pwteYFqHIVYfQpuEiO2HXwJrhCBJVgrNrl9O5eaUoJVDGXUJX+0RpGncNVTuestexjk1afj01wQ==", "dev": true }, + "hamljs": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/hamljs/-/hamljs-0.6.2.tgz", + "integrity": "sha1-e3EWz22+cnjkKz9u+HJaM+F3yOM=", + "dev": true + }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "hard-source-webpack-plugin": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/hard-source-webpack-plugin/-/hard-source-webpack-plugin-0.13.1.tgz", @@ -6500,6 +7566,35 @@ } } }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", + "dev": true + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -6773,6 +7868,17 @@ } } }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -6827,6 +7933,12 @@ "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "dev": true + }, "import-cwd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", @@ -6895,6 +8007,12 @@ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -7048,6 +8166,16 @@ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, "is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", @@ -7181,6 +8309,24 @@ "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", "dev": true }, + "is-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", + "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", + "dev": true, + "requires": { + "acorn": "~4.0.2", + "object-assign": "^4.0.1" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -7255,12 +8401,36 @@ } } }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "requires": { + "lodash.isfinite": "^3.3.2" + } + }, "is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true }, + "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.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", @@ -7285,6 +8455,12 @@ "isobject": "^3.0.1" } }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", @@ -7300,6 +8476,15 @@ "has-symbols": "^1.0.1" } }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", @@ -7345,6 +8530,21 @@ "has-symbols": "^1.0.1" } }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha1-Fjnssb4DauxppUy7QBz77XEUq38=", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -7374,6 +8574,12 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "javascript-stringify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.1.tgz", + "integrity": "sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow==", + "dev": true + }, "jest-docblock": { "version": "21.2.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", @@ -7413,6 +8619,42 @@ "integrity": "sha512-IlUGuEHKA44dqJoSqpv1poIRyyi31ciEmpLlRZCmo9TasVSZhwfmaVUuQVs26EHuwYdx+NirOm41+wbykH/+9Q==", "dev": true }, + "js-beautify": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.13.4.tgz", + "integrity": "sha512-M5yEWwonlEO3kPcCZ3K3KBSpFRZAEO3FAWC6wtbIGeyg7dusStxvF0WG+HRLBoMZqREXSRSxkkqClDE865x1sg==", + "dev": true, + "requires": { + "config-chain": "^1.1.12", + "editorconfig": "^0.15.3", + "glob": "^7.1.3", + "mkdirp": "^1.0.4", + "nopt": "^5.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7470,6 +8712,22 @@ "graceful-fs": "^4.1.6" } }, + "jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", + "dev": true, + "requires": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "junk": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz", + "integrity": "sha1-h75jSIZJy9ym9Tqzm+yczSNH9ZI=", + "dev": true + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -7527,6 +8785,12 @@ "launch-editor": "^2.2.1" } }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, "lazysizes": { "version": "5.3.0-beta1", "resolved": "https://registry.npmjs.org/lazysizes/-/lazysizes-5.3.0-beta1.tgz", @@ -7542,6 +8806,12 @@ "type-check": "~0.3.2" } }, + "limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, "linkify-it": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", @@ -7550,6 +8820,12 @@ "uc.micro": "^1.0.1" } }, + "liquidjs": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-6.4.3.tgz", + "integrity": "sha512-m1xSB10Ncu22NR3X0xdaqu/GvP1xadDCFYGqGgd6me8DAWjyA68BKE5DHJmSxw1CGsWPsX+Hj2v/87J2w/LvMQ==", + "dev": true + }, "loader-fs-cache": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", @@ -7629,6 +8905,97 @@ } } }, + "localtunnel": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.1.tgz", + "integrity": "sha512-LiaI5wZdz0xFkIQpXbNI62ZnNn8IMsVhwxHmhA+h4vj8R9JG/07bQHWwQlyy7b95/5fVOCHJfIHv+a5XnkvaJA==", + "dev": true, + "requires": { + "axios": "0.21.1", + "debug": "4.3.1", + "openurl": "1.1.1", + "yargs": "16.2.0" + }, + "dependencies": { + "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 + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "dev": true, + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "y18n": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -7650,6 +9017,12 @@ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "dev": true + }, "lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", @@ -7698,6 +9071,12 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "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.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -7739,6 +9118,12 @@ "yallist": "^4.0.0" } }, + "luxon": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.25.0.tgz", + "integrity": "sha512-hEgLurSH8kQRjY6i4YLey+mcKVAWXbDNlZRmM6AgWDJ1cY3atl8Ztf5wEY7VBReFbmGnwQPz7KYJblL8B2k0jQ==", + "dev": true + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -7788,6 +9173,41 @@ "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.7.tgz", "integrity": "sha512-No11hFYcXr/zkBvL6qFmAp1z6BKY3zqLMHny/JN/ey+al7qwCM2+CMBL9BOgqMxZU36fz4cCWfn2poWIf7QRXA==" }, + "maximatch": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz", + "integrity": "sha1-hs2NawTJ8wfAWmuUGZBtA2D7E6I=", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + }, + "dependencies": { + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "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.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -8045,6 +9465,12 @@ "through2": "^2.0.0" } }, + "mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -8075,6 +9501,12 @@ "minimist": "^1.2.5" } }, + "moo": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", + "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==", + "dev": true + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -8095,6 +9527,19 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "multimatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + } + }, "mustache": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz", @@ -8522,6 +9967,26 @@ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", "dev": true }, + "nunjucks": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.2.tgz", + "integrity": "sha512-KUi85OoF2NMygwODAy28Lh9qHmq5hO3rBlbkYoC8v377h4l8Pt5qFjILl0LWpMbOrZ18CzfVVUvIHUIrtED3sA==", + "dev": true, + "requires": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "chokidar": "^3.3.0", + "commander": "^5.1.0" + }, + "dependencies": { + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + } + } + }, "nuxt": { "version": "2.14.11", "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-2.14.11.tgz", @@ -8545,6 +10010,12 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -8691,6 +10162,21 @@ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, + "openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "dev": true + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, "optimize-css-assets-webpack-plugin": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", @@ -8875,6 +10361,17 @@ "safe-buffer": "^5.1.1" } }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, "parse-git-config": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-3.0.0.tgz", @@ -8895,6 +10392,12 @@ "json-parse-better-errors": "^1.0.1" } }, + "parse-ms": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-0.1.2.tgz", + "integrity": "sha1-3T+iXtbC78e93hKtm0bBY6opIk4=", + "dev": true + }, "parse-path": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.2.tgz", @@ -8917,6 +10420,18 @@ "protocols": "^1.4.0" } }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -8988,6 +10503,21 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -9049,6 +10579,25 @@ "find-up": "^4.0.0" } }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "is-number-like": "^1.0.3" + } + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -10201,6 +11750,28 @@ "integrity": "sha512-qZDVnCrnpsRJJq5nSsiHCE3BYMED2OtsI+cmzIzF1QIfqm5ALf8tEJcO27zV1gKNKRPdhjO0dNWnrzssDQ1tFg==", "dev": true }, + "pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU=", + "dev": true, + "requires": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "pretty-bytes": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.4.1.tgz", @@ -10223,6 +11794,15 @@ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "dev": true }, + "pretty-ms": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", + "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=", + "dev": true, + "requires": { + "parse-ms": "^0.1.0" + } + }, "pretty-time": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", @@ -10247,6 +11827,15 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -10264,6 +11853,12 @@ "signal-exit": "^3.0.2" } }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, "protocols": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", @@ -10319,6 +11914,180 @@ } } }, + "pug": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz", + "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==", + "dev": true, + "requires": { + "pug-code-gen": "^2.0.2", + "pug-filters": "^3.1.1", + "pug-lexer": "^4.1.0", + "pug-linker": "^3.0.6", + "pug-load": "^2.0.12", + "pug-parser": "^5.0.1", + "pug-runtime": "^2.0.5", + "pug-strip-comments": "^1.0.4" + } + }, + "pug-attrs": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz", + "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", + "dev": true, + "requires": { + "constantinople": "^3.0.1", + "js-stringify": "^1.0.1", + "pug-runtime": "^2.0.5" + } + }, + "pug-code-gen": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.2.tgz", + "integrity": "sha512-kROFWv/AHx/9CRgoGJeRSm+4mLWchbgpRzTEn8XCiwwOy6Vh0gAClS8Vh5TEJ9DBjaP8wCjS3J6HKsEsYdvaCw==", + "dev": true, + "requires": { + "constantinople": "^3.1.2", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.1", + "pug-attrs": "^2.0.4", + "pug-error": "^1.3.3", + "pug-runtime": "^2.0.5", + "void-elements": "^2.0.1", + "with": "^5.0.0" + } + }, + "pug-error": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz", + "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==", + "dev": true + }, + "pug-filters": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz", + "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==", + "dev": true, + "requires": { + "clean-css": "^4.1.11", + "constantinople": "^3.0.1", + "jstransformer": "1.0.0", + "pug-error": "^1.3.3", + "pug-walk": "^1.1.8", + "resolve": "^1.1.6", + "uglify-js": "^2.6.1" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "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, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "pug-lexer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz", + "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==", + "dev": true, + "requires": { + "character-parser": "^2.1.1", + "is-expression": "^3.0.0", + "pug-error": "^1.3.3" + } + }, + "pug-linker": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz", + "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==", + "dev": true, + "requires": { + "pug-error": "^1.3.3", + "pug-walk": "^1.1.8" + } + }, + "pug-load": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz", + "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "pug-walk": "^1.1.8" + } + }, + "pug-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz", + "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==", + "dev": true, + "requires": { + "pug-error": "^1.3.3", + "token-stream": "0.0.1" + } + }, + "pug-runtime": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz", + "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==", + "dev": true + }, + "pug-strip-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", + "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", + "dev": true, + "requires": { + "pug-error": "^1.3.3" + } + }, + "pug-walk": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz", + "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==", + "dev": true + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -10517,6 +12286,38 @@ "picomatch": "^2.2.1" } }, + "recursive-copy": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/recursive-copy/-/recursive-copy-2.0.11.tgz", + "integrity": "sha512-DqL2kO10mUne7XK5BPcwRtOJJZKhddD7IrW4UmHmKrwdV3HLPWcw6Jr4Jh12ooddfJOVz7ynFoFYYnPM7De0Og==", + "dev": true, + "requires": { + "del": "^2.2.0", + "emitter-mixin": "0.0.3", + "errno": "^0.1.2", + "graceful-fs": "^4.1.4", + "junk": "^1.0.1", + "maximatch": "^0.1.0", + "mkdirp": "^0.5.1", + "pify": "^2.3.0", + "promise": "^7.0.1", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } + } + }, "reduce-css-calc": { "version": "2.1.7", "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz", @@ -10719,6 +12520,24 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, "resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", @@ -10740,6 +12559,33 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -10780,6 +12626,15 @@ "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, + "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, + "requires": { + "align-text": "^0.1.1" + } + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -10820,6 +12675,12 @@ "aproba": "^1.1.1" } }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, "rxjs": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", @@ -10874,11 +12735,38 @@ "compute-scroll-into-view": "^1.0.16" } }, + "section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, "semver-diff": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", @@ -10949,6 +12837,62 @@ "randombytes": "^2.1.0" } }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, "serve-placeholder": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/serve-placeholder/-/serve-placeholder-1.2.3.tgz", @@ -10976,6 +12920,12 @@ "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", "dev": true }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -11040,6 +12990,12 @@ "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", "dev": true }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -11226,6 +13182,231 @@ } } }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + }, + "dependencies": { + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", + "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "engine.io-client": "~3.5.0", + "has-binary2": "~1.0.2", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", @@ -11465,6 +13646,24 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "dev": true, + "requires": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -11519,6 +13718,12 @@ "ansi-regex": "^3.0.0" } }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "dev": true + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -11645,6 +13850,12 @@ } } }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -11827,6 +14038,58 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "tfunk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz", + "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "dlv": "^1.1.3" + }, + "dependencies": { + "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 + }, + "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.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "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.0.0" + } + }, + "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 + } + } + }, "thread-loader": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", @@ -11892,6 +14155,43 @@ "integrity": "sha512-uVFet1LQToeUX0rTcSiYVYVoGuBpc8gP/2jnlUzuHMHe+gux6XLsNzxLUweabMwiUj5ejhoIMsUI55nVSEa/Vw==", "dev": true }, + "time-require": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/time-require/-/time-require-0.1.2.tgz", + "integrity": "sha1-+eEss3D8JgXhFARYK6VO9corLZg=", + "dev": true, + "requires": { + "chalk": "^0.4.0", + "date-time": "^0.1.1", + "pretty-ms": "^0.2.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "dev": true, + "requires": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + } + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -11922,6 +14222,12 @@ "os-tmpdir": "~1.0.2" } }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -11982,6 +14288,12 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, + "token-stream": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", + "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=", + "dev": true + }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -12063,6 +14375,25 @@ "integrity": "sha512-o8lHP20KjIiQe5b/67Rh68xEGRrc2SRsCuuoYclXXoC74AfSRGblU1HKzJWH3HxPZ+Ort85fWHpSX7KwBUC9CQ==", "dev": true }, + "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 + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, "undefsafe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", @@ -12542,6 +14873,12 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, + "valid-url": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", + "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=", + "dev": true + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -12560,6 +14897,12 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, "vue": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz", @@ -13317,6 +15660,12 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -13360,12 +15709,42 @@ } } }, + "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 + }, + "with": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", + "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", + "dev": true, + "requires": { + "acorn": "^3.1.0", + "acorn-globals": "^3.0.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 + } + } + }, "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": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -13530,6 +15909,12 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==" }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -13556,6 +15941,92 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "dependencies": { + "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 + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.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 + }, + "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" + } + }, + "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" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true } } } diff --git a/package.json b/package.json index fbc2063..0a0129c 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "slugify": "^1.4.6" }, "devDependencies": { + "@11ty/eleventy": "^0.11.1", "@nuxtjs/tailwindcss": "^3.3.4", "autoprefixer": "^8.6.4", "babel-eslint": "^8.2.1", From ebdb7b681edc1dfc7527f130b2c7459e5bad6c4b Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Mon, 18 Jan 2021 18:55:31 -0600 Subject: [PATCH 05/49] Try generating tv routes with eleventy --- .eleventy.js | 11 + nuxt.config.js | 2 +- package.json | 4 +- pages/tv.njk | 2865 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 2880 insertions(+), 2 deletions(-) create mode 100644 .eleventy.js create mode 100644 pages/tv.njk diff --git a/.eleventy.js b/.eleventy.js new file mode 100644 index 0000000..8796608 --- /dev/null +++ b/.eleventy.js @@ -0,0 +1,11 @@ +module.exports = { + dir: { + input: 'pages', + output: 'dist', + jsDataFileSuffix: '.json', + + // Relative to input directory. + data: '../static', + layouts: '../layouts' + } +} diff --git a/nuxt.config.js b/nuxt.config.js index 6ac0793..a93facf 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -210,7 +210,7 @@ export default { ...homebrewRoutes, // Non-app routes - ...videoRoutes, + // ...videoRoutes, ...categoryRoutes, ...benchmarkRoutes ]) diff --git a/package.json b/package.json index 0a0129c..4259323 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,9 @@ "dev": "nuxt", "build": "nuxt build", "start": "nuxt start", - "generate": "rm -f ./static/app-list.json && npm run clone-readme && nuxt generate", + "generate": "rm -f ./static/app-list.json && npm run clone-readme && npm run generate-nuxt && npm run generate-eleventy", + "generate-nust": "nuxt generate", + "generate-eleventy": "npx @11ty/eleventy", "lint": "eslint --ext .js,.vue --ignore-path .gitignore .", "lint:fix": "eslint --fix --ext .js,.vue --ignore-path .gitignore .", "precommit": "npm run lint", diff --git a/pages/tv.njk b/pages/tv.njk new file mode 100644 index 0000000..ef5cb31 --- /dev/null +++ b/pages/tv.njk @@ -0,0 +1,2865 @@ +--- +pagination: + data: video-list + size: 1 + alias: video +permalink: "tv/{{ video.slug }}/" +--- + + + + + + {{ video.name }} - Does It ARM + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+

{{ video.name }}

+ +
+
+ + +
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+

© 2020 Does it ARM All rights reserved.

+
+
+
+
+
+ + + From 5891018ba2bd7158a4f54712de6bfb2e4cf34d70 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Mon, 18 Jan 2021 18:58:07 -0600 Subject: [PATCH 06/49] Fix misseplled script --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4259323..c039fe9 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "build": "nuxt build", "start": "nuxt start", "generate": "rm -f ./static/app-list.json && npm run clone-readme && npm run generate-nuxt && npm run generate-eleventy", - "generate-nust": "nuxt generate", + "generate-nuxt": "nuxt generate", "generate-eleventy": "npx @11ty/eleventy", "lint": "eslint --ext .js,.vue --ignore-path .gitignore .", "lint:fix": "eslint --fix --ext .js,.vue --ignore-path .gitignore .", From 9fd92fa8cf6cd404c3d26090e7bfdefd1d67fa8b Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Tue, 19 Jan 2021 14:11:36 -0600 Subject: [PATCH 07/49] Add default layout --- layouts/default.njk | 100 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 layouts/default.njk diff --git a/layouts/default.njk b/layouts/default.njk new file mode 100644 index 0000000..88c6125 --- /dev/null +++ b/layouts/default.njk @@ -0,0 +1,100 @@ + + + + + + {{ pageTitle }} - Does It ARM + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + {{ content | safe }} + +
+
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+

© 2020 Does it ARM All rights reserved.

+
+
+
+
+
+ + + From b35cc029bdedd44e08e23b620678837e51e341fb Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Tue, 19 Jan 2021 14:13:47 -0600 Subject: [PATCH 08/49] Duplicate tv endpoints for testing --- nuxt.config.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/nuxt.config.js b/nuxt.config.js index a93facf..7b764c1 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -29,7 +29,27 @@ const listsOptions = [ ] const videoListOptions = { - buildMethod: buildVideoList, + buildMethod: async buildArgs => { + const videoList = await buildVideoList( buildArgs ) + + const extraVideos = [] + + const multiplier = 5 + + for (let i = 0; i < multiplier; i++) { + videoList.forEach( video => { + extraVideos.push({ + ...video, + slug: video.slug + '-' + i, + }) + }) + } + + return [ + ...videoList, + ...extraVideos + ] + }, path: '/static/video-list.json', } From 28024faeeb397f89a0db513927e66f071bf2e194 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Tue, 19 Jan 2021 14:14:38 -0600 Subject: [PATCH 09/49] Add javascript template for tv pages --- .eleventy.js | 24 ++++++---- pages-eleventy/tv.11ty.js | 92 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 8 deletions(-) create mode 100644 pages-eleventy/tv.11ty.js diff --git a/.eleventy.js b/.eleventy.js index 8796608..fb95754 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -1,11 +1,19 @@ -module.exports = { - dir: { - input: 'pages', - output: 'dist', - jsDataFileSuffix: '.json', +// const eleventyVue = require("@11ty/eleventy-plugin-vue"); - // Relative to input directory. - data: '../static', - layouts: '../layouts' + +module.exports = function ( eleventyConfig ) { + // eleventyConfig.addPlugin(eleventyVue) + + + return { + dir: { + input: 'pages-eleventy', + output: 'dist', + jsDataFileSuffix: '.json', + + // Relative to input directory. + data: '../static', + layouts: '../layouts' + } } } diff --git a/pages-eleventy/tv.11ty.js b/pages-eleventy/tv.11ty.js new file mode 100644 index 0000000..3adef46 --- /dev/null +++ b/pages-eleventy/tv.11ty.js @@ -0,0 +1,92 @@ +class TV { + // or `async data() {` + // or `get data() {` + data() { + return { + layout: 'default.njk', + + pagination: { + data: 'video-list', + size: 1, + alias: 'video' + }, + + permalink: ({ video }) => { + // console.log('data', data) + return `tv/${ video.slug }/` + } + } + } + + render({name}) { + + return /* html */` +
+ +
+ `; + } +} + +module.exports = TV From 0d4d98b6d0c1e6967eaf530e8ce5d1a0cff6b684 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Tue, 19 Jan 2021 15:40:25 -0600 Subject: [PATCH 10/49] Generete 10k video pages --- nuxt.config.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/nuxt.config.js b/nuxt.config.js index 7b764c1..5752c47 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -34,7 +34,7 @@ const videoListOptions = { const extraVideos = [] - const multiplier = 5 + const multiplier = 12 for (let i = 0; i < multiplier; i++) { videoList.forEach( video => { @@ -48,7 +48,7 @@ const videoListOptions = { return [ ...videoList, ...extraVideos - ] + ].slice(0, 10 * 1000) }, path: '/static/video-list.json', } @@ -187,7 +187,7 @@ export default { gameRoutes, homebrewRoutes, - videoRoutes + // videoRoutes ] = lists.map((list, listI) => { return list.map( app => { @@ -196,7 +196,7 @@ export default { if (isVideo) { return { route: getVideoEndpoint(app), - payload: buildVideoPayload(app, allVideoAppsList, videoList) + payload: {}//buildVideoPayload(app, allVideoAppsList, videoList) } } @@ -338,7 +338,7 @@ export default { */ build: { parallel: true, - hardSource: true, + // hardSource: true, cache: true, html: { minify: { From ce0bd8b7f8c5798039a40523f5c14a2bda4f7c3f Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Tue, 19 Jan 2021 15:52:03 -0600 Subject: [PATCH 11/49] Convert default template to javascript --- layouts/default.11ty.js | 125 ++++++++++++++++++++++++++++++++++++++ layouts/default.njk | 100 ------------------------------ pages-eleventy/tv.11ty.js | 2 +- 3 files changed, 126 insertions(+), 101 deletions(-) create mode 100644 layouts/default.11ty.js delete mode 100644 layouts/default.njk diff --git a/layouts/default.11ty.js b/layouts/default.11ty.js new file mode 100644 index 0000000..c8dfbba --- /dev/null +++ b/layouts/default.11ty.js @@ -0,0 +1,125 @@ +class DefaultLayout { + // or `async data() {` + // or `get data() {` + // data() { + // return { + // layout: 'default.njk', + + // pagination: { + // data: 'video-list', + // size: 1, + // alias: 'video' + // }, + + // permalink: ({ video }) => { + // // console.log('data', data) + // return `tv/${ video.slug }/` + // } + // } + // } + + render({ content }) { + return /* html */` + + + + {{ pageTitle }} + + + + + + + + + + + + + + + + + + + + {{ Script Preloads }} + + + + {{ External Styles }} + + + +
+ +
+
+ +
+ + ${ content } + +
+
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+

© 2020 Does it ARM All rights reserved.

+
+
+
+
+
+ + {{ Scripts }} + + + `; + } +} + +module.exports = DefaultLayout diff --git a/layouts/default.njk b/layouts/default.njk deleted file mode 100644 index 88c6125..0000000 --- a/layouts/default.njk +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - {{ pageTitle }} - Does It ARM - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - {{ content | safe }} - -
-
-
-
-
-
-
-
- -
- -
-
-
- -
-
-
-

© 2020 Does it ARM All rights reserved.

-
-
-
-
-
- - - diff --git a/pages-eleventy/tv.11ty.js b/pages-eleventy/tv.11ty.js index 3adef46..a69d677 100644 --- a/pages-eleventy/tv.11ty.js +++ b/pages-eleventy/tv.11ty.js @@ -3,7 +3,7 @@ class TV { // or `get data() {` data() { return { - layout: 'default.njk', + layout: 'default.11ty.js', pagination: { data: 'video-list', From 5f51f4958a0b9ecabead5540c21872b18918d1af Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Tue, 19 Jan 2021 16:26:02 -0600 Subject: [PATCH 12/49] Remove extra endpoints --- nuxt.config.js | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/nuxt.config.js b/nuxt.config.js index 5752c47..7134e18 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -30,25 +30,27 @@ const listsOptions = [ const videoListOptions = { buildMethod: async buildArgs => { - const videoList = await buildVideoList( buildArgs ) + return await buildVideoList( buildArgs ) - const extraVideos = [] + // const videoList = await buildVideoList( buildArgs ) - const multiplier = 12 + // const extraVideos = [] - for (let i = 0; i < multiplier; i++) { - videoList.forEach( video => { - extraVideos.push({ - ...video, - slug: video.slug + '-' + i, - }) - }) - } + // const multiplier = 12 - return [ - ...videoList, - ...extraVideos - ].slice(0, 10 * 1000) + // for (let i = 0; i < multiplier; i++) { + // videoList.forEach( video => { + // extraVideos.push({ + // ...video, + // slug: video.slug + '-' + i, + // }) + // }) + // } + + // return [ + // ...videoList, + // ...extraVideos + // ].slice(0, 10 * 1000) }, path: '/static/video-list.json', } From 6abb89b7a80466ad4efe7510ea09dbc88b5dbc7a Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Tue, 19 Jan 2021 22:32:14 -0600 Subject: [PATCH 13/49] Generate meta and link tags --- layouts/default.11ty.js | 113 ++++++++++++++++++++++++++-------------- 1 file changed, 75 insertions(+), 38 deletions(-) diff --git a/layouts/default.11ty.js b/layouts/default.11ty.js index c8dfbba..35a1967 100644 --- a/layouts/default.11ty.js +++ b/layouts/default.11ty.js @@ -1,57 +1,94 @@ +import config from '../nuxt.config' + + + +const makeTag = ( tag, tagName = 'meta') => { + + const attributes = Object.entries(tag).map( ([ name, value ]) => `${name}="${value}"` ).join(' ') + + return `<${tagName} ${attributes}>` +} + +const mapMetaTag = ( tag ) => { + + if ( tag.hasOwnProperty('property') ) { + return [ + `property-${tag.property}`, + makeTag(tag) + ] + } + + if ( tag.hasOwnProperty('name') ) { + return [ + `name-${tag.name}`, + makeTag(tag) + ] + } + + if ( tag.hasOwnProperty('charset') ) { + return [ + 'charset', + makeTag(tag) + ] + } +} + +const mapLinkTag = ( tag ) => { + return [ + `type-${tag.type}`, + makeTag(tag, 'link') + ] +} + +const defaultMeta = Object.fromEntries(config.head.meta.map( mapMetaTag )) + +const defaultLinkTags = Object.fromEntries(config.head.link.map( mapLinkTag )) + class DefaultLayout { - // or `async data() {` - // or `get data() {` - // data() { - // return { - // layout: 'default.njk', - // pagination: { - // data: 'video-list', - // size: 1, - // alias: 'video' - // }, + generateMetaTags = ( pageMeta = [] ) => { - // permalink: ({ video }) => { - // // console.log('data', data) - // return `tv/${ video.slug }/` - // } - // } - // } + const meta = { + ...defaultMeta, + ...Object.fromEntries(pageMeta.map(mapMetaTag)) + } - render({ content }) { + return Object.values(meta).join('') + } + + generateLinkTags = ( pageLinkTags = [] ) => { + + const linkTags = { + ...defaultLinkTags, + ...Object.fromEntries(pageLinkTags.map( mapLinkTag )) + } + + return Object.values( linkTags ).join('') + } + + render({ + content, + pageTitle = null + }) { return /* html */` - + - {{ pageTitle }} - - + ${ pageTitle || config.head.title } - - - - - - - - - - - - - + ${ this.generateMetaTags() } - + ${ this.generateLinkTags() } - {{ Script Preloads }} + - {{ External Styles }} + From 4c990f491799eda90e5f90c041a8fb3c185e3aad Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Tue, 19 Jan 2021 22:34:40 -0600 Subject: [PATCH 14/49] Move eleventy layout into separate folder --- .eleventy.js | 2 +- {layouts => layouts-eleventy}/default.11ty.js | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename {layouts => layouts-eleventy}/default.11ty.js (100%) diff --git a/.eleventy.js b/.eleventy.js index fb95754..b3d0235 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -13,7 +13,7 @@ module.exports = function ( eleventyConfig ) { // Relative to input directory. data: '../static', - layouts: '../layouts' + layouts: '../layouts-eleventy' } } } diff --git a/layouts/default.11ty.js b/layouts-eleventy/default.11ty.js similarity index 100% rename from layouts/default.11ty.js rename to layouts-eleventy/default.11ty.js From 722bf5398355c2f65e3a5f42a478deb3b7449d2b Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Tue, 19 Jan 2021 22:35:42 -0600 Subject: [PATCH 15/49] Run Eleventy with esm --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index c039fe9..602f2ef 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "start": "nuxt start", "generate": "rm -f ./static/app-list.json && npm run clone-readme && npm run generate-nuxt && npm run generate-eleventy", "generate-nuxt": "nuxt generate", - "generate-eleventy": "npx @11ty/eleventy", + "generate-eleventy": "node -r esm node_modules/.bin/eleventy", "lint": "eslint --ext .js,.vue --ignore-path .gitignore .", "lint:fix": "eslint --fix --ext .js,.vue --ignore-path .gitignore .", "precommit": "npm run lint", @@ -39,6 +39,7 @@ "eslint-loader": "^2.0.0", "eslint-plugin-prettier": "2.6.2", "eslint-plugin-vue": "^4.0.0", + "esm": "^3.2.25", "node-fetch": "^2.6.1", "nodemon": "^1.11.0", "nuxt": "^2.14.11", From 3a6119578de33ed1285e6f99a87cc64a8e317733 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Tue, 19 Jan 2021 22:50:26 -0600 Subject: [PATCH 16/49] Add video name to page titles --- layouts-eleventy/default.11ty.js | 4 ++-- pages-eleventy/tv.11ty.js | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/layouts-eleventy/default.11ty.js b/layouts-eleventy/default.11ty.js index 35a1967..1683c23 100644 --- a/layouts-eleventy/default.11ty.js +++ b/layouts-eleventy/default.11ty.js @@ -68,13 +68,13 @@ class DefaultLayout { render({ content, - pageTitle = null + title = null }) { return /* html */` - ${ pageTitle || config.head.title } + ${ title || config.head.title } ${ this.generateMetaTags() } diff --git a/pages-eleventy/tv.11ty.js b/pages-eleventy/tv.11ty.js index a69d677..250bf53 100644 --- a/pages-eleventy/tv.11ty.js +++ b/pages-eleventy/tv.11ty.js @@ -11,6 +11,13 @@ class TV { alias: 'video' }, + eleventyComputed: { + title: ({ video }) => { + // console.log('data', data) + return `${ video.name } - Does It ARM` + } + }, + permalink: ({ video }) => { // console.log('data', data) return `tv/${ video.slug }/` From 085dfff3231a6281a65a5cca117337bf867b8504 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Tue, 19 Jan 2021 22:50:57 -0600 Subject: [PATCH 17/49] Use video name and id in template --- pages-eleventy/tv.11ty.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pages-eleventy/tv.11ty.js b/pages-eleventy/tv.11ty.js index 250bf53..9e695a1 100644 --- a/pages-eleventy/tv.11ty.js +++ b/pages-eleventy/tv.11ty.js @@ -25,19 +25,21 @@ class TV { } } - render({name}) { + render({ name, video }) { return /* html */`
-
+
+ +
-

{{ video.name }}

+

${ video.name }


From a5c297d2d63e4275c25565c90f81d5549f9687e6 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Tue, 19 Jan 2021 23:50:44 -0600 Subject: [PATCH 18/49] Import nuxt at config file --- .eleventy.js | 10 +++++++++- layouts-eleventy/default.11ty.js | 8 ++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.eleventy.js b/.eleventy.js index b3d0235..8a94bc8 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -1,9 +1,17 @@ // const eleventyVue = require("@11ty/eleventy-plugin-vue"); - +import nuxtConfig from './nuxt.config' module.exports = function ( eleventyConfig ) { // eleventyConfig.addPlugin(eleventyVue) + // console.log('eleventyConfig', eleventyConfig) + + eleventyConfig.addJavaScriptFunction('getNuxt', function () { + return nuxtConfig + }) + // eleventyConfig.addGlobalData('nuxt', () => nuxtConfig) + + return { dir: { diff --git a/layouts-eleventy/default.11ty.js b/layouts-eleventy/default.11ty.js index 1683c23..d5d266b 100644 --- a/layouts-eleventy/default.11ty.js +++ b/layouts-eleventy/default.11ty.js @@ -1,6 +1,6 @@ import config from '../nuxt.config' - +const year = new Date().getFullYear() const makeTag = ( tag, tagName = 'meta') => { @@ -72,9 +72,9 @@ class DefaultLayout { }) { return /* html */` - + - ${ title || config.head.title } + ${ title || this.getNuxt().head.title } ${ this.generateMetaTags() } @@ -145,7 +145,7 @@ class DefaultLayout {
-

© 2020 Does it ARM All rights reserved.

+

© ${ year } ${ this.getNuxt().head.title } All rights reserved.

From 9d2f6e20b6f12a2508baa9ec573c18185c73c4a3 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Tue, 19 Jan 2021 23:50:56 -0600 Subject: [PATCH 19/49] Use title from config --- pages-eleventy/tv.11ty.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pages-eleventy/tv.11ty.js b/pages-eleventy/tv.11ty.js index 9e695a1..23e8d3c 100644 --- a/pages-eleventy/tv.11ty.js +++ b/pages-eleventy/tv.11ty.js @@ -1,3 +1,5 @@ +import config from '../nuxt.config' + class TV { // or `async data() {` // or `get data() {` @@ -14,7 +16,7 @@ class TV { eleventyComputed: { title: ({ video }) => { // console.log('data', data) - return `${ video.name } - Does It ARM` + return `${ video.name } - ${ config.head.title }` } }, From aa99f61a16a655d26ad3a7211030b3f21759382e Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Tue, 19 Jan 2021 23:51:32 -0600 Subject: [PATCH 20/49] Delete old tv template --- pages/tv.njk | 2865 -------------------------------------------------- 1 file changed, 2865 deletions(-) delete mode 100644 pages/tv.njk diff --git a/pages/tv.njk b/pages/tv.njk deleted file mode 100644 index ef5cb31..0000000 --- a/pages/tv.njk +++ /dev/null @@ -1,2865 +0,0 @@ ---- -pagination: - data: video-list - size: 1 - alias: video -permalink: "tv/{{ video.slug }}/" ---- - - - - - - {{ video.name }} - Does It ARM - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
-
-
-
-
-
-
- -
-
-

{{ video.name }}

- -
-
- - -
-
-
-
-
-
-
-
-
-
- -
- -
-
-
- -
-
-
-

© 2020 Does it ARM All rights reserved.

-
-
-
-
-
- - - From 624da8ba5a6fff627e718b55a7ede426f8b4677b Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Fri, 22 Jan 2021 22:20:10 -0600 Subject: [PATCH 21/49] Ignore nuxt and eleventy endpoints files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 8bc8a27..4e87194 100644 --- a/.gitignore +++ b/.gitignore @@ -87,5 +87,7 @@ dist /static/game-list.json /static/homebrew-list.json /static/video-list.json +/static/eleventy-endpoints.json +/static/nuxt-endpoints.json /commits-data.json .DS_Store From ea5ec51af1ea8b041e8c2ac89dabd029fd300870 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Fri, 22 Jan 2021 22:21:13 -0600 Subject: [PATCH 22/49] Build lists before generating site --- build-lists.js | 250 +++++++++++++++++++++++++++++++++++++++++++++++++ nuxt.config.js | 208 ++-------------------------------------- package.json | 4 +- 3 files changed, 262 insertions(+), 200 deletions(-) create mode 100644 build-lists.js diff --git a/build-lists.js b/build-lists.js new file mode 100644 index 0000000..8e166e6 --- /dev/null +++ b/build-lists.js @@ -0,0 +1,250 @@ +import { promises as fs } from 'fs' +import dotenv from 'dotenv' + +import buildAppList from './helpers/build-app-list.js' +import buildGamesList from './helpers/build-game-list.js' +import buildHomebrewList from './helpers/build-homebrew-list.js' +import buildVideoList from './helpers/build-video-list.js' + +import { buildVideoPayload, buildAppBenchmarkPayload } from './helpers/build-payload.js' + +import { categories } from './helpers/categories.js' +import { getAppEndpoint, getVideoEndpoint } from './helpers/app-derived.js' + +// Setup dotenv +dotenv.config() + + +class BuildLists { + + constructor () { + // this.apps = new Set() + // this.games = new Set() + // this.homebrewFormulae = new Set() + + this.lists = {} + + this.nuxtEndpointsSet = new Set() + this.eleventyEndpointsSet = new Set() + + // Videos contains app and game data + // so it goes during the second pass + // this.videos = new Set() + } + + listsOptions = [ + { + name: 'apps', + path: '/static/app-list.json', + buildMethod: buildAppList, + }, + { + name: 'games', + path: '/static/game-list.json', + buildMethod: buildGamesList, + }, + { + name: 'homebrewFormulae', + path: '/static/homebrew-list.json', + buildMethod: buildHomebrewList, + }, + + // Always goes after initial lists + { + name: 'videos', + path: '/static/video-list.json', + buildMethod: async () => { + + // const videoList = await buildVideoList( buildArgs ) + + // const extraVideos = [] + + // const multiplier = 12 + + // for (let i = 0; i < multiplier; i++) { + // videoList.forEach( video => { + // extraVideos.push({ + // ...video, + // slug: video.slug + '-' + i, + // }) + // }) + // } + + // return [ + // ...videoList, + // ...extraVideos + // ].slice(0, 10 * 1000) + + // return await this.saveList(videoListOptions, allVideoAppsList) + + return await buildVideoList( this.getAllVideoAppsList() ) + }, + } + ] + + getAllVideoAppsList = () => { + // return new Set([ + // ...this.lists.apps, + // ...this.lists.games, + // ]) + + return [ + ...Array.from(this.lists.apps), + ...Array.from(this.lists.games), + ] + } + + saveToJson = async function ( content, path ) { + + // Write the list to JSON + await fs.writeFile(path, JSON.stringify(content)) + + return + } + + saveList = async function ( listOptions ) { + + if (this.lists[listOptions.name].size === 0) throw new Error('Trying to save empty list') + + // Make the relative path for our new JSON file + const listFullPath = `.${listOptions.path}` + + // console.log('listFullPath', listFullPath) + + // Write the list to JSON + await fs.writeFile(listFullPath, JSON.stringify(this.lists[listOptions.name])) + + // Read back the JSON we just wrote to ensure it exists + const savedListJSON = await fs.readFile(listFullPath, 'utf-8') + + // console.log('savedListJSON', savedListJSON) + + const savedList = JSON.parse(savedListJSON) + + // Import the created JSON File + return savedList + } + + async buildLists () { + console.log('Build Lists started') + + + for (const listOptions of this.listsOptions) { + + const methodName = `Building ${listOptions.path}` + console.time(methodName) + + // Run the build method to get the lists + this.lists[listOptions.name] = await listOptions.buildMethod() + + + console.timeEnd(methodName) + } + + console.log('Build Lists finished') + + return + } + + storeAppLists = async function () { + + if (Object.keys(this.listsOptions).length === 0) throw new Error('Trying to store empty lists') + + for ( const listOptionsKey in this.listsOptions ) { + await this.saveList(this.listsOptions[listOptionsKey]) + } + + return + } + + async build () { + + await this.buildLists() + + await this.storeAppLists() + + // console.log('appList', appList) + + // Break out lists + // const [ + // appList, + // gameList, + // _,//homebrewList, + + // videoList + // ] = savedLists + + // console.log('appList', appList) + + const allVideoAppsList = this.getAllVideoAppsList() + + // console.log('allVideoAppsList', allVideoAppsList[0]) + // console.log('videoList', videoList[0]) + + // const allEndpointsSet = new Set() + + // Add list based routes + for ( const listKey in this.lists ) { + + this.lists[listKey].forEach( app => { + + const isVideo = (app.category === undefined) + const isApp = (app.endpoint.includes('/app/')) + const isGame = (app.category === 'games') + + if (isVideo) { + this.eleventyEndpointsSet.add({ + route: getVideoEndpoint(app), + payload: buildVideoPayload( app, allVideoAppsList, this.lists.videos ) + }) + + return + } + + // Add benchmark endpoints for apps and games + if ( isApp || isGame ) { + this.nuxtEndpointsSet.add({ + route: `${getAppEndpoint(app)}/benchmarks`, + payload: buildAppBenchmarkPayload( app, allVideoAppsList, this.lists.videos ) + }) + } + + this.nuxtEndpointsSet.add({ + route: getAppEndpoint(app), + payload: { app } + }) + + return + }) + + } + + + Object.keys(categories).forEach( slug => { + this.nuxtEndpointsSet.add({ + route: '/kind/' + slug, + // payload: appList + }) + }) + + + // Save Nuxt Endpoints + await this.saveToJson(Array.from(this.nuxtEndpointsSet), './static/nuxt-endpoints.json') + + // Save Eleventy Endpoints + await this.saveToJson(Array.from(this.eleventyEndpointsSet), './static/eleventy-endpoints.json') + + return + } +} + + +const listBuilder = new BuildLists() + +listBuilder.build() + +// export default async function () { +// const listBuilder = new BuildLists() + +// return await listBuilder.build() +// } diff --git a/nuxt.config.js b/nuxt.config.js index 7134e18..0f8657e 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -13,104 +13,7 @@ import { categories } from './helpers/categories.js' import { getAppEndpoint, getVideoEndpoint } from './helpers/app-derived.js' -const listsOptions = [ - { - buildMethod: buildAppList, - path: '/static/app-list.json', - }, - { - buildMethod: buildGamesList, - path: '/static/game-list.json', - }, - { - buildMethod: buildHomebrewList, - path: '/static/homebrew-list.json', - } -] -const videoListOptions = { - buildMethod: async buildArgs => { - return await buildVideoList( buildArgs ) - - // const videoList = await buildVideoList( buildArgs ) - - // const extraVideos = [] - - // const multiplier = 12 - - // for (let i = 0; i < multiplier; i++) { - // videoList.forEach( video => { - // extraVideos.push({ - // ...video, - // slug: video.slug + '-' + i, - // }) - // }) - // } - - // return [ - // ...videoList, - // ...extraVideos - // ].slice(0, 10 * 1000) - }, - path: '/static/video-list.json', -} - - -const saveList = async function ( list, buildArgs = null ) { - const methodName = `Building ${list.path}` - console.time(methodName) - - // Run the build method - const builtList = await list.buildMethod(buildArgs) - - // Make the relative path for our new JSON file - const listFullPath = `.${list.path}` - - // console.log('listFullPath', listFullPath) - - // Write the list to JSON - await fs.writeFile(listFullPath, JSON.stringify(builtList)) - - // Read back the JSON we just wrote to ensure it exists - const savedListJSON = await fs.readFile(listFullPath, 'utf-8') - - // console.log('savedListJSON', savedListJSON) - - const savedList = JSON.parse(savedListJSON) - - - console.timeEnd(methodName) - - // Import the created JSON File - return savedList -} - - -const storeAppLists = async function (builder) { - - console.log('Build Lists started') - - const savedLists = await Promise.all(listsOptions.map(saveList)) - // Build and save list of videos based on app lists - .then(async lists => { - const [ - appList, - gameList - ] = lists - - // Build a video app list with apps and games only - const allVideoAppsList = [ - ...appList, - ...gameList - ].flat(1) - - return await saveList(videoListOptions, allVideoAppsList) - }) - - console.log('Build Lists finished') - - return savedLists -} export default { @@ -125,12 +28,12 @@ export default { * https://nuxtjs.org/api/configuration-hooks/ */ hooks: { - build: { - before: storeAppLists - }, - generate: { - before: storeAppLists - } + // build: { + // before: storeAppLists + // }, + // generate: { + // before: storeAppLists + // } }, generate: { @@ -142,102 +45,9 @@ export default { ] }, routes() { - return Promise.all([ - ...listsOptions, - videoListOptions - ].map(async list => { - // Read saved lists - - const methodName = `Reading ${list.path}` - console.time(methodName) - - const listPath = `.${list.path}` - - // Read JSON to ensure it exists - const savedListJSON = await fs.readFile(listPath, 'utf-8') - - // Parse the saved JSON into a variable - const savedList = JSON.parse(savedListJSON) - - console.timeEnd(methodName) - - // Pass on the variable - return savedList - })) - .then(( lists ) => { - // console.log('appList', appList) - - // Break out lists - const [ - appList, - gameList, - _,//homebrewList, - - videoList - ] = lists - - const allVideoAppsList = [ - ...appList, - ...gameList - ] - - // console.log('allVideoAppsList', allVideoAppsList[0]) - // console.log('videoList', videoList[0]) - - const [ - appRoutes, - gameRoutes, - homebrewRoutes, - - // videoRoutes - ] = lists.map((list, listI) => { - return list.map( app => { - - const isVideo = (app.category === undefined) - - if (isVideo) { - return { - route: getVideoEndpoint(app), - payload: {}//buildVideoPayload(app, allVideoAppsList, videoList) - } - } - - return { - route: getAppEndpoint(app), - payload: { app } - } - }) - }) - - // Build routes for app types that support benchmark endpoints - const benchmarkRoutes = [ - ...appRoutes, - ...gameRoutes, - ].flat(1).map( ({ route, payload: { app } }) => ({ - route: `${route}/benchmarks`, - payload: buildAppBenchmarkPayload( app, allVideoAppsList, videoList ) - })) - - // console.log('homebrewRoutes', homebrewRoutes) - - const categoryRoutes = Object.keys(categories).map( slug => ({ - route: '/kind/' + slug, - // payload: appList - })) - - // Merge endpoints into set to ensure no duplicates - const allEndpointsSet = new Set([ - ...appRoutes, - ...gameRoutes, - ...homebrewRoutes, - - // Non-app routes - // ...videoRoutes, - ...categoryRoutes, - ...benchmarkRoutes - ]) - - return Array.from(allEndpointsSet) + return fs.readFile('./static/nuxt-endpoints.json', 'utf-8') + .then( endpointsJson => { + return JSON.parse(endpointsJson) }) } }, diff --git a/package.json b/package.json index 602f2ef..1951f1d 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "dev": "nuxt", "build": "nuxt build", "start": "nuxt start", - "generate": "rm -f ./static/app-list.json && npm run clone-readme && npm run generate-nuxt && npm run generate-eleventy", + "generate": "npm run clone-readme && npm run build-lists && npm run generate-nuxt && npm run generate-eleventy", + "build-lists": "node -r esm build-lists.js", "generate-nuxt": "nuxt generate", "generate-eleventy": "node -r esm node_modules/.bin/eleventy", "lint": "eslint --ext .js,.vue --ignore-path .gitignore .", @@ -34,6 +35,7 @@ "@nuxtjs/tailwindcss": "^3.3.4", "autoprefixer": "^8.6.4", "babel-eslint": "^8.2.1", + "dotenv": "^8.2.0", "eslint": "^5.16.0", "eslint-config-prettier": "^3.1.0", "eslint-loader": "^2.0.0", From c7d39dd9f2a22fcd2707730327350427e6320f4a Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Fri, 22 Jan 2021 22:28:04 -0600 Subject: [PATCH 23/49] Limit related videos to 24 --- helpers/build-payload.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/build-payload.js b/helpers/build-payload.js index 3dc4ed9..c822552 100644 --- a/helpers/build-payload.js +++ b/helpers/build-payload.js @@ -21,7 +21,7 @@ export function buildVideoPayload ( video, allVideoAppsList, videoList ) { video, featuredApps, // If no related video found just get the 12 newest ones - relatedVideos: (relatedVideos.length !== 0) ? relatedVideos : videoList.slice(0, 12) + relatedVideos: (relatedVideos.length !== 0) ? relatedVideos.slice(0, 24) : videoList.slice(0, 12) } } From 1f5f47eab4c69ef07546fdbeb5c7b2548c657c22 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Fri, 22 Jan 2021 23:14:44 -0600 Subject: [PATCH 24/49] Store lists as Sets --- build-lists.js | 21 ++++++++++++--------- helpers/build-payload.js | 10 +++++----- helpers/get-list.js | 4 ++-- helpers/related.js | 10 ++++++---- nuxt.config.js | 13 ------------- pages/app/_slug/index.vue | 2 +- pages/game/_slug/index.vue | 2 +- pages/games.vue | 2 +- pages/index.vue | 2 +- pages/kind/_slug.vue | 2 +- 10 files changed, 30 insertions(+), 38 deletions(-) diff --git a/build-lists.js b/build-lists.js index 8e166e6..a8f1332 100644 --- a/build-lists.js +++ b/build-lists.js @@ -55,7 +55,10 @@ class BuildLists { path: '/static/video-list.json', buildMethod: async () => { - // const videoList = await buildVideoList( buildArgs ) + return await buildVideoList( this.getAllVideoAppsList() ) + + + // const videoList = await buildVideoList( this.getAllVideoAppsList() ) // const extraVideos = [] @@ -70,14 +73,10 @@ class BuildLists { // }) // } - // return [ + // return new Set([ // ...videoList, // ...extraVideos - // ].slice(0, 10 * 1000) - - // return await this.saveList(videoListOptions, allVideoAppsList) - - return await buildVideoList( this.getAllVideoAppsList() ) + // ].slice(0, 10 * 1000)) }, } ] @@ -112,7 +111,7 @@ class BuildLists { // console.log('listFullPath', listFullPath) // Write the list to JSON - await fs.writeFile(listFullPath, JSON.stringify(this.lists[listOptions.name])) + await fs.writeFile(listFullPath, JSON.stringify(Array.from(this.lists[listOptions.name]))) // Read back the JSON we just wrote to ensure it exists const savedListJSON = await fs.readFile(listFullPath, 'utf-8') @@ -134,8 +133,12 @@ class BuildLists { const methodName = `Building ${listOptions.path}` console.time(methodName) + const builtList = await listOptions.buildMethod() + // Run the build method to get the lists - this.lists[listOptions.name] = await listOptions.buildMethod() + this.lists[listOptions.name] = new Set([ + ...builtList + ]) console.timeEnd(methodName) diff --git a/helpers/build-payload.js b/helpers/build-payload.js index c822552..0d3e65c 100644 --- a/helpers/build-payload.js +++ b/helpers/build-payload.js @@ -4,7 +4,7 @@ import { appsRelatedToVideo, videosRelatedToVideo, videosRelatedToApp } from './ // import videoList from '~/static/video-list.json' -export function buildVideoPayload ( video, allVideoAppsList, videoList ) { +export function buildVideoPayload ( video, allVideoAppsList, videoListSet ) { // const { appsRelatedToVideo, videosRelatedToVideo } = await import('~/helpers/related.js') // const { default: videoList } = await import('~/static/video-list.json') @@ -15,18 +15,18 @@ export function buildVideoPayload ( video, allVideoAppsList, videoList ) { const featuredApps = appsRelatedToVideo( video, allVideoAppsList ) // Get related videos - const relatedVideos = videosRelatedToVideo( video, allVideoAppsList, videoList ) + const relatedVideos = videosRelatedToVideo( video, allVideoAppsList, videoListSet ) return { video, featuredApps, // If no related video found just get the 12 newest ones - relatedVideos: (relatedVideos.length !== 0) ? relatedVideos.slice(0, 24) : videoList.slice(0, 12) + relatedVideos: (relatedVideos.length !== 0) ? relatedVideos.slice(0, 24) : Array.from(videoListSet).slice(0, 12) } } -export function buildAppBenchmarkPayload ( app, allVideoAppsList, videoList ) { +export function buildAppBenchmarkPayload ( app, allVideoAppsList, videoListSet ) { // const { allVideoAppsList } = await import('~/helpers/get-list.js') // const { videosRelatedToApp } = await import('~/helpers/related.js') @@ -39,7 +39,7 @@ export function buildAppBenchmarkPayload ( app, allVideoAppsList, videoList ) { // const featuredApps = [] - const relatedVideos = videosRelatedToApp( app, videoList ).map(video => { + const relatedVideos = videosRelatedToApp( app, videoListSet ).map(video => { // console.log('video', video) return { ...video, diff --git a/helpers/get-list.js b/helpers/get-list.js index ac861c4..2129d73 100644 --- a/helpers/get-list.js +++ b/helpers/get-list.js @@ -21,9 +21,9 @@ export const allList = [ ] -export function makeAppSearchLinks ( app, videoList ) { +export function makeAppSearchLinks ( app, videoListSet ) { - const videos = videosRelatedToApp( app, videoList ) + const videos = videosRelatedToApp( app, videoListSet ) // If there are no videos // then skip diff --git a/helpers/related.js b/helpers/related.js index 700b289..a8a65fc 100644 --- a/helpers/related.js +++ b/helpers/related.js @@ -21,7 +21,7 @@ export function appsRelatedToVideo ( video, allVideoAppsList ) { return relatedApps } -export function videosRelatedToVideo ( video, allVideoAppsList, videoList ) { +export function videosRelatedToVideo ( video, allVideoAppsList, videoListSet ) { const relatedVideos = {} // console.log('videoList', videoList[0]) @@ -30,7 +30,7 @@ export function videosRelatedToVideo ( video, allVideoAppsList, videoList ) { const featuredApps = appsRelatedToVideo( video, allVideoAppsList ) // Find other videos that also feature this video's app - for (const otherVideo of videoList) { + for (const otherVideo of videoListSet) { for (const app of featuredApps) { // console.log('otherVideo', otherVideo) // Skip if this app is not in the other video's apps @@ -48,12 +48,14 @@ export function videosRelatedToVideo ( video, allVideoAppsList, videoList ) { } -export function videosRelatedToApp ( app, videoList ) { +export function videosRelatedToApp ( app, videoListSet ) { + + // console.log('videoListSet', videoListSet) const relatedVideos = {} // Find other videos that also feature this video's app - for (const video of videoList) { + for (const video of videoListSet) { if (!video.apps.includes(app.slug)) continue relatedVideos[video.id] = video diff --git a/nuxt.config.js b/nuxt.config.js index 0f8657e..f7f0553 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -1,19 +1,6 @@ import { promises as fs } from 'fs' -// import path from 'path' import pkg from './package' -import buildAppList from './helpers/build-app-list.js' -import buildGamesList from './helpers/build-game-list.js' -import buildHomebrewList from './helpers/build-homebrew-list.js' -import buildVideoList from './helpers/build-video-list.js' - -import { buildVideoPayload, buildAppBenchmarkPayload } from './helpers/build-payload.js' - -import { categories } from './helpers/categories.js' -import { getAppEndpoint, getVideoEndpoint } from './helpers/app-derived.js' - - - export default { diff --git a/pages/app/_slug/index.vue b/pages/app/_slug/index.vue index 80f1e1c..55effc8 100644 --- a/pages/app/_slug/index.vue +++ b/pages/app/_slug/index.vue @@ -82,7 +82,7 @@ export default { const app = appList.find(app => (app.slug === slug)) - const relatedVideos = videosRelatedToApp( app, videoList ) + const relatedVideos = videosRelatedToApp( app, (new Set(videoList)) ) // Find other videos that also feature this video's app // for (const video of videoList) { diff --git a/pages/game/_slug/index.vue b/pages/game/_slug/index.vue index 625f6a7..5cf5d5a 100644 --- a/pages/game/_slug/index.vue +++ b/pages/game/_slug/index.vue @@ -119,7 +119,7 @@ export default { const app = gameList.find(app => (app.slug === slug)) - const relatedVideos = videosRelatedToApp( app, videoList ) + const relatedVideos = videosRelatedToApp( app, (new Set(videoList)) ) // Find other videos that also feature this video's app // for (const video of videoList) { diff --git a/pages/games.vue b/pages/games.vue index fdc7981..b43ec61 100644 --- a/pages/games.vue +++ b/pages/games.vue @@ -51,7 +51,7 @@ export default { text: app.text, lastUpdated: app.lastUpdated, category: app.category, - searchLinks: makeAppSearchLinks( app, videoList ) + searchLinks: makeAppSearchLinks( app, (new Set(videoList)) ) } }) } diff --git a/pages/index.vue b/pages/index.vue index bb58b63..cde2988 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -80,7 +80,7 @@ export default { allVideoAppsList.forEach( app => { // Make the search links - const searchLinks = makeAppSearchLinks( app, videoList ) + const searchLinks = makeAppSearchLinks( app, (new Set(videoList)) ) // If there are more than zero // add them to our list diff --git a/pages/kind/_slug.vue b/pages/kind/_slug.vue index 92603a7..32c61c2 100644 --- a/pages/kind/_slug.vue +++ b/pages/kind/_slug.vue @@ -78,7 +78,7 @@ export default { text: app.text, lastUpdated: app.lastUpdated, category: app.category, - searchLinks: makeAppSearchLinks( app, videoList ) + searchLinks: makeAppSearchLinks( app, (new Set(videoList)) ) } }) } From 4a042699c183af9ce2aa604751ae00bba09de3cf Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Fri, 22 Jan 2021 23:15:39 -0600 Subject: [PATCH 25/49] Try 10k endpoints --- build-lists.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/build-lists.js b/build-lists.js index a8f1332..e0b2b43 100644 --- a/build-lists.js +++ b/build-lists.js @@ -55,28 +55,28 @@ class BuildLists { path: '/static/video-list.json', buildMethod: async () => { - return await buildVideoList( this.getAllVideoAppsList() ) + // return await buildVideoList( this.getAllVideoAppsList() ) - // const videoList = await buildVideoList( this.getAllVideoAppsList() ) + const videoList = await buildVideoList( this.getAllVideoAppsList() ) - // const extraVideos = [] + const extraVideos = [] - // const multiplier = 12 + const multiplier = 12 - // for (let i = 0; i < multiplier; i++) { - // videoList.forEach( video => { - // extraVideos.push({ - // ...video, - // slug: video.slug + '-' + i, - // }) - // }) - // } + for (let i = 0; i < multiplier; i++) { + videoList.forEach( video => { + extraVideos.push({ + ...video, + slug: video.slug + '-' + i, + }) + }) + } - // return new Set([ - // ...videoList, - // ...extraVideos - // ].slice(0, 10 * 1000)) + return new Set([ + ...videoList, + ...extraVideos + ].slice(0, 10 * 1000)) }, } ] From 2a40450a116ad21240bdd658e033fd2d591ef774 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Sat, 23 Jan 2021 12:46:57 -0600 Subject: [PATCH 26/49] Switch back to normal amount of videos --- build-lists.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/build-lists.js b/build-lists.js index e0b2b43..a8f1332 100644 --- a/build-lists.js +++ b/build-lists.js @@ -55,28 +55,28 @@ class BuildLists { path: '/static/video-list.json', buildMethod: async () => { - // return await buildVideoList( this.getAllVideoAppsList() ) + return await buildVideoList( this.getAllVideoAppsList() ) - const videoList = await buildVideoList( this.getAllVideoAppsList() ) + // const videoList = await buildVideoList( this.getAllVideoAppsList() ) - const extraVideos = [] + // const extraVideos = [] - const multiplier = 12 + // const multiplier = 12 - for (let i = 0; i < multiplier; i++) { - videoList.forEach( video => { - extraVideos.push({ - ...video, - slug: video.slug + '-' + i, - }) - }) - } + // for (let i = 0; i < multiplier; i++) { + // videoList.forEach( video => { + // extraVideos.push({ + // ...video, + // slug: video.slug + '-' + i, + // }) + // }) + // } - return new Set([ - ...videoList, - ...extraVideos - ].slice(0, 10 * 1000)) + // return new Set([ + // ...videoList, + // ...extraVideos + // ].slice(0, 10 * 1000)) }, } ] From 6c96398c75e8337a875fe7103002f3fa7cc83fb8 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Sat, 23 Jan 2021 14:06:59 -0600 Subject: [PATCH 27/49] Ignore json files in static --- .gitignore | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 4e87194..c7e9422 100644 --- a/.gitignore +++ b/.gitignore @@ -84,10 +84,6 @@ dist # Other /static/app-list.json /README-temp.md -/static/game-list.json -/static/homebrew-list.json -/static/video-list.json -/static/eleventy-endpoints.json -/static/nuxt-endpoints.json +/static/**/*.json /commits-data.json .DS_Store From a0297d36137de9a1a28f2a426e577c01c59d417f Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Sat, 23 Jan 2021 14:20:27 -0600 Subject: [PATCH 28/49] Save searchable lists in addition to normal ones --- build-lists.js | 160 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 124 insertions(+), 36 deletions(-) diff --git a/build-lists.js b/build-lists.js index a8f1332..87ccc21 100644 --- a/build-lists.js +++ b/build-lists.js @@ -8,50 +8,48 @@ import buildVideoList from './helpers/build-video-list.js' import { buildVideoPayload, buildAppBenchmarkPayload } from './helpers/build-payload.js' -import { categories } from './helpers/categories.js' +import { categories, getAppCategory } from './helpers/categories.js' import { getAppEndpoint, getVideoEndpoint } from './helpers/app-derived.js' // Setup dotenv dotenv.config() + class BuildLists { constructor () { - // this.apps = new Set() - // this.games = new Set() - // this.homebrewFormulae = new Set() - + // Where our lists are stored this.lists = {} + // Where Nuxt Routes and Payloads get stored this.nuxtEndpointsSet = new Set() - this.eleventyEndpointsSet = new Set() - // Videos contains app and game data - // so it goes during the second pass - // this.videos = new Set() + // Where Eleventy Enpoints get stored + this.eleventyEndpointsSet = new Set() } listsOptions = [ { - name: 'apps', + name: 'app', path: '/static/app-list.json', buildMethod: buildAppList, }, { - name: 'games', + name: 'game', path: '/static/game-list.json', buildMethod: buildGamesList, }, { - name: 'homebrewFormulae', + name: 'homebrew', path: '/static/homebrew-list.json', buildMethod: buildHomebrewList, }, // Always goes after initial lists + // since it depend on them { - name: 'videos', + name: 'video', path: '/static/video-list.json', buildMethod: async () => { @@ -88,8 +86,8 @@ class BuildLists { // ]) return [ - ...Array.from(this.lists.apps), - ...Array.from(this.lists.games), + ...Array.from(this.lists.app), + ...Array.from(this.lists.game), ] } @@ -124,13 +122,15 @@ class BuildLists { return savedList } + // Run all listsOprions methods + // and store them to this.lists async buildLists () { console.log('Build Lists started') for (const listOptions of this.listsOptions) { - const methodName = `Building ${listOptions.path}` + const methodName = `Building ${listOptions.name}` console.time(methodName) const builtList = await listOptions.buildMethod() @@ -140,8 +140,8 @@ class BuildLists { ...builtList ]) - console.timeEnd(methodName) + console.log(`Finished ${listOptions.name} list with ${this.lists[listOptions.name].size} items`) } console.log('Build Lists finished') @@ -149,14 +149,116 @@ class BuildLists { return } - storeAppLists = async function () { + // Converts a list into a smaller searchable list + // similar to a table/spreadsheet + makeSearchableList ( list ) { + let firstLoop = true + + const searchableList = new Set() + + const tableHeader = new Set() + + // const searchableKeys = new Set([ + // 'name', + // 'text', + // 'lastUpdated', + // 'endpoint' + // ]) + + const makeSearchable = new Map([ + [ + 'name', + item => { + // console.log('Running name method', item) + return item.name + } + ], + [ + 'text', + item => item.text + ], + [ + 'endpoint', + item => item.endpoint + ], + // [ + // 'category', + // app => { + // return getAppCategory( item ).id + // } + // ] + ]) + + list.forEach( ( searchableItem ) => { + // If this is the first items + // then store the keys + if ( firstLoop ) { + Object.keys(searchableItem).forEach( key => { + // console.log(key, makeSearchable.has(key)) + + if ( !makeSearchable.has(key) ) return + + // Add to table header so we can loop it later on + tableHeader.add( key ) + }) + + // Add keys to table head + searchableList.add( Array.from( tableHeader ) ) + + firstLoop = false + } + // This could cause an issue if the keys + // are out of order + + // console.log('tableHeader', tableHeader) + + const tableRow = [] + + // Loop through keys from table header + // and push them to this row + tableHeader.forEach( key => { + // console.log('searchableValue', key, searchableItem[key], makeSearchable.get(key)(searchableItem) ) + + tableRow.push( makeSearchable.get(key)(searchableItem) ) + }) + + searchableList.add( tableRow ) + + return + }) + + return searchableList + } + + // Save app lists to JSON + saveAppLists = async function () { if (Object.keys(this.listsOptions).length === 0) throw new Error('Trying to store empty lists') + console.log('Save lists started') + for ( const listOptionsKey in this.listsOptions ) { - await this.saveList(this.listsOptions[listOptionsKey]) + + const methodName = `Saving ${this.listsOptions[listOptionsKey].path}` + console.time(methodName) + + const listOptions = this.listsOptions[listOptionsKey] + + await this.saveList( listOptions ) + + const searchableList = this.makeSearchableList( this.lists[listOptions.name] ) + + // console.log('searchableList', searchableList) + + // Save a searchable list + await this.saveToJson( Array.from(searchableList), `./static/${listOptions.name}-list-searchable.json` ) + + + console.timeEnd(methodName) } + console.log('Save lists finished') + return } @@ -164,27 +266,13 @@ class BuildLists { await this.buildLists() - await this.storeAppLists() - - // console.log('appList', appList) - - // Break out lists - // const [ - // appList, - // gameList, - // _,//homebrewList, - - // videoList - // ] = savedLists + await this.saveAppLists() // console.log('appList', appList) const allVideoAppsList = this.getAllVideoAppsList() // console.log('allVideoAppsList', allVideoAppsList[0]) - // console.log('videoList', videoList[0]) - - // const allEndpointsSet = new Set() // Add list based routes for ( const listKey in this.lists ) { @@ -198,7 +286,7 @@ class BuildLists { if (isVideo) { this.eleventyEndpointsSet.add({ route: getVideoEndpoint(app), - payload: buildVideoPayload( app, allVideoAppsList, this.lists.videos ) + payload: buildVideoPayload( app, allVideoAppsList, this.lists.video ) }) return @@ -208,7 +296,7 @@ class BuildLists { if ( isApp || isGame ) { this.nuxtEndpointsSet.add({ route: `${getAppEndpoint(app)}/benchmarks`, - payload: buildAppBenchmarkPayload( app, allVideoAppsList, this.lists.videos ) + payload: buildAppBenchmarkPayload( app, allVideoAppsList, this.lists.video ) }) } From 14b1d47dc916bfaa426e5074ac837cbb10138b2a Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Wed, 13 Jan 2021 12:31:10 -0600 Subject: [PATCH 29/49] Add category IDs --- helpers/categories.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/helpers/categories.js b/helpers/categories.js index 631cf11..738a9f9 100644 --- a/helpers/categories.js +++ b/helpers/categories.js @@ -10,62 +10,85 @@ export const categoryTemplate = { export const categories = { + 'no-category': { + id: 0 + }, + // App lists 'developer-tools': { + id: 1, ...categoryTemplate, label: 'Developer Tools', pluralLabel: 'Developer Tools', slug: 'developer-tools', }, + 'productivity-tools': { + id: 2, ...categoryTemplate, label: 'Productivity Tools', pluralLabel: 'Productivity Tools', slug: 'productivity-tools', }, + 'video-and-motion-tools': { + id: 3, ...categoryTemplate, label: 'Video and Motion Tools', pluralLabel: 'Video and Motion Tools', slug: 'video-and-motion-tools', }, + 'social-and-communication': { + id: 4, ...categoryTemplate, label: 'Social and Communication', pluralLabel: 'Social and Communication Apps', slug: 'social-and-communication', }, + 'entertainment-and-media-apps': { + id: 5, ...categoryTemplate, label: 'Entertainment and Media Apps', pluralLabel: 'Entertainment and Media Apps', slug: 'entertainment-and-media-apps', }, + 'music-and-audio-tools': { + id: 6, ...categoryTemplate, label: 'Music and Audio Tools', pluralLabel: 'Music and Audio Tools', slug: 'music-and-audio-tools', }, + 'photo-and-graphic-tools': { + id: 7, ...categoryTemplate, label: 'Photo and Graphic Tools', pluralLabel: 'Photo and Graphic Tools', slug: 'photo-and-graphic-tools', }, + 'science-and-research-software': { + id: 8, ...categoryTemplate, label: 'Science and Research Software', pluralLabel: 'Science and Research Software', slug: 'science-and-research-software', }, + '3d-and-architecture': { + id: 9, ...categoryTemplate, label: '3D and Architecture', pluralLabel: '3D and Architecture Applications', slug: '3d-and-architecture', }, + 'vpns-security-and-privacy': { + id: 10, ...categoryTemplate, label: 'VPNs, Security, and Privacy', pluralLabel: 'VPN, Security, and Privacy Applications', @@ -74,6 +97,7 @@ export const categories = { // Special Lists 'games': { + id: 100, ...categoryTemplate, label: 'Games', pluralLabel: 'Games', @@ -87,6 +111,7 @@ export const categories = { ] }, 'homebrew': { + id: 101, ...categoryTemplate, label: 'Homebrew', pluralLabel: 'Homebrew Formulae', From 50272298bf194efffd55343c6937563b387aab17 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Sat, 23 Jan 2021 14:29:54 -0600 Subject: [PATCH 30/49] Add category ids to seachable lists --- build-lists.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build-lists.js b/build-lists.js index 87ccc21..7fbc755 100644 --- a/build-lists.js +++ b/build-lists.js @@ -181,12 +181,12 @@ class BuildLists { 'endpoint', item => item.endpoint ], - // [ - // 'category', - // app => { - // return getAppCategory( item ).id - // } - // ] + [ + 'category', + app => { + return getAppCategory( app ).id + } + ] ]) list.forEach( ( searchableItem ) => { From c73d62f6bc6d49798d21efec40dc862583b3347c Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Sat, 23 Jan 2021 14:39:04 -0600 Subject: [PATCH 31/49] =?UTF-8?q?Move=20makeSearchableList=20to=20it?= =?UTF-8?q?=E2=80=99s=20own=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-lists.js | 84 +------------------------------------- helpers/categories.js | 2 + helpers/searchable-list.js | 84 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 82 deletions(-) create mode 100644 helpers/searchable-list.js diff --git a/build-lists.js b/build-lists.js index 7fbc755..582cddf 100644 --- a/build-lists.js +++ b/build-lists.js @@ -10,6 +10,7 @@ import { buildVideoPayload, buildAppBenchmarkPayload } from './helpers/build-pay import { categories, getAppCategory } from './helpers/categories.js' import { getAppEndpoint, getVideoEndpoint } from './helpers/app-derived.js' +import { makeSearchableList } from './helpers/searchable-list.js' // Setup dotenv dotenv.config() @@ -149,87 +150,6 @@ class BuildLists { return } - // Converts a list into a smaller searchable list - // similar to a table/spreadsheet - makeSearchableList ( list ) { - let firstLoop = true - - const searchableList = new Set() - - const tableHeader = new Set() - - // const searchableKeys = new Set([ - // 'name', - // 'text', - // 'lastUpdated', - // 'endpoint' - // ]) - - const makeSearchable = new Map([ - [ - 'name', - item => { - // console.log('Running name method', item) - return item.name - } - ], - [ - 'text', - item => item.text - ], - [ - 'endpoint', - item => item.endpoint - ], - [ - 'category', - app => { - return getAppCategory( app ).id - } - ] - ]) - - list.forEach( ( searchableItem ) => { - // If this is the first items - // then store the keys - if ( firstLoop ) { - Object.keys(searchableItem).forEach( key => { - // console.log(key, makeSearchable.has(key)) - - if ( !makeSearchable.has(key) ) return - - // Add to table header so we can loop it later on - tableHeader.add( key ) - }) - - // Add keys to table head - searchableList.add( Array.from( tableHeader ) ) - - firstLoop = false - } - // This could cause an issue if the keys - // are out of order - - // console.log('tableHeader', tableHeader) - - const tableRow = [] - - // Loop through keys from table header - // and push them to this row - tableHeader.forEach( key => { - // console.log('searchableValue', key, searchableItem[key], makeSearchable.get(key)(searchableItem) ) - - tableRow.push( makeSearchable.get(key)(searchableItem) ) - }) - - searchableList.add( tableRow ) - - return - }) - - return searchableList - } - // Save app lists to JSON saveAppLists = async function () { @@ -246,7 +166,7 @@ class BuildLists { await this.saveList( listOptions ) - const searchableList = this.makeSearchableList( this.lists[listOptions.name] ) + const searchableList = makeSearchableList( this.lists[listOptions.name] ) // console.log('searchableList', searchableList) diff --git a/helpers/categories.js b/helpers/categories.js index 738a9f9..534cd58 100644 --- a/helpers/categories.js +++ b/helpers/categories.js @@ -1,3 +1,5 @@ +// Universal JS imports only + // Contains all types of properies to keep data consistent export const categoryTemplate = { diff --git a/helpers/searchable-list.js b/helpers/searchable-list.js new file mode 100644 index 0000000..95b3bd7 --- /dev/null +++ b/helpers/searchable-list.js @@ -0,0 +1,84 @@ +// Universal JS imports only +import { getAppCategory } from './categories.js' + + +// Converts a list into a smaller searchable list +// similar to a table/spreadsheet +export function makeSearchableList ( listSet ) { + let firstLoop = true + + const searchableList = new Set() + + const tableHeader = new Set() + + // const searchableKeys = new Set([ + // 'name', + // 'text', + // 'lastUpdated', + // 'endpoint' + // ]) + + const makeSearchable = new Map([ + [ + 'name', + item => { + // console.log('Running name method', item) + return item.name + } + ], + [ + 'text', + item => item.text + ], + [ + 'endpoint', + item => item.endpoint + ], + [ + 'category', + app => { + return getAppCategory( app ).id + } + ] + ]) + + listSet.forEach( ( searchableItem ) => { + // If this is the first items + // then store the keys + if ( firstLoop ) { + Object.keys(searchableItem).forEach( key => { + // console.log(key, makeSearchable.has(key)) + + if ( !makeSearchable.has(key) ) return + + // Add to table header so we can loop it later on + tableHeader.add( key ) + }) + + // Add keys to table head + searchableList.add( Array.from( tableHeader ) ) + + firstLoop = false + } + // This could cause an issue if the keys + // are out of order + + // console.log('tableHeader', tableHeader) + + const tableRow = [] + + // Loop through keys from table header + // and push them to this row + tableHeader.forEach( key => { + // console.log('searchableValue', key, searchableItem[key], makeSearchable.get(key)(searchableItem) ) + + tableRow.push( makeSearchable.get(key)(searchableItem) ) + }) + + searchableList.add( tableRow ) + + return + }) + + return searchableList +} From a1b2594b4aa30cab4fbf74f78b0ef4bfb8eacf36 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Sat, 23 Jan 2021 14:58:54 -0600 Subject: [PATCH 32/49] Add payloads to video list --- build-lists.js | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/build-lists.js b/build-lists.js index 582cddf..cfca5a4 100644 --- a/build-lists.js +++ b/build-lists.js @@ -28,6 +28,8 @@ class BuildLists { // Where Eleventy Enpoints get stored this.eleventyEndpointsSet = new Set() + + this.allVideoAppsList = [] } listsOptions = [ @@ -77,6 +79,14 @@ class BuildLists { // ...extraVideos // ].slice(0, 10 * 1000)) }, + beforeSave: videoListSet => { + return Array.from(videoListSet).map( video => { + return { + ...video, + payload: buildVideoPayload( video, this.allVideoAppsList, this.lists.video ) + } + }) + } } ] @@ -107,10 +117,17 @@ class BuildLists { // Make the relative path for our new JSON file const listFullPath = `.${listOptions.path}` + const hasSaveMethod = listOptions.hasOwnProperty('beforeSave') + const saveMethod = hasSaveMethod ? listOptions.beforeSave : listSet => Array.from( listSet ) + // console.log('listFullPath', listFullPath) + const saveableList = saveMethod( this.lists[listOptions.name] ) + + console.log('saveableList', typeof saveableList) + // Write the list to JSON - await fs.writeFile(listFullPath, JSON.stringify(Array.from(this.lists[listOptions.name]))) + await fs.writeFile(listFullPath, JSON.stringify( saveableList )) // Read back the JSON we just wrote to ensure it exists const savedListJSON = await fs.readFile(listFullPath, 'utf-8') @@ -190,7 +207,7 @@ class BuildLists { // console.log('appList', appList) - const allVideoAppsList = this.getAllVideoAppsList() + this.allVideoAppsList = this.getAllVideoAppsList() // console.log('allVideoAppsList', allVideoAppsList[0]) @@ -206,7 +223,7 @@ class BuildLists { if (isVideo) { this.eleventyEndpointsSet.add({ route: getVideoEndpoint(app), - payload: buildVideoPayload( app, allVideoAppsList, this.lists.video ) + // payload: buildVideoPayload( app, this.allVideoAppsList, this.lists.video ) }) return @@ -216,7 +233,7 @@ class BuildLists { if ( isApp || isGame ) { this.nuxtEndpointsSet.add({ route: `${getAppEndpoint(app)}/benchmarks`, - payload: buildAppBenchmarkPayload( app, allVideoAppsList, this.lists.video ) + payload: buildAppBenchmarkPayload( app, this.allVideoAppsList, this.lists.video ) }) } From 9d4d447802d3b79db3049c1316b9a4ef9b73fad5 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Sat, 23 Jan 2021 15:28:36 -0600 Subject: [PATCH 33/49] Preprocess thumbnail attributes --- components/video/card.vue | 28 +++------------------------- helpers/build-video-list.js | 29 +++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/components/video/card.vue b/components/video/card.vue index c2fcdc6..b1336f6 100644 --- a/components/video/card.vue +++ b/components/video/card.vue @@ -10,12 +10,12 @@
@@ -64,8 +64,6 @@ import 'lazysizes' -// import { getVideoEndpoint } from '~/helpers/app-derived.js' - export default { props: { video: { @@ -74,26 +72,6 @@ export default { } }, computed: { - thumbnailSizes () { - let maxWidth = 0 - Object.entries(this.video.thumbnails).forEach(([thumbnailKey, thumbnail]) => { - if (thumbnail.width > maxWidth) maxWidth = thumbnail.width - }) - - // example: - // "(max-width: 640px) 100vw, 640px" - return `(max-width: ${maxWidth}px) 100vw, ${maxWidth}px` - }, - thumbnailSrcset () { - // console.log('this.video', this.video) - - // example: - // https://vumbnail.com/358629078.jpg 640w, https://vumbnail.com/358629078_large.jpg 640w, https://vumbnail.com/358629078_medium.jpg 200w, https://vumbnail.com/358629078_small.jpg 100w - return Object.entries(this.video.thumbnails).map(([thumbnailKey, thumbnail]) => { - // console.log('thumbnail', thumbnail) - return `${thumbnail.url} ${thumbnail.width}w` - }).join(', ') - }, pill () { // if this video has a banchmark tag // then pill is 'Benchmark' diff --git a/helpers/build-video-list.js b/helpers/build-video-list.js index 94d3e6f..6f2dab4 100644 --- a/helpers/build-video-list.js +++ b/helpers/build-video-list.js @@ -87,6 +87,30 @@ const generateVideoTags = function ( video ) { return videoTags } +const makeThumbnailData = function ( thumbnails ) { + + let maxWidth = 0 + Object.entries( thumbnails ).forEach(([thumbnailKey, thumbnail]) => { + if (thumbnail.width > maxWidth) maxWidth = thumbnail.width + }) + + const sizes = `(max-width: ${maxWidth}px) 100vw, ${maxWidth}px` + + const srcset = Object.entries( thumbnails ).map(([thumbnailKey, thumbnail]) => { + // console.log('thumbnail', thumbnail) + return `${thumbnail.url} ${thumbnail.width}w` + }).join(', ') + + + const src = thumbnails.default.url + + return { + sizes, + srcset, + src + } +} + export default async function ( applist ) { // Fetch Commits @@ -139,14 +163,15 @@ export default async function ( applist ) { lastUpdated, apps, slug, - channel:{ + channel: { name: fetchedVideos[videoId].rawData.snippet.channelTitle, id: fetchedVideos[videoId].rawData.snippet.channelId }, // Convert tags set into array tags: Array.from(tags), timestamps: fetchedVideos[videoId].timestamps, - thumbnails: fetchedVideos[videoId].rawData.snippet.thumbnails, + // thumbnails: fetchedVideos[videoId].rawData.snippet.thumbnails, + thumbnail: makeThumbnailData( fetchedVideos[videoId].rawData.snippet.thumbnails ), endpoint: getVideoEndpoint({ slug }) From 1ca9f7d28c5f6025f8123e1d3c98a1049fac95d7 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Sat, 23 Jan 2021 15:44:14 -0600 Subject: [PATCH 34/49] Rebuild video card component for eleventy --- components-eleventy/video/card.js | 67 +++++++++++++++++++++++++++++++ pages-eleventy/tv.11ty.js | 37 +++++------------ 2 files changed, 77 insertions(+), 27 deletions(-) create mode 100644 components-eleventy/video/card.js diff --git a/components-eleventy/video/card.js b/components-eleventy/video/card.js new file mode 100644 index 0000000..6a29916 --- /dev/null +++ b/components-eleventy/video/card.js @@ -0,0 +1,67 @@ + +function pill ( text ) { + return /* html */` +
+ ${ text } +
+ ` +} + +export default function ( video ) { + + // console.log('video', video) + + return /* html */` + +` +} diff --git a/pages-eleventy/tv.11ty.js b/pages-eleventy/tv.11ty.js index 23e8d3c..ce52ce7 100644 --- a/pages-eleventy/tv.11ty.js +++ b/pages-eleventy/tv.11ty.js @@ -1,5 +1,7 @@ import config from '../nuxt.config' +import VideoCard from '../components-eleventy/video/card.js' + class TV { // or `async data() {` // or `get data() {` @@ -29,6 +31,8 @@ class TV { render({ name, video }) { + // console.log('video.payload', Object.keys(video.payload)) + return /* html */`
@@ -44,42 +48,20 @@ class TV {

${ video.name }

+
+ + +
- `; + ` } } From 5cc0703508e7519e28a19dff2c56815084b249bf Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Sat, 23 Jan 2021 16:52:48 -0600 Subject: [PATCH 35/49] Install eleventy-assets --- package-lock.json | 11 +++++++++-- package.json | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 35431a9..e33fd8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -83,6 +83,14 @@ } } }, + "@11ty/eleventy-assets": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-assets/-/eleventy-assets-1.0.5.tgz", + "integrity": "sha512-bw/k3luksUngrp8PKTmFhmM+KLoTw/57UHHM4dQ5vK3wDPl/f3T2QC+AH5I90JCyBLMQ1tfmeiT4TgkayVl/kA==", + "requires": { + "dependency-graph": "^0.9.0" + } + }, "@babel/code-frame": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", @@ -5446,8 +5454,7 @@ "dependency-graph": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.9.0.tgz", - "integrity": "sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w==", - "dev": true + "integrity": "sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w==" }, "des.js": { "version": "1.0.1", diff --git a/package.json b/package.json index 1951f1d..d0b1f36 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "clone-readme": "cp ./README.md README-temp.md" }, "dependencies": { + "@11ty/eleventy-assets": "^1.0.5", "@fontsource/inter": "^4.0.1", "@nuxtjs/sitemap": "^2.4.0", "axios": "^0.21.0", From 60a43c2f39dba20ac4fdcb48b79e89eea7c23ba1 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Sat, 23 Jan 2021 16:53:25 -0600 Subject: [PATCH 36/49] Setup inline scripts and styles --- .eleventy.js | 68 +++++++++++++++++++++++++++++-- components-eleventy/video/card.js | 3 ++ layouts-eleventy/default.11ty.js | 7 +++- pages-eleventy/tv.11ty.js | 7 +++- 4 files changed, 78 insertions(+), 7 deletions(-) diff --git a/.eleventy.js b/.eleventy.js index 8a94bc8..748c673 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -1,16 +1,78 @@ -// const eleventyVue = require("@11ty/eleventy-plugin-vue"); +import fs from 'fs' + import nuxtConfig from './nuxt.config' -module.exports = function ( eleventyConfig ) { - // eleventyConfig.addPlugin(eleventyVue) +import { InlineCodeManager } from '@11ty/eleventy-assets' + +function getAssetFilePath(componentName) { + return `./${componentName}` +} + +module.exports = function ( eleventyConfig ) { // console.log('eleventyConfig', eleventyConfig) + // Global Nuxt data eleventyConfig.addJavaScriptFunction('getNuxt', function () { return nuxtConfig }) // eleventyConfig.addGlobalData('nuxt', () => nuxtConfig) + const cssManager = new InlineCodeManager() + const jsManager = new InlineCodeManager() + + eleventyConfig.addJavaScriptFunction('usingComponent', function ( componentName ) { + // console.log('Getting component', componentName) + + if ( componentName.includes('.js') ) { + // If a never before seen component, add the JS code + if(!jsManager.hasComponentCode(componentName)) { + const fileContents = fs.readFileSync(getAssetFilePath(componentName), { encoding: "UTF-8" }) + + // console.log('Got component', componentName, componentCss) + + jsManager.addComponentCode(componentName, fileContents) + } + + // Log usage for this url + // this.page.url is supported on Eleventy 0.11.0 and newer + jsManager.addComponentForUrl(componentName, this.page.url) + } else if ( componentName.includes('.css') ) { + // If a never before seen component, add the CSS code + if(!cssManager.hasComponentCode(componentName)) { + const fileContents = fs.readFileSync(getAssetFilePath(componentName), { encoding: "UTF-8" }) + + // console.log('Got component', componentName, componentCss) + + cssManager.addComponentCode(componentName, fileContents) + } + + // Log usage for this url + // this.page.url is supported on Eleventy 0.11.0 and newer + cssManager.addComponentForUrl(componentName, this.page.url) + } + + return + }) + + // This needs to be called in a Layout template. + eleventyConfig.addJavaScriptFunction('getJs', function ( url = this.page.url ) { + // console.log( 'jsManager.getCodeForUrl(url)', url ) + + return jsManager.getCodeForUrl(url) + }) + + // This needs to be called in a Layout template. + eleventyConfig.addJavaScriptFunction('getCss', function ( url = this.page.url ) { + // console.log( 'jsManager.getCodeForUrl(url)', url ) + + return cssManager.getCodeForUrl(url) + }) + + eleventyConfig.addJavaScriptFunction('boundComponent', function ( Component ) { + return Component.bind(this) + }) + return { diff --git a/components-eleventy/video/card.js b/components-eleventy/video/card.js index 6a29916..8617cdb 100644 --- a/components-eleventy/video/card.js +++ b/components-eleventy/video/card.js @@ -11,6 +11,9 @@ function pill ( text ) { export default function ( video ) { + // Setup inline lazysizes + this.usingComponent( 'node_modules/lazysizes/lazysizes.min.js' ) + // console.log('video', video) return /* html */` diff --git a/layouts-eleventy/default.11ty.js b/layouts-eleventy/default.11ty.js index d5d266b..502928f 100644 --- a/layouts-eleventy/default.11ty.js +++ b/layouts-eleventy/default.11ty.js @@ -66,9 +66,10 @@ class DefaultLayout { return Object.values( linkTags ).join('') } + render({ content, - title = null + title = null, }) { return /* html */` @@ -152,7 +153,9 @@ class DefaultLayout { - {{ Scripts }} + `; diff --git a/pages-eleventy/tv.11ty.js b/pages-eleventy/tv.11ty.js index ce52ce7..e05ab76 100644 --- a/pages-eleventy/tv.11ty.js +++ b/pages-eleventy/tv.11ty.js @@ -19,7 +19,10 @@ class TV { title: ({ video }) => { // console.log('data', data) return `${ video.name } - ${ config.head.title }` - } + }, + // footerInlineScripts: () => [ + // 'node_modules/lazysizes/lazysizes.min.js' + // ] }, permalink: ({ video }) => { @@ -61,7 +64,7 @@ class TV {
- ${ video.payload.relatedVideos.map(VideoCard) } + ${ video.payload.relatedVideos.map( this.boundComponent(VideoCard) ) }
- ${ video.tags.includes('benchmark') && pill('Benchmark')} + ${ (video.tags.includes('benchmark')) ? pill('Benchmark') : '' } From 159b7117161b52c435ace684f8c4706fc1672e6a Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Sat, 23 Jan 2021 21:40:23 -0600 Subject: [PATCH 42/49] Move base styles into tailwind --- assets/css/tailwind.css | 25 +++++++++++++++++++++++++ layouts/default.vue | 24 ------------------------ 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/assets/css/tailwind.css b/assets/css/tailwind.css index b01a3fc..fec74e5 100644 --- a/assets/css/tailwind.css +++ b/assets/css/tailwind.css @@ -46,6 +46,31 @@ */ @tailwind utilities; + + + +html { + font-family: 'Inter', -apple-system, BlinkMacSystemFont, + 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; + font-size: 20px; + word-spacing: 1px; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + box-sizing: border-box; + + background: #191a1d; +} + +*, +*:before, +*:after { + box-sizing: border-box; + margin: 0; +} + + /** * Here you would add any custom utilities you need that don't come out of the * box with Tailwind. diff --git a/layouts/default.vue b/layouts/default.vue index b56d6ca..de5144c 100644 --- a/layouts/default.vue +++ b/layouts/default.vue @@ -53,27 +53,3 @@ export default { } - - From 54dad896b34a82f56fd099fd1858b9136ca5ac05 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Sat, 23 Jan 2021 21:42:00 -0600 Subject: [PATCH 43/49] Install replace-css-url --- package-lock.json | 341 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 342 insertions(+) diff --git a/package-lock.json b/package-lock.json index 909d272..15f7155 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2836,6 +2836,12 @@ "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", "dev": true }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -4140,6 +4146,25 @@ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -5818,6 +5843,15 @@ "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", "dev": true }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", @@ -5851,6 +5885,24 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -8245,6 +8297,12 @@ "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", "dev": true }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, "hsl-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", @@ -9439,6 +9497,26 @@ "integrity": "sha512-m1xSB10Ncu22NR3X0xdaqu/GvP1xadDCFYGqGgd6me8DAWjyA68BKE5DHJmSxw1CGsWPsX+Hj2v/87J2w/LvMQ==", "dev": true }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, "loader-fs-cache": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", @@ -9729,6 +9807,16 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, "lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -9790,6 +9878,12 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -9921,6 +10015,40 @@ } } }, + "meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -10054,6 +10182,24 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, "minipass": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", @@ -10554,6 +10700,18 @@ "abbrev": "1" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -16346,6 +16504,12 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -16431,6 +16595,95 @@ } } }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -16483,6 +16736,24 @@ } } }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + }, + "dependencies": { + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + } + } + }, "reduce-css-calc": { "version": "2.1.7", "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz", @@ -16685,6 +16956,16 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, + "replace-css-url": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/replace-css-url/-/replace-css-url-1.2.6.tgz", + "integrity": "sha512-ahYIalU301Z4iipTngX58BJgDgxNFiX3veCMQpbPPpS3wHqV63tU8dBnlT1cqb18wMdlFlSKRkVSNVx2cl5mCw==", + "dev": true, + "requires": { + "glob": "^7.1.2", + "meow": "^5.0.0" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -17630,6 +17911,38 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -17883,6 +18196,12 @@ "ansi-regex": "^3.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", @@ -17901,6 +18220,12 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -18566,6 +18891,12 @@ "nopt": "~1.0.10" } }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -19142,6 +19473,16 @@ "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=", "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", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index 087bde7..8a3a772 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "postcss": "^8.2.4", "postcss-cli": "^8.3.1", "prettier": "1.14.3", + "replace-css-url": "^1.2.6", "tailwindcss": "^1.9.6" } } From 3894b485dff4327b280f60d48615a801a2f1c44f Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Sat, 23 Jan 2021 21:42:28 -0600 Subject: [PATCH 44/49] Make module fonts relative --- .eleventy.js | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/.eleventy.js b/.eleventy.js index 748c673..c280550 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -1,9 +1,9 @@ import fs from 'fs' +import replace_css_url from 'replace-css-url' +import { InlineCodeManager } from '@11ty/eleventy-assets' import nuxtConfig from './nuxt.config' -import { InlineCodeManager } from '@11ty/eleventy-assets' - function getAssetFilePath(componentName) { return `./${componentName}` @@ -42,9 +42,17 @@ module.exports = function ( eleventyConfig ) { if(!cssManager.hasComponentCode(componentName)) { const fileContents = fs.readFileSync(getAssetFilePath(componentName), { encoding: "UTF-8" }) - // console.log('Got component', componentName, componentCss) + // Replace urls in css with relative urls for dist folder + const parsedCss = replace_css_url( + fileContents, + function( path ) { + const fileName = path.split('/').pop().split('#')[0].split('?')[0] - cssManager.addComponentCode(componentName, fileContents) + return '/fonts/' + fileName + } + ) + + cssManager.addComponentCode(componentName, parsedCss) } // Log usage for this url @@ -55,6 +63,12 @@ module.exports = function ( eleventyConfig ) { return }) + + // Copy Inter font files + eleventyConfig.addPassthroughCopy({ + "node_modules/@fontsource/inter/**/*.woff2": "fonts" + }) + // This needs to be called in a Layout template. eleventyConfig.addJavaScriptFunction('getJs', function ( url = this.page.url ) { // console.log( 'jsManager.getCodeForUrl(url)', url ) From ee90acc82f16949bab01ba4746c4af80ed041723 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Mon, 25 Jan 2021 12:14:25 -0600 Subject: [PATCH 45/49] Add comments --- build-lists.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/build-lists.js b/build-lists.js index cfca5a4..2bd616f 100644 --- a/build-lists.js +++ b/build-lists.js @@ -33,6 +33,12 @@ class BuildLists { } listsOptions = [ + + // Mixed sources will(theoretically) go here + // then be read by follow main build methods + + + // Main build methods { name: 'app', path: '/static/app-list.json', @@ -49,6 +55,7 @@ class BuildLists { buildMethod: buildHomebrewList, }, + // Secondary Derivative built lists // Always goes after initial lists // since it depend on them { From bacbb825c601569015927ff4e9fe5427f53ce6eb Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Mon, 25 Jan 2021 12:40:07 -0600 Subject: [PATCH 46/49] Fix missing featured apps --- build-lists.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build-lists.js b/build-lists.js index 2bd616f..46b351f 100644 --- a/build-lists.js +++ b/build-lists.js @@ -63,6 +63,8 @@ class BuildLists { path: '/static/video-list.json', buildMethod: async () => { + // console.log('this.getAllVideoAppsList()', this.getAllVideoAppsList()) + return await buildVideoList( this.getAllVideoAppsList() ) @@ -87,6 +89,8 @@ class BuildLists { // ].slice(0, 10 * 1000)) }, beforeSave: videoListSet => { + this.allVideoAppsList = this.getAllVideoAppsList() + return Array.from(videoListSet).map( video => { return { ...video, @@ -214,9 +218,7 @@ class BuildLists { // console.log('appList', appList) - this.allVideoAppsList = this.getAllVideoAppsList() - - // console.log('allVideoAppsList', allVideoAppsList[0]) + // console.log('this.allVideoAppsList', this.allVideoAppsList.length, this.allVideoAppsList[0]) // Add list based routes for ( const listKey in this.lists ) { From 3a2326baa94771ee1ffac804993694c4f6de966e Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Mon, 25 Jan 2021 12:46:33 -0600 Subject: [PATCH 47/49] Use set for video app list --- build-lists.js | 15 +++++---------- helpers/build-payload.js | 12 ++++++------ helpers/related.js | 14 ++++++++------ 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/build-lists.js b/build-lists.js index 46b351f..bd23e54 100644 --- a/build-lists.js +++ b/build-lists.js @@ -29,7 +29,7 @@ class BuildLists { // Where Eleventy Enpoints get stored this.eleventyEndpointsSet = new Set() - this.allVideoAppsList = [] + this.allVideoAppsList = new Set() } listsOptions = [ @@ -102,15 +102,10 @@ class BuildLists { ] getAllVideoAppsList = () => { - // return new Set([ - // ...this.lists.apps, - // ...this.lists.games, - // ]) - - return [ - ...Array.from(this.lists.app), - ...Array.from(this.lists.game), - ] + return new Set([ + ...this.lists.app, + ...this.lists.game, + ]) } saveToJson = async function ( content, path ) { diff --git a/helpers/build-payload.js b/helpers/build-payload.js index 0d3e65c..aa97a2f 100644 --- a/helpers/build-payload.js +++ b/helpers/build-payload.js @@ -4,7 +4,7 @@ import { appsRelatedToVideo, videosRelatedToVideo, videosRelatedToApp } from './ // import videoList from '~/static/video-list.json' -export function buildVideoPayload ( video, allVideoAppsList, videoListSet ) { +export function buildVideoPayload ( video, allVideoAppsListSet, videoListSet ) { // const { appsRelatedToVideo, videosRelatedToVideo } = await import('~/helpers/related.js') // const { default: videoList } = await import('~/static/video-list.json') @@ -12,10 +12,10 @@ export function buildVideoPayload ( video, allVideoAppsList, videoListSet ) { // const video = videoList.find(video => (video.slug === slug)) // Get featured apps - const featuredApps = appsRelatedToVideo( video, allVideoAppsList ) + const featuredApps = appsRelatedToVideo( video, allVideoAppsListSet ) // Get related videos - const relatedVideos = videosRelatedToVideo( video, allVideoAppsList, videoListSet ) + const relatedVideos = videosRelatedToVideo( video, allVideoAppsListSet, videoListSet ) return { video, @@ -26,12 +26,12 @@ export function buildVideoPayload ( video, allVideoAppsList, videoListSet ) { } -export function buildAppBenchmarkPayload ( app, allVideoAppsList, videoListSet ) { - // const { allVideoAppsList } = await import('~/helpers/get-list.js') +export function buildAppBenchmarkPayload ( app, allVideoAppsListSet, videoListSet ) { + // const { allVideoAppsListSet } = await import('~/helpers/get-list.js') // const { videosRelatedToApp } = await import('~/helpers/related.js') - // const app = allVideoAppsList.find(app => (app.slug === slug)) + // const app = allVideoAppsListSet.find(app => (app.slug === slug)) const submitVideoCard = { endpoint: `https://docs.google.com/forms/d/e/1FAIpQLSeEVGM9vE7VcfLMy6fJkfU70X2VZ60rHDyhDQLtnAN4nso0WA/viewform?usp=pp_url&entry.1018125313=${app.name}` diff --git a/helpers/related.js b/helpers/related.js index a8a65fc..98eb8f8 100644 --- a/helpers/related.js +++ b/helpers/related.js @@ -1,15 +1,17 @@ -// import { allVideoAppsList } from '~/helpers/get-list.js' +// import { allVideoAppsListSet } from '~/helpers/get-list.js' // import videoList from '~/static/video-list.json' export function matchesWholeWord (needle, haystack) { return new RegExp('\\b' + needle + '\\b').test(haystack) } -export function appsRelatedToVideo ( video, allVideoAppsList ) { +export function appsRelatedToVideo ( video, allVideoAppsListSet ) { + // console.log('allVideoAppsListSet', allVideoAppsListSet.length) + const relatedApps = [] // Find the apps listed in this video - for (const app of allVideoAppsList) { + for (const app of allVideoAppsListSet) { // console.log('video', video) // Skip this app if it's not listed in the videos apps if (!video.apps.includes(app.slug)) continue @@ -21,13 +23,13 @@ export function appsRelatedToVideo ( video, allVideoAppsList ) { return relatedApps } -export function videosRelatedToVideo ( video, allVideoAppsList, videoListSet ) { +export function videosRelatedToVideo ( video, allVideoAppsListSet, videoListSet ) { const relatedVideos = {} // console.log('videoList', videoList[0]) - // console.log('allVideoAppsList', allVideoAppsList[0]) + // console.log('allVideoAppsListSet', allVideoAppsListSet[0]) - const featuredApps = appsRelatedToVideo( video, allVideoAppsList ) + const featuredApps = appsRelatedToVideo( video, allVideoAppsListSet ) // Find other videos that also feature this video's app for (const otherVideo of videoListSet) { From 2342c01b7e5cae0fc9209a9413227ea72c6e60e2 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Mon, 25 Jan 2021 13:16:21 -0600 Subject: [PATCH 48/49] Add meta for tv pages --- .eleventy.js | 4 +++ layouts-eleventy/default.11ty.js | 45 +++++++++++++++++++++++++++----- nuxt.config.js | 1 + pages-eleventy/tv.11ty.js | 29 ++++++++++++++++---- 4 files changed, 67 insertions(+), 12 deletions(-) diff --git a/.eleventy.js b/.eleventy.js index c280550..8999d32 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -1,9 +1,13 @@ import fs from 'fs' import replace_css_url from 'replace-css-url' +import dotenv from 'dotenv' import { InlineCodeManager } from '@11ty/eleventy-assets' import nuxtConfig from './nuxt.config' +// Setup dotenv +dotenv.config() + function getAssetFilePath(componentName) { return `./${componentName}` diff --git a/layouts-eleventy/default.11ty.js b/layouts-eleventy/default.11ty.js index c7c1a9b..405030a 100644 --- a/layouts-eleventy/default.11ty.js +++ b/layouts-eleventy/default.11ty.js @@ -46,13 +46,41 @@ const defaultLinkTags = Object.fromEntries(config.head.link.map( mapLinkTag )) class DefaultLayout { - generateMetaTags = ( pageMeta = [] ) => { + generateMetaTags = function ( renderData ) { + + const { + title = null, + description = null, + meta: pageMeta = [] + } = renderData + + // console.log('renderData', Object.keys(renderData)) const meta = { ...defaultMeta, - ...Object.fromEntries(pageMeta.map(mapMetaTag)) + 'property-twitter:url': ``, + ...Object.fromEntries( pageMeta.map(mapMetaTag) ) } + // console.log('renderData.description', renderData.description) + + // if set + // get description from data + if ( description ) { + // Set meta description + meta['name-description'] = `` + // Set twitter description + meta['property-twitter:description'] = `` + } + + // if set + // get title from data + if ( title ) { + // Set twitter title + meta['property-twitter:title'] = `` + } + + return Object.values(meta).join('') } @@ -67,10 +95,13 @@ class DefaultLayout { } - render({ - content, - title = null, - }) { + render( data ) { + + const { + content, + title = null, + description = null + } = data // Setup inline tailwind this.usingComponent( 'static/tailwind.css' ) @@ -83,7 +114,7 @@ class DefaultLayout { ${ title || this.getNuxt().head.title } - ${ this.generateMetaTags() } + ${ this.generateMetaTags( data ) } ${ this.generateLinkTags() } diff --git a/nuxt.config.js b/nuxt.config.js index f7f0553..c51ed4e 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -48,6 +48,7 @@ export default { lang: 'en', }, title: 'Does it ARM', + description: pkg.description, meta: [ { charset: 'utf-8' }, { diff --git a/pages-eleventy/tv.11ty.js b/pages-eleventy/tv.11ty.js index 3622f1f..74ff865 100644 --- a/pages-eleventy/tv.11ty.js +++ b/pages-eleventy/tv.11ty.js @@ -1,11 +1,30 @@ +import dotenv from 'dotenv' + import config from '../nuxt.config' import VideoCard from '../components-eleventy/video/card.js' +// Setup dotenv +dotenv.config() + +export const makeTitle = function ( video ) { + return `${ video.name } - ${ config.head.title }` +} + +export const makeDescription = function ( video ) { + if ( video.payload.featuredApps.length === 0 ) return 'Apple Silicon performance and support videos' + + const featuredAppsString = video.payload.featuredApps.slice(0, 5).map(app => app.name).join(', ') + + // console.log('video.payload.featuredApps', video.payload.featuredApps) + + return `Apple Silicon performance and support videos for ${ featuredAppsString }` +} + class TV { // or `async data() {` // or `get data() {` - data() { + data () { return { layout: 'default.11ty.js', @@ -18,11 +37,11 @@ class TV { eleventyComputed: { title: ({ video }) => { // console.log('data', data) - return `${ video.name } - ${ config.head.title }` + return makeTitle( video ) + }, + description: ({ video }) => { + return makeDescription( video ) }, - // footerInlineScripts: () => [ - // 'node_modules/lazysizes/lazysizes.min.js' - // ] }, permalink: ({ video }) => { From 3553923530adcb67f579cf56471baafff96abfb2 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Fri, 29 Jan 2021 17:32:55 -0600 Subject: [PATCH 49/49] Add Video Rows --- components-eleventy/video/card.js | 9 +-- components-eleventy/video/row.js | 80 +++++++++++++++++++++++ components-eleventy/video/submit-card.js | 81 ++++++++++++++++++++++++ helpers/scroll.js | 13 ++++ pages-eleventy/tv.11ty.js | 20 +----- 5 files changed, 182 insertions(+), 21 deletions(-) create mode 100644 components-eleventy/video/row.js create mode 100644 components-eleventy/video/submit-card.js create mode 100644 helpers/scroll.js diff --git a/components-eleventy/video/card.js b/components-eleventy/video/card.js index ceedfb1..0f77819 100644 --- a/components-eleventy/video/card.js +++ b/components-eleventy/video/card.js @@ -9,10 +9,11 @@ function pill ( text ) { ` } -export default function ( video, { - width = '325px', - classes = 'w-full flex-shrink-0 flex-grow-0 border-2 border-transparent rounded-2xl overflow-hidden' -} ) { +export default function ( video, options = {} ) { + const { + width = '325px', + classes = 'w-full flex-shrink-0 flex-grow-0 border-2 border-transparent rounded-2xl overflow-hidden' + } = options // Setup inline lazysizes this.usingComponent( 'node_modules/lazysizes/lazysizes.min.js' ) diff --git a/components-eleventy/video/row.js b/components-eleventy/video/row.js new file mode 100644 index 0000000..308e9c5 --- /dev/null +++ b/components-eleventy/video/row.js @@ -0,0 +1,80 @@ + +import VideoCard from './card.js' +import SubmitCard from './submit-card.js' + +function getCardType ( video ) { + const isSubmitCard = video.endpoint.includes('https://docs.google.com/forms') + + if ( isSubmitCard ) return SubmitCard + + return VideoCard +} + +export default function ( videos, options = {} ) { + + const { + cardWidth = '325', + classes = '' + } = options + + // Math.random should be unique because of its seeding algorithm. + // Convert it to base 36 (numbers + letters), and grab the first 9 characters + // after the decimal. + const uid = Math.random().toString(36).substr(2, 9) + const rowId = `row-${ uid }` + + // Setup inline lazysizes + this.usingComponent( 'helpers/scroll.js' ) + + // console.log('video', video) + + const cardsHtml = videos.map( video => { + const Card = getCardType( video ) + + // console.log('Card', this.boundComponent(Card)( video ) ) + + return this.boundComponent(Card)( video ) + } ).join('') + + // console.log( 'cardsHtml', cardsHtml ) + + return /* html */` + +
+ +
+ + ${ cardsHtml } + +
+ + + +
+ + ` +} diff --git a/components-eleventy/video/submit-card.js b/components-eleventy/video/submit-card.js new file mode 100644 index 0000000..717bc4b --- /dev/null +++ b/components-eleventy/video/submit-card.js @@ -0,0 +1,81 @@ + +export default function ( video, { + width = '325px', + classes = 'w-full flex-shrink-0 flex-grow-0 border-2 border-transparent rounded-2xl overflow-hidden' +} ) { + + // Setup inline lazysizes + // this.usingComponent( 'node_modules/lazysizes/lazysizes.min.js' ) + + // console.log('video', video) + + return /* html */` +
+ + +` +} diff --git a/helpers/scroll.js b/helpers/scroll.js new file mode 100644 index 0000000..e94fbfa --- /dev/null +++ b/helpers/scroll.js @@ -0,0 +1,13 @@ + + +function scrollHorizontalCarousel ( event ) { + event.stopPropagation() + + // console.log('event.target', event.currentTarget) + // console.log('distance', event.currentTarget.getAttribute('distance')) + + const distance = Number(event.currentTarget.getAttribute('distance')) + const scrollTarget = document.querySelector(event.currentTarget.getAttribute('scroll-target')) + + scrollTarget.scrollBy({ left: distance, behavior: 'smooth' }) +} diff --git a/pages-eleventy/tv.11ty.js b/pages-eleventy/tv.11ty.js index 74ff865..693dd74 100644 --- a/pages-eleventy/tv.11ty.js +++ b/pages-eleventy/tv.11ty.js @@ -2,7 +2,7 @@ import dotenv from 'dotenv' import config from '../nuxt.config' -import VideoCard from '../components-eleventy/video/card.js' +import VideoRow from '../components-eleventy/video/row.js' // Setup dotenv dotenv.config() @@ -51,7 +51,7 @@ class TV { } } - render({ name, video }) { + render({ video }) { // console.log('video.payload', Object.keys(video.payload)) @@ -80,23 +80,9 @@ class TV {