From 32465e59839999a5fa3e3820467d839a819b12d0 Mon Sep 17 00:00:00 2001 From: Christian Bundy Date: Mon, 23 Mar 2020 15:54:28 -0700 Subject: [PATCH] Update npm dependencies Problem: Our dependencies are falling behind and it'd be nice to have them up-to-date. The only big update it that Common-Good upgraded to the latest version of Prettier. Solution: Update them! --- .eslintrc.js | 8 +- .travis.yml | 4 +- package-lock.json | 1108 ++++++++++++++++++++++++----------------- package.json | 18 +- src/cli.js | 12 +- src/http.js | 6 +- src/index.js | 156 +++--- src/models.js | 281 +++++------ src/ssb.js | 26 +- src/views/i18n.js | 110 ++-- src/views/index.js | 138 ++--- src/views/markdown.js | 6 +- 12 files changed, 1029 insertions(+), 844 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 889fc75..7be2b7d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -2,15 +2,15 @@ module.exports = { env: { commonjs: true, es6: true, - node: true + node: true, }, extends: "eslint:recommended", globals: { Atomics: "readonly", - SharedArrayBuffer: "readonly" + SharedArrayBuffer: "readonly", }, parserOptions: { - ecmaVersion: 2018 + ecmaVersion: 2018, }, - rules: {} + rules: {}, }; diff --git a/.travis.yml b/.travis.yml index 865d9df..ee0c21a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,5 +17,5 @@ os: # Don't build arbitrary branches, just pull requests + master + semver tags. branches: only: - - master - - "/^v\\d+\\.\\d+\\.\\d+$/" + - master + - "/^v\\d+\\.\\d+\\.\\d+$/" diff --git a/package-lock.json b/package-lock.json index a43d303..555f937 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,22 +14,23 @@ } }, "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", + "json5": "^2.1.2", "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", @@ -45,12 +46,12 @@ } }, "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz", + "integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==", "dev": true, "requires": { - "@babel/types": "^7.8.3", + "@babel/types": "^7.9.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -84,6 +85,70 @@ "@babel/types": "^7.8.3" } }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, "@babel/helper-split-export-declaration": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", @@ -93,15 +158,21 @@ "@babel/types": "^7.8.3" } }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", "dev": true, "requires": { "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" } }, "@babel/highlight": { @@ -116,9 +187,9 @@ } }, "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.3.tgz", + "integrity": "sha512-E6SpIDJZ0cZAKoCNk+qSDd0ChfTnpiJN9FfNf3RZ20dzwA2vL2oq5IX1XTVT+4vDmRlta2nGk5HGMMskJAR+4A==", "dev": true }, "@babel/runtime": { @@ -131,28 +202,28 @@ } }, "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", + "@babel/generator": "^7.9.0", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" @@ -167,12 +238,12 @@ } }, "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", "dev": true, "requires": { - "esutils": "^2.0.2", + "@babel/helper-validator-identifier": "^7.9.0", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -213,6 +284,26 @@ "ssb-ws": "^6.2.3" } }, + "@koa/router": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/@koa/router/-/router-8.0.8.tgz", + "integrity": "sha512-FnT93N4NUehnXr+juupDmG2yfi0JnWdCmNEuIXpCG4TtG+9xvtrLambBH3RclycopVUOEYAim2lydiNBI7IRVg==", + "requires": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "koa-compose": "^4.1.0", + "methods": "^1.1.2", + "path-to-regexp": "1.x", + "urijs": "^1.19.2" + }, + "dependencies": { + "koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" + } + } + }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -324,12 +415,6 @@ "vfile-message": "*" } }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -360,9 +445,9 @@ "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" }, "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, "acorn-node": { @@ -381,9 +466,9 @@ "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==" }, "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -403,6 +488,16 @@ "obv": "^0.0.1", "rwlock": "^5.0.0", "uint48be": "^2.0.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "ansi-align": { @@ -415,18 +510,18 @@ } }, "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.11.0" }, "dependencies": { "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", "dev": true } } @@ -547,18 +642,18 @@ } }, "autoprefixer": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", - "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.5.tgz", + "integrity": "sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg==", "dev": true, "requires": { - "browserslist": "^4.8.3", - "caniuse-lite": "^1.0.30001020", + "browserslist": "^4.11.0", + "caniuse-lite": "^1.0.30001036", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.26", - "postcss-value-parser": "^4.0.2" + "postcss": "^7.0.27", + "postcss-value-parser": "^4.0.3" } }, "bail": { @@ -719,14 +814,15 @@ "integrity": "sha1-QUGcrvdpdVkp3VGJZ9PuwKYmJ3E=" }, "browserslist": { - "version": "4.8.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", - "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.0.tgz", + "integrity": "sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001027", - "electron-to-chromium": "^1.3.349", - "node-releases": "^1.1.49" + "caniuse-lite": "^1.0.30001035", + "electron-to-chromium": "^1.3.380", + "node-releases": "^1.1.52", + "pkg-up": "^3.1.0" } }, "buffer-equal": { @@ -806,9 +902,9 @@ "dev": true }, "camelcase-keys": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.1.2.tgz", - "integrity": "sha512-QfFrU0CIw2oltVvpndW32kuJ/9YOJwUnmWrjlXt1nnJZHCaS9i6bfOpg9R4Lw8aZjStkJWM+jc0cdXjWBgVJSw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.1.tgz", + "integrity": "sha512-BPCNVH56RVIxQQIXskp5tLQXUNGQ6sXr7iCv1FHDt81xBOQ/1r6H8SPxf19InVP6DexWar4s87q9thfuk8X9HA==", "dev": true, "requires": { "camelcase": "^5.3.1", @@ -825,9 +921,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001028", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", - "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==", + "version": "1.0.30001036", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001036.tgz", + "integrity": "sha512-jU8CIFIj2oR7r4W+5AKcsvWNVIb6Q6OZE3UsrXrZBHFtreT4YgTeOJtTucp+zSedEpTi3L5wASSP0LYIE3if6w==", "dev": true }, "capture-stack-trace": { @@ -1090,19 +1186,18 @@ } }, "common-good": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/common-good/-/common-good-1.1.20.tgz", - "integrity": "sha512-BOVAP2G+xxUFIB5JIvhEuFHrRKD0IiwKeVDFSt+8R/7HQ2leiJOeuWm2XPJNJLY6jgsLNc8JecPK6HidzmRcLg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/common-good/-/common-good-2.0.2.tgz", + "integrity": "sha512-h2QU3lVflXHpOdxsxB8f5xn2WN6TKzGNPp4ScgK+MezH7rVXvIcSgvLGV1J/H6S3vKY1tEurQKfQGk1WyCAR+Q==", "dev": true, "requires": { "cross-spawn": "^7.0.1", - "cspell": "^4.0.46", + "cspell": "^4.0.55", "dependency-check": "^4.1.0", "eslint": "^6.8.0", - "lockfile-lint": "^3.0.8", - "prettier": "^1.19.1", - "stylelint": "^13.0.0", - "typescript": "^3.7.5" + "prettier": "^2.0.1", + "stylelint": "^13.2.1", + "typescript": "^3.8.3" }, "dependencies": { "cross-spawn": { @@ -1158,6 +1253,12 @@ "typewiselite": "^1.0.0" } }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1343,33 +1444,16 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "dependencies": { - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" } }, "create-error-class": { @@ -1400,16 +1484,16 @@ "dev": true }, "cspell": { - "version": "4.0.47", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-4.0.47.tgz", - "integrity": "sha512-r8xnNWt2jr51iMxjJ7fef7pOgvq2HR5gMqmFagwtk9ayeD9Q0wy0nDAy4o+DY7vX4ORBN2oLKlT1Zen/XsMd7g==", + "version": "4.0.55", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-4.0.55.tgz", + "integrity": "sha512-LmBk2VNrBSXFPOpmhJalqYGdDF1x68H4wI3c7RDMRLfG/zOaFoZUEuJUYOC07tFXDosczXMu38Qt9cnEVZmrAA==", "dev": true, "requires": { "chalk": "^2.4.2", "commander": "^2.20.3", "comment-json": "^1.1.3", "cspell-glob": "^0.1.17", - "cspell-lib": "^4.1.15", + "cspell-lib": "^4.1.21", "fs-extra": "^8.1.0", "gensequence": "^3.0.3", "get-stdin": "^7.0.0", @@ -1427,9 +1511,9 @@ } }, "cspell-dict-companies": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/cspell-dict-companies/-/cspell-dict-companies-1.0.20.tgz", - "integrity": "sha512-LpDV5YMNV0vG8/LA4S8bbHNwaxI3gHTsCe0XZSGMRFlxO3bWWhi3Il3KB3pdDArDaopTGZKCMXDQsYFy5WHhQA==", + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/cspell-dict-companies/-/cspell-dict-companies-1.0.21.tgz", + "integrity": "sha512-vHW6pA0cLIT1qUfT6c+xV1IORrmSKuraHPJ7dwdRhWwuc6Ltc7QJWloapufxWgsYUCLllmFcv6E7kzzmue66gw==", "dev": true, "requires": { "configstore": "^5.0.0" @@ -1445,9 +1529,9 @@ } }, "cspell-dict-django": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/cspell-dict-django/-/cspell-dict-django-1.0.14.tgz", - "integrity": "sha512-HG/hzldjx2SCOCNP8R4Va3rsiDtOItPhIc6FAKaqp8+6upaCkZmu0QU4RUobbWOyUkZX/WUX5jJRrlj5ZMBjyg==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/cspell-dict-django/-/cspell-dict-django-1.0.15.tgz", + "integrity": "sha512-heppo6ZEGgv+cVPDLr24miG8xIn3E5SEGFBGHyNLyGqt8sHzeG3eNKhjKOJCC0hG/fq0ZECbE5q4691LvH24/Q==", "dev": true, "requires": { "configstore": "^5.0.0" @@ -1481,9 +1565,9 @@ } }, "cspell-dict-en_us": { - "version": "1.2.24", - "resolved": "https://registry.npmjs.org/cspell-dict-en_us/-/cspell-dict-en_us-1.2.24.tgz", - "integrity": "sha512-EINpnko8JlKGod64Sx5JYZHmUH1rNYaE90ALgqlnWins/t2MEi3ma5u0I7Ghh+/RiNRlcNErrVJxYb2xpeqiJg==", + "version": "1.2.25", + "resolved": "https://registry.npmjs.org/cspell-dict-en_us/-/cspell-dict-en_us-1.2.25.tgz", + "integrity": "sha512-owr04YQAO86wMR0nSup8d7Ogkm23vIOoQsPtIMFou1OA2XLUu13Xhla/Cs+qFzopakpcblvRuMSel0RomkAo7g==", "dev": true, "requires": { "configstore": "^5.0.0" @@ -1571,18 +1655,18 @@ } }, "cspell-dict-powershell": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/cspell-dict-powershell/-/cspell-dict-powershell-1.0.5.tgz", - "integrity": "sha512-vO4rdojQsmNHvzPdJT/rU2xw03uzs1x7+JJijufDSR+vf277KeQHCUV4+YTm4U7/33XDcPEgYJPT7uhzyjOqmA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cspell-dict-powershell/-/cspell-dict-powershell-1.0.6.tgz", + "integrity": "sha512-rwxt/fG3Nr7tQaV7e38ilz8qWfXrf5Ie+MQC6Mw/ddjT4wLOkGvruUqtJA/USoDE9PFG12KoarFsWlVXv/nwPA==", "dev": true, "requires": { "configstore": "^5.0.0" } }, "cspell-dict-python": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/cspell-dict-python/-/cspell-dict-python-1.0.19.tgz", - "integrity": "sha512-u1jU+4kNn/ds/Wm+oSNy8ZfR6ebK7otNJnxRKXehJfbWWxTbK+vyJF5MThS4osub7fI1FZKW4nPrPjYWIqDevA==", + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/cspell-dict-python/-/cspell-dict-python-1.0.20.tgz", + "integrity": "sha512-BiV8LnH9YNxvkUbVwTyDpZhOuRjPr8cE+nxpuPDbCHmVJmlLsDlg8MXTcJH8I+OFjoz6YdBX6yqK1bi55Aioow==", "dev": true, "requires": { "configstore": "^5.0.0" @@ -1616,18 +1700,18 @@ } }, "cspell-dict-software-terms": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/cspell-dict-software-terms/-/cspell-dict-software-terms-1.0.5.tgz", - "integrity": "sha512-sFkij2gLxml+yDJZYoUCgj/iaWG8rXOfKzQYE2ON3kA9N+x2xfO1nGOEMukkoRggRhXee1TWV0bJ6Wqekl/Clg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cspell-dict-software-terms/-/cspell-dict-software-terms-1.0.7.tgz", + "integrity": "sha512-Fh8NmDqY+GZRrJJuFUNoIDbR9WoP9mte+nVVGK5u8vurNInOG/MgRL0O/dhDfTmrMlSyAMhlUWm+852sXietEA==", "dev": true, "requires": { "configstore": "^5.0.0" } }, "cspell-dict-typescript": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cspell-dict-typescript/-/cspell-dict-typescript-1.0.3.tgz", - "integrity": "sha512-j6sVvLUuPCTw5Iqc1D1zB3mWJQTMNshEOmChJfz8vFeBMbu7oj61rLbnhnn2x8kXguKmWN5jhhKnsBIp++jRZA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cspell-dict-typescript/-/cspell-dict-typescript-1.0.4.tgz", + "integrity": "sha512-cniGSmTohYriEgGJ0PgcQP2GCGP+PH/0WZ2N7BTTemQr/mHTU6bKWy8DVK63YEtYPEmhZv+G2xPBgBD41QQypQ==", "dev": true, "requires": { "configstore": "^5.0.0" @@ -1653,23 +1737,23 @@ } }, "cspell-lib": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-4.1.15.tgz", - "integrity": "sha512-9TXx+GIryqISSCtEMO4SkEFE+E4nDkYnaurMxuQSJHUC6xNL/FVTwEsPZNyYm74eSBUYnfO7ixQ9/IuR1irsbA==", + "version": "4.1.21", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-4.1.21.tgz", + "integrity": "sha512-mcbYQRO9GeLjUU3fTrJEwD17pF/t4YlgYoEqVQkLgR0kCQ5exMFlj8II4UQHgNevx8GMJGpqQ9+fM6ZhCYKIzQ==", "dev": true, "requires": { "comment-json": "^1.1.3", - "configstore": "^5.0.0", + "configstore": "^5.0.1", "cspell-dict-bash": "^1.0.3", "cspell-dict-companies": "^1.0.20", "cspell-dict-cpp": "^1.1.26", - "cspell-dict-django": "^1.0.14", + "cspell-dict-django": "^1.0.15", "cspell-dict-dotnet": "^1.0.14", "cspell-dict-elixir": "^1.0.13", - "cspell-dict-en-gb": "^1.1.14", - "cspell-dict-en_us": "^1.2.23", + "cspell-dict-en-gb": "^1.1.16", + "cspell-dict-en_us": "^1.2.25", "cspell-dict-fonts": "^1.0.5", - "cspell-dict-fullstack": "^1.0.21", + "cspell-dict-fullstack": "^1.0.22", "cspell-dict-golang": "^1.1.14", "cspell-dict-haskell": "^1.0.4", "cspell-dict-html-symbol-entities": "^1.0.13", @@ -1677,12 +1761,12 @@ "cspell-dict-latex": "^1.0.13", "cspell-dict-lorem-ipsum": "^1.0.10", "cspell-dict-php": "^1.0.13", - "cspell-dict-powershell": "^1.0.5", - "cspell-dict-python": "^1.0.19", + "cspell-dict-powershell": "^1.0.6", + "cspell-dict-python": "^1.0.20", "cspell-dict-ruby": "^1.0.3", "cspell-dict-rust": "^1.0.12", "cspell-dict-scala": "^1.0.11", - "cspell-dict-software-terms": "^1.0.5", + "cspell-dict-software-terms": "^1.0.6", "cspell-dict-typescript": "^1.0.3", "cspell-io": "^4.0.20", "cspell-trie-lib": "^4.1.8", @@ -2006,9 +2090,9 @@ "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" }, "electron-to-chromium": { - "version": "1.3.354", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.354.tgz", - "integrity": "sha512-24YMkNiZWOUeF6YeoscWfIGP0oMx+lJpU/miwI+lcu7plIDpyZn8Gx0lx0qTDlzGoz7hx+lpyD8QkbkX5L2Pqw==", + "version": "1.3.381", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.381.tgz", + "integrity": "sha512-JQBpVUr83l+QOqPQpj2SbOve1bBE4ACpmwcMNqWlZmfib7jccxJ02qFNichDpZ5LS4Zsqc985NIPKegBIZjK8Q==", "dev": true }, "emoji-named-characters": { @@ -2112,9 +2196,9 @@ "integrity": "sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc=" }, "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", @@ -2283,6 +2367,15 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -2326,13 +2419,13 @@ "dev": true }, "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "dev": true, "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.1.0" } }, @@ -2342,12 +2435,20 @@ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" }, "esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz", + "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.0.0" + }, + "dependencies": { + "estraverse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", + "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==", + "dev": true + } } }, "esrecurse": { @@ -2389,13 +2490,13 @@ } }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", @@ -2403,13 +2504,15 @@ "strip-eof": "^1.0.0" }, "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "pump": "^3.0.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } } } @@ -2530,16 +2633,17 @@ "dev": true }, "fast-glob": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.1.tgz", - "integrity": "sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", + "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.0", "merge2": "^1.3.0", - "micromatch": "^4.0.2" + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" } }, "fast-json-stable-stringify": { @@ -2554,12 +2658,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fastq": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", - "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.1.tgz", + "integrity": "sha512-mpIH5sKYueh3YyeJwqtVo8sORi0CgtmkVbK6kZStpQlZBYQuTzG2CZ7idSiJuA7bY0SFCWUc5WIs+oYumGCQNw==", "dev": true, "requires": { - "reusify": "^1.0.0" + "reusify": "^1.0.4" } }, "figures": { @@ -2622,6 +2726,15 @@ "locate-path": "^3.0.0" } }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, "flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", @@ -2728,6 +2841,16 @@ "pull-paramap": "^1.2.1", "pull-stream": "^3.5.0", "pull-write": "^1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "flumeview-query": { @@ -3019,20 +3142,12 @@ } }, "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } } }, "globby": { @@ -3170,9 +3285,9 @@ "integrity": "sha1-CKdNknKpzIOujmu+AwPw7nZDIJQ=" }, "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "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 }, "html-comment-regex": { @@ -3249,22 +3364,67 @@ } }, "husky": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/husky/-/husky-3.1.0.tgz", - "integrity": "sha512-FJkPoHHB+6s4a+jwPqBudBDvYZsoQW5/HBuMSehC8qDiCe50kpcxeqFoDSlow+9I6wg47YxBoT3WxaURlrDIIQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz", + "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==", "dev": true, "requires": { - "chalk": "^2.4.2", + "chalk": "^3.0.0", "ci-info": "^2.0.0", - "cosmiconfig": "^5.2.1", - "execa": "^1.0.0", - "get-stdin": "^7.0.0", + "compare-versions": "^3.5.1", + "cosmiconfig": "^6.0.0", + "find-versions": "^3.2.0", "opencollective-postinstall": "^2.0.2", "pkg-dir": "^4.2.0", "please-upgrade-node": "^3.2.0", - "read-pkg": "^5.2.0", - "run-node": "^1.0.0", - "slash": "^3.0.0" + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "hyperaxe": { @@ -3389,26 +3549,61 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", + "chalk": "^3.0.0", "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.15", "mute-stream": "0.0.8", - "run-async": "^2.2.0", + "run-async": "^2.4.0", "rxjs": "^6.5.3", "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" }, "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "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", @@ -3424,34 +3619,15 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } + "has-flag": "^4.0.0" } } } @@ -3557,11 +3733,10 @@ "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", "dev": true }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==" }, "is-electron": { "version": "2.2.0", @@ -3855,12 +4030,12 @@ "dev": true }, "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "jsonfile": { @@ -3991,34 +4166,6 @@ } } }, - "koa-router": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-7.4.0.tgz", - "integrity": "sha512-IWhaDXeAnfDBEpWS6hkGdZ1ablgr6Q6pGdXCyK38RbzuH4LkUOpPqPw+3f8l8aTDrQmBQ7xJc0bs2yV4dzcO+g==", - "requires": { - "debug": "^3.1.0", - "http-errors": "^1.3.1", - "koa-compose": "^3.0.0", - "methods": "^1.0.1", - "path-to-regexp": "^1.1.1", - "urijs": "^1.19.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, "koa-send": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.0.tgz", @@ -4378,28 +4525,6 @@ "path-exists": "^3.0.0" } }, - "lockfile-lint": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/lockfile-lint/-/lockfile-lint-3.0.18.tgz", - "integrity": "sha512-CvG+CkrJzdHOB2JdTWQpvigHmv55Bhm31G1y9/4Ak3RrKJPmIQbVElFq2rGjR5QI3km2xNNouR19Vu0edo1low==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "lockfile-lint-api": "^5.0.12", - "yargs": "^15.0.2" - } - }, - "lockfile-lint-api": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/lockfile-lint-api/-/lockfile-lint-api-5.0.12.tgz", - "integrity": "sha512-8OSMww33l0xghDl1aK450UHYzKZjMaPjdbtvt7A/iEdD2AAH6h3xyVkVIHSJmD2KfD1lh819tdpOukui+qSEsw==", - "dev": true, - "requires": { - "@yarnpkg/lockfile": "^1.1.0", - "debug": "^4.1.1", - "object-hash": "^2.0.1" - } - }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", @@ -4452,6 +4577,16 @@ "requires": { "mkdirp": "^0.5.1", "tape": "^4.6.3" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "lowercase-keys": { @@ -4464,7 +4599,6 @@ "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" @@ -4473,8 +4607,7 @@ "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" } } }, @@ -4592,9 +4725,9 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "meow": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-6.0.1.tgz", - "integrity": "sha512-kxGTFgT/b7/oSRSQsJ0qsT5IMU+bgZ1eAdSA3kIV7onkW0QWo/hL5RbGlMfvBjHJKPE1LaPX0kdecYFiqYWjUw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.0.tgz", + "integrity": "sha512-iIAoeI01v6pmSfObAAWFoITAA4GgiT45m4SmJgoxtZfvI0fyZwhV4d0lTwiUXvAKIPlma05Feb2Xngl52Mj5Cg==", "dev": true, "requires": { "@types/minimist": "^1.2.0", @@ -4607,15 +4740,7 @@ "redent": "^3.0.0", "trim-newlines": "^3.0.0", "type-fest": "^0.8.1", - "yargs-parser": "^16.1.0" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } + "yargs-parser": "^18.1.1" } }, "merge-descriptors": { @@ -4704,9 +4829,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minimist-options": { "version": "4.0.2", @@ -4738,19 +4863,10 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", + "dev": true }, "monotonic-timestamp": { "version": "0.0.9", @@ -4787,6 +4903,16 @@ "pull-write-file": "^0.2.1", "rimraf": "^2.2.8", "stream-to-pull-stream": "^1.7.2" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "multiblob-http": { @@ -4894,6 +5020,14 @@ "path-is-absolute": "^1.0.0" } }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + }, "rimraf": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", @@ -4993,9 +5127,9 @@ "optional": true }, "node-releases": { - "version": "1.1.49", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.49.tgz", - "integrity": "sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg==", + "version": "1.1.52", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.52.tgz", + "integrity": "sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ==", "dev": true, "requires": { "semver": "^6.3.0" @@ -5141,12 +5275,6 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", - "dev": true - }, "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", @@ -5232,11 +5360,12 @@ "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" }, "open": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.0.tgz", - "integrity": "sha512-K6EKzYqnwQzk+/dzJAQSBORub3xlBTxMz+ntpZpH/LyCa1o6KjXhuN+2npAaI9jaSmU3R1Q8NWf4KUWcyytGsQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", + "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", "requires": { - "is-wsl": "^2.1.0" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" } }, "opencollective-postinstall": { @@ -5359,13 +5488,15 @@ } }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", "dev": true, "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" } }, "parse-ms": { @@ -5667,6 +5798,25 @@ "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0", "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "optional": true, + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "optional": true + } + } + } } }, "prelude-ls": { @@ -5681,15 +5831,15 @@ "dev": true }, "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.2.tgz", + "integrity": "sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg==", "dev": true }, "pretty-ms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-5.1.0.tgz", - "integrity": "sha512-4gaK1skD2gwscCfkswYQRmddUb2GJZtzDGRjHWadVHtK/DIKFufa12MvES6/xu1tVbUYeia5bmLcwJtZJQUqnw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-6.0.1.tgz", + "integrity": "sha512-ke4njoVmlotekHlHyCZ3wI/c5AMT8peuHs8rKJqekj/oR5G8lND2dVpicFlUz5cbZgE290vvkMuDwfj/OcW1kw==", "requires": { "parse-ms": "^2.1.0" } @@ -5740,8 +5890,7 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "pstree.remy": { "version": "1.1.7", @@ -6087,6 +6236,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "optional": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6211,17 +6361,11 @@ "type-fest": "^0.6.0" }, "dependencies": { - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true } } }, @@ -6269,12 +6413,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true } } }, @@ -6575,20 +6713,14 @@ "integrity": "sha1-30PoDZvIKtRDC8/vA/SccX6LLow=" }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", "dev": true, "requires": { "is-promise": "^2.1.0" } }, - "run-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", - "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", - "dev": true - }, "run-parallel": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", @@ -6688,6 +6820,12 @@ "semver": "^5.0.3" } }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", @@ -7040,6 +7178,14 @@ "ssb-keys": "^7.2.1" }, "dependencies": { + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + }, "ssb-keys": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/ssb-keys/-/ssb-keys-7.2.2.tgz", @@ -7172,6 +7318,16 @@ "ssb-ref": "^2.12.0", "ssb-validate": "^4.0.0", "zerr": "^1.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "ssb-ebt": { @@ -7230,6 +7386,21 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + } + } } } }, @@ -7255,9 +7426,9 @@ } }, "ssb-markdown": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ssb-markdown/-/ssb-markdown-6.0.4.tgz", - "integrity": "sha512-MdmHnev7259wzGcCSBo6A93kR/3iIx5sWrrzFTuyDmAAgHLycvotS6tbcge15AlPZDNRmo2N3MyHKTYb+SYbUA==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ssb-markdown/-/ssb-markdown-6.0.5.tgz", + "integrity": "sha512-isJeAb7KgVXD1e+uNoF9dHYaD167Aew/VsofZJC1DDfL8tPG7xtjGuB+QRluE2/5ilLej2hE8mq27DcFT2a8Ww==", "requires": { "emoji-regex": "^8.0.0", "hashtag-regex": "^2.1.0", @@ -7265,7 +7436,8 @@ "markdown-it": "^8.4.2", "markdown-it-emoji": "^1.4.0", "markdown-it-hashtag": "^0.4.0", - "node-emoji": "^1.10.0" + "node-emoji": "^1.10.0", + "ssb-ref": "^2.13.9" } }, "ssb-marked": { @@ -7339,6 +7511,14 @@ "requires": { "level-codec": "^6.2.0" } + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } } } }, @@ -7359,6 +7539,16 @@ "pull-pushable": "^2.2.0", "pull-stream": "^3.6.9", "stream-to-pull-stream": "^1.7.2" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "ssb-query": { @@ -7797,9 +7987,9 @@ "dev": true }, "stylelint": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.2.0.tgz", - "integrity": "sha512-isf31yjkm0DQesx+Yk1b/WQpFkf1MicwaAVR22Hprx9HRFGhhEkWdrVCyrkK6HFymL0rhzynG97Tu53q/WCsAg==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.2.1.tgz", + "integrity": "sha512-461ZV4KpUe7pEHHgMOsH4kkjF7qsjkCIMJYOf7QQC4cvgPUJ0z4Nj+ah5fvKl1rzqBqc5EZa6P0nna4CGoJX+A==", "dev": true, "requires": { "autoprefixer": "^9.7.4", @@ -7822,10 +8012,10 @@ "lodash": "^4.17.15", "log-symbols": "^3.0.0", "mathml-tag-names": "^2.1.3", - "meow": "^6.0.0", + "meow": "^6.0.1", "micromatch": "^4.0.2", "normalize-selector": "^0.2.0", - "postcss": "^7.0.26", + "postcss": "^7.0.27", "postcss-html": "^0.36.0", "postcss-jsx": "^0.36.4", "postcss-less": "^3.1.4", @@ -7838,7 +8028,7 @@ "postcss-scss": "^2.0.0", "postcss-selector-parser": "^6.0.2", "postcss-syntax": "^0.36.2", - "postcss-value-parser": "^4.0.2", + "postcss-value-parser": "^4.0.3", "resolve-from": "^5.0.0", "slash": "^3.0.0", "specificity": "^0.4.1", @@ -7849,7 +8039,7 @@ "svg-tags": "^1.0.0", "table": "^5.4.6", "v8-compile-cache": "^2.1.0", - "write-file-atomic": "^3.0.1" + "write-file-atomic": "^3.0.3" }, "dependencies": { "ansi-styles": { @@ -7881,19 +8071,6 @@ "color-name": "~1.1.4" } }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, "globby": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz", @@ -7926,18 +8103,6 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -8092,6 +8257,23 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "optional": true, + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "optional": true + } + } } } }, @@ -8111,6 +8293,23 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "optional": true, + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "optional": true + } + } } } }, @@ -8153,27 +8352,11 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, "requires": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", "which": "^1.2.9" } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } } } }, @@ -8303,9 +8486,9 @@ "dev": true }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", "dev": true }, "tsscmp": { @@ -8349,9 +8532,9 @@ } }, "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, "type-is": { @@ -8377,9 +8560,9 @@ } }, "typescript": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", - "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "dev": true }, "typewise": { @@ -8507,9 +8690,9 @@ } }, "unist-util-stringify-position": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.2.tgz", - "integrity": "sha512-nK5n8OGhZ7ZgUwoUbL8uiVRwAbZyzBsB/Ddrlbu6jwwubFza4oe15KlyEaLNMXQW1svOQq4xesUeqA85YrIUQA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", "dev": true, "requires": { "@types/unist": "^2.0.2" @@ -8728,9 +8911,9 @@ "dev": true }, "vfile-message": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.2.tgz", - "integrity": "sha512-gNV2Y2fDvDOOqq8bEe7cF3DXU6QgV4uA9zMR2P8tix11l1r7zju3zry3wZ8sx+BEfuO6WQ7z2QzfWTvqHQiwsA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.3.tgz", + "integrity": "sha512-qQg/2z8qnnBHL0psXyF72kCjb9YioIynvyltuNKFaUhRtqTIcIMP3xnBaPzirVZNuBrUe1qwFciSx2yApa4byw==", "dev": true, "requires": { "@types/unist": "^2.0.0", @@ -8764,8 +8947,7 @@ "which-pm-runs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "optional": true + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" }, "wide-align": { "version": "1.1.3", @@ -8846,12 +9028,23 @@ "dev": true, "requires": { "mkdirp": "^0.5.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } } }, "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { "imurmurhash": "^0.1.4", @@ -8907,9 +9100,9 @@ } }, "yargs": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", - "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", "requires": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -8921,7 +9114,7 @@ "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^18.1.0" + "yargs-parser": "^18.1.1" }, "dependencies": { "camelcase": { @@ -8973,23 +9166,13 @@ "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" } - }, - "yargs-parser": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.0.tgz", - "integrity": "sha512-o/Jr6JBOv6Yx3pL+5naWSoIA2jJ+ZkMYQG/ie9qFbukBe4uzmBatlXFOiu/tNKRWEtyf+n5w7jc/O16ufqOTdQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", - "dev": true, + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz", + "integrity": "sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -8998,8 +9181,7 @@ "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" } } }, diff --git a/package.json b/package.json index fb389f3..81ddd30 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,8 @@ }, "dependencies": { "@fraction/base16-css": "^1.1.0", - "@fraction/flotilla": "^4.0.1", + "@fraction/flotilla": "^4.0.0", + "@koa/router": "^8.0.0", "debug": "^4.1.1", "env-paths": "^2.2.0", "highlight.js": "^9.18.1", @@ -31,12 +32,11 @@ "koa": "^2.7.0", "koa-body": "^4.1.0", "koa-mount": "^4.0.0", - "koa-router": "^7.4.0", "koa-static": "^5.0.0", "lodash": "^4.17.11", "markdown-it": "^8.4.2", - "open": "7.0.0", - "pretty-ms": "^5.0.0", + "open": "^7.0.3", + "pretty-ms": "^6.0.0", "pull-paramap": "^1.2.2", "pull-sort": "^1.0.2", "pull-stream": "^3.6.12", @@ -44,19 +44,19 @@ "sharp": "^0.23.0", "ssb-client": "^4.9.0", "ssb-config": "^3.4.4", - "ssb-markdown": "^6.0.4", + "ssb-markdown": "^6.0.5", "ssb-mentions": "^0.5.2", "ssb-msgs": "^5.2.0", "ssb-ref": "^2.13.9", "ssb-tangle": "^1.0.1", "ssb-thread-schema": "^1.1.1", - "yargs": "^15.3.0" + "yargs": "^15.3.1" }, "devDependencies": { "changelog-version": "^1.0.1", - "common-good": "^1.1.20", - "husky": "^3.0.5", - "mkdirp": "^0.5.1", + "common-good": "^2.0.2", + "husky": "^4.0.0", + "mkdirp": "^1.0.0", "nodemon": "^2.0.2", "stylelint-config-recommended": "^3.0.0" }, diff --git a/src/cli.js b/src/cli.js index c980e60..70595a8 100644 --- a/src/cli.js +++ b/src/cli.js @@ -14,33 +14,33 @@ module.exports = (presets, defaultConfigFile) => describe: "Automatically open app in web browser. Use --no-open to disable.", default: _.get(presets, "open", true), - type: "boolean" + type: "boolean", }) .options("offline", { describe: "Don't try to connect to scuttlebutt peers or pubs. This can be changed on the 'settings' page while Oasis is running.", default: _.get(presets, "offline", false), - type: "boolean" + type: "boolean", }) .options("host", { describe: "Hostname for web app to listen on", default: _.get(presets, "host", "localhost"), - type: "string" + type: "string", }) .options("port", { describe: "Port for web app to listen on", default: _.get(presets, "port", 3000), - type: "number" + type: "number", }) .options("public", { describe: "Assume Oasis is being hosted publicly, disable HTTP POST and redact messages from people who haven't given consent for public web hosting.", default: _.get(presets, "public", false), - type: "boolean" + type: "boolean", }) .options("debug", { describe: "Use verbose output for debugging", default: _.get(presets, "debug", false), - type: "boolean" + type: "boolean", }) .epilog(`The defaults can be configured in ${defaultConfigFile}.`).argv; diff --git a/src/http.js b/src/http.js index 9986b9a..c085404 100644 --- a/src/http.js +++ b/src/http.js @@ -13,7 +13,7 @@ module.exports = ({ host, port, middleware }) => { const app = new Koa(); module.exports = app; - app.on("error", err => { + app.on("error", (err) => { // Output full error objects err.message = err.stack; console.error(err); @@ -32,7 +32,7 @@ module.exports = ({ host, port, middleware }) => { "img-src 'self'", "form-action 'self'", "media-src 'self'", - "style-src 'self' 'unsafe-inline'" + "style-src 'self' 'unsafe-inline'", ].join("; "); // Disallow scripts. @@ -69,6 +69,6 @@ module.exports = ({ host, port, middleware }) => { } }); - middleware.forEach(m => app.use(m)); + middleware.forEach((m) => app.use(m)); app.listen({ host, port }); }; diff --git a/src/index.js b/src/index.js index 24c3562..ddd50a3 100755 --- a/src/index.js +++ b/src/index.js @@ -66,12 +66,12 @@ these settings the default. See the readme for details.`); const oasisCheckPath = "/.well-known/oasis"; -process.on("uncaughtException", function(err) { +process.on("uncaughtException", function (err) { // This isn't `err.code` because TypeScript doesn't like that. if (err["code"] === "EADDRINUSE") { - nodeHttp.get(url + oasisCheckPath, res => { + nodeHttp.get(url + oasisCheckPath, (res) => { let rawData = ""; - res.on("data", chunk => { + res.on("data", (chunk) => { rawData += chunk; }); res.on("end", () => { @@ -123,7 +123,7 @@ const { nav, ul, li, a } = require("hyperaxe"); const open = require("open"); const pull = require("pull-stream"); const requireStyle = require("require-style"); -const router = require("koa-router")(); +const router = require("@koa/router")(); const ssbMentions = require("ssb-mentions"); const ssbRef = require("ssb-ref"); const isSvg = require("is-svg"); @@ -138,7 +138,7 @@ const cooler = ssb({ offline: config.offline }); const { about, blob, friend, meta, post, vote } = require("./models")({ cooler, - isPublic: config.public + isPublic: config.public, }); const { @@ -162,7 +162,7 @@ const { setLanguage, settingsView, topicsView, - summaryView + summaryView, } = require("./views"); let sharp; @@ -178,11 +178,11 @@ const defaultTheme = "atelier-sulphurPool-light".toLowerCase(); const readmePath = path.join(__dirname, "..", "README.md"); const packagePath = path.join(__dirname, "..", "package.json"); -fs.promises.readFile(readmePath, "utf8").then(text => { +fs.promises.readFile(readmePath, "utf8").then((text) => { config.readme = text; }); -fs.promises.readFile(packagePath, "utf8").then(text => { +fs.promises.readFile(packagePath, "utf8").then((text) => { config.version = JSON.parse(text).version; }); @@ -207,21 +207,21 @@ router ctx.assert(ssbRef.isFeedId(message), 400, "Invalid feed link"); return next(); }) - .get("/", async ctx => { + .get("/", async (ctx) => { ctx.redirect("/mentions"); }) - .get("/robots.txt", ctx => { + .get("/robots.txt", (ctx) => { ctx.body = "User-agent: *\nDisallow: /"; }) - .get(oasisCheckPath, ctx => { + .get(oasisCheckPath, (ctx) => { ctx.body = "oasis"; }) - .get("/public/popular/:period", async ctx => { + .get("/public/popular/:period", async (ctx) => { const { period } = ctx.params; const publicPopular = async ({ period }) => { const messages = await post.popular({ period }); - const option = somePeriod => { + const option = (somePeriod) => { const lowerPeriod = somePeriod.toLowerCase(); return li( period === lowerPeriod @@ -236,30 +236,30 @@ router return popularView({ messages, - prefix + prefix, }); }; ctx.body = await publicPopular({ period }); }) - .get("/public/latest", async ctx => { + .get("/public/latest", async (ctx) => { const messages = await post.latest(); ctx.body = await latestView({ messages }); }) - .get("/public/latest/extended", async ctx => { + .get("/public/latest/extended", async (ctx) => { const messages = await post.latestExtended(); ctx.body = await extendedView({ messages }); }) - .get("/public/latest/topics", async ctx => { + .get("/public/latest/topics", async (ctx) => { const messages = await post.latestTopics(); ctx.body = await topicsView({ messages }); }) - .get("/public/latest/summaries", async ctx => { + .get("/public/latest/summaries", async (ctx) => { const messages = await post.latestSummaries(); ctx.body = await summaryView({ messages }); }) - .get("/author/:feed", async ctx => { + .get("/author/:feed", async (ctx) => { const { feed } = ctx.params; - const author = async feedId => { + const author = async (feedId) => { const description = await about.description(feedId); const name = await about.name(feedId); const image = await about.image(feedId); @@ -274,12 +274,12 @@ router name, description, avatarUrl, - relationship + relationship, }); }; ctx.body = await author(feed); }) - .get("/search/", async ctx => { + .get("/search/", async (ctx) => { let { query } = ctx.query; if (isMsg(query)) { @@ -305,7 +305,7 @@ router ctx.body = await searchView({ messages, query }); }) - .get("/inbox", async ctx => { + .get("/inbox", async (ctx) => { const inbox = async () => { const messages = await post.inbox(); @@ -313,13 +313,13 @@ router }; ctx.body = await inbox(); }) - .get("/hashtag/:hashtag", async ctx => { + .get("/hashtag/:hashtag", async (ctx) => { const { hashtag } = ctx.params; const messages = await post.fromHashtag(hashtag); ctx.body = await hashtagView({ hashtag, messages }); }) - .get("/theme.css", ctx => { + .get("/theme.css", (ctx) => { const theme = ctx.cookies.get("theme") || defaultTheme; const packageName = "@fraction/base16-css"; @@ -327,7 +327,7 @@ router ctx.type = "text/css"; ctx.body = requireStyle(filePath); }) - .get("/profile/", async ctx => { + .get("/profile/", async (ctx) => { const myFeedId = await meta.myFeedId(); const description = await about.description(myFeedId); @@ -344,20 +344,20 @@ router name, description, avatarUrl, - relationship: null + relationship: null, }); }) - .get("/profile/edit", async ctx => { + .get("/profile/edit", async (ctx) => { const myFeedId = await meta.myFeedId(); const description = await about.description(myFeedId); const name = await about.name(myFeedId); ctx.body = await editProfileView({ name, - description + description, }); }) - .post("/profile/edit", koaBody({ multipart: true }), async ctx => { + .post("/profile/edit", koaBody({ multipart: true }), async (ctx) => { const name = String(ctx.request.body.name); const description = String(ctx.request.body.description); @@ -365,14 +365,14 @@ router ctx.body = await post.publishProfileEdit({ name, description, - image + image, }); ctx.redirect("/profile"); }) - .get("/publish/custom/", async ctx => { + .get("/publish/custom/", async (ctx) => { ctx.body = await publishCustomView(); }) - .get("/json/:message", async ctx => { + .get("/json/:message", async (ctx) => { if (config.public) { throw new Error( "Sorry, many actions are unavailable when Oasis is running in public mode. Please run Oasis in the default mode and try again." @@ -380,19 +380,19 @@ router } const { message } = ctx.params; ctx.type = "application/json"; - const json = async message => { + const json = async (message) => { const json = await meta.get(message); return JSON.stringify(json, null, 2); }; ctx.body = await json(message); }) - .get("/blob/:blobId", async ctx => { + .get("/blob/:blobId", async (ctx) => { const { blobId } = ctx.params; const getBlob = async ({ blobId }) => { const bufferSource = await blob.get({ blobId }); debug("got buffer source"); - return new Promise(resolve => { + return new Promise((resolve) => { pull( bufferSource, pull.collect(async (err, bufferArray) => { @@ -428,7 +428,7 @@ router ctx.type = "image/svg+xml"; } }) - .get("/image/:imageSize/:blobId", async ctx => { + .get("/image/:imageSize/:blobId", async (ctx) => { const { blobId, imageSize } = ctx.params; if (sharp) { ctx.type = "image/png"; @@ -439,7 +439,7 @@ router "base64" ); - const fakeImage = imageSize => + const fakeImage = (imageSize) => sharp ? sharp({ create: { @@ -450,23 +450,23 @@ router r: 0, g: 0, b: 0, - alpha: 0.5 - } - } + alpha: 0.5, + }, + }, }) .png() .toBuffer() - : new Promise(resolve => resolve(fakePixel)); + : new Promise((resolve) => resolve(fakePixel)); const image = async ({ blobId, imageSize }) => { const bufferSource = await blob.get({ blobId }); const fakeId = "&0000000000000000000000000000000000000000000=.sha256"; debug("got buffer source"); - return new Promise(resolve => { + return new Promise((resolve) => { if (blobId === fakeId) { debug("fake image"); - fakeImage(imageSize).then(result => resolve(result)); + fakeImage(imageSize).then((result) => resolve(result)); } else { debug("not fake image"); pull( @@ -485,7 +485,7 @@ router .resize(imageSize, imageSize) .png() .toBuffer() - .then(data => { + .then((data) => { resolve(data); }); } else { @@ -499,7 +499,7 @@ router }; ctx.body = await image({ blobId, imageSize: Number(imageSize) }); }) - .get("/settings/", async ctx => { + .get("/settings/", async (ctx) => { const theme = ctx.cookies.get("theme") || defaultTheme; const getMeta = async ({ theme }) => { const status = await meta.status(); @@ -516,12 +516,12 @@ router peers: peersWithNames, theme, themeNames, - version: config.version + version: config.version, }); }; ctx.body = await getMeta({ theme }); }) - .get("/likes/:feed", async ctx => { + .get("/likes/:feed", async (ctx) => { const { feed } = ctx.params; const likes = async ({ feed }) => { const pendingMessages = post.likes({ feed }); @@ -529,18 +529,18 @@ router return likesView({ messages: await pendingMessages, feed, - name: await pendingName + name: await pendingName, }); }; ctx.body = await likes({ feed }); }) - .get("/settings/readme/", async ctx => { - const status = async text => { + .get("/settings/readme/", async (ctx) => { + const status = async (text) => { return markdownView({ text }); }; ctx.body = await status(config.readme); }) - .get("/mentions/", async ctx => { + .get("/mentions/", async (ctx) => { const mentions = async () => { const messages = await post.mentionsMe(); @@ -548,9 +548,9 @@ router }; ctx.body = await mentions(); }) - .get("/thread/:message", async ctx => { + .get("/thread/:message", async (ctx) => { const { message } = ctx.params; - const thread = async message => { + const thread = async (message) => { const messages = await post.fromThread(message); debug("got %i messages", messages.length); @@ -559,9 +559,9 @@ router ctx.body = await thread(message); }) - .get("/reply/:message", async ctx => { + .get("/reply/:message", async (ctx) => { const { message } = ctx.params; - const reply = async parentId => { + const reply = async (parentId) => { const rootMessage = await post.get(parentId); const myFeedId = await meta.myFeedId(); @@ -572,12 +572,12 @@ router }; ctx.body = await reply(message); }) - .get("/publish", async ctx => { + .get("/publish", async (ctx) => { ctx.body = await publishView(); }) - .get("/comment/:message", async ctx => { + .get("/comment/:message", async (ctx) => { const { message } = ctx.params; - const comment = async parentId => { + const comment = async (parentId) => { const parentMessage = await post.get(parentId); const myFeedId = await meta.myFeedId(); @@ -602,7 +602,7 @@ router }; ctx.body = await comment(message); }) - .post("/reply/:message", koaBody(), async ctx => { + .post("/reply/:message", koaBody(), async (ctx) => { const { message } = ctx.params; const text = String(ctx.request.body.text); const publishReply = async ({ message, text }) => { @@ -612,13 +612,13 @@ router const parent = await post.get(message); return post.reply({ parent, - message: { text, mentions } + message: { text, mentions }, }); }; ctx.body = await publishReply({ message, text }); ctx.redirect(`/thread/${encodeURIComponent(message)}`); }) - .post("/comment/:message", koaBody(), async ctx => { + .post("/comment/:message", koaBody(), async (ctx) => { const { message } = ctx.params; const text = String(ctx.request.body.text); const publishComment = async ({ message, text }) => { @@ -628,13 +628,13 @@ router return post.comment({ parent, - message: { text, mentions } + message: { text, mentions }, }); }; ctx.body = await publishComment({ message, text }); ctx.redirect(`/thread/${encodeURIComponent(message)}`); }) - .post("/publish/", koaBody(), async ctx => { + .post("/publish/", koaBody(), async (ctx) => { const text = String(ctx.request.body.text); const rawContentWarning = String(ctx.request.body.contentWarning); @@ -648,31 +648,31 @@ router return post.root({ text, mentions, - contentWarning + contentWarning, }); }; ctx.body = await publish({ text, contentWarning }); ctx.redirect("/public/latest"); }) - .post("/publish/custom", koaBody(), async ctx => { + .post("/publish/custom", koaBody(), async (ctx) => { const text = String(ctx.request.body.text); const obj = JSON.parse(text); ctx.body = await post.publishCustom(obj); ctx.redirect(`/public/latest`); }) - .post("/follow/:feed", koaBody(), async ctx => { + .post("/follow/:feed", koaBody(), async (ctx) => { const { feed } = ctx.params; const referer = new URL(ctx.request.header.referer); ctx.body = await friend.follow(feed); ctx.redirect(referer); }) - .post("/unfollow/:feed", koaBody(), async ctx => { + .post("/unfollow/:feed", koaBody(), async (ctx) => { const { feed } = ctx.params; const referer = new URL(ctx.request.header.referer); ctx.body = await friend.unfollow(feed); ctx.redirect(referer); }) - .post("/like/:message", koaBody(), async ctx => { + .post("/like/:message", koaBody(), async (ctx) => { const { message } = ctx.params; // TODO: convert all so `message` is full message and `messageKey` is key const messageKey = message; @@ -680,7 +680,7 @@ router const voteValue = Number(ctx.request.body.voteValue); const encoded = { - message: encodeURIComponent(message) + message: encodeURIComponent(message), }; const referer = new URL(ctx.request.header.referer); @@ -693,7 +693,7 @@ router const isPrivate = message.value.meta.private === true; const messageRecipients = isPrivate ? message.value.content.recps : []; - const normalized = messageRecipients.map(recipient => { + const normalized = messageRecipients.map((recipient) => { if (typeof recipient === "string") { return recipient; } @@ -712,31 +712,31 @@ router ctx.body = await like({ messageKey, voteValue }); ctx.redirect(referer); }) - .post("/theme.css", koaBody(), async ctx => { + .post("/theme.css", koaBody(), async (ctx) => { const theme = String(ctx.request.body.theme); ctx.cookies.set("theme", theme); const referer = new URL(ctx.request.header.referer); ctx.redirect(referer); }) - .post("/language", koaBody(), async ctx => { + .post("/language", koaBody(), async (ctx) => { const language = String(ctx.request.body.language); ctx.cookies.set("language", language); const referer = new URL(ctx.request.header.referer); ctx.redirect(referer); }) - .post("/settings/conn/start", koaBody(), async ctx => { + .post("/settings/conn/start", koaBody(), async (ctx) => { await meta.connStart(); ctx.redirect("/settings"); }) - .post("/settings/conn/stop", koaBody(), async ctx => { + .post("/settings/conn/stop", koaBody(), async (ctx) => { await meta.connStop(); ctx.redirect("/settings"); }) - .post("/settings/conn/restart", koaBody(), async ctx => { + .post("/settings/conn/restart", koaBody(), async (ctx) => { await meta.connRestart(); ctx.redirect("/settings"); }) - .post("/settings/invite/accept", koaBody(), async ctx => { + .post("/settings/invite/accept", koaBody(), async (ctx) => { const invite = String(ctx.request.body.invite); await meta.acceptInvite(invite); ctx.redirect("/settings"); @@ -781,7 +781,7 @@ const middleware = [ await next(); } }, - routes + routes, ]; http({ host, port, middleware }); diff --git a/src/models.js b/src/models.js index 5af947f..95d87df 100644 --- a/src/models.js +++ b/src/models.js @@ -18,11 +18,11 @@ const nullImage = `&${"0".repeat(43)}=.sha256`; const defaultOptions = { private: true, reverse: true, - meta: true + meta: true, }; const publicOnlyFilter = pull.filter( - message => lodash.get(message, "value.meta.private", false) === false + (message) => lodash.get(message, "value.meta.private", false) === false ); /** @param {object[]} customOptions */ @@ -55,16 +55,19 @@ module.exports = ({ cooler, isPublic }) => { { $filter: { dest: feedId, - value: { author: feedId, content: { type: "about", about: feedId } } - } - } - ] + value: { + author: feedId, + content: { type: "about", about: feedId }, + }, + }, + }, + ], }); return new Promise((resolve, reject) => pull( source, pull.find( - message => message.value.content[key] !== undefined, + (message) => message.value.content[key] !== undefined, (err, message) => { if (err) { reject(err); @@ -82,14 +85,14 @@ module.exports = ({ cooler, isPublic }) => { }; models.about = { - publicWebHosting: async feedId => { + publicWebHosting: async (feedId) => { const result = await getAbout({ key: "publicWebHosting", - feedId + feedId, }); return result === true; }, - name: async feedId => { + name: async (feedId) => { if (isPublic && (await models.about.publicWebHosting(feedId)) === false) { return "Redacted"; } @@ -97,18 +100,18 @@ module.exports = ({ cooler, isPublic }) => { return ( (await getAbout({ key: "name", - feedId + feedId, })) || feedId.slice(1, 1 + 8) ); // First 8 chars of public key }, - image: async feedId => { + image: async (feedId) => { if (isPublic && (await models.about.publicWebHosting(feedId)) === false) { return nullImage; } const raw = await getAbout({ key: "image", - feedId + feedId, }); if (raw == null || raw.link == null) { @@ -120,7 +123,7 @@ module.exports = ({ cooler, isPublic }) => { } return raw; }, - description: async feedId => { + description: async (feedId) => { if (isPublic && (await models.about.publicWebHosting(feedId)) === false) { return "Redacted"; } @@ -128,10 +131,10 @@ module.exports = ({ cooler, isPublic }) => { const raw = (await getAbout({ key: "description", - feedId + feedId, })) || ""; return raw; - } + }, }; models.blob = { @@ -146,17 +149,17 @@ module.exports = ({ cooler, isPublic }) => { // This does not wait for the blob. ssb.blobs.want(blobId); - } + }, }; models.friend = { - isFollowing: async feedId => { + isFollowing: async (feedId) => { const ssb = await cooler.open(); const { id } = ssb; const isFollowing = await ssb.friends.isFollowing({ source: id, - dest: feedId + dest: feedId, }); return isFollowing; }, @@ -166,24 +169,24 @@ module.exports = ({ cooler, isPublic }) => { const content = { type: "contact", contact: feedId, - following + following, }; return ssb.publish(content); }, - follow: async feedId => { + follow: async (feedId) => { const isFollowing = await models.friend.isFollowing(feedId); if (!isFollowing) { await models.friend.setFollowing({ feedId, following: true }); } }, - unfollow: async feedId => { + unfollow: async (feedId) => { const isFollowing = await models.friend.isFollowing(feedId); if (isFollowing) { await models.friend.setFollowing({ feedId, following: false }); } }, - getRelationship: async feedId => { + getRelationship: async (feedId) => { const ssb = await cooler.open(); const { id } = ssb; @@ -193,19 +196,19 @@ module.exports = ({ cooler, isPublic }) => { const isFollowing = await ssb.friends.isFollowing({ source: id, - dest: feedId + dest: feedId, }); const isBlocking = await ssb.friends.isBlocking({ source: id, - dest: feedId + dest: feedId, }); return { following: isFollowing, - blocking: isBlocking + blocking: isBlocking, }; - } + }, }; models.meta = { @@ -214,12 +217,12 @@ module.exports = ({ cooler, isPublic }) => { const { id } = ssb; return id; }, - get: async msgId => { + get: async (msgId) => { const ssb = await cooler.open(); return ssb.get({ id: msgId, meta: true, - private: true + private: true, }); }, status: async () => { @@ -269,44 +272,44 @@ module.exports = ({ cooler, isPublic }) => { await models.meta.connStop(); await models.meta.connStart(); }, - acceptInvite: async invite => { + acceptInvite: async (invite) => { const ssb = await cooler.open(); return await ssb.invite.accept(invite); - } + }, }; - const isPost = message => + const isPost = (message) => lodash.get(message, "value.content.type") === "post" && lodash.get(message, "value.content.text") != null; - const isLooseRoot = message => { + const isLooseRoot = (message) => { const conditions = [ isPost(message), lodash.get(message, "value.content.root") == null, - lodash.get(message, "value.content.fork") == null + lodash.get(message, "value.content.fork") == null, ]; - return conditions.every(x => x); + return conditions.every((x) => x); }; - const isLooseReply = message => { + const isLooseReply = (message) => { const conditions = [ isPost(message), lodash.get(message, "value.content.root") != null, - lodash.get(message, "value.content.fork") != null + lodash.get(message, "value.content.fork") != null, ]; - return conditions.every(x => x); + return conditions.every((x) => x); }; - const isLooseComment = message => { + const isLooseComment = (message) => { const conditions = [ isPost(message), lodash.get(message, "value.content.root") != null, - lodash.get(message, "value.content.fork") == null + lodash.get(message, "value.content.fork") == null, ]; - return conditions.every(x => x === true); + return conditions.every((x) => x === true); }; const maxMessages = 64; @@ -316,7 +319,7 @@ module.exports = ({ cooler, isPublic }) => { customOptions, ssb, query, - filter = null + filter = null, }) => { const options = configure({ query, index: "DTA" }, customOptions); @@ -328,7 +331,7 @@ module.exports = ({ cooler, isPublic }) => { source, basicSocialFilter, pull.filter( - msg => + (msg) => typeof msg.value.content !== "string" && msg.value.content.type === "post" && (filter == null || filter(msg) === true) @@ -356,12 +359,12 @@ module.exports = ({ cooler, isPublic }) => { const socialFilter = async ({ following = null, blocking = false, - me = null + me = null, } = {}) => { const ssb = await cooler.open(); const { id } = ssb; const relationshipObject = await ssb.friends.get({ - source: id + source: id, }); const followingList = Object.entries(relationshipObject) @@ -372,7 +375,7 @@ module.exports = ({ cooler, isPublic }) => { .filter(([, val]) => val === false) .map(([key]) => key); - return pull.filter(message => { + return pull.filter((message) => { if (message.value.author === id) { return me !== false; } else { @@ -387,7 +390,7 @@ module.exports = ({ cooler, isPublic }) => { }; const transform = (ssb, messages, myFeedId) => Promise.all( - messages.map(async msg => { + messages.map(async (msg) => { debug("transforming %s", msg.key); if (msg == null) { @@ -396,22 +399,22 @@ module.exports = ({ cooler, isPublic }) => { const filterQuery = { $filter: { - dest: msg.key - } + dest: msg.key, + }, }; const referenceStream = ssb.backlinks.read({ query: [filterQuery], index: "DTA", // use asserted timestamps private: true, - meta: true + meta: true, }); const rawVotes = await new Promise((resolve, reject) => { pull( referenceStream, pull.filter( - ref => + (ref) => typeof ref.value.content !== "string" && ref.value.content.type === "vote" && ref.value.content.vote && @@ -500,7 +503,7 @@ module.exports = ({ cooler, isPublic }) => { lodash.set(msg, "value.meta.author.name", name); lodash.set(msg, "value.meta.author.avatar", { id: avatarId, - url: avatarUrl + url: avatarUrl, }); const isPost = @@ -539,7 +542,7 @@ module.exports = ({ cooler, isPublic }) => { pull( source, pull.filter( - msg => + (msg) => lodash.get(msg, "value.meta.private", false) === false && msg.value.content.type === "post" ), @@ -564,9 +567,9 @@ module.exports = ({ cooler, isPublic }) => { const query = [ { $filter: { - dest: myFeedId - } - } + dest: myFeedId, + }, + }, ]; const messages = await getMessages({ @@ -574,9 +577,9 @@ module.exports = ({ cooler, isPublic }) => { customOptions, ssb, query, - filter: msg => + filter: (msg) => msg.value.author !== myFeedId && - lodash.get(msg, "value.meta.private") !== true + lodash.get(msg, "value.meta.private") !== true, }); return messages; @@ -589,16 +592,16 @@ module.exports = ({ cooler, isPublic }) => { const query = [ { $filter: { - dest: `#${hashtag}` - } - } + dest: `#${hashtag}`, + }, + }, ]; const messages = await getMessages({ myFeedId, customOptions, ssb, - query + query, }); return messages; @@ -611,9 +614,9 @@ module.exports = ({ cooler, isPublic }) => { const query = [ { $filter: { - dest: rootId - } - } + dest: rootId, + }, + }, ]; const messages = await getMessages({ @@ -621,8 +624,8 @@ module.exports = ({ cooler, isPublic }) => { customOptions, ssb, query, - filter: msg => - msg.value.content.root === rootId && msg.value.content.fork == null + filter: (msg) => + msg.value.content.root === rootId && msg.value.content.fork == null, }); return messages; @@ -637,17 +640,17 @@ module.exports = ({ cooler, isPublic }) => { author: feed, timestamp: { $lte: Date.now() }, content: { - type: "vote" - } - } - } - } + type: "vote", + }, + }, + }, + }, ]; const options = configure( { query, - reverse: true + reverse: true, }, customOptions ); @@ -657,7 +660,7 @@ module.exports = ({ cooler, isPublic }) => { const messages = await new Promise((resolve, reject) => { pull( source, - pull.filter(msg => { + pull.filter((msg) => { return ( typeof msg.value.content === "object" && msg.value.author === feed && @@ -688,7 +691,7 @@ module.exports = ({ cooler, isPublic }) => { const myFeedId = ssb.id; const options = configure({ - query + query, }); const source = await ssb.search.query(options); @@ -729,12 +732,12 @@ module.exports = ({ cooler, isPublic }) => { value: { timestamp: { $lte: Date.now() }, content: { - type: "post" - } - } - } - } - ] + type: "post", + }, + }, + }, + }, + ], }) ); const followingFilter = await socialFilter({ following: true }); @@ -770,18 +773,18 @@ module.exports = ({ cooler, isPublic }) => { value: { timestamp: { $lte: Date.now() }, content: { - type: "post" - } - } - } - } - ] + type: "post", + }, + }, + }, + }, + ], }) ); const extendedFilter = await socialFilter({ following: false, - me: false + me: false, }); const messages = await new Promise((resolve, reject) => { @@ -815,24 +818,24 @@ module.exports = ({ cooler, isPublic }) => { value: { timestamp: { $lte: Date.now() }, content: { - type: "post" - } - } - } - } - ] + type: "post", + }, + }, + }, + }, + ], }) ); const extendedFilter = await socialFilter({ - following: true + following: true, }); const messages = await new Promise((resolve, reject) => { pull( source, publicOnlyFilter, - pull.filter(message => message.value.content.root == null), + pull.filter((message) => message.value.content.root == null), extendedFilter, pull.take(maxMessages), pull.collect((err, collectedMessages) => { @@ -854,20 +857,20 @@ module.exports = ({ cooler, isPublic }) => { const options = configure({ type: "post", - private: false + private: false, }); const source = ssb.messagesByType(options); const extendedFilter = await socialFilter({ - following: true + following: true, }); const messages = await new Promise((resolve, reject) => { pull( source, pull.filter( - message => + (message) => typeof message.value.content !== "string" && message.value.content.root == null ), @@ -903,7 +906,7 @@ module.exports = ({ cooler, isPublic }) => { day: 1, week: 7, month: 30.42, - year: 365 + year: 365, }; if (period in periodDict === false) { @@ -923,12 +926,12 @@ module.exports = ({ cooler, isPublic }) => { value: { timestamp: { $gte: earliest }, content: { - type: "vote" - } - } - } - } - ] + type: "vote", + }, + }, + }, + }, + ], }) ); const basicSocialFilter = await socialFilter(); @@ -937,7 +940,7 @@ module.exports = ({ cooler, isPublic }) => { pull( source, publicOnlyFilter, - pull.filter(msg => { + pull.filter((msg) => { return ( typeof msg.value.content === "object" && typeof msg.value.content.vote === "object" && @@ -1008,7 +1011,7 @@ module.exports = ({ cooler, isPublic }) => { }), // avoid private messages (!) and non-posts pull.filter( - message => + (message) => message && typeof message.value.content !== "string" && message.value.content.type === "post" @@ -1038,12 +1041,12 @@ module.exports = ({ cooler, isPublic }) => { const options = configure({ id: msgId }, customOptions); return ssb .get(options) - .then(async rawMsg => { + .then(async (rawMsg) => { debug("got raw message"); const parents = []; - const getRootAncestor = msg => + const getRootAncestor = (msg) => new Promise((resolve, reject) => { if (msg.key == null) { debug("something is very wrong, we used `{ meta: true }`"); @@ -1070,9 +1073,9 @@ module.exports = ({ cooler, isPublic }) => { .get({ id: msg.value.content.fork, meta: true, - private: true + private: true, }) - .then(fork => { + .then((fork) => { resolve(getRootAncestor(fork)); }) .catch(reject); @@ -1091,9 +1094,9 @@ module.exports = ({ cooler, isPublic }) => { .get({ id: msg.value.content.root, meta: true, - private: true + private: true, }) - .then(root => { + .then((root) => { resolve(getRootAncestor(root)); }) .catch(reject); @@ -1116,21 +1119,21 @@ module.exports = ({ cooler, isPublic }) => { } }); - const getReplies = key => + const getReplies = (key) => new Promise((resolve, reject) => { const filterQuery = { $filter: { - dest: key - } + dest: key, + }, }; const referenceStream = ssb.backlinks.read({ query: [filterQuery], - index: "DTA" // use asserted timestamps + index: "DTA", // use asserted timestamps }); pull( referenceStream, - pull.filter(msg => { + pull.filter((msg) => { const isPost = lodash.get(msg, "value.content.type") === "post"; if (isPost === false) { @@ -1164,7 +1167,7 @@ module.exports = ({ cooler, isPublic }) => { }); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat - const flattenDeep = arr1 => + const flattenDeep = (arr1) => arr1.reduce( (acc, val) => Array.isArray(val) @@ -1173,13 +1176,13 @@ module.exports = ({ cooler, isPublic }) => { [] ); - const getDeepReplies = key => + const getDeepReplies = (key) => new Promise((resolve, reject) => { const oneDeeper = async (replyKey, depth) => { const replies = await getReplies(replyKey); debug( "replies", - replies.map(m => m.key) + replies.map((m) => m.key) ); debug("found %s replies for %s", replies.length, replyKey); @@ -1188,7 +1191,7 @@ module.exports = ({ cooler, isPublic }) => { return replies; } return Promise.all( - replies.map(async reply => { + replies.map(async (reply) => { const deeperReplies = await oneDeeper(reply.key, depth + 1); lodash.set(reply, "value.meta.thread.depth", depth); lodash.set(reply, "value.meta.thread.reply", true); @@ -1197,7 +1200,7 @@ module.exports = ({ cooler, isPublic }) => { ); }; oneDeeper(key, 0) - .then(nested => { + .then((nested) => { const nestedReplies = [...nested]; const deepReplies = flattenDeep(nestedReplies); resolve(deepReplies); @@ -1211,7 +1214,7 @@ module.exports = ({ cooler, isPublic }) => { const deepReplies = await getDeepReplies(rootAncestor.key); debug("got deep replies"); - const allMessages = [rootAncestor, ...deepReplies].map(message => { + const allMessages = [rootAncestor, ...deepReplies].map((message) => { const isThreadTarget = message.key === msgId; lodash.set(message, "value.meta.thread.target", isThreadTarget); return message; @@ -1219,7 +1222,7 @@ module.exports = ({ cooler, isPublic }) => { return await transform(ssb, allMessages, myFeedId); }) - .catch(err => { + .catch((err) => { if (err.name === "NotFoundError") { throw new Error( "Message not found in the database. You've done nothing wrong. Maybe try again later?" @@ -1243,7 +1246,7 @@ module.exports = ({ cooler, isPublic }) => { debug("transformed: %O", transformed); return transformed[0]; }, - publish: async options => { + publish: async (options) => { const ssb = await cooler.open(); const body = { type: "post", ...options }; @@ -1269,7 +1272,7 @@ module.exports = ({ cooler, isPublic }) => { return new Promise((resolve, reject) => { pull( pull.values([image]), - ssb.blobs.add(blobId, err => { + ssb.blobs.add(blobId, (err) => { if (err) { reject(err); } else { @@ -1278,7 +1281,7 @@ module.exports = ({ cooler, isPublic }) => { about: ssb.id, name, description, - image: blobId + image: blobId, }; debug("Published: %O", body); resolve(ssb.publish(body)); @@ -1292,7 +1295,7 @@ module.exports = ({ cooler, isPublic }) => { return ssb.publish(body); } }, - publishCustom: async options => { + publishCustom: async (options) => { const ssb = await cooler.open(); debug("Published: %O", options); return ssb.publish(options); @@ -1310,7 +1313,7 @@ module.exports = ({ cooler, isPublic }) => { return post.publish(message); }, - root: async options => { + root: async (options) => { const message = { type: "post", ...options }; if (isRoot(message) !== true) { @@ -1333,7 +1336,7 @@ module.exports = ({ cooler, isPublic }) => { if (isPrivate) { message.recps = lodash .get(parent, "value.content.recps", []) - .map(recipient => { + .map((recipient) => { if ( typeof recipient === "object" && typeof recipient.link === "string" && @@ -1379,7 +1382,7 @@ module.exports = ({ cooler, isPublic }) => { const options = configure( { - query: [{ $filter: { dest: ssb.id } }] + query: [{ $filter: { dest: ssb.id } }], }, customOptions ); @@ -1391,12 +1394,12 @@ module.exports = ({ cooler, isPublic }) => { source, // Make sure we're only getting private messages that are posts. pull.filter( - message => + (message) => typeof message.value.content !== "string" && lodash.get(message, "value.meta.private") && lodash.get(message, "value.content.type") === "post" ), - pull.unique(message => { + pull.unique((message) => { const { root } = message.value.content; if (root == null) { return message.key; @@ -1416,7 +1419,7 @@ module.exports = ({ cooler, isPublic }) => { }); return messages; - } + }, }; models.post = post; @@ -1430,12 +1433,12 @@ module.exports = ({ cooler, isPublic }) => { type: "vote", vote: { link: messageKey, - value: Number(value) + value: Number(value), }, branch, - recps + recps, }); - } + }, }; return models; diff --git a/src/ssb.js b/src/ssb.js index 119e39b..dbde980 100644 --- a/src/ssb.js +++ b/src/ssb.js @@ -18,7 +18,7 @@ const remote = `unix:${socketPath}~noauth:${publicInteger}`; // This is unnecessary when https://github.com/ssbc/ssb-config/pull/72 is merged ssbConfig.connections.incoming.unix = [ - { scope: "device", transform: "noauth" } + { scope: "device", transform: "noauth" }, ]; const server = flotilla(ssbConfig); @@ -33,7 +33,7 @@ const log = (...args) => { const rawConnect = () => new Promise((resolve, reject) => { ssbClient(null, { remote }) - .then(api => { + .then((api) => { if (api.tangle === undefined) { // HACK: SSB-Tangle isn't available in Patchwork, but we want that // compatibility. This code automatically injects SSB-Tangle into our @@ -53,14 +53,14 @@ const rawConnect = () => let handle; -const createConnection = config => { - handle = new Promise(resolve => { +const createConnection = (config) => { + handle = new Promise((resolve) => { rawConnect() - .then(ssb => { + .then((ssb) => { log("Using pre-existing Scuttlebutt server instead of starting one"); resolve(ssb); }) - .catch(e => { + .catch((e) => { if (e.message !== "could not connect to sbot") { throw e; } @@ -69,11 +69,11 @@ const createConnection = config => { server(config); const connectOrRetry = () => { rawConnect() - .then(ssb => { + .then((ssb) => { log("Retrying connection to own server"); resolve(ssb); }) - .catch(e => { + .catch((e) => { if (e.message !== "could not connect to sbot") { log(e); } @@ -98,8 +98,8 @@ module.exports = ({ offline }) => { const config = { conn: { - autostart: !offline - } + autostart: !offline, + }, }; createConnection(config); @@ -117,14 +117,14 @@ module.exports = ({ offline }) => { // If the connection is closed, we need to restart it. It's important to // note that if we're depending on an external service (like Patchwork) and // that app is closed, then Oasis will seamlessly start its own SSB service. - return new Promise(resolve => { - handle.then(ssb => { + return new Promise((resolve) => { + handle.then((ssb) => { if (ssb.closed) { createConnection(); } resolve(handle); }); }); - } + }, }; }; diff --git a/src/views/i18n.js b/src/views/i18n.js index b6d088b..c91aaeb 100644 --- a/src/views/i18n.js +++ b/src/views/i18n.js @@ -7,7 +7,7 @@ module.exports = { extendedDescription: [ "Posts from ", strong("people you don't follow"), - ", sorted by recency. When you follow someone you may download messages from the people they follow, and those messages show up here." + ", sorted by recency. When you follow someone you may download messages from the people they follow, and those messages show up here.", ], popular: "Popular", popularDescription: [ @@ -15,7 +15,7 @@ module.exports = { strong("hearts"), " in a given period. Hearts are counted from ", em("everyone"), - ", including people you don't follow, so this shows posts from your friends that are popular in your extended network." + ", including people you don't follow, so this shows posts from your friends that are popular in your extended network.", ], latest: "Latest", latestDescription: @@ -23,12 +23,12 @@ module.exports = { topics: "Topics", topicsDescription: [ strong("Topics"), - " from yourself and people you follow, sorted by recency. Select the timestamp of any post to see the rest of the thread." + " from yourself and people you follow, sorted by recency. Select the timestamp of any post to see the rest of the thread.", ], summaries: "Summaries", summariesDescription: [ strong("Topics and some comments"), - " from yourself and people you follow, sorted by recency. Select the timestamp of any post to see the rest of the thread." + " from yourself and people you follow, sorted by recency. Select the timestamp of any post to see the rest of the thread.", ], profile: "Profile", manualMode: "Manual Mode", @@ -37,13 +37,13 @@ module.exports = { strong("Posts that mention you"), " from ", strong("anyone"), - " sorted by recency. Sometimes people may forget to @mention you, and those posts won't show up here." + " sorted by recency. Sometimes people may forget to @mention you, and those posts won't show up here.", ], private: "Private", privateDescription: [ "The latest comment from ", strong("private threads that include you"), - ", sorted by recency. Private posts are encrypted for your public key, and have a maximum of 7 recipients. Recipients cannot be added after the thread has started. Select the timestamp to view the full thread." + ", sorted by recency. Private posts are encrypted for your public key, and have a maximum of 7 recipients. Recipients cannot be added after the thread has started. Select the timestamp to view the full thread.", ], search: "Search", settings: "Settings", @@ -69,12 +69,12 @@ module.exports = { publishCustomDescription: [ "Publish a custom message by entering ", a({ href: "https://en.wikipedia.org/wiki/JSON" }, "JSON"), - " below. This may be useful for prototyping or publishing messages that Oasis doesn't support. This message cannot be edited or deleted." + " below. This may be useful for prototyping or publishing messages that Oasis doesn't support. This message cannot be edited or deleted.", ], commentWarning: [ " Comments cannot be edited or deleted. To respond to an individual message, select ", strong("reply"), - " instead." + " instead.", ], commentPublic: "public", commentPrivate: "private", @@ -83,28 +83,28 @@ module.exports = { strong(`${publicOrPrivate} comment`), " on this thread with ", a({ href: markdownUrl }, "Markdown"), - "." + ".", ], publishLabel: ({ markdownUrl, linkTarget }) => [ "Write a new public post in ", a( { href: markdownUrl, - target: linkTarget + target: linkTarget, }, "Markdown" ), - ". Posts cannot be edited or deleted." + ". Posts cannot be edited or deleted.", ], publishCustomInfo: ({ href }) => [ "If you're an advanced user, you can also ", a({ href }, "publish a custom message"), - "." + ".", ], publishBasicInfo: ({ href }) => [ "If you're not an advanced user, you should ", a({ href }, "publish a post"), - "." + ".", ], publishCustom: "Publish custom", @@ -115,13 +115,13 @@ module.exports = { a({ href: markdownUrl }, "Markdown"), ". Messages cannot be edited or deleted. To respond to an entire thread, select ", strong("comment"), - " instead." + " instead.", ], // settings settingsIntro: ({ readmeUrl, version }) => [ `You're using Oasis ${version}. Check out `, a({ href: readmeUrl }, "the readme"), - ", configure your theme, or view debugging information below." + ", configure your theme, or view debugging information below.", ], theme: "Theme", themeIntro: @@ -152,11 +152,11 @@ module.exports = { // posts and comments commentDescription: ({ parentUrl }) => [ "commented on ", - a({ href: parentUrl }, " thread") + a({ href: parentUrl }, " thread"), ], replyDescription: ({ parentUrl }) => [ "replied to ", - a({ href: parentUrl }, " message") + a({ href: parentUrl }, " message"), ], mysteryDescription: "posted a mysterious message", // misc @@ -169,7 +169,7 @@ module.exports = { profileImage: "Profile image", profileDescription: "Profile description (Markdown)", hashtagDescription: - "Posts from people in your network that reference this hashtag, sorted by recency." + "Posts from people in your network that reference this hashtag, sorted by recency.", }, /* spell-checker: disable */ es: { @@ -182,7 +182,7 @@ module.exports = { extendedDescription: [ "Publicaciones de ", strong("personas que no seguís"), - ", ordenadas por las más recientes. Quando seguís una persona poderás descargar publicaciones de otras personas que esta siga y esos mensajes aparecen aquí." + ", ordenadas por las más recientes. Quando seguís una persona poderás descargar publicaciones de otras personas que esta siga y esos mensajes aparecen aquí.", ], popular: "Populares", popularDescription: [ @@ -190,32 +190,32 @@ module.exports = { strong("Me Gusta"), " en determinados periodos. Se cuentan los Me Gusta de ", em("todos"), - ", incluindo aquellos que no seguís. Esta es una lista de publicaciones más populares de tu red de contacto." + ", incluindo aquellos que no seguís. Esta es una lista de publicaciones más populares de tu red de contacto.", ], latestDescription: "Publicaciones que aquellos que seguís, ordenadas por las más recientes.", topics: "Topicos", topicsDescription: [ strong("Topicos"), - " de las personas que seguís, ordenadas por las más recientes. Seleccioná la hora de una publicación para leer el hilo completo." + " de las personas que seguís, ordenadas por las más recientes. Seleccioná la hora de una publicación para leer el hilo completo.", ], summaries: "Resumen", summariesDescription: [ strong("Topicos y algunos comentarios"), - " de las personas que seguís, ordenadas por las más recientes. Seleccioná la hora de una publicación para leer el hilo completo." + " de las personas que seguís, ordenadas por las más recientes. Seleccioná la hora de una publicación para leer el hilo completo.", ], manualMode: "Modo manual", mentions: "Menciones", mentionsDescription: [ strong("Publicaciones de "), strong("cualquier persona"), - " que te mencionan, ordenadas por las más recientes. Solo figuran menciones en el formato @mención." + " que te mencionan, ordenadas por las más recientes. Solo figuran menciones en el formato @mención.", ], private: "Privado", privateDescription: [ "Los comentarios más recientes de ", strong("hilos privados que te incluyen"), - ". Las publicaciones privadas están encriptadas para tu llave privada, y contienen el máximo de 7 destinatarios. No se podrán adicionar nuevos destinarios después que empieze el hilo. Seleccioná la hora de una publicación para leer el hilo completo." + ". Las publicaciones privadas están encriptadas para tu llave privada, y contienen el máximo de 7 destinatarios. No se podrán adicionar nuevos destinarios después que empieze el hilo. Seleccioná la hora de una publicación para leer el hilo completo.", ], // post actions comment: "Comentar", @@ -239,12 +239,12 @@ module.exports = { publishCustomDescription: [ "Compone un mensaje custom usando ", a({ href: "https://en.wikipedia.org/wiki/JSON" }, "JSON"), - ". Esto puede ser util para prototipar o componer tipos de mensaje que Oasis aún no soporta. Este mensaje no podrá ser editado o borrado." + ". Esto puede ser util para prototipar o componer tipos de mensaje que Oasis aún no soporta. Este mensaje no podrá ser editado o borrado.", ], commentWarning: [ " Los mensajes no podrán ser editados o borrados. Para responde a mensajes, seleccione ", strong("Responder"), - "." + ".", ], commentPublic: "publico", commentPrivate: "privado", @@ -253,28 +253,28 @@ module.exports = { strong(`${publicOrPrivate} comentário`), " con ", a({ href: markdownUrl }, "Markdown"), - " en este hilo." + " en este hilo.", ], publishLabel: ({ markdownUrl, linkTarget }) => [ "Escribí mensaje publico con ", a( { href: markdownUrl, - target: linkTarget + target: linkTarget, }, "Markdown" ), - ". Los mensajes no podrán ser editados o borrados." + ". Los mensajes no podrán ser editados o borrados.", ], publishCustomInfo: ({ href }) => [ "Si sos un usário avanzado, podrás ", a({ href }, "publicar un mensaje custom"), - "." + ".", ], publishBasicInfo: ({ href }) => [ "Si no sos un usuário avanzado, podés ", a({ href }, "publicar un mensaje basico."), - "." + ".", ], publishCustom: "Publicar custom", @@ -285,13 +285,13 @@ module.exports = { a({ href: markdownUrl }, "Markdown"), ". Los mensajes no podrán ser editados o borrados. Para responder a todo un hilo, seleccioná ", strong("comentário"), - "." + ".", ], // settings settingsIntro: ({ readmeUrl, version }) => [ `Estás usando Oasis ${version}. Leé `, a({ href: readmeUrl }, "el Readme"), - ", configura un tema, o consultá información de debug abajo." + ", configura un tema, o consultá información de debug abajo.", ], theme: "Tema", themeIntro: @@ -323,11 +323,11 @@ module.exports = { // posts and comments commentDescription: ({ parentUrl }) => [ "comentado en el hilo ", - a({ href: parentUrl }, "") + a({ href: parentUrl }, ""), ], replyDescription: ({ parentUrl }) => [ "respondido al mensaje ", - a({ href: parentUrl }, "") + a({ href: parentUrl }, ""), ], mysteryDescription: "publicó un mensaje misterioso", // misc @@ -340,14 +340,14 @@ module.exports = { profileImage: "Imagen de perfil", profileDescription: "Descripción de perfil (Markdown)", hashtagDescription: - "Publicaciones de personas en tu red que mencionan este hashtag, ordenadas por las más recientes." + "Publicaciones de personas en tu red que mencionan este hashtag, ordenadas por las más recientes.", }, de: { extended: "Erweitert", extendedDescription: [ "Beiträge von ", strong("Leuten denen du nicht folgst"), - ", sortiert nach Aktualität. Wenn du jemandem folgst lädst du eventuell auch Beiträge von Leuten herunter denen diese Person folgt, hier erscheinen diese Beiträge." + ", sortiert nach Aktualität. Wenn du jemandem folgst lädst du eventuell auch Beiträge von Leuten herunter denen diese Person folgt, hier erscheinen diese Beiträge.", ], popular: "Beliebt", popularDescription: [ @@ -355,7 +355,7 @@ module.exports = { strong("Herzen"), " in der angegebenen Periode. Herzen werden von ", em("jedem"), - " gezählt, auch von Personen denen du nicht folgst. D.h. hier werden Beiträge von deinen Freund*innen angezeigt die in deinem erweiterten Netzwerk populär sind." + " gezählt, auch von Personen denen du nicht folgst. D.h. hier werden Beiträge von deinen Freund*innen angezeigt die in deinem erweiterten Netzwerk populär sind.", ], latest: "Aktuell", latestDescription: @@ -363,12 +363,12 @@ module.exports = { topics: "Themen", topicsDescription: [ strong("Themen"), - " von Leuten denen du folgst, sortiert nach Aktualität. Klicke auf den Zeitstempel eines Beitrages um den Rest des Threads zu sehen." + " von Leuten denen du folgst, sortiert nach Aktualität. Klicke auf den Zeitstempel eines Beitrages um den Rest des Threads zu sehen.", ], summaries: "Übersicht", summariesDescription: [ strong("Themen und einige Kommentare"), - " von Leuten denen du folgst, sortiert nach Aktualität. Klicke auf den Zeitstempel eines Beitrages um den Rest des Threads zu sehen." + " von Leuten denen du folgst, sortiert nach Aktualität. Klicke auf den Zeitstempel eines Beitrages um den Rest des Threads zu sehen.", ], profile: "Profil", manualMode: "Manueller Modus", @@ -377,13 +377,13 @@ module.exports = { strong("Beiträge in denen du erwähnt wirst"), " von ", strong("allen"), - ", sortiert nach Aktualität. Manchmal vergessen Leute dich zu @erwähnen, diese Beiträge werden hier nicht erscheinen." + ", sortiert nach Aktualität. Manchmal vergessen Leute dich zu @erwähnen, diese Beiträge werden hier nicht erscheinen.", ], private: "Privat", privateDescription: [ "Die letzten Kommentare aus ", strong("privaten Threads die dich beinhalten"), - ", sortiert nach Aktualität. Private Beiträge werden mit deinem öffentlichen Schlüssel verschlüsselt und haben maximal 7 Empfänger*innen. Empfänger*innen können nicht hinzugefügt werden nachdem ein Thread gestartet wurde. Klicke auf den Zeitstämpel um einen komplette Thread anzuzeigen." + ", sortiert nach Aktualität. Private Beiträge werden mit deinem öffentlichen Schlüssel verschlüsselt und haben maximal 7 Empfänger*innen. Empfänger*innen können nicht hinzugefügt werden nachdem ein Thread gestartet wurde. Klicke auf den Zeitstämpel um einen komplette Thread anzuzeigen.", ], search: "Suche", settings: "Einstellungen", @@ -409,12 +409,12 @@ module.exports = { publishCustomDescription: [ "Veröffentliche eine benutzerdefinierte Nachricht durch das Eingeben von ", a({ href: "https://en.wikipedia.org/wiki/JSON" }, "JSON"), - " unten. Dies kann zum Prototyping oder dem veröffentlichen von Nachrichten die Oasis nicht unterstützt nützlich sein. Diese Nachricht kann nicht bearbeitet oder gelöscht werden." + " unten. Dies kann zum Prototyping oder dem veröffentlichen von Nachrichten die Oasis nicht unterstützt nützlich sein. Diese Nachricht kann nicht bearbeitet oder gelöscht werden.", ], commentWarning: [ " Nachrichten können nicht bearbeitet oder gelöscht werden. Um auf eine einzelne Nachricht zu antworten, wähle ", strong("antworten"), - " stattdessen." + " stattdessen.", ], commentPublic: "öffentlichen", commentPrivate: "privaten", @@ -423,28 +423,28 @@ module.exports = { strong(`${publicOrPrivate} Kommentar`), " in diesem Thread mit ", a({ href: markdownUrl }, "Markdown"), - "." + ".", ], publishLabel: ({ markdownUrl, linkTarget }) => [ "Verfasse einen neuen öffentlichen Beitrag in ", a( { href: markdownUrl, - target: linkTarget + target: linkTarget, }, "Markdown" ), - ". Beiträge können nicht bearbeitet oder gelöscht werden." + ". Beiträge können nicht bearbeitet oder gelöscht werden.", ], publishCustomInfo: ({ href }) => [ "Wenn du ein erfahrener Benutzer bist kannst du auch ", a({ href }, "eine benutzerdefinierte Nachricht veröffentlichen"), - "." + ".", ], publishBasicInfo: ({ href }) => [ "Wenn du kein erfahrener Benutzer bist, solltest du ", a({ href }, "einen einfachen Beitrag veröffentlichen"), - "." + ".", ], publishCustom: "Benutzerdefinierte Veröffentlichung", replyLabel: ({ markdownUrl }) => [ @@ -454,13 +454,13 @@ module.exports = { a({ href: markdownUrl }, "Markdown"), ". Nachrichten können nicht bearbeitet oder gelöscht werden. Um auf einen kompletten Thread zu antworten, klicke auf ", strong("kommentieren"), - " stattdessen." + " stattdessen.", ], // settings settingsIntro: ({ readmeUrl, version }) => [ `Du verwendest Oasis ${version}. Lese `, a({ href: readmeUrl }, "die Readme"), - ", konfiguriere dein Theme oder schaue dir Debugging-Informationen weiter unten an." + ", konfiguriere dein Theme oder schaue dir Debugging-Informationen weiter unten an.", ], theme: "Theme", themeIntro: @@ -491,11 +491,11 @@ module.exports = { // posts and comments commentDescription: ({ parentUrl }) => [ "kommentierte auf ", - a({ href: parentUrl }, " Thread") + a({ href: parentUrl }, " Thread"), ], replyDescription: ({ parentUrl }) => [ "antwortete auf ", - a({ href: parentUrl }, " Nachricht") + a({ href: parentUrl }, " Nachricht"), ], mysteryDescription: "veröffentlichte eine mysteriöse Nachricht", // misc @@ -507,6 +507,6 @@ module.exports = { profileName: "Profilname (Text)", profileDescription: "Profilbeschreibung (Markdown)", hashtagDescription: - "Beiträge von Leuten in deinem Netzwerk die dieses Hashtag referenzieren, sortiert nach Aktualität." - } + "Beiträge von Leuten in deinem Netzwerk die dieses Hashtag referenzieren, sortiert nach Aktualität.", + }, }; diff --git a/src/views/index.js b/src/views/index.js index c15d7a5..9fbd747 100644 --- a/src/views/index.js +++ b/src/views/index.js @@ -38,7 +38,7 @@ const { summary, textarea, title, - ul + ul, } = require("hyperaxe"); const lodash = require("lodash"); @@ -50,7 +50,7 @@ const i18nBase = require("./i18n"); let i18n = null; let selectedLanguage = null; -exports.setLanguage = language => { +exports.setLanguage = (language) => { selectedLanguage = language; i18n = Object.assign({}, i18nBase.en, i18nBase[language]); }; @@ -60,7 +60,7 @@ const doctypeString = ""; const THREAD_PREVIEW_LENGTH = 3; -const toAttributes = obj => +const toAttributes = (obj) => Object.entries(obj) .map(([key, val]) => `${key}=${val}`) .join(", "); @@ -83,11 +83,11 @@ const template = (...elements) => { meta({ charset: "utf-8" }), meta({ name: "description", - content: i18n.oasisDescription + content: i18n.oasisDescription, }), meta({ name: "viewport", - content: toAttributes({ width: "device-width", "initial-scale": 1 }) + content: toAttributes({ width: "device-width", "initial-scale": 1 }), }) ), body( @@ -96,28 +96,28 @@ const template = (...elements) => { navLink({ href: "/publish", emoji: "📝", - text: i18n.publish + text: i18n.publish, }), navLink({ href: "/public/latest/extended", emoji: "🗺️", - text: i18n.extended + text: i18n.extended, }), navLink({ href: "/public/popular/day", emoji: "📣", - text: i18n.popular + text: i18n.popular, }), navLink({ href: "/public/latest", emoji: "🐇", text: i18n.latest }), navLink({ href: "/public/latest/topics", emoji: "📖", - text: i18n.topics + text: i18n.topics, }), navLink({ href: "/public/latest/summaries", emoji: "🗒️", - text: i18n.summaries + text: i18n.summaries, }), navLink({ href: "/profile", emoji: "🐱", text: i18n.profile }), navLink({ href: "/mentions", emoji: "💬", text: i18n.mentions }), @@ -135,11 +135,11 @@ const template = (...elements) => { return result; }; -const postInAside = msg => { +const postInAside = (msg) => { const encoded = { key: encodeURIComponent(msg.key), author: encodeURIComponent(msg.value.author), - parent: encodeURIComponent(msg.value.content.root) + parent: encodeURIComponent(msg.value.content.root), }; const url = { @@ -150,7 +150,7 @@ const postInAside = msg => { avatar: msg.value.meta.author.avatar.url, json: `/json/${encoded.key}`, reply: `/reply/${encoded.key}`, - comment: `/comment/${encoded.key}` + comment: `/comment/${encoded.key}`, }; const isPrivate = Boolean(msg.value.meta.private); @@ -197,16 +197,16 @@ const postInAside = msg => { post: null, comment: i18n.commentDescription({ parentUrl: url.parent }), reply: i18n.replyDescription({ parentUrl: url.parent }), - mystery: i18n.mysteryDescription + mystery: i18n.mysteryDescription, }; - const isMarkdownEmpty = md => md === "

