diff --git a/.forestry/front_matter/templates/blog-post.yml b/.forestry/front_matter/templates/blog-post.yml index 65882a0f..6babd9e5 100644 --- a/.forestry/front_matter/templates/blog-post.yml +++ b/.forestry/front_matter/templates/blog-post.yml @@ -27,12 +27,16 @@ fields: - type: datetime name: date label: Date - description: '"Published on" date. Remember this is only a list date for - display; posts are not automatically published!' + description: '"Published on" date.

To schedule this post for future publishing, simply + set the date to the future.

WARNING: Data + is saved in the ipfs/ipfs-blog + public GitHub repo as soon as you hit the save button. So any sensitive information + will also be publicly available on GitHub, but hidden from the website blog.ipfs.io.' config: required: true date_format: YYYY/MM/DD export_format: YYYY-MM-DD + display_utc: false - type: text name: permalink label: Permalink @@ -58,23 +62,91 @@ fields: target="_blank">Use this crop/scale tool to save a revised image to your local machine, then upload here. - name: tags - type: tag_list - default: [] + type: list + config: + use_select: true + min: + max: + source: + type: simple + section: '' + file: + path: '' + options: + - AEgir + - API + - async/await + - Bitswap + - blockstore + - bootstrap nodes + - breaking change + - browsers + - case study + - CDN + - censorship + - CID + - CLI tools + - collaborative cluster + - community + - conferences + - containerization + - content routing + - CRDTs + - DAG + - datastore + - demo + - DHT + - Docker + - docs + - encryption + - Ethereum + - Filecoin + - gaming + - gateways + - go-ipfs + - Gossipsub + - hackathon + - identity + - infrastructure + - interoperability + - interview + - IPFS Camp + - IPFS Cluster + - IPFS Companion + - IPFS Desktop + - IPFS Web UI + - IPLD + - js-ipfs + - Kademlia + - libp2p + - MFS + - mobile + - NFTs + - official meetup + - opera + - package managers + - pinning + - project planning + - ProtoSchool + - pubsub + - QUIC + - recap + - release notes + - research + - Rust + - SECIO + - security + - static publishing + - streaming + - Testground + - tutorial + - weekly + - whitepaper + - Windows label: Tags - description: "Please copy/paste applicable values from this canonical tags - list (capitalization counts!):
AEgir ... API ... async/await ... Bitswap - ... blockstore ... bootstrap nodes ... breaking change ... browsers ... case study - ... CDN ... censorship ... CID ...CLI tools ... collaborative cluster ... community - ... conferences ... containerization ... content routing ... CRDTs ... DAG ... - datastore ... demo ... DHT ... DNSLink ... Docker ... docs ... Drand ... encryption - ... Ethereum ... Filecoin ... gateways ... go-ipfs ... Gossipsub ... identity - ... infrastructure ... interoperability ... interview ... IoT ... IPFS Camp ... - IPFS Cluster ... IPFS Companion ... IPFS Desktop ... IPFS Web UI ... IPLD ... - IPNS ... js-ipfs ... Kademlia ... Kubernetes ... libp2p ... Linux ... MacOS ... - MFS ... mobile ... NFTs ... official meetup ... package managers ... pinning ... - project planning ... pubsub ... QUIC ... recap ... research ... Rust ... SECIO - ... security ... static publishing ... streaming ... Testground ... tutorial ... - TypeScript ... Windows ... weekly ... whitepaper" + description: Select all tags that apply. If you really + need to add a new tag, please file an issue with the details. pages: - src/_blog/announcing-js-ipfs-0.53.0.md - src/_blog/go-ipfs-0.8.0-and-remote-pinning-is-here.md @@ -89,6 +161,7 @@ pages: - src/_blog/meet-the-new-ipfs-blog-news.md - src/_blog/own-your-identity-with-ion.md - src/_blog/storing-nfts-on-ipfs.md +- src/_blog/using-ipfs-to-help-with-scaling-ethereum.md - src/_blog/welcome-to-ipfs-weekly-119.md - src/_blog/welcome-to-ipfs-weekly-120.md - src/_blog/welcome-to-ipfs-weekly-121.md @@ -101,3 +174,4 @@ pages: - src/_blog/welcome-to-ipfs-weekly-128.md - src/_blog/welcome-to-ipfs-weekly-129.md - src/_blog/welcome-to-ipfs-weekly-130.md +- src/_blog/welcome-to-ipfs-weekly-131.md diff --git a/.forestry/front_matter/templates/newslinks.yml b/.forestry/front_matter/templates/newslinks.yml index fd22eefa..98413de4 100644 --- a/.forestry/front_matter/templates/newslinks.yml +++ b/.forestry/front_matter/templates/newslinks.yml @@ -35,6 +35,23 @@ fields: export_format: YYYY-MM-DD description: For events, use the date of the event itself.
For all other link types, use the date the original item was published. + - name: publish_date + type: datetime + label: Publish Date + description: 'When + the link should be published.
Use this to schedule publishing the link in + the future.
If you don''t want to schedule, leave this blank.

