Merge pull request #179 from ipfs/main

Sync recent updates on main back down to staging
This commit is contained in:
Jessica Schilling
2021-05-03 17:13:34 -06:00
committed by GitHub
20 changed files with 436 additions and 302 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
name: Check for scheduled posts to publish
on:
schedule:
- cron: '* 4,16 * * *'
- cron: '0 4,16 * * *'
jobs:
check-n-publish:
name: Check for scheduled posts and publish if any found
+1 -1
View File
@@ -43,7 +43,7 @@ A few tips:
Changes you _save_ in Forestry are written directly to the `staging` branch and automatically generate a staging preview at https://ipfs-blog-staging.on.fleek.co/.
**Once a staged post is ready to go live, please PR `staging` to `main` using [this handy shortcut](https://github.com/ipfs/ipfs-blog/compare/main...staging?expand=1).** _Note that if multiple posts are in-flight in staging and only one is approved to go live, your PR may need some massaging by a reviewer._
**Once a staged post is ready to go live, please PR `staging` to `main` using [this handy shortcut](https://github.com/ipfs/ipfs-blog/compare/main...staging?expand=1).** Give your PR a title explaining what changes are inside (the default just says "Staging", which isn't helpful.) _Note that if multiple posts are in-flight in staging and only one is approved to go live, your PR may need some massaging by a reviewer._
_Note for PR reviewers: While we continue to dogfood Forestry, please leave your edits in comments rather than making additional commits._ As our overall workflow continues to solidify, this direction may change.
+245 -126
View File
@@ -8,12 +8,12 @@
"version": "1.0.0",
"dependencies": {
"dayjs": "^1.10.4",
"markdown-it-image-lazy-loading": "^1.0.2",
"markdown-it-image-lazy-loading": "^1.1.0",
"markdown-it-imsize": "^2.0.1",
"tailwindcss-typography": "^3.1.0",
"v-lazy-image": "^1.4.0",
"v-scroll-lock": "^1.3.1",
"vue-advanced-cropper": "^1.5.0",
"vue-advanced-cropper": "^1.5.1",
"vue-mq": "^1.0.1",
"vue-multiselect": "^2.1.6",
"vue-social-sharing": "^3.0.7",
@@ -25,15 +25,15 @@
"@vuepress/plugin-html-redirect": "^0.1.2",
"@vuepress/plugin-last-updated": "^1.8.2",
"autoprefixer": "^9.8.6",
"eslint": "^7.24.0",
"eslint-config-prettier": "^8.2.0",
"eslint": "^7.25.0",
"eslint-config-prettier": "^8.3.0",
"eslint-config-standard": "^16.0.2",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^3.4.0",
"eslint-plugin-promise": "^5.1.0",
"eslint-plugin-vue": "^7.9.0",
"gray-matter": "^4.0.2",
"gray-matter": "^4.0.3",
"husky": "^6.0.0",
"lint-staged": "^10.5.4",
"lodash": "^4.17.21",
@@ -47,10 +47,10 @@
"prettier": "^2.2.1",
"slug": "^4.0.4",
"standard-version": "^9.2.0",
"stylelint": "^13.12.0",
"stylelint": "^13.13.0",
"stylelint-config-prettier": "^8.0.2",
"stylelint-prettier": "^1.2.0",
"svg-sprite-loader": "^6.0.5",
"svg-sprite-loader": "^6.0.6",
"svgo": "^2.3.0",
"svgo-loader": "^3.0.0",
"tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.1.0",
@@ -9706,9 +9706,9 @@
}
},
"node_modules/eslint": {
"version": "7.24.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz",
"integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==",
"version": "7.25.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.25.0.tgz",
"integrity": "sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw==",
"dev": true,
"dependencies": {
"@babel/code-frame": "7.12.11",
@@ -9760,9 +9760,9 @@
}
},
"node_modules/eslint-config-prettier": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.2.0.tgz",
"integrity": "sha512-dWV9EVeSo2qodOPi1iBYU/x6F6diHv8uujxbxr77xExs3zTAlNXvVZKiyLsQGNz7yPV2K49JY5WjPzNIuDc2Bw==",
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
"integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
"dev": true,
"bin": {
"eslint-config-prettier": "bin/cli.js"
@@ -12057,9 +12057,9 @@
}
},
"node_modules/globby": {
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz",
"integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==",
"version": "11.0.3",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz",
"integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==",
"dev": true,
"dependencies": {
"array-union": "^2.1.0",
@@ -12071,6 +12071,9 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/globby/node_modules/ignore": {
@@ -12154,12 +12157,12 @@
"dev": true
},
"node_modules/gray-matter": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.2.tgz",
"integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==",
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz",
"integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==",
"dev": true,
"dependencies": {
"js-yaml": "^3.11.0",
"js-yaml": "^3.13.1",
"kind-of": "^6.0.2",
"section-matter": "^1.0.0",
"strip-bom-string": "^1.0.0"
@@ -13120,8 +13123,7 @@
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/ini": {
"version": "1.3.5",
@@ -13646,6 +13648,18 @@
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
"dev": true
},
"node_modules/is-unicode-supported": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
"integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-utf8": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
@@ -14123,6 +14137,12 @@
"integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==",
"dev": true
},
"node_modules/lodash.flatten": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
"integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
"dev": true
},
"node_modules/lodash.isempty": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
@@ -14202,6 +14222,12 @@
"integrity": "sha1-j/TexTLYJIavWVc8OURZFOlEp/E=",
"dev": true
},
"node_modules/lodash.truncate": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
"integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
"dev": true
},
"node_modules/lodash.uniq": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
@@ -14209,15 +14235,19 @@
"dev": true
},
"node_modules/log-symbols": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
"integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
"integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
"dev": true,
"dependencies": {
"chalk": "^4.0.0"
"chalk": "^4.1.0",
"is-unicode-supported": "^0.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/log-update": {
@@ -14489,9 +14519,26 @@
"dev": true
},
"node_modules/markdown-it-image-lazy-loading": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/markdown-it-image-lazy-loading/-/markdown-it-image-lazy-loading-1.0.2.tgz",
"integrity": "sha512-FBGKcF+zDSE7HEN9rGar6+36RtO3ozakqNLpbl2uL91DZQEIkXxN8uUZXJGCjvQL4O5f9IxeP5lagxX3FZ2SgA=="
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/markdown-it-image-lazy-loading/-/markdown-it-image-lazy-loading-1.1.0.tgz",
"integrity": "sha512-3Mk/UjzNdYvhWyslIti9YUFSzQkmnaGsI3HC4jkw19VcIbnmp5Sofi18p1sIAHIvrQUGTAx8oW8tSDKSZEL49Q==",
"dependencies": {
"image-size": "^1.0.0"
}
},
"node_modules/markdown-it-image-lazy-loading/node_modules/image-size": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz",
"integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==",
"dependencies": {
"queue": "6.0.2"
},
"bin": {
"image-size": "bin/image-size.js"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/markdown-it-img-lazy": {
"version": "1.0.2",
@@ -14965,16 +15012,16 @@
}
},
"node_modules/micromatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
"integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
"dev": true,
"dependencies": {
"braces": "^3.0.1",
"picomatch": "^2.0.5"
"picomatch": "^2.2.3"
},
"engines": {
"node": ">=8"
"node": ">=8.6"
}
},
"node_modules/miller-rabin": {
@@ -16359,12 +16406,15 @@
"dev": true
},
"node_modules/picomatch": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz",
"integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==",
"dev": true,
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/pidtree": {
@@ -17262,14 +17312,12 @@
}
},
"node_modules/postcss-selector-parser": {
"version": "6.0.4",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
"integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.5.tgz",
"integrity": "sha512-aFYPoYmXbZ1V6HZaSvat08M97A8HqO6Pjz+PiNpw/DhuRrC72XWAdp3hL6wusDCN31sSmcZyMGa2hZEuX+Xfhg==",
"dev": true,
"dependencies": {
"cssesc": "^3.0.0",
"indexes-of": "^1.0.1",
"uniq": "^1.0.1",
"util-deprecate": "^1.0.2"
},
"engines": {
@@ -17864,6 +17912,14 @@
"integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
"dev": true
},
"node_modules/queue": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
"integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
"dependencies": {
"inherits": "~2.0.3"
}
},
"node_modules/queue-microtask": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz",
@@ -20299,15 +20355,15 @@
}
},
"node_modules/stylelint": {
"version": "13.12.0",
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.12.0.tgz",
"integrity": "sha512-P8O1xDy41B7O7iXaSlW+UuFbE5+ZWQDb61ndGDxKIt36fMH50DtlQTbwLpFLf8DikceTAb3r6nPrRv30wBlzXw==",
"version": "13.13.0",
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.0.tgz",
"integrity": "sha512-jvkM1iuH88vAvjdKPwPm6abiMP2/D/1chbfb+4GVONddOOskHuCXc0loyrLdxO1AwwH6jdnjYskkTKHQD7cXwQ==",
"dev": true,
"dependencies": {
"@stylelint/postcss-css-in-js": "^0.37.2",
"@stylelint/postcss-markdown": "^0.36.2",
"autoprefixer": "^9.8.6",
"balanced-match": "^1.0.0",
"balanced-match": "^2.0.0",
"chalk": "^4.1.0",
"cosmiconfig": "^7.0.0",
"debug": "^4.3.1",
@@ -20317,7 +20373,7 @@
"file-entry-cache": "^6.0.1",
"get-stdin": "^8.0.0",
"global-modules": "^2.0.0",
"globby": "^11.0.2",
"globby": "^11.0.3",
"globjoin": "^0.1.4",
"html-tags": "^3.1.0",
"ignore": "^5.1.8",
@@ -20325,10 +20381,10 @@
"imurmurhash": "^0.1.4",
"known-css-properties": "^0.21.0",
"lodash": "^4.17.21",
"log-symbols": "^4.0.0",
"log-symbols": "^4.1.0",
"mathml-tag-names": "^2.1.3",
"meow": "^9.0.0",
"micromatch": "^4.0.2",
"micromatch": "^4.0.4",
"normalize-selector": "^0.2.0",
"postcss": "^7.0.35",
"postcss-html": "^0.36.0",
@@ -20338,7 +20394,7 @@
"postcss-safe-parser": "^4.0.2",
"postcss-sass": "^0.4.4",
"postcss-scss": "^2.1.1",
"postcss-selector-parser": "^6.0.4",
"postcss-selector-parser": "^6.0.5",
"postcss-syntax": "^0.36.2",
"postcss-value-parser": "^4.1.0",
"resolve-from": "^5.0.0",
@@ -20349,8 +20405,8 @@
"style-search": "^0.1.0",
"sugarss": "^2.0.0",
"svg-tags": "^1.0.0",
"table": "^6.0.7",
"v8-compile-cache": "^2.2.0",
"table": "^6.5.1",
"v8-compile-cache": "^2.3.0",
"write-file-atomic": "^3.0.3"
},
"bin": {
@@ -20358,6 +20414,10 @@
},
"engines": {
"node": ">=10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/stylelint"
}
},
"node_modules/stylelint-config-prettier": {
@@ -20386,6 +20446,12 @@
"node": ">=6"
}
},
"node_modules/stylelint/node_modules/balanced-match": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
"integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
"dev": true
},
"node_modules/stylelint/node_modules/debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
@@ -21148,9 +21214,9 @@
}
},
"node_modules/svg-sprite-loader": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-6.0.5.tgz",
"integrity": "sha512-d1F4Bkx//jvITCYo4r5wf8skiJLdTHEREIg9hMH+N9KGARm8o57oCR49O3iBevDY4T+TRcxuTPU479FNQVnt8w==",
"version": "6.0.6",
"resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-6.0.6.tgz",
"integrity": "sha512-AcGvAH19iNuqGZ+DItYo0WOSl+TjTTGvx2pli9xNAFrGZ3UmO50rQRVt2+YJHPrvIAzdvxVv1EyIu/gEePAMCg==",
"dev": true,
"dependencies": {
"bluebird": "^3.5.0",
@@ -21222,30 +21288,37 @@
}
},
"node_modules/table": {
"version": "6.0.7",
"resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
"integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/table/-/table-6.6.0.tgz",
"integrity": "sha512-iZMtp5tUvcnAdtHpZTWLPF0M7AgiQsURR2DwmxnJwSy8I3+cY+ozzVvYha3BOLG2TB+L0CqjIz+91htuj6yCXg==",
"dev": true,
"dependencies": {
"ajv": "^7.0.2",
"lodash": "^4.17.20",
"ajv": "^8.0.1",
"lodash.clonedeep": "^4.5.0",
"lodash.flatten": "^4.4.0",
"lodash.truncate": "^4.4.2",
"slice-ansi": "^4.0.0",
"string-width": "^4.2.0"
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/table/node_modules/ajv": {
"version": "7.2.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.1.tgz",
"integrity": "sha512-+nu0HDv7kNSOua9apAVc979qd932rrZeb3WOvoiD31A/p1mIE5/9bN2027pE2rOPYEdS3UHzsvof4hY+lM9/WQ==",
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.1.0.tgz",
"integrity": "sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/table/node_modules/emoji-regex": {
@@ -22706,9 +22779,9 @@
"integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
},
"node_modules/vue-advanced-cropper": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-1.5.0.tgz",
"integrity": "sha512-WQs15c8wFRCje2GLdD6aGCRapttjjKE/dmz0qVFlRB7q38scB6G51G7eh5Jcnm4jMUgOX3OVD1sD2UWmHpaNpQ==",
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-1.5.1.tgz",
"integrity": "sha512-uK5le+RwMzYNKT+L9UTH9qNnqDNWcwZ/XKG5pFMb0Py8zuxl12OHCT/Fahc7FXhgp+ZcxzX2AJ7TiNQy8djAbA==",
"dependencies": {
"classnames": "^2.2.6",
"debounce": "^1.2.0",
@@ -32814,9 +32887,9 @@
"dev": true
},
"eslint": {
"version": "7.24.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz",
"integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==",
"version": "7.25.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.25.0.tgz",
"integrity": "sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw==",
"dev": true,
"requires": {
"@babel/code-frame": "7.12.11",
@@ -32956,9 +33029,9 @@
}
},
"eslint-config-prettier": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.2.0.tgz",
"integrity": "sha512-dWV9EVeSo2qodOPi1iBYU/x6F6diHv8uujxbxr77xExs3zTAlNXvVZKiyLsQGNz7yPV2K49JY5WjPzNIuDc2Bw==",
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
"integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
"dev": true,
"requires": {}
},
@@ -34710,9 +34783,9 @@
}
},
"globby": {
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz",
"integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==",
"version": "11.0.3",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz",
"integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==",
"dev": true,
"requires": {
"array-union": "^2.1.0",
@@ -34793,12 +34866,12 @@
"dev": true
},
"gray-matter": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.2.tgz",
"integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==",
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz",
"integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==",
"dev": true,
"requires": {
"js-yaml": "^3.11.0",
"js-yaml": "^3.13.1",
"kind-of": "^6.0.2",
"section-matter": "^1.0.0",
"strip-bom-string": "^1.0.0"
@@ -35608,8 +35681,7 @@
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"ini": {
"version": "1.3.5",
@@ -36016,6 +36088,12 @@
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
"dev": true
},
"is-unicode-supported": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
"integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
"dev": true
},
"is-utf8": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
@@ -36434,6 +36512,12 @@
"integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==",
"dev": true
},
"lodash.flatten": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
"integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
"dev": true
},
"lodash.isempty": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
@@ -36513,6 +36597,12 @@
"integrity": "sha1-j/TexTLYJIavWVc8OURZFOlEp/E=",
"dev": true
},
"lodash.truncate": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
"integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
"dev": true
},
"lodash.uniq": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
@@ -36520,12 +36610,13 @@
"dev": true
},
"log-symbols": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
"integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
"integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
"dev": true,
"requires": {
"chalk": "^4.0.0"
"chalk": "^4.1.0",
"is-unicode-supported": "^0.1.0"
}
},
"log-update": {
@@ -36752,9 +36843,22 @@
"dev": true
},
"markdown-it-image-lazy-loading": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/markdown-it-image-lazy-loading/-/markdown-it-image-lazy-loading-1.0.2.tgz",
"integrity": "sha512-FBGKcF+zDSE7HEN9rGar6+36RtO3ozakqNLpbl2uL91DZQEIkXxN8uUZXJGCjvQL4O5f9IxeP5lagxX3FZ2SgA=="
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/markdown-it-image-lazy-loading/-/markdown-it-image-lazy-loading-1.1.0.tgz",
"integrity": "sha512-3Mk/UjzNdYvhWyslIti9YUFSzQkmnaGsI3HC4jkw19VcIbnmp5Sofi18p1sIAHIvrQUGTAx8oW8tSDKSZEL49Q==",
"requires": {
"image-size": "^1.0.0"
},
"dependencies": {
"image-size": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz",
"integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==",
"requires": {
"queue": "6.0.2"
}
}
}
},
"markdown-it-img-lazy": {
"version": "1.0.2",
@@ -37159,13 +37263,13 @@
}
},
"micromatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
"integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
"dev": true,
"requires": {
"braces": "^3.0.1",
"picomatch": "^2.0.5"
"picomatch": "^2.2.3"
}
},
"miller-rabin": {
@@ -38310,9 +38414,9 @@
"dev": true
},
"picomatch": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz",
"integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==",
"dev": true
},
"pidtree": {
@@ -39135,14 +39239,12 @@
}
},
"postcss-selector-parser": {
"version": "6.0.4",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
"integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.5.tgz",
"integrity": "sha512-aFYPoYmXbZ1V6HZaSvat08M97A8HqO6Pjz+PiNpw/DhuRrC72XWAdp3hL6wusDCN31sSmcZyMGa2hZEuX+Xfhg==",
"dev": true,
"requires": {
"cssesc": "^3.0.0",
"indexes-of": "^1.0.1",
"uniq": "^1.0.1",
"util-deprecate": "^1.0.2"
}
},
@@ -39593,6 +39695,14 @@
"integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
"dev": true
},
"queue": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
"integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
"requires": {
"inherits": "~2.0.3"
}
},
"queue-microtask": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz",
@@ -41694,15 +41804,15 @@
}
},
"stylelint": {
"version": "13.12.0",
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.12.0.tgz",
"integrity": "sha512-P8O1xDy41B7O7iXaSlW+UuFbE5+ZWQDb61ndGDxKIt36fMH50DtlQTbwLpFLf8DikceTAb3r6nPrRv30wBlzXw==",
"version": "13.13.0",
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.0.tgz",
"integrity": "sha512-jvkM1iuH88vAvjdKPwPm6abiMP2/D/1chbfb+4GVONddOOskHuCXc0loyrLdxO1AwwH6jdnjYskkTKHQD7cXwQ==",
"dev": true,
"requires": {
"@stylelint/postcss-css-in-js": "^0.37.2",
"@stylelint/postcss-markdown": "^0.36.2",
"autoprefixer": "^9.8.6",
"balanced-match": "^1.0.0",
"balanced-match": "^2.0.0",
"chalk": "^4.1.0",
"cosmiconfig": "^7.0.0",
"debug": "^4.3.1",
@@ -41712,7 +41822,7 @@
"file-entry-cache": "^6.0.1",
"get-stdin": "^8.0.0",
"global-modules": "^2.0.0",
"globby": "^11.0.2",
"globby": "^11.0.3",
"globjoin": "^0.1.4",
"html-tags": "^3.1.0",
"ignore": "^5.1.8",
@@ -41720,10 +41830,10 @@
"imurmurhash": "^0.1.4",
"known-css-properties": "^0.21.0",
"lodash": "^4.17.21",
"log-symbols": "^4.0.0",
"log-symbols": "^4.1.0",
"mathml-tag-names": "^2.1.3",
"meow": "^9.0.0",
"micromatch": "^4.0.2",
"micromatch": "^4.0.4",
"normalize-selector": "^0.2.0",
"postcss": "^7.0.35",
"postcss-html": "^0.36.0",
@@ -41733,7 +41843,7 @@
"postcss-safe-parser": "^4.0.2",
"postcss-sass": "^0.4.4",
"postcss-scss": "^2.1.1",
"postcss-selector-parser": "^6.0.4",
"postcss-selector-parser": "^6.0.5",
"postcss-syntax": "^0.36.2",
"postcss-value-parser": "^4.1.0",
"resolve-from": "^5.0.0",
@@ -41744,11 +41854,17 @@
"style-search": "^0.1.0",
"sugarss": "^2.0.0",
"svg-tags": "^1.0.0",
"table": "^6.0.7",
"v8-compile-cache": "^2.2.0",
"table": "^6.5.1",
"v8-compile-cache": "^2.3.0",
"write-file-atomic": "^3.0.3"
},
"dependencies": {
"balanced-match": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
"integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
"dev": true
},
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
@@ -42377,9 +42493,9 @@
}
},
"svg-sprite-loader": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-6.0.5.tgz",
"integrity": "sha512-d1F4Bkx//jvITCYo4r5wf8skiJLdTHEREIg9hMH+N9KGARm8o57oCR49O3iBevDY4T+TRcxuTPU479FNQVnt8w==",
"version": "6.0.6",
"resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-6.0.6.tgz",
"integrity": "sha512-AcGvAH19iNuqGZ+DItYo0WOSl+TjTTGvx2pli9xNAFrGZ3UmO50rQRVt2+YJHPrvIAzdvxVv1EyIu/gEePAMCg==",
"dev": true,
"requires": {
"bluebird": "^3.5.0",
@@ -42440,21 +42556,24 @@
}
},
"table": {
"version": "6.0.7",
"resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
"integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/table/-/table-6.6.0.tgz",
"integrity": "sha512-iZMtp5tUvcnAdtHpZTWLPF0M7AgiQsURR2DwmxnJwSy8I3+cY+ozzVvYha3BOLG2TB+L0CqjIz+91htuj6yCXg==",
"dev": true,
"requires": {
"ajv": "^7.0.2",
"lodash": "^4.17.20",
"ajv": "^8.0.1",
"lodash.clonedeep": "^4.5.0",
"lodash.flatten": "^4.4.0",
"lodash.truncate": "^4.4.2",
"slice-ansi": "^4.0.0",
"string-width": "^4.2.0"
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0"
},
"dependencies": {
"ajv": {
"version": "7.2.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.1.tgz",
"integrity": "sha512-+nu0HDv7kNSOua9apAVc979qd932rrZeb3WOvoiD31A/p1mIE5/9bN2027pE2rOPYEdS3UHzsvof4hY+lM9/WQ==",
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.1.0.tgz",
"integrity": "sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
@@ -43686,9 +43805,9 @@
"integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
},
"vue-advanced-cropper": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-1.5.0.tgz",
"integrity": "sha512-WQs15c8wFRCje2GLdD6aGCRapttjjKE/dmz0qVFlRB7q38scB6G51G7eh5Jcnm4jMUgOX3OVD1sD2UWmHpaNpQ==",
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-1.5.1.tgz",
"integrity": "sha512-uK5le+RwMzYNKT+L9UTH9qNnqDNWcwZ/XKG5pFMb0Py8zuxl12OHCT/Fahc7FXhgp+ZcxzX2AJ7TiNQy8djAbA==",
"requires": {
"classnames": "^2.2.6",
"debounce": "^1.2.0",
+7 -7
View File
@@ -22,15 +22,15 @@
"@vuepress/plugin-html-redirect": "^0.1.2",
"@vuepress/plugin-last-updated": "^1.8.2",
"autoprefixer": "^9.8.6",
"eslint": "^7.24.0",
"eslint-config-prettier": "^8.2.0",
"eslint": "^7.25.0",
"eslint-config-prettier": "^8.3.0",
"eslint-config-standard": "^16.0.2",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^3.4.0",
"eslint-plugin-promise": "^5.1.0",
"eslint-plugin-vue": "^7.9.0",
"gray-matter": "^4.0.2",
"gray-matter": "^4.0.3",
"husky": "^6.0.0",
"lint-staged": "^10.5.4",
"lodash": "^4.17.21",
@@ -44,10 +44,10 @@
"prettier": "^2.2.1",
"slug": "^4.0.4",
"standard-version": "^9.2.0",
"stylelint": "^13.12.0",
"stylelint": "^13.13.0",
"stylelint-config-prettier": "^8.0.2",
"stylelint-prettier": "^1.2.0",
"svg-sprite-loader": "^6.0.5",
"svg-sprite-loader": "^6.0.6",
"svgo": "^2.3.0",
"svgo-loader": "^3.0.0",
"tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.1.0",
@@ -75,12 +75,12 @@
},
"dependencies": {
"dayjs": "^1.10.4",
"markdown-it-image-lazy-loading": "^1.0.2",
"markdown-it-image-lazy-loading": "^1.1.0",
"markdown-it-imsize": "^2.0.1",
"tailwindcss-typography": "^3.1.0",
"v-lazy-image": "^1.4.0",
"v-scroll-lock": "^1.3.1",
"vue-advanced-cropper": "^1.5.0",
"vue-advanced-cropper": "^1.5.1",
"vue-mq": "^1.0.1",
"vue-multiselect": "^2.1.6",
"vue-social-sharing": "^3.0.7",
+31 -18
View File
@@ -32,18 +32,40 @@ module.exports = (options, context) => ({
extendPageData($page) {
const { frontmatter } = $page
// author config
const authorName = frontmatter.author
if (frontmatter.type) {
frontmatter.type = {
name: frontmatter.type,
slug: slug(frontmatter.type),
}
}
if (typeof authorName === 'string') {
const authorKey = slug(authorName, { lower: true })
if (typeof frontmatter.author === 'string') {
frontmatter.author = frontmatter.author
.split(/,|and|&/)
.map((author) => ({ name: author.trim(), slug: slug(author) }))
}
// setup author stub to keep templates happy
const author = { name: authorName }
if (frontmatter.tags) {
frontmatter.tags = frontmatter.tags.map((tag) => ({
name: tag,
slug: slug(tag),
}))
}
// setup the page author object
frontmatter.author = author
frontmatter.authorKey = authorKey
if (frontmatter.data) {
frontmatter.data.forEach((subPage) => {
if (subPage.tags) {
subPage.tags = subPage.tags.map((tag) => ({
name: tag,
slug: slug(tag),
}))
}
// set links has hidden (future publishes, etc)
if (shouldBeHidden(subPage)) {
subPage.hidden = true
}
})
}
// exclude hidden pages (sitemap config, future publishes, etc)
@@ -62,14 +84,5 @@ module.exports = (options, context) => ({
frontmatter.hidden = true
$page.hidden = true
}
// set links has hidden (future publishes, etc)
if (frontmatter.data) {
frontmatter.data.forEach((item) => {
if (shouldBeHidden(item)) {
item.hidden = true
}
})
}
},
})
@@ -22,7 +22,7 @@
(newest first)
</span>
of {{ resolvedActiveCategory }}
<span v-if="activeAuthor"> by {{ activeAuthor }} </span>
<span v-if="activeAuthor"> by {{ activeAuthor.name }} </span>
<span v-if="searchedText.length">
for {{ resolvedSearchedText }}
</span>
@@ -37,7 +37,7 @@
class="multiselect__tag active-tag text-sm"
@click="tagClick(tag)"
>
<span>#{{ tag }}</span
<span>#{{ tagsList.find((t) => t.slug === tag).name }}</span
><i class="multiselect__tag-icon"></i>
</button>
</div>
@@ -75,13 +75,16 @@ export default {
},
computed: {
...mapState('appState', [
'tagsList',
'activeCategory',
'activeTags',
'searchedText',
'activeAuthor',
]),
resolvedActiveCategory() {
return this.activeCategory ? `type "${this.activeCategory}"` : 'all types'
return this.activeCategory
? `type "${this.activeCategory.name}"`
: 'all types'
},
resolvedSearchedText() {
return `"${this.searchedText.join(' ')}"`
+1 -1
View File
@@ -33,7 +33,7 @@ export default {
return RegularCard
}
switch (this.card.type) {
switch (this.card.type.name) {
case 'Academic paper':
case 'Event':
case 'News coverage':
@@ -15,7 +15,7 @@
See here: https://github.com/ipfs/ipfs-blog/pull/94
-->
<div
v-if="frontmatter.type === 'Video'"
v-if="frontmatter.type.slug === 'video'"
class="cover embed-responsive embed-responsive-og"
@click="handleVideoClick"
>
@@ -47,10 +47,7 @@
:src="
frontmatter.card_image
? frontmatter.card_image
: `/${frontmatter.type
.toLowerCase()
.split(' ')
.join('-')}-placeholder.png`
: `/${frontmatter.type.slug}-placeholder.png`
"
/>
</div>
@@ -64,7 +61,9 @@
:title="title"
:description="frontmatter.description"
:post-path="path"
:onclick="frontmatter.type === 'Video' ? handleVideoClick : null"
:onclick="
frontmatter.type.slug === 'video' ? handleVideoClick : null
"
class="type-p4 text-primary"
/>
</div>
@@ -1,8 +1,8 @@
<template>
<div class="flex flex-row flex-wrap">
<div
v-for="(piece, index) in resolvedAuthorName"
:key="piece"
v-for="(piece, index) in author"
:key="piece.name"
itemprop="publisher author"
itemtype="http://schema.org/Person"
itemscope
@@ -10,21 +10,15 @@
>
<span itemprop="name" class="flex flex-row">
<router-link
:to="{ path: $localePath, query: { author: piece.trim() } }"
:to="{ path: $localePath, query: { author: piece.slug } }"
rel="nofollow"
>
<span
:class="computedClassName"
@click="handleAuthorClick(piece.trim())"
>
{{ piece }}
<span :class="computedClassName" @click="handleAuthorClick(piece)">
{{ piece.name }}
</span>
</router-link>
<span>{{
resolvedAuthorName.length !== 1 &&
index !== resolvedAuthorName.length - 1
? ',&nbsp;'
: ''
author.length !== 1 && index !== author.length - 1 ? ',&nbsp;' : ''
}}</span>
</span>
</div>
@@ -33,22 +27,20 @@
<script>
import { mapState } from 'vuex'
import Author from '@theme/components/mixins/Author'
import countly from '../../util/countly'
export default {
name: 'PostAuthor',
components: {},
mixins: [Author],
props: {
author: {
type: Array,
default: null,
},
light: {
type: Boolean,
default: null,
},
name: {
type: String,
default: '',
},
parent: {
type: String,
default: 'card',
@@ -56,16 +48,6 @@ export default {
},
computed: {
...mapState('appState', ['activeAuthor']),
resolvedAuthorName() {
const resolvedName = this.name.replace('and', ',')
const pieces = resolvedName.match(/[,&]/g)
if (!pieces) {
return [resolvedName]
}
return resolvedName.split(/[,&]/g)
},
computedClassName() {
return [
'hover:underline cursor-pointer',
@@ -74,15 +56,15 @@ export default {
},
},
methods: {
handleAuthorClick(authorName) {
handleAuthorClick(author) {
const authorTracking = {
author: authorName,
author: author.name,
method: `${this.parent}-select`,
}
countly.trackEvent(countly.events.FILTER, authorTracking)
this.$store.commit('appState/setActiveAuthor', authorName)
this.$store.commit('appState/setActiveAuthor', author)
},
},
}
@@ -6,7 +6,7 @@
<div class="grid grid-cols-1 md:grid-cols-2 pt-4">
<div class="flex flex-col md:pr-8">
<h1 class="type-h1">{{ title }}</h1>
<PostAuthor v-bind="author" light parent="blog-post" />
<PostAuthor :author="author" light parent="blog-post" />
<time
class="text-gray"
pubdate
@@ -37,7 +37,7 @@
>
<PostTag
v-for="tag in resolvedTags"
:key="tag"
:key="tag.slug"
:tag="tag"
link
dark
@@ -76,7 +76,7 @@ export default {
default: () => [],
},
author: {
type: Object,
type: Array,
default: null,
},
date: {
@@ -27,7 +27,7 @@
{{ title }}
</h1>
</a>
<PostAuthor v-if="author" v-bind="author" />
<PostAuthor v-if="author" :author="author" />
<p
v-if="description"
class="type-p1 text-sm text-primary clamp-3 mt-2"
@@ -41,9 +41,9 @@
class="p-1 mr-1 bg-aquaMuted leading-none bg-opacity-50 text-blueGreen font-semibold hover:bg-blueGreen hover:text-white transition duration-300 ease-in-out rounded cursor-pointer mt-1"
@click="handleCatClick"
>
{{ category }}
{{ category.name }}
</button>
<PostTag v-for="tag in resolvedTags" :key="tag" class="mt-1" :tag="tag" />
<PostTag v-for="tag in tags" :key="tag.name" class="mt-1" :tag="tag" />
</div>
</div>
</template>
@@ -69,7 +69,7 @@ export default {
default: () => [],
},
author: {
type: Object,
type: Array,
default: null,
},
date: {
@@ -77,7 +77,7 @@ export default {
default: null,
},
category: {
type: String,
type: Object,
default: null,
},
title: {
@@ -104,19 +104,11 @@ export default {
.utc(this.date)
.format(this.$themeLocaleConfig.dateFormat || 'YYYY-MM-DD')
},
resolvedTags() {
if (!this.tags || Array.isArray(this.tags)) return this.tags
return this.tags
.replace(/, /g, ',')
.split(',')
.filter((tag) => tag)
},
},
methods: {
handleCatClick() {
const categoryTracking = {
category: this.category,
category: this.category.name,
method: 'card-select',
}
@@ -1,14 +1,16 @@
<template>
<router-link
v-if="link"
:to="{ path: $localePath, query: { tags: tag } }"
:to="{ path: $localePath, query: { tags: tag.slug } }"
:class="computedClass"
rel="nofollow"
@click.native="handleTagClick"
>
#{{ tag }}
#{{ tag.name }}
</router-link>
<button v-else :class="computedClass" @click="addNewTag">#{{ tag }}</button>
<button v-else :class="computedClass" @click="addNewTag">
#{{ tag.name }}
</button>
</template>
<script>
@@ -22,7 +24,7 @@ export default {
default: () => false,
},
tag: {
type: String,
type: Object,
required: true,
},
dark: {
@@ -56,16 +58,16 @@ export default {
methods: {
handleTagClick() {
this.trackTag()
this.$store.commit('appState/setActiveTags', [this.tag])
this.$store.commit('appState/setActiveTags', [this.tag.slug])
},
addNewTag() {
this.trackTag()
this.$store.commit('appState/addNewTag', [this.tag])
this.$store.commit('appState/addNewTag', [this.tag.slug])
this.callback()
},
trackTag() {
const tagTracking = {
tag: this.tag,
tag: this.tag.name,
method: `${this.parent}-select`,
}
@@ -30,7 +30,7 @@
<div class="p-4 flex flex-grow flex-col">
<div class="flex flex-grow">
<PostMeta
category="Blog post"
:category="{ name: 'Blog post', slug: 'blog-post' }"
:author="frontmatter.author"
:date="frontmatter.date"
:tags="frontmatter.tags"
@@ -8,9 +8,13 @@
>
<multiselect
ref="select0"
:value="activeCategory !== '' ? activeCategory : 'All content'"
:value="
activeCategory !== '' ? activeCategory : { name: 'All content' }
"
class="mb-2 xl:mb-0 xl:mr-2 xl:max-w-xs"
:options="['All content', ...categoriesList]"
:options="[{ name: 'All content' }, ...categoriesList]"
label="name"
track-by="name"
:searchable="false"
:allow-empty="false"
select-label="Press 'enter' to select"
@@ -25,7 +29,12 @@
tag-placeholder="search for this text"
placeholder="Search for words or #tags"
track-by="name"
label="name"
:custom-label="
(option) =>
tagsList.map((tag) => tag.name).includes(option.name)
? `#${option.name}`
: option.name
"
:limit="['xxl'].includes($mq) ? tagsLimit : tagsList.length"
:options="resolvedTags"
:multiple="true"
@@ -83,8 +92,8 @@ export default {
]),
resolvedTags() {
return this.tags.map((tag) => ({
name: `#${tag}`,
value: tag,
name: tag.name,
value: tag.slug,
}))
},
queryProptertyWatchlist() {
@@ -115,7 +124,7 @@ export default {
},
calculateTagsLimit(newTags) {
// The max value a char chan occupy in px
const multiplier = 8
const multiplier = 12
// Width of the help text - "X or more"
const helpTextWidth = 75
// Padding and margin for the each tag
@@ -159,16 +168,17 @@ export default {
const queryTags = query.tags ? query.tags.split(',') : []
const querySearch = query.search ? query.search.split(',') : []
const tagsListSlugs = this.tagsList.map((tag) => tag.slug)
const tagArray = this.selectedTags.map((tag) => tag.value)
const tagsToAdd = [...queryTags, ...querySearch].filter(
(tag) => !tagArray.includes(tag)
)
const tagsToRemove = tagArray.filter(
(tag) => this.tagsList.includes(tag) && !queryTags.includes(tag)
(tag) => tagsListSlugs.includes(tag) && !queryTags.includes(tag)
)
const textsToRemove = tagArray.filter(
(tag) => !this.tagsList.includes(tag) && !querySearch.includes(tag)
(tag) => !tagsListSlugs.includes(tag) && !querySearch.includes(tag)
)
const newTags = this.selectedTags.filter(
@@ -178,11 +188,13 @@ export default {
)
tagsToAdd.forEach((tag) => {
const isTag = this.tagsList.includes(tag)
const filteredTag = this.tagsList.find(
(listTag) => listTag.slug === tag
)
newTags.push({
name: (isTag ? '#' : '') + tag,
value: tag,
name: filteredTag ? filteredTag.name : tag,
value: filteredTag ? filteredTag.slug : tag,
})
})
@@ -190,7 +202,7 @@ export default {
},
setActiveCategory(category) {
const categoryTracking = {
category: category,
category: category.name,
method: 'filter-select',
}
@@ -198,7 +210,11 @@ export default {
this.$store.commit(
'appState/setActiveCategory',
this.categoriesList.includes(category) ? category : ''
this.categoriesList
.map((category) => category.slug)
.includes(category.slug)
? category
: ''
)
},
removeTag(tagToRemove) {
@@ -211,8 +227,9 @@ export default {
},
handleSearch() {
const tagArray = this.selectedTags.map((tag) => tag.value)
const tags = tagArray.filter((tag) => this.tagsList.includes(tag))
const texts = tagArray.filter((tag) => !this.tagsList.includes(tag))
const tagsListSlugs = this.tagsList.map((tag) => tag.slug)
const tags = tagArray.filter((tag) => tagsListSlugs.includes(tag))
const texts = tagArray.filter((tag) => !tagsListSlugs.includes(tag))
this.$store.commit('appState/setActiveTags', tags)
this.$store.commit('appState/setSearchedText', texts)
@@ -236,7 +253,7 @@ export default {
},
focusOnSubmit(option) {
const tagTracking = {
tag: option.value,
tag: option.name,
method: 'filter-select',
}
@@ -35,11 +35,11 @@
class="p-1 bg-aquaMuted leading-none bg-opacity-50 rounded text-blueGreen font-semibold hover:bg-blueGreen hover:text-white text-sm mr-1"
@click="handleCatClick()"
>
{{ videoModalCard.frontmatter.type }}
{{ videoModalCard.frontmatter.type.name }}
</button>
<PostTag
v-for="tag in resolvedTags"
:key="tag"
:key="tag.slug"
:tag="tag"
:callback="closeModal"
class-name="text-sm"
@@ -141,7 +141,7 @@ export default {
methods: {
handleCatClick() {
const categoryTracking = {
category: this.videoModalCard.frontmatter.type,
category: this.videoModalCard.frontmatter.type.name,
method: 'video-modal-select',
}
@@ -1,18 +0,0 @@
<script>
export default {
props: {
svgIcon: {
type: String,
default: null,
},
twitter: {
type: String,
default: '',
},
name: {
type: String,
required: true,
},
},
}
</script>
+49 -29
View File
@@ -60,11 +60,13 @@ import LanguageSelector from '@theme/components/base/LanguageSelector'
import { getTags } from '@theme/util/tagUtils'
import { parseProtectedPost, checkItem } from '@theme/util/blogUtils'
import uniq from 'lodash/uniq'
import uniqBy from 'lodash/uniqBy'
import pick from 'lodash/pick'
import isEqual from 'lodash/isEqual'
import orderBy from 'lodash/orderBy'
import countly from '../util/countly'
const defaultCategory = 'Blog post'
const defaultCategory = { name: 'Blog post', slug: 'blog-post' }
export default {
name: 'BlogIndex',
@@ -95,12 +97,19 @@ export default {
'videoModalCard',
]),
tags() {
return getTags(this.activeTags, this.publicPages)
return getTags(
this.tagsList.filter((tag) => this.activeTags.includes(tag.slug)),
this.publicPages
)
},
publicPages: function () {
let result = []
this.$pagination.pages.forEach((page) => {
if (this.categoriesList.includes(page.frontmatter.type)) {
if (
this.categoriesList
.map((category) => category.slug)
.includes(page.frontmatter.type?.slug)
) {
result = [
...result,
...parseProtectedPost(
@@ -144,7 +153,9 @@ export default {
: this.publicPages.slice(0, this.numberOfPagesToShow)
},
queryProptertyWatchlist() {
return `${this.activeCategory}|${this.activeTags}|${this.searchedText}|${this.activeAuthor}`
return `${JSON.stringify(this.activeCategory)}|${this.activeTags}|${
this.searchedText
}|${this.activeAuthor}`
},
urlUpdate() {
return this.$route.query
@@ -177,25 +188,20 @@ export default {
}
if (data) {
tagsArray.push(
uniq(
data
.filter((subPage) => subPage.tags)
.map((subPage) => subPage.tags)
.flat(2)
)
)
data.forEach((subPage) => {
if (subPage.tags) {
tagsArray.push(...subPage.tags)
}
})
}
if (author) {
authorsArray.push(
author.name.split(/,|and|&/).map((author) => author.trim())
)
authorsArray.push(author)
}
})
categories = uniq(categories, true)
tagsArray = uniq(tagsArray.flat(2), true)
categories = orderBy(uniq(categories, true), 'name')
tagsArray = uniqBy(tagsArray.flat(2), 'name')
authorsArray = uniq(authorsArray.flat(2), true)
this.$store.commit('appState/setCategoriesList', [
@@ -225,7 +231,11 @@ export default {
let queryCategory = query.category || ''
if (queryCategory && !this.categoriesList.includes(queryCategory)) {
const filteredCategory = this.categoriesList.find(
(category) =>
category.slug === queryCategory || category.name === queryCategory
)
if (queryCategory && !filteredCategory) {
queryCategory = ''
delete newQuery.category
}
@@ -233,7 +243,9 @@ export default {
let queryTags = query.tags ? query.tags.split(',') : []
if (queryTags.length > 0) {
queryTags = queryTags.filter((tag) => this.tagsList.includes(tag))
queryTags = queryTags.filter((queryTag) =>
this.tagsList.find((tag) => tag.slug === queryTag)
)
if (queryTags.length === 0) {
delete newQuery.tags
@@ -242,7 +254,10 @@ export default {
let queryAuthor = query.author
if (queryAuthor && !this.authorsList.includes(queryAuthor)) {
if (
queryAuthor &&
!this.authorsList.map((author) => author.slug).includes(queryAuthor)
) {
queryAuthor = ''
delete newQuery.author
}
@@ -255,7 +270,7 @@ export default {
if (queryCategory !== '') {
const categoryTracking = {
category: queryCategory,
category: filteredCategory.name,
method: 'urlQuery',
}
@@ -263,9 +278,9 @@ export default {
}
if (queryTags.length > 0) {
queryTags.forEach((tag) => {
queryTags.forEach((queryTag) => {
const tagTracking = {
tag: tag,
tag: this.tagsList.find((tag) => tag.slug === queryTag).name,
method: 'urlQuery',
}
@@ -294,19 +309,25 @@ export default {
}
this.$store.commit('appState/setActiveTags', queryTags)
this.$store.commit('appState/setActiveCategory', queryCategory)
this.$store.commit(
'appState/setActiveCategory',
filteredCategory || queryCategory
)
this.$store.commit(
'appState/setSearchedText',
queryText ? queryText.split(',') : []
)
this.$store.commit('appState/setActiveAuthor', queryAuthor || '')
this.$store.commit(
'appState/setActiveAuthor',
this.authorsList.find((author) => author.slug === queryAuthor) || ''
)
const latestWeeklyPost = this.publicPages
.filter(
(item) =>
item.frontmatter &&
item.frontmatter.tags &&
item.frontmatter.tags.includes('weekly')
item.frontmatter.tags.find((tag) => tag.name === 'weekly')
)
.sort(
(a, b) => new Date(b.frontmatter.date) - new Date(a.frontmatter.date)
@@ -323,8 +344,8 @@ export default {
...this.$route.query,
tags: this.activeTags.join(','),
search: this.searchedText.join(','),
category: this.activeCategory,
author: this.activeAuthor,
category: this.activeCategory.slug || '',
author: this.activeAuthor.slug || '',
}
Object.keys(newQuery).forEach((entry) => {
@@ -333,7 +354,6 @@ export default {
delete newQuery[entry]
}
})
this.$router.replace({ query: newQuery }).catch(() => {})
},
blockLazyLoad() {
+11
View File
@@ -53,6 +53,17 @@ export default {
},
},
mounted() {
// redirect routes that are not blog posts (/events, /videos, etc)
// to the homepage with the search parameter category
if (!this.isVisible && this.$root.$page.frontmatter.type) {
const type = this.$root.$page.frontmatter.type
// path is relative to support ipfs sub path deployments
return this.$router.replace({ path: `../?category=${type.slug}` })
}
// redirect any other blog post route that should not be visible
// to the 404 page (hidden or scheduled publish posts)
if (!this.isVisible) {
// path to 404 is relative to support ipfs sub path deployments
return this.$router.replace({ path: '../404' })
+7 -11
View File
@@ -2,29 +2,27 @@ export function checkItem({
postType,
tags,
title,
author = {},
author = [],
activeTags = [],
searchedText = [],
activeCategory = '',
activeAuthor = '',
activeAuthor,
}) {
if (activeCategory && decodeURI(activeCategory) !== postType) {
if (activeCategory && activeCategory.slug !== postType.slug) {
return false
}
if (
activeAuthor &&
((author.name &&
!author.name
.toLowerCase()
.includes(decodeURI(activeAuthor.toLowerCase()))) ||
!author.name)
((author.length > 0 &&
!author.map((entry) => entry.slug).includes(activeAuthor.slug)) ||
author.length === 0)
) {
return false
}
for (let i = 0; i < activeTags.length; i++) {
if (!tags || !tags.includes(activeTags[i])) {
if (!tags || !tags.map((tag) => tag.slug).includes(activeTags[i])) {
return false
}
}
@@ -76,13 +74,11 @@ export function parseProtectedPost(
type: post.frontmatter.type,
date: item.date,
title: item.title,
author: { name: item.author },
path: item.path,
frontmatter: {
...item,
date: item.date,
title: item.title,
author: { name: item.author },
path: item.path,
type: post.frontmatter.type,
},
+4 -6
View File
@@ -1,4 +1,4 @@
import isArray from 'lodash/isArray'
import orderBy from 'lodash/orderBy'
export const getTags = (activeTags, posts) => {
const tags = [...activeTags]
@@ -8,16 +8,14 @@ export const getTags = (activeTags, posts) => {
return
}
const postTags = isArray(post.frontmatter.tags)
? post.frontmatter.tags
: post.frontmatter.tags.replace(/, /g, ',').split(',')
const postTags = post.frontmatter.tags
for (let i = 0; i < postTags.length; i++) {
if (postTags[i] && !tags.includes(postTags[i])) {
if (postTags[i] && !tags.find((tag) => tag.slug === postTags[i].slug)) {
tags.push(postTags[i])
}
}
})
return tags.sort()
return orderBy(tags, 'name')
}