undefined

\n"; + const isMarkdownEmpty = (md) => md === "

undefined

\n"; const articleElement = isMarkdownEmpty(markdownContent) ? article( { class: "content" }, pre({ innerHTML: highlightJs.highlight("json", JSON.stringify(msg, null, 2)) - .value + .value, }) ) : article({ class: "content", innerHTML: markdownContent }); @@ -217,7 +217,7 @@ const postInAside = msg => { return section( { - class: messageClasses.join(" ") + class: messageClasses.join(" "), }, header( span( @@ -244,7 +244,7 @@ const postInAside = msg => { name: "voteValue", type: "submit", value: likeButton.value, - class: likeButton.class + class: likeButton.class, }, `❤ ${likeCount}` ) @@ -267,7 +267,7 @@ const postInAside = msg => { const continueThreadComponent = (thread, isComment) => { const encoded = { next: encodeURIComponent(thread[THREAD_PREVIEW_LENGTH + 1].key), - parent: encodeURIComponent(thread[0].key) + parent: encodeURIComponent(thread[0].key), }; const left = thread.length - (THREAD_PREVIEW_LENGTH + 1); let continueLink; @@ -301,7 +301,7 @@ const postAside = ({ key, value }) => { let postsToShow; if (isComment) { - const commentPosition = thread.findIndex(msg => msg.key === key); + const commentPosition = thread.findIndex((msg) => msg.key === key); postsToShow = thread.slice( commentPosition + 1, Math.min(commentPosition + (THREAD_PREVIEW_LENGTH + 1), thread.length) @@ -326,7 +326,7 @@ const post = ({ msg, aside = false }) => { const encoded = { key: encodeURIComponent(msg.key), author: encodeURIComponent(msg.value.author), - parent: encodeURIComponent(msg.value.content.root) + parent: encodeURIComponent(msg.value.content.root), }; const url = { @@ -337,7 +337,7 @@ const post = ({ msg, aside = false }) => { avatar: msg.value.meta.author.avatar.url, json: `/json/${encoded.key}`, reply: `/reply/${encoded.key}`, - comment: `/comment/${encoded.key}` + comment: `/comment/${encoded.key}`, }; const isPrivate = Boolean(msg.value.meta.private); @@ -390,7 +390,7 @@ const post = ({ msg, aside = false }) => { post: null, comment: i18n.commentDescription({ parentUrl: url.parent }), reply: i18n.replyDescription({ parentUrl: url.parent }), - mystery: i18n.mysteryDescription + mystery: i18n.mysteryDescription, }; const emptyContent = "