WARNING: + Data is saved in the ipfs/ipfs-blog public GitHub repo as soon as + you hit the Save button. This means anything you save will also be publicly + visible on GitHub, but not on the blog.ipfs.io site. Be careful if you are drafting something sensitive!' + config: + required: false + date_format: + time_format: + display_utc: true + export_format: YYYY-MM-DDThh:mm:ssZ + default: '' - type: text name: path label: URL @@ -54,21 +71,86 @@ fields: revised image to your local machine, then upload here.
Video links don''t need images: they use the video thumbnail!' - name: tags - type: tag_list - default: [] + type: list + config: + use_select: true + min: + max: + source: + type: simple + options: + - AEgir + - API + - async/await + - Bitswap + - blockstore + - bootstrap nodes + - breaking change + - browsers + - case study + - CDN + - censorship + - CID + - CLI tools + - collaborative cluster + - community + - conferences + - containerization + - content routing + - CRDTs + - DAG + - datastore + - demo + - DHT + - Docker + - docs + - encryption + - Ethereum + - Filecoin + - gaming + - gateways + - go-ipfs + - Gossipsub + - hackathon + - identity + - infrastructure + - interoperability + - interview + - IPFS Camp + - IPFS Cluster + - IPFS Companion + - IPFS Desktop + - IPFS Web UI + - IPLD + - js-ipfs + - Kademlia + - libp2p + - MFS + - mobile + - NFTs + - official meetup + - opera + - package managers + - pinning + - project planning + - ProtoSchool + - pubsub + - QUIC + - recap + - release notes + - research + - Rust + - SECIO + - security + - static publishing + - streaming + - Testground + - tutorial + - weekly + - whitepaper + - Windows label: Tags - description: "Please copy/paste applicable values from this canonical - tags list (capitalization counts!):
AEgir ... API ... async/await - ... Bitswap ... blockstore ... bootstrap nodes ... breaking change ... browsers - ... case study ... CDN ... censorship ... CID ...CLI tools ... collaborative - cluster ... community ... conferences ... containerization ... content routing - ... CRDTs ... DAG ... datastore ... demo ... DHT ... DNSLink ... Docker ... - docs ... Drand ... encryption ... Ethereum ... Filecoin ... gateways ... go-ipfs - ... Gossipsub ... identity ... infrastructure ... interoperability ... interview - ... IoT ... IPFS Camp ... IPFS Cluster ... IPFS Companion ... IPFS Desktop ... - IPFS Web UI ... IPLD ... IPNS ... js-ipfs ... Kademlia ... Kubernetes ... libp2p - ... Linux ... MacOS ... MFS ... mobile ... NFTs ... official meetup ... package - managers ... pinning ... project planning ... pubsub ... QUIC ... recap ... - research ... Rust ... SECIO ... security ... static publishing ... streaming - ... Testground ... tutorial ... TypeScript ... Windows ... weekly ... whitepaper" + description: Select all tags that apply. If you really + need to add a new tag, please file an issue with the details. description: To add a new link, click the "Add Link" button. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..3e24b1d0 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: 'npm' # See documentation for possible values + directory: '/' # Location of package manifests + schedule: + interval: 'daily' + commit-message: + prefix: 'chore' + include: 'scope' diff --git a/.github/workflows/calibreapp-image-actions.yml b/.github/workflows/calibreapp-image-actions.yml new file mode 100644 index 00000000..c1c338cd --- /dev/null +++ b/.github/workflows/calibreapp-image-actions.yml @@ -0,0 +1,26 @@ +name: Compress Images +on: + pull_request: + paths: + - 'src/assets/*.jpg' + - 'src/assets/*.jpeg' + - 'src/assets/*.png' + - 'src/assets/*.webp' +jobs: + build: + # Only run on Pull Requests within the same repository, and not from forks. + if: github.event.pull_request.head.repo.full_name == github.repository + name: calibreapp/image-actions + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v2 + + - name: Compress Images + uses: calibreapp/image-actions@main + with: + githubToken: ${{ secrets.GITHUB_TOKEN }} + jpegQuality: '100' + jpegProgressive: true + pngQuality: '100' + webpQuality: '100' \ No newline at end of file diff --git a/.github/workflows/scheduled-publishing.yml b/.github/workflows/scheduled-publishing.yml new file mode 100644 index 00000000..25b24736 --- /dev/null +++ b/.github/workflows/scheduled-publishing.yml @@ -0,0 +1,26 @@ +name: Check for scheduled posts to publish +on: + schedule: + - cron: '* 4,16 * * *' +jobs: + check-n-publish: + name: Check for scheduled posts and publish if any found + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v2 + - name: Install dependencies + run: npm ci + - name: Check for scheduled posts + run: echo "::set-output name=should_publish::$(${{ github.workspace }}/scripts/scheduled-publishing.js)" + id: should_publish_step + - name: Trigger Fleek Build + if: ${{ steps.should_publish_step.outputs.should_publish == 'true' }} + id: deploy + uses: fleekhq/action-deploy@v1 + with: + apiKey: ${{ secrets.FLEEK_API_KEY }} + - name: Scheduled posts published + if: ${{ steps.should_publish_step.outputs.should_publish == 'true' }} + run: echo "Check https://blog.ipfs.io" + diff --git a/README.md b/README.md index 22839f32..1a4bd5d4 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,8 @@ Forestry uses the `staging` branch as a work-in-progress scratchpad for blog con - Use the "Content Types" section of Forestry's left-hand menu to drill down to the type of item (blog post, video, news coverage, event) you want to create/edit. - For card and blog post header images, **be sure to use the [image crop/scale tool](https://blog.ipfs.io/image-crop/)** to resize and save images so they're the correct dimensions. (Don't have an image? Don't worry, there are generic fallback images.) -- To switch between WYSIWYG and raw markdown while writing a blog post, choose "Raw Editor" or "WYSIWYG Editor" from the dots menu at the top right of the page (this is useful if you want to add any HTML, such as a video or Twitter embed):
![image](https://user-images.githubusercontent.com/1507828/110036257-fbe93e00-7cf9-11eb-935c-a70f9d21c14f.png) +- Want to embed a YouTube video in a blog post? Switch to raw markdown view and use `@[youtube](videoID)`, substituting the video's unique ID from the URL (e.g. `https://www.youtube.com/watch?v=eFbKKsEoQNg`) for `videoID`. +- To switch between WYSIWYG and raw markdown while writing a blog post, choose "Raw Editor" or "WYSIWYG Editor" from the dots menu at the top right of the page:
![image](https://user-images.githubusercontent.com/1507828/110036257-fbe93e00-7cf9-11eb-935c-a70f9d21c14f.png) ### Forestry build preview tips diff --git a/package-lock.json b/package-lock.json index 826e1e94..f0a78098 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,11 +13,10 @@ "tailwindcss-typography": "^3.1.0", "v-lazy-image": "^1.4.0", "v-scroll-lock": "^1.3.1", - "vue-advanced-cropper": "^1.3.1", + "vue-advanced-cropper": "^1.5.0", "vue-mq": "^1.0.1", "vue-multiselect": "^2.1.6", - "vue-observe-visibility": "^0.4.6", - "vue-social-sharing": "^3.0.5", + "vue-social-sharing": "^3.0.7", "vuepress-plugin-img-lazy": "^1.0.4", "vuex": "^3.6.2" }, @@ -26,14 +25,15 @@ "@vuepress/plugin-html-redirect": "^0.1.2", "@vuepress/plugin-last-updated": "^1.8.2", "autoprefixer": "^9.8.6", - "eslint": "^7.23.0", - "eslint-config-prettier": "^8.1.0", + "eslint": "^7.24.0", + "eslint-config-prettier": "^8.2.0", "eslint-config-standard": "^16.0.2", "eslint-plugin-import": "^2.22.1", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^3.3.1", - "eslint-plugin-promise": "^4.3.1", - "eslint-plugin-vue": "^7.8.0", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-promise": "^5.1.0", + "eslint-plugin-vue": "^7.9.0", + "gray-matter": "^4.0.2", "husky": "^6.0.0", "lint-staged": "^10.5.4", "lodash": "^4.17.21", @@ -42,22 +42,24 @@ "markdown-it-task-lists": "^2.1.1", "markdown-it-video": "^0.6.3", "npm-run-all": "^4.1.5", + "p-map": "^4.0.0", "postcss": "^7.0.35", "prettier": "^2.2.1", - "slug": "^4.0.3", + "slug": "^4.0.4", "standard-version": "^9.2.0", "stylelint": "^13.12.0", "stylelint-config-prettier": "^8.0.2", "stylelint-prettier": "^1.2.0", - "svg-sprite-loader": "^5.2.1", - "svgo": "^1.3.2", - "svgo-loader": "^2.2.2", + "svg-sprite-loader": "^6.0.5", + "svgo": "^2.3.0", + "svgo-loader": "^3.0.0", "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.1.0", "tailwindcss-line-clamp": "^1.0.5", "tailwindcss-touch": "^1.0.1", "vue": "^2.6.12", "vuepress": "^1.8.2", "vuepress-plugin-canonical": "^1.0.0", + "vuepress-plugin-chunkload-redirect": "^1.0.3", "vuepress-plugin-clean-urls": "^1.1.2", "vuepress-plugin-ipfs": "^1.0.2", "vuepress-plugin-robots": "^1.0.1", @@ -3355,6 +3357,15 @@ "node": ">=6" } }, + "node_modules/@trysound/sax": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz", + "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -8252,15 +8263,19 @@ } }, "node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-3.1.2.tgz", + "integrity": "sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "css-what": "^4.0.0", + "domhandler": "^4.0.0", + "domutils": "^2.4.3", + "nth-check": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, "node_modules/css-select-base-adapter": { @@ -8269,13 +8284,89 @@ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", "dev": true }, - "node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "node_modules/css-select/node_modules/dom-serializer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.1.tgz", + "integrity": "sha512-Pv2ZluG5ife96udGgEDovOOOA5UELkltfJpnIExPrAk1LTvecolUGn6lIaoLh86d83GiB86CjzciMd9BuRB71Q==", "dev": true, "dependencies": { - "mdn-data": "2.0.4", + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.1.0.tgz", + "integrity": "sha512-/6/kmsGlMY4Tup/nGVutdrK9yQi4YjWVcVeoQmixpzjOUK1U7pQkvAPHBJeUxOgxF0J8f8lwCJSlCfD0V4CMGQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.5.2.tgz", + "integrity": "sha512-MHTthCb1zj8f1GVfRpeZUbohQf/HdBos0oX5gZcQFepOZPLLRyj6Wn7XS7EMnY7CVpwv8863u2vyE83Hfu28HQ==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.1.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-select/node_modules/nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", "source-map": "^0.6.1" }, "engines": { @@ -8298,12 +8389,15 @@ "dev": true }, "node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-4.0.0.tgz", + "integrity": "sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==", "dev": true, "engines": { "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, "node_modules/css/node_modules/source-map": { @@ -8473,45 +8567,17 @@ } }, "node_modules/csso": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", - "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, "dependencies": { - "css-tree": "1.0.0-alpha.39" + "css-tree": "^1.1.2" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/csso/node_modules/css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.6", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", - "dev": true - }, - "node_modules/csso/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cuint": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", @@ -9640,9 +9706,9 @@ } }, "node_modules/eslint": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.23.0.tgz", - "integrity": "sha512-kqvNVbdkjzpFy0XOszNwjkKzZ+6TcwCQ/h+ozlcIWwaimBBuhlQ4nN6kbiM2L+OjDcznkTJxzYfRFH92sx4a0Q==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz", + "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==", "dev": true, "dependencies": { "@babel/code-frame": "7.12.11", @@ -9694,9 +9760,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.1.0.tgz", - "integrity": "sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.2.0.tgz", + "integrity": "sha512-dWV9EVeSo2qodOPi1iBYU/x6F6diHv8uujxbxr77xExs3zTAlNXvVZKiyLsQGNz7yPV2K49JY5WjPzNIuDc2Bw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -9865,30 +9931,42 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz", - "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", "dev": true, "dependencies": { "prettier-linter-helpers": "^1.0.0" }, "engines": { "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=5.0.0", + "prettier": ">=1.13.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } } }, "node_modules/eslint-plugin-promise": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz", - "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz", + "integrity": "sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==", "dev": true, "engines": { - "node": ">=6" + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0" } }, "node_modules/eslint-plugin-vue": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.8.0.tgz", - "integrity": "sha512-OGrnPz+PuYL2HmVyBHxm4mRjxW2kfFCQE6Hw9G6qOHs/Pcu0srOlCCW0FMa8SLzIEqxl8WuKoBSPcMnrjUG2vw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.9.0.tgz", + "integrity": "sha512-2Q0qQp5+5h+pZvJKCbG1/jCRUYrdgAz5BYKGyTlp2NU8mx09u3Hp7PsH6d5qef6ojuPoCXMnrbbDxeoplihrSw==", "dev": true, "dependencies": { "eslint-utils": "^2.1.0", @@ -13049,10 +13127,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true, - "engines": { - "node": "*" - } + "dev": true }, "node_modules/internal-ip": { "version": "4.3.0", @@ -14500,9 +14575,9 @@ "dev": true }, "node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true }, "node_modules/mdurl": { @@ -17216,12 +17291,105 @@ "node": ">=6.9.0" } }, + "node_modules/postcss-svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, "node_modules/postcss-svgo/node_modules/postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, + "node_modules/postcss-svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/postcss-syntax": { "version": "0.36.2", "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", @@ -19093,9 +19261,9 @@ } }, "node_modules/slug": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/slug/-/slug-4.0.3.tgz", - "integrity": "sha512-CnR9sYvJn6JW8hDzxRVg8imqzaJrCuUMc8poiFmd3tqWQXxeEQdwsBbBidSdl+Q3obwxQ4hrx7kxcUH9oCE9yw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/slug/-/slug-4.0.4.tgz", + "integrity": "sha512-GwSsWjX2rcIAtbKWGaxnzASWljWraPQry0RmCnRkji2pEggVjgb5HjXdqN0Gb6JOPg19rsC3hHUYXbOnHXKv2Q==", "dev": true }, "node_modules/smoothscroll-polyfill": { @@ -20980,9 +21148,9 @@ } }, "node_modules/svg-sprite-loader": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-5.2.1.tgz", - "integrity": "sha512-n2IZc87rpOeXh+PQFksFMGCfMV/BT01YG+Dlbyjoh2Cz8BSTL5Vi/7KDr86Pt/u1NRDCVb3vY74BF5rKCmqbNA==", + "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==", "dev": true, "dependencies": { "bluebird": "^3.5.0", @@ -21014,54 +21182,43 @@ "dev": true }, "node_modules/svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.0.tgz", + "integrity": "sha512-fz4IKjNO6HDPgIQxu4IxwtubtbSfGEAJUq/IXyTPIkGhWck/faiiwfkvsB8LnBkKLvSoyNNIY6d13lZprJMc9Q==", "dev": true, "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" + "@trysound/sax": "0.1.1", + "chalk": "^4.1.0", + "commander": "^7.1.0", + "css-select": "^3.1.2", + "css-tree": "^1.1.2", + "csso": "^4.2.0", + "stable": "^0.1.8" }, "bin": { "svgo": "bin/svgo" }, "engines": { - "node": ">=4.0.0" + "node": ">=10.13.0" } }, "node_modules/svgo-loader": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-2.2.2.tgz", - "integrity": "sha512-UeE/4yZEK96LoYqvxwh8YqCOJCjXwRY9K6YT99vXE+nYhs/W8hAY2hNf5zg/lRsyKshJkR79V+4beV3cbGL40Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-3.0.0.tgz", + "integrity": "sha512-gwyFuzTxZ8hEWYKQ9GodudSKRHzW8CUqgdfsdNpu1U5Keow5dPIgxT4DoHUEVXQRolefgSCeBtW3y12CyhIGxw==", "dev": true, "dependencies": { - "js-yaml": "^3.13.1", - "loader-utils": "^1.0.3" + "loader-utils": "^1.0.3", + "svgo": "^2.2.0" } }, - "node_modules/svgo/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, "engines": { - "node": ">=4" + "node": ">= 10" } }, "node_modules/table": { @@ -22399,6 +22556,9 @@ "es-abstract": "^1.17.2", "has-symbols": "^1.0.1", "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/util/node_modules/inherits": { @@ -22543,13 +22703,12 @@ "node_modules/vue": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz", - "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==", - "dev": true + "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==" }, "node_modules/vue-advanced-cropper": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-1.3.1.tgz", - "integrity": "sha512-VsCx+PRize+BYpET5Nk1nxP7CSI8zd+cDx4imdqCg+ImlOUegLwMBiEePFIoIgIdMpiwPQzkPY51Ad2IZcZ+IA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-1.5.0.tgz", + "integrity": "sha512-WQs15c8wFRCje2GLdD6aGCRapttjjKE/dmz0qVFlRB7q38scB6G51G7eh5Jcnm4jMUgOX3OVD1sD2UWmHpaNpQ==", "dependencies": { "classnames": "^2.2.6", "debounce": "^1.2.0", @@ -22558,6 +22717,9 @@ "engines": { "node": ">=8", "npm": ">=5" + }, + "peerDependencies": { + "vue": "^2.6.6" } }, "node_modules/vue-class-component": { @@ -22645,11 +22807,6 @@ "npm": ">= 3.0.0" } }, - "node_modules/vue-observe-visibility": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vue-observe-visibility/-/vue-observe-visibility-0.4.6.tgz", - "integrity": "sha512-xo0CEVdkjSjhJoDdLSvoZoQrw/H2BlzB5jrCBKGZNXN2zdZgMuZ9BKrxXDjNP2AxlcCoKc8OahI3F3r3JGLv2Q==" - }, "node_modules/vue-property-decorator": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.5.1.tgz", @@ -22755,9 +22912,12 @@ } }, "node_modules/vue-social-sharing": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/vue-social-sharing/-/vue-social-sharing-3.0.5.tgz", - "integrity": "sha512-wQWdL5SUR0amy1y5ZrHpfgrYYYFMjAKyn+81lVMeZsoKMTYESAGZC+fQSHA3ThLaFY2wtLcJ9uTkWygHVWu7XQ==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vue-social-sharing/-/vue-social-sharing-3.0.7.tgz", + "integrity": "sha512-6FS+9t9qJQXY/Km0oyfpJv7rtjhqvrQodpVc/cbBc6TvQdhXc64pHi4yoqa3Jv797veNAlFuLztYyir9jONhBg==", + "peerDependencies": { + "vue": "^2.6.10" + } }, "node_modules/vue-style-loader": { "version": "4.1.3", @@ -22885,6 +23045,12 @@ "integrity": "sha512-R2mcc+bp9VbKBQ3YIbCqUbWcWfmWSp1NIEyNGiLKkrcZmyUF/+0D48BqMCTx61AgJzWPW5DJzB6VkmpjbMIDbA==", "dev": true }, + "node_modules/vuepress-plugin-chunkload-redirect": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vuepress-plugin-chunkload-redirect/-/vuepress-plugin-chunkload-redirect-1.0.3.tgz", + "integrity": "sha512-5VgvGw9t9v6DZU4NNksph9+en7v8NIo/gDKDnUdFkM+kuTnp4BAmWA+2JbpFIaw4Ke8R1txb2LZmAmuOum3DEA==", + "dev": true + }, "node_modules/vuepress-plugin-clean-urls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vuepress-plugin-clean-urls/-/vuepress-plugin-clean-urls-1.1.2.tgz", @@ -27198,6 +27364,12 @@ "defer-to-connect": "^1.0.1" } }, + "@trysound/sax": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz", + "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==", + "dev": true + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -31450,15 +31622,70 @@ } }, "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-3.1.2.tgz", + "integrity": "sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "css-what": "^4.0.0", + "domhandler": "^4.0.0", + "domutils": "^2.4.3", + "nth-check": "^2.0.0" + }, + "dependencies": { + "dom-serializer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.1.tgz", + "integrity": "sha512-Pv2ZluG5ife96udGgEDovOOOA5UELkltfJpnIExPrAk1LTvecolUGn6lIaoLh86d83GiB86CjzciMd9BuRB71Q==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domhandler": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.1.0.tgz", + "integrity": "sha512-/6/kmsGlMY4Tup/nGVutdrK9yQi4YjWVcVeoQmixpzjOUK1U7pQkvAPHBJeUxOgxF0J8f8lwCJSlCfD0V4CMGQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.5.2.tgz", + "integrity": "sha512-MHTthCb1zj8f1GVfRpeZUbohQf/HdBos0oX5gZcQFepOZPLLRyj6Wn7XS7EMnY7CVpwv8863u2vyE83Hfu28HQ==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.1.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + } } }, "css-select-base-adapter": { @@ -31468,12 +31695,12 @@ "dev": true }, "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dev": true, "requires": { - "mdn-data": "2.0.4", + "mdn-data": "2.0.14", "source-map": "^0.6.1" }, "dependencies": { @@ -31492,9 +31719,9 @@ "dev": true }, "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-4.0.0.tgz", + "integrity": "sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==", "dev": true }, "cssesc": { @@ -31621,36 +31848,12 @@ "dev": true }, "csso": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", - "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, "requires": { - "css-tree": "1.0.0-alpha.39" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", - "dev": true, - "requires": { - "mdn-data": "2.0.6", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "css-tree": "^1.1.2" } }, "cuint": { @@ -32611,9 +32814,9 @@ "dev": true }, "eslint": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.23.0.tgz", - "integrity": "sha512-kqvNVbdkjzpFy0XOszNwjkKzZ+6TcwCQ/h+ozlcIWwaimBBuhlQ4nN6kbiM2L+OjDcznkTJxzYfRFH92sx4a0Q==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz", + "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==", "dev": true, "requires": { "@babel/code-frame": "7.12.11", @@ -32753,9 +32956,9 @@ } }, "eslint-config-prettier": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.1.0.tgz", - "integrity": "sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.2.0.tgz", + "integrity": "sha512-dWV9EVeSo2qodOPi1iBYU/x6F6diHv8uujxbxr77xExs3zTAlNXvVZKiyLsQGNz7yPV2K49JY5WjPzNIuDc2Bw==", "dev": true, "requires": {} }, @@ -32906,24 +33109,25 @@ } }, "eslint-plugin-prettier": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz", - "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" } }, "eslint-plugin-promise": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz", - "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==", - "dev": true + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz", + "integrity": "sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==", + "dev": true, + "requires": {} }, "eslint-plugin-vue": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.8.0.tgz", - "integrity": "sha512-OGrnPz+PuYL2HmVyBHxm4mRjxW2kfFCQE6Hw9G6qOHs/Pcu0srOlCCW0FMa8SLzIEqxl8WuKoBSPcMnrjUG2vw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.9.0.tgz", + "integrity": "sha512-2Q0qQp5+5h+pZvJKCbG1/jCRUYrdgAz5BYKGyTlp2NU8mx09u3Hp7PsH6d5qef6ojuPoCXMnrbbDxeoplihrSw==", "dev": true, "requires": { "eslint-utils": "^2.1.0", @@ -36631,9 +36835,9 @@ "dev": true }, "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true }, "mdurl": { @@ -38954,11 +39158,83 @@ "svgo": "^1.0.0" }, "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } } } }, @@ -40518,9 +40794,9 @@ } }, "slug": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/slug/-/slug-4.0.3.tgz", - "integrity": "sha512-CnR9sYvJn6JW8hDzxRVg8imqzaJrCuUMc8poiFmd3tqWQXxeEQdwsBbBidSdl+Q3obwxQ4hrx7kxcUH9oCE9yw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/slug/-/slug-4.0.4.tgz", + "integrity": "sha512-GwSsWjX2rcIAtbKWGaxnzASWljWraPQry0RmCnRkji2pEggVjgb5HjXdqN0Gb6JOPg19rsC3hHUYXbOnHXKv2Q==", "dev": true }, "smoothscroll-polyfill": { @@ -42101,9 +42377,9 @@ } }, "svg-sprite-loader": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-5.2.1.tgz", - "integrity": "sha512-n2IZc87rpOeXh+PQFksFMGCfMV/BT01YG+Dlbyjoh2Cz8BSTL5Vi/7KDr86Pt/u1NRDCVb3vY74BF5rKCmqbNA==", + "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==", "dev": true, "requires": { "bluebird": "^3.5.0", @@ -42131,47 +42407,36 @@ "dev": true }, "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.0.tgz", + "integrity": "sha512-fz4IKjNO6HDPgIQxu4IxwtubtbSfGEAJUq/IXyTPIkGhWck/faiiwfkvsB8LnBkKLvSoyNNIY6d13lZprJMc9Q==", "dev": true, "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" + "@trysound/sax": "0.1.1", + "chalk": "^4.1.0", + "commander": "^7.1.0", + "css-select": "^3.1.2", + "css-tree": "^1.1.2", + "csso": "^4.2.0", + "stable": "^0.1.8" }, "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true } } }, "svgo-loader": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-2.2.2.tgz", - "integrity": "sha512-UeE/4yZEK96LoYqvxwh8YqCOJCjXwRY9K6YT99vXE+nYhs/W8hAY2hNf5zg/lRsyKshJkR79V+4beV3cbGL40Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-3.0.0.tgz", + "integrity": "sha512-gwyFuzTxZ8hEWYKQ9GodudSKRHzW8CUqgdfsdNpu1U5Keow5dPIgxT4DoHUEVXQRolefgSCeBtW3y12CyhIGxw==", "dev": true, "requires": { - "js-yaml": "^3.13.1", - "loader-utils": "^1.0.3" + "loader-utils": "^1.0.3", + "svgo": "^2.2.0" } }, "table": { @@ -43418,13 +43683,12 @@ "vue": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz", - "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==", - "dev": true + "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==" }, "vue-advanced-cropper": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-1.3.1.tgz", - "integrity": "sha512-VsCx+PRize+BYpET5Nk1nxP7CSI8zd+cDx4imdqCg+ImlOUegLwMBiEePFIoIgIdMpiwPQzkPY51Ad2IZcZ+IA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-1.5.0.tgz", + "integrity": "sha512-WQs15c8wFRCje2GLdD6aGCRapttjjKE/dmz0qVFlRB7q38scB6G51G7eh5Jcnm4jMUgOX3OVD1sD2UWmHpaNpQ==", "requires": { "classnames": "^2.2.6", "debounce": "^1.2.0", @@ -43508,11 +43772,6 @@ "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-2.1.6.tgz", "integrity": "sha512-s7jmZPlm9FeueJg1RwJtnE9KNPtME/7C8uRWSfp9/yEN4M8XcS/d+bddoyVwVnvFyRh9msFo0HWeW0vTL8Qv+w==" }, - "vue-observe-visibility": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vue-observe-visibility/-/vue-observe-visibility-0.4.6.tgz", - "integrity": "sha512-xo0CEVdkjSjhJoDdLSvoZoQrw/H2BlzB5jrCBKGZNXN2zdZgMuZ9BKrxXDjNP2AxlcCoKc8OahI3F3r3JGLv2Q==" - }, "vue-property-decorator": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.5.1.tgz", @@ -43602,9 +43861,10 @@ } }, "vue-social-sharing": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/vue-social-sharing/-/vue-social-sharing-3.0.5.tgz", - "integrity": "sha512-wQWdL5SUR0amy1y5ZrHpfgrYYYFMjAKyn+81lVMeZsoKMTYESAGZC+fQSHA3ThLaFY2wtLcJ9uTkWygHVWu7XQ==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vue-social-sharing/-/vue-social-sharing-3.0.7.tgz", + "integrity": "sha512-6FS+9t9qJQXY/Km0oyfpJv7rtjhqvrQodpVc/cbBc6TvQdhXc64pHi4yoqa3Jv797veNAlFuLztYyir9jONhBg==", + "requires": {} }, "vue-style-loader": { "version": "4.1.3", @@ -43715,6 +43975,12 @@ "integrity": "sha512-R2mcc+bp9VbKBQ3YIbCqUbWcWfmWSp1NIEyNGiLKkrcZmyUF/+0D48BqMCTx61AgJzWPW5DJzB6VkmpjbMIDbA==", "dev": true }, + "vuepress-plugin-chunkload-redirect": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vuepress-plugin-chunkload-redirect/-/vuepress-plugin-chunkload-redirect-1.0.3.tgz", + "integrity": "sha512-5VgvGw9t9v6DZU4NNksph9+en7v8NIo/gDKDnUdFkM+kuTnp4BAmWA+2JbpFIaw4Ke8R1txb2LZmAmuOum3DEA==", + "dev": true + }, "vuepress-plugin-clean-urls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vuepress-plugin-clean-urls/-/vuepress-plugin-clean-urls-1.1.2.tgz", diff --git a/package.json b/package.json index cd838f72..b7947fc9 100644 --- a/package.json +++ b/package.json @@ -22,14 +22,15 @@ "@vuepress/plugin-html-redirect": "^0.1.2", "@vuepress/plugin-last-updated": "^1.8.2", "autoprefixer": "^9.8.6", - "eslint": "^7.23.0", - "eslint-config-prettier": "^8.1.0", + "eslint": "^7.24.0", + "eslint-config-prettier": "^8.2.0", "eslint-config-standard": "^16.0.2", "eslint-plugin-import": "^2.22.1", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^3.3.1", - "eslint-plugin-promise": "^4.3.1", - "eslint-plugin-vue": "^7.8.0", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-promise": "^5.1.0", + "eslint-plugin-vue": "^7.9.0", + "gray-matter": "^4.0.2", "husky": "^6.0.0", "lint-staged": "^10.5.4", "lodash": "^4.17.21", @@ -38,22 +39,24 @@ "markdown-it-task-lists": "^2.1.1", "markdown-it-video": "^0.6.3", "npm-run-all": "^4.1.5", + "p-map": "^4.0.0", "postcss": "^7.0.35", "prettier": "^2.2.1", - "slug": "^4.0.3", + "slug": "^4.0.4", "standard-version": "^9.2.0", "stylelint": "^13.12.0", "stylelint-config-prettier": "^8.0.2", "stylelint-prettier": "^1.2.0", - "svg-sprite-loader": "^5.2.1", - "svgo": "^1.3.2", - "svgo-loader": "^2.2.2", + "svg-sprite-loader": "^6.0.5", + "svgo": "^2.3.0", + "svgo-loader": "^3.0.0", "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.1.0", "tailwindcss-line-clamp": "^1.0.5", "tailwindcss-touch": "^1.0.1", "vue": "^2.6.12", "vuepress": "^1.8.2", "vuepress-plugin-canonical": "^1.0.0", + "vuepress-plugin-chunkload-redirect": "^1.0.3", "vuepress-plugin-clean-urls": "^1.1.2", "vuepress-plugin-ipfs": "^1.0.2", "vuepress-plugin-robots": "^1.0.1", @@ -77,11 +80,10 @@ "tailwindcss-typography": "^3.1.0", "v-lazy-image": "^1.4.0", "v-scroll-lock": "^1.3.1", - "vue-advanced-cropper": "^1.3.1", + "vue-advanced-cropper": "^1.5.0", "vue-mq": "^1.0.1", "vue-multiselect": "^2.1.6", - "vue-observe-visibility": "^0.4.6", - "vue-social-sharing": "^3.0.5", + "vue-social-sharing": "^3.0.7", "vuepress-plugin-img-lazy": "^1.0.4", "vuex": "^3.6.2" } diff --git a/scripts/scheduled-publishing.js b/scripts/scheduled-publishing.js new file mode 100755 index 00000000..3cf9f6b8 --- /dev/null +++ b/scripts/scheduled-publishing.js @@ -0,0 +1,98 @@ +#!/usr/bin/env node + +'use strict' + +/** + * Scheduled Publishing of posts and links. + * This script checks for any blog posts and links that are scheduled to + * be published, but are to be published today. If there is at least + * one found, a build is trigged in fleek, updating the website + * with the latest data. + */ + +const fs = require('fs') +const path = require('path') + +const pMap = require('p-map') +const matter = require('gray-matter') +const dayjs = require('dayjs') + +const isBetween = require('dayjs/plugin/isBetween') +dayjs.extend(isBetween) + +async function main() { + // read files contents concurrently, 10 at a time + const contentDir = path.resolve(__dirname, '../src/_blog') + const files = await pMap( + await fs.promises.readdir(contentDir), + (filename) => { + if (!filename.endsWith('.md')) { + return null + } + + return fs.promises.readFile(path.resolve(contentDir, filename), 'utf8') + }, + { concurrency: 10 } + ) + + const output = files + // exclude possible nulls + .filter((result) => !!result) + // process files into publishable items (posts or links) + .reduce((items, fileContent) => { + const metadata = matter(fileContent).data + + if (metadata.type && metadata.data) { + // links + items.push(...metadata.data) + } else { + items.push(metadata) + } + + return items + }, []) + // check if there is at least one publish date in the future + .some((item) => { + let publishDate + + // blog post + if (item.permalink) { + publishDate = item.date + } + + // links + if (item.url && item.publish_date) { + publishDate = item.publish_date + } + + if (!publishDate) { + return false + } + + // we trim to the hour to avoid counting the initial delays on triggering + // the job, which could cause the time calculations to exclude specific + // scheduled dates and times. + const now = dayjs(new Date()).startOf('hour') + const timeMatch = dayjs(new Date(publishDate)).isBetween( + now.subtract(12, 'hour'), + now + ) + + // using stderr since stdout is used for GH workflow output + if (timeMatch) { + console.error(`Found post/link to publish: "${item.title}"`) + } + + return timeMatch + }) + + if (!output) { + console.error('Nothing found to publish.') + } + + // output true or false: should trigger publish or not + // GH Workflow step reads from stdout + console.log(output) +} + +main() diff --git a/src/.vuepress/config.js b/src/.vuepress/config.js index 6c107e13..51977749 100644 --- a/src/.vuepress/config.js +++ b/src/.vuepress/config.js @@ -3,6 +3,7 @@ const { reverse, sortBy } = require('lodash') // configure this to an absolute url to enable a generated sitemap & blog RSS feeds const CANONICAL_BASE = process.env.CANONICAL_BASE || '' const IPFS_DEPLOY = process.env.IPFS_DEPLOY === 'true' || false +const SPEEDCURVE_ID = process.env.SPEEDCURVE_ID || '' const themeConfigDefaults = { dateFormat: 'DD MMMM YYYY', @@ -134,6 +135,7 @@ module.exports = { }, }, plugins: [ + [require('./plugins/vuepress-plugin-speedcurve'), { id: SPEEDCURVE_ID }], ['@vuepress/last-updated'], [ 'vuepress-plugin-clean-urls', @@ -247,6 +249,7 @@ module.exports = { countdown: 0, }, ], + 'vuepress-plugin-chunkload-redirect', ['vuepress-plugin-ipfs', IPFS_DEPLOY], ], extraWatchFiles: ['.vuepress/config/head.js'], diff --git a/src/.vuepress/plugins/pageData.js b/src/.vuepress/plugins/pageData.js index e503fa2a..79d5e59f 100644 --- a/src/.vuepress/plugins/pageData.js +++ b/src/.vuepress/plugins/pageData.js @@ -1,4 +1,32 @@ const slug = require('slug') +const dayjs = require('dayjs') + +function shouldBeHidden(frontmatter) { + const isDateInFuture = (date) => dayjs(new Date(date)).isAfter(dayjs()) + let shouldHide = frontmatter.hidden || false + + // sitemap config + if (frontmatter.sitemap) { + shouldHide = shouldHide || frontmatter.sitemap.exclude + } + + // scheduled posts + // see auto-publishing of scheduled posts here: https://github.com/ipfs/ipfs-blog/issues/147 + if ( + !shouldHide && + frontmatter.permalink && // permalink is unique to posts + frontmatter.date + ) { + shouldHide = shouldHide || isDateInFuture(frontmatter.date) + } + + // scheduled links (path is unique to links) + if (!shouldHide && frontmatter.path && frontmatter.publish_date) { + shouldHide = shouldHide || isDateInFuture(frontmatter.publish_date) + } + + return shouldHide +} module.exports = (options, context) => ({ extendPageData($page) { @@ -18,8 +46,8 @@ module.exports = (options, context) => ({ frontmatter.authorKey = authorKey } - // exclude a page from the feed & robots if excluded from sitemap - if (frontmatter.sitemap && frontmatter.sitemap.exclude) { + // exclude hidden pages (sitemap config, future publishes, etc) + if (shouldBeHidden(frontmatter)) { frontmatter.feed = { enable: false, } @@ -30,6 +58,18 @@ module.exports = (options, context) => ({ } else { frontmatter.meta = [noIndex] } + + 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 + } + }) } }, }) diff --git a/src/.vuepress/plugins/vuepress-plugin-speedcurve/enhanceAppFiles.js b/src/.vuepress/plugins/vuepress-plugin-speedcurve/enhanceAppFiles.js new file mode 100644 index 00000000..ed374582 --- /dev/null +++ b/src/.vuepress/plugins/vuepress-plugin-speedcurve/enhanceAppFiles.js @@ -0,0 +1,29 @@ +'use strict' + +/* global SPEEDCURVE_ID */ + +module.exports = () => { + if ( + process.env.NODE_ENV === 'production' && + SPEEDCURVE_ID && + typeof window !== 'undefined' + ) { + ;(function () { + const customScriptCode = `LUX=(function(){var a=("undefined"!==typeof(LUX)&&"undefined"!==typeof(LUX.gaMarks)?LUX.gaMarks:[]);var d=("undefined"!==typeof(LUX)&&"undefined"!==typeof(LUX.gaMeasures)?LUX.gaMeasures:[]);var j="LUX_start";var k=window.performance;var l=("undefined"!==typeof(LUX)&&LUX.ns?LUX.ns:(Date.now?Date.now():+(new Date())));if(k&&k.timing&&k.timing.navigationStart){l=k.timing.navigationStart}function f(){if(k&&k.now){return k.now()}var o=Date.now?Date.now():+(new Date());return o-l}function b(n){if(k){if(k.mark){return k.mark(n)}else{if(k.webkitMark){return k.webkitMark(n)}}}a.push({name:n,entryType:"mark",startTime:f(),duration:0});return}function m(p,t,n){if("undefined"===typeof(t)&&h(j)){t=j}if(k){if(k.measure){if(t){if(n){return k.measure(p,t,n)}else{return k.measure(p,t)}}else{return k.measure(p)}}else{if(k.webkitMeasure){return k.webkitMeasure(p,t,n)}}}var r=0,o=f();if(t){var s=h(t);if(s){r=s.startTime}else{if(k&&k.timing&&k.timing[t]){r=k.timing[t]-k.timing.navigationStart}else{return}}}if(n){var q=h(n);if(q){o=q.startTime}else{if(k&&k.timing&&k.timing[n]){o=k.timing[n]-k.timing.navigationStart}else{return}}}d.push({name:p,entryType:"measure",startTime:r,duration:(o-r)});return}function h(n){return c(n,g())}function c(p,o){for(i=o.length-1;i>=0;i--){var n=o[i];if(p===n.name){return n}}return undefined}function g(){if(k){if(k.getEntriesByType){return k.getEntriesByType("mark")}else{if(k.webkitGetEntriesByType){return k.webkitGetEntriesByType("mark")}}}return a}return{mark:b,measure:m,gaMarks:a,gaMeasures:d}})();LUX.ns=(Date.now?Date.now():+(new Date()));LUX.ac=[];LUX.cmd=function(a){LUX.ac.push(a)};LUX.init=function(){LUX.cmd(["init"])};LUX.send=function(){LUX.cmd(["send"])};LUX.addData=function(a,b){LUX.cmd(["addData",a,b])};LUX_ae=[];window.addEventListener("error",function(a){LUX_ae.push(a)});LUX_al=[];if("function"===typeof(PerformanceObserver)&&"function"===typeof(PerformanceLongTaskTiming)){var LongTaskObserver=new PerformanceObserver(function(c){var b=c.getEntries();for(var a=0;a ({ + name: 'vuepress-plugin-speedcurve', + define() { + const id = params.id + + return { SPEEDCURVE_ID: id || false } + }, + enhanceAppFiles: path.resolve(__dirname, 'enhanceAppFiles.js'), +}) diff --git a/src/.vuepress/public/100-IPFS-mobile-design-guidelines-cheat-sheet.png b/src/.vuepress/public/100-IPFS-mobile-design-guidelines-cheat-sheet.png index 8914f284..d8a1c7d5 100644 Binary files a/src/.vuepress/public/100-IPFS-mobile-design-guidelines-cheat-sheet.png and b/src/.vuepress/public/100-IPFS-mobile-design-guidelines-cheat-sheet.png differ diff --git a/src/.vuepress/public/android-chrome-192x192.png b/src/.vuepress/public/android-chrome-192x192.png index 401df594..3586c244 100644 Binary files a/src/.vuepress/public/android-chrome-192x192.png and b/src/.vuepress/public/android-chrome-192x192.png differ diff --git a/src/.vuepress/public/android-chrome-512x512.png b/src/.vuepress/public/android-chrome-512x512.png index 59a57810..af16edc2 100644 Binary files a/src/.vuepress/public/android-chrome-512x512.png and b/src/.vuepress/public/android-chrome-512x512.png differ diff --git a/src/.vuepress/public/apple-touch-icon-114x114.png b/src/.vuepress/public/apple-touch-icon-114x114.png index f035eeb1..ae6e6014 100644 Binary files a/src/.vuepress/public/apple-touch-icon-114x114.png and b/src/.vuepress/public/apple-touch-icon-114x114.png differ diff --git a/src/.vuepress/public/apple-touch-icon-120x120.png b/src/.vuepress/public/apple-touch-icon-120x120.png index a28bb1a8..b87f8a15 100644 Binary files a/src/.vuepress/public/apple-touch-icon-120x120.png and b/src/.vuepress/public/apple-touch-icon-120x120.png differ diff --git a/src/.vuepress/public/apple-touch-icon-144x144.png b/src/.vuepress/public/apple-touch-icon-144x144.png index 55b235d4..1b66b836 100644 Binary files a/src/.vuepress/public/apple-touch-icon-144x144.png and b/src/.vuepress/public/apple-touch-icon-144x144.png differ diff --git a/src/.vuepress/public/apple-touch-icon-152x152.png b/src/.vuepress/public/apple-touch-icon-152x152.png index eeabba49..b672a2a3 100644 Binary files a/src/.vuepress/public/apple-touch-icon-152x152.png and b/src/.vuepress/public/apple-touch-icon-152x152.png differ diff --git a/src/.vuepress/public/apple-touch-icon-180x180.png b/src/.vuepress/public/apple-touch-icon-180x180.png index 345de33a..a00cef70 100644 Binary files a/src/.vuepress/public/apple-touch-icon-180x180.png and b/src/.vuepress/public/apple-touch-icon-180x180.png differ diff --git a/src/.vuepress/public/apple-touch-icon-57x57.png b/src/.vuepress/public/apple-touch-icon-57x57.png index 061f69ee..3d6a6573 100644 Binary files a/src/.vuepress/public/apple-touch-icon-57x57.png and b/src/.vuepress/public/apple-touch-icon-57x57.png differ diff --git a/src/.vuepress/public/apple-touch-icon-60x60.png b/src/.vuepress/public/apple-touch-icon-60x60.png index 5205f532..773a71c4 100644 Binary files a/src/.vuepress/public/apple-touch-icon-60x60.png and b/src/.vuepress/public/apple-touch-icon-60x60.png differ diff --git a/src/.vuepress/public/apple-touch-icon-72x72.png b/src/.vuepress/public/apple-touch-icon-72x72.png index 216e0464..0d160eda 100644 Binary files a/src/.vuepress/public/apple-touch-icon-72x72.png and b/src/.vuepress/public/apple-touch-icon-72x72.png differ diff --git a/src/.vuepress/public/apple-touch-icon-76x76.png b/src/.vuepress/public/apple-touch-icon-76x76.png index 3212b84d..375dfb1f 100644 Binary files a/src/.vuepress/public/apple-touch-icon-76x76.png and b/src/.vuepress/public/apple-touch-icon-76x76.png differ diff --git a/src/.vuepress/public/apple-touch-icon.png b/src/.vuepress/public/apple-touch-icon.png index e6b70538..a00cef70 100644 Binary files a/src/.vuepress/public/apple-touch-icon.png and b/src/.vuepress/public/apple-touch-icon.png differ diff --git a/src/.vuepress/public/favicon-16x16.png b/src/.vuepress/public/favicon-16x16.png index 4b08f2f7..e42d7f42 100644 Binary files a/src/.vuepress/public/favicon-16x16.png and b/src/.vuepress/public/favicon-16x16.png differ diff --git a/src/.vuepress/public/favicon-32x32.png b/src/.vuepress/public/favicon-32x32.png index d85e4fde..50442dd1 100644 Binary files a/src/.vuepress/public/favicon-32x32.png and b/src/.vuepress/public/favicon-32x32.png differ diff --git a/src/.vuepress/public/favicon-48x48.png b/src/.vuepress/public/favicon-48x48.png index a36df8ad..249c2506 100644 Binary files a/src/.vuepress/public/favicon-48x48.png and b/src/.vuepress/public/favicon-48x48.png differ diff --git a/src/.vuepress/public/mstile-150x150.png b/src/.vuepress/public/mstile-150x150.png index 1f6abfc6..609272b8 100644 Binary files a/src/.vuepress/public/mstile-150x150.png and b/src/.vuepress/public/mstile-150x150.png differ diff --git a/src/.vuepress/theme/enhanceApp.js b/src/.vuepress/theme/enhanceApp.js index 0f9937e7..cbf0dcd6 100644 --- a/src/.vuepress/theme/enhanceApp.js +++ b/src/.vuepress/theme/enhanceApp.js @@ -4,7 +4,6 @@ import { createStore } from '@theme/store/store' import VScrollLock from 'v-scroll-lock' import VueMq from 'vue-mq' import { VLazyImagePlugin } from 'v-lazy-image' -import VueObserveVisibility from 'vue-observe-visibility' import VueSocialSharing from 'vue-social-sharing' import Transition from '@theme/components/directives/Transition.js' @@ -39,7 +38,6 @@ export default ({ Vue, router, siteData, isServer }) => { Vue.use(VScrollLock) Vue.use(VueMq, { breakpoints }) Vue.use(VLazyImagePlugin) - Vue.use(VueObserveVisibility) Vue.use(VueSocialSharing) Vue.directive(Transition.name, Transition.directive) diff --git a/src/.vuepress/theme/layouts/Blog.vue b/src/.vuepress/theme/layouts/Blog.vue index 64eec2f0..ad47102d 100644 --- a/src/.vuepress/theme/layouts/Blog.vue +++ b/src/.vuepress/theme/layouts/Blog.vue @@ -80,6 +80,7 @@ export default { numberOfPagesToShow: 24, infiniteScroll: false, delayValues: [0, 0.15, 0.3], + observer: null, } }, computed: { @@ -128,14 +129,8 @@ export default { return false } - if ( - page.frontmatter && - (page.frontmatter.sitemap ? !page.frontmatter.sitemap.exclude : true) - ) { - result.push({ - ...page, - category: defaultCategory, - }) + if (page.frontmatter && !page.frontmatter.hidden) { + result.push({ ...page, category: defaultCategory }) } }) @@ -211,14 +206,14 @@ export default { this.$store.commit('appState/setAuthorsList', authorsArray) }, mounted() { - const observer = new IntersectionObserver( + this.observer = new IntersectionObserver( this.handleBottomVisibilityChange, { threshold: 1.0, } ) - observer.observe(document.querySelector('footer.footer ul')) + this.observer.observe(document.querySelector('footer.footer ul')) const { query } = this.$route const newQuery = pick(Object.assign({}, query), [ @@ -319,6 +314,9 @@ export default { this.$store.commit('appState/setLatestWeeklyPost', latestWeeklyPost) }, + beforeDestroy() { + this.observer.disconnect() + }, methods: { updateQuery() { const newQuery = { diff --git a/src/.vuepress/theme/layouts/BlogPost.vue b/src/.vuepress/theme/layouts/BlogPost.vue index 8c954a05..50d4d681 100644 --- a/src/.vuepress/theme/layouts/BlogPost.vue +++ b/src/.vuepress/theme/layouts/BlogPost.vue @@ -1,5 +1,5 @@