undefined

\n"; @@ -402,7 +402,7 @@ const post = ({ msg, aside = false }) => { innerHTML: highlightJs.highlight( "json", JSON.stringify(msg, null, 2) - ).value + ).value, }) ) : article({ class: "content", innerHTML: markdownContent }); @@ -415,7 +415,7 @@ const post = ({ msg, aside = false }) => { { id: msg.key, class: messageClasses.join(" "), - style: `margin-left: ${depth}rem;` + style: `margin-left: ${depth}rem;`, }, header( span( @@ -454,7 +454,7 @@ const post = ({ msg, aside = false }) => { name: "voteValue", type: "submit", value: likeButton.value, - class: likeButton.class + class: likeButton.class, }, `❤ ${likeCount}` ) @@ -481,7 +481,7 @@ exports.editProfileView = ({ name, description }) => { action: "/profile/edit", method: "POST", - enctype: "multipart/form-data" + enctype: "multipart/form-data", }, label( i18n.profileImage, @@ -493,14 +493,14 @@ exports.editProfileView = ({ name, description }) => textarea( { autofocus: true, - name: "description" + name: "description", }, description ) ), button( { - type: "submit" + type: "submit", }, i18n.submit ) @@ -514,7 +514,7 @@ exports.authorView = ({ feedId, messages, name, - relationship + relationship, }) => { const mention = `[@${name}](${feedId})`; const markdownMention = highlightJs.highlight("markdown", mention).value; @@ -532,11 +532,11 @@ exports.authorView = ({ : form( { action: `/${contactFormType}/${encodeURIComponent(feedId)}`, - method: "post" + method: "post", }, button( { - type: "submit" + type: "submit", }, contactFormType ) @@ -579,7 +579,7 @@ exports.authorView = ({ ), pre({ class: "md-mention", - innerHTML: markdownMention + innerHTML: markdownMention, }), description !== "" ? article({ innerHTML: markdown(description) }) : null, footer( @@ -594,7 +594,7 @@ exports.authorView = ({ return template( prefix, - messages.map(msg => post({ msg })) + messages.map((msg) => post({ msg })) ); }; @@ -602,7 +602,7 @@ exports.commentView = async ({ messages, myFeedId, parentMessage }) => { let markdownMention; const messageElements = await Promise.all( - messages.reverse().map(message => { + messages.reverse().map((message) => { debug("%O", message); const authorName = message.value.meta.author.name; const authorFeedId = message.value.author; @@ -636,13 +636,13 @@ exports.commentView = async ({ messages, myFeedId, parentMessage }) => { { autofocus: true, required: true, - name: "text" + name: "text", }, isPrivate ? null : markdownMention ), button( { - type: "submit" + type: "submit", }, i18n.comment ) @@ -654,7 +654,7 @@ exports.mentionsView = ({ messages }) => { return messageListView({ messages, viewTitle: i18n.mentions, - viewDescription: i18n.mentionsDescription + viewDescription: i18n.mentionsDescription, }); }; @@ -662,7 +662,7 @@ exports.privateView = ({ messages }) => { return messageListView({ messages, viewTitle: i18n.private, - viewDescription: i18n.privateDescription + viewDescription: i18n.privateDescription, }); }; @@ -680,7 +680,7 @@ exports.publishCustomView = async () => { { autofocus: true, required: true, - name: "text" + name: "text", }, "{\n", ' "type": "test",\n', @@ -689,7 +689,7 @@ exports.publishCustomView = async () => { ), button( { - type: "submit" + type: "submit", }, i18n.submit ) @@ -700,7 +700,7 @@ exports.publishCustomView = async () => { }; exports.threadView = ({ messages }) => - template(messages.map(msg => post({ msg }))); + template(messages.map((msg) => post({ msg }))); exports.markdownView = ({ text }) => { const rawHtml = md.render(text); @@ -726,7 +726,7 @@ exports.publishView = () => { name: "contentWarning", type: "text", class: "contentWarning", - placeholder: i18n.contentWarningPlaceholder + placeholder: i18n.contentWarningPlaceholder, }) ), button({ type: "submit" }, i18n.submit) @@ -739,7 +739,7 @@ exports.publishView = () => { exports.settingsView = ({ status, peers, theme, themeNames, version }) => { const max = status.sync.since; - const progressElements = Object.entries(status.sync.plugins).map(e => { + const progressElements = Object.entries(status.sync.plugins).map((e) => { const [key, val] = e; const id = `progress-${key}`; return div(label(key, progress({ id, value: val, max }, val))); @@ -763,7 +763,7 @@ exports.settingsView = ({ status, peers, theme, themeNames, version }) => { const connButtons = div({ class: "form-button-group" }, [ startButton, restartButton, - stopButton + stopButton, ]); const peerList = (peers || []).map(([, data]) => { @@ -775,7 +775,7 @@ exports.settingsView = ({ status, peers, theme, themeNames, version }) => { ); }); - const themeElements = themeNames.map(cur => { + const themeElements = themeNames.map((cur) => { const isCurrentTheme = cur === theme; if (isCurrentTheme) { return option({ value: cur, selected: true }, cur); @@ -800,18 +800,18 @@ exports.settingsView = ({ status, peers, theme, themeNames, version }) => { "0C", "0D", "0E", - "0F" + "0F", ]; - const base16Elements = base16.map(base => + const base16Elements = base16.map((base) => div({ style: { "background-color": `var(--base${base})`, width: `${(1 / base16.length) * 100}%`, height: "1em", "margin-top": "1em", - display: "inline-block" - } + display: "inline-block", + }, }) ); @@ -853,7 +853,7 @@ exports.settingsView = ({ status, peers, theme, themeNames, version }) => { languageOption("en", "English"), languageOption("es", "Español"), /* cspell:disable-next-line */ - languageOption("de", "Deutsch") + languageOption("de", "Deutsch"), ]), button({ type: "submit" }, i18n.setLanguage) ), @@ -882,9 +882,9 @@ exports.likesView = async ({ messages, feed, name }) => { return template( viewInfoBox({ - viewTitle: span(authorLink, i18n.likedBy) + viewTitle: span(authorLink, i18n.likedBy), }), - messages.map(msg => post({ msg })) + messages.map((msg) => post({ msg })) ); }; @@ -894,11 +894,11 @@ const messageListView = ({ viewDescription = null, viewElements = null, // If `aside = true`, it will show a few comments in the thread. - aside = null + aside = null, }) => { return template( section(h1(viewTitle), p(viewDescription), viewElements), - messages.map(msg => post({ msg, aside })) + messages.map((msg) => post({ msg, aside })) ); }; @@ -907,7 +907,7 @@ exports.popularView = ({ messages, prefix }) => { messages, viewElements: prefix, viewTitle: i18n.popular, - viewDescription: i18n.popularDescription + viewDescription: i18n.popularDescription, }); }; @@ -915,7 +915,7 @@ exports.extendedView = ({ messages }) => { return messageListView({ messages, viewTitle: i18n.extended, - viewDescription: i18n.extendedDescription + viewDescription: i18n.extendedDescription, }); }; @@ -923,7 +923,7 @@ exports.latestView = ({ messages }) => { return messageListView({ messages, viewTitle: i18n.latest, - viewDescription: i18n.latestDescription + viewDescription: i18n.latestDescription, }); }; @@ -931,7 +931,7 @@ exports.topicsView = ({ messages }) => { return messageListView({ messages, viewTitle: i18n.topics, - viewDescription: i18n.topicsDescription + viewDescription: i18n.topicsDescription, }); }; @@ -940,7 +940,7 @@ exports.summaryView = ({ messages }) => { messages, viewTitle: i18n.summaries, viewDescription: i18n.summariesDescription, - aside: true + aside: true, }); }; @@ -952,7 +952,7 @@ exports.replyView = async ({ messages, myFeedId }) => { let markdownMention; const messageElements = await Promise.all( - messages.reverse().map(message => { + messages.reverse().map((message) => { debug("%O", message); const authorName = message.value.meta.author.name; const authorFeedId = message.value.author; @@ -975,13 +975,13 @@ exports.replyView = async ({ messages, myFeedId }) => { { autofocus: true, required: true, - name: "text" + name: "text", }, markdownMention ), button( { - type: "submit" + type: "submit", }, i18n.reply ) @@ -994,7 +994,7 @@ exports.searchView = ({ messages, query }) => { name: "query", required: false, type: "search", - value: query + value: query, }); // - Minimum length of 3 because otherwise SSB-Search hangs forever. :) @@ -1012,20 +1012,20 @@ exports.searchView = ({ messages, query }) => { label(i18n.searchLabel, searchInput), button( { - type: "submit" + type: "submit", }, i18n.submit ) ) ), - messages.map(msg => post({ msg })) + messages.map((msg) => post({ msg })) ); }; exports.hashtagView = ({ messages, hashtag }) => { return template( section(h1(`#${hashtag}`), p(i18n.hashtagDescription)), - messages.map(msg => post({ msg })) + messages.map((msg) => post({ msg })) ); }; @@ -1041,11 +1041,11 @@ exports.indexingView = ({ percent }) => { meta({ charset: "utf-8" }), meta({ name: "description", - content: i18n.oasisDescription + content: i18n.oasisDescription, }), meta({ name: "viewport", - content: toAttributes({ width: "device-width", "initial-scale": 1 }) + content: toAttributes({ width: "device-width", "initial-scale": 1 }), }), meta({ "http-equiv": "refresh", content: 10 }) ), diff --git a/src/views/markdown.js b/src/views/markdown.js index 6394b38..4a60a58 100644 --- a/src/views/markdown.js +++ b/src/views/markdown.js @@ -6,7 +6,7 @@ const ssbRef = require("ssb-ref"); const { span } = require("hyperaxe"); /** @param {{ link: string}[]} mentions */ -const toUrl = mentions => { +const toUrl = (mentions) => { /** @type {{name: string, link: string}[]} */ const mentionNames = []; @@ -21,7 +21,7 @@ const toUrl = mentions => { ssbMessages.links(mentions, "feed").forEach(handleLink); /** @param {string} ref */ - const urlHandler = ref => { + const urlHandler = (ref) => { // @mentions const found = mentionNames.find(({ name }) => name === ref); if (found !== undefined) { @@ -53,5 +53,5 @@ const toUrl = mentions => { module.exports = (input, mentions = []) => md.block(input, { toUrl: toUrl(mentions), - emoji: character => span({ class: "emoji" }, character).outerHTML + emoji: (character) => span({ class: "emoji" }, character).outerHTML, });