diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..97d9df5 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Contributing to Vue Class Component + +Thank you for contributing to Vue Class Component! To manage the process smoothly, please take a look at the following points. + +## Issue Reporting + +Please make sure that your issue is either a **bug report** or **feature request**. The other kinds of issue will be closed immediately. For usage questions, +please use [Stack Overflow](https://stackoverflow.com/), [the official Vue.js forum](https://forum.vuejs.org), [the official Discord server](https://chat.vuejs.org), etc. + +Also, please try searching existing issue before creating a new one. Your issue may exist already in an old thread. + +### Bug Report + +Please **make sure to provide [minimal and self-contained reproduction](https://new-issue.vuejs.org/?repo=vuejs/vue#why-repro)**. +A bug report without a proper reproduction may be closed immediately. + +To create a reproduction, you can use on-browser playground such as JSFiddle ([template for Vue Class Component](https://jsfiddle.net/ktsn/nm55jnjk/)) +or create a GitHub repository and share its link. + +Please also clarify the expected behavior, actual behavior and steps to reproduce the bug to confirm it precisely. + +### Feature Request + +For feature request, please make sure to clarify **the use case** that you want to solve. +Explaining it with actual code example or pseudo code would be useful to share your idea. + +## Pull Request + +Please do not commit the files under `dist/`. They are supporsed to be generated during the releasing process. diff --git a/README.md b/README.md index 4d4f78e..d1d2a00 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,33 @@ -# Vue Class Component +# [DEPRECATED] Vue Class Component + + +## ⚠️ Notice + +This library is no longer actively maintained. It is no longer recommend to use Class-based components in Vue 3. The recommended way to use Vue 3 in large applications is Single-File Components, Composition API, and `<script setup>`. If you still want to use classes, check out the community-maintained project [`vue-facing-decorator`](https://facing-dev.github.io/vue-facing-decorator/#/). + +Additionally, if you're interested in migrating out of class components, you might find the CLI tool [`vue-class-migrator`](https://github.com/getyourguide/vue-class-migrator) helpful for the transition. + +--- ECMAScript / TypeScript decorator for class-style Vue components. -[](https://www.npmjs.com/package/vue-class-component) [](https://gitpod.io/#https://github.com/vuejs/vue-class-component) +[](https://www.npmjs.com/package/vue-class-component) [](https://gitpod.io/#https://github.com/vuejs/vue-class-component) ## Document See [https://class-component.vuejs.org](https://class-component.vuejs.org) +> Please note, documentation for v8 is not ready yet. Check out the readme in the respective branch or see [v8 proposals in the issue list](https://github.com/vuejs/vue-class-component/issues?q=is%3Aopen+is%3Aissue+label%3Av8) + ## Online one-click setup for contributing Contribute to Vue Class Component using a fully featured online development environment that will automatically: clone the repo, install the dependencies and start the docs web server and run `yarn dev`. [](https://gitpod.io/from-referrer/) -## Questions +## Issue reporting / pull requests -For questions and support please use the [the official forum](http://forum.vuejs.org) or [community chat](https://chat.vuejs.org/). The issue list of this repo is **exclusively** for bug reports and feature requests. +See [contribution guideline](./.github/CONTRIBUTING.md) ## License diff --git a/dist/vue-class-component.common.js b/dist/vue-class-component.common.js index 8d43de1..4d6918d 100644 --- a/dist/vue-class-component.common.js +++ b/dist/vue-class-component.common.js @@ -1,5 +1,5 @@ /** - * vue-class-component v7.2.5 + * vue-class-component v7.2.6 * (c) 2015-present Evan You * @license MIT */ diff --git a/dist/vue-class-component.esm.browser.js b/dist/vue-class-component.esm.browser.js index fae4f6b..86fe28b 100644 --- a/dist/vue-class-component.esm.browser.js +++ b/dist/vue-class-component.esm.browser.js @@ -1,5 +1,5 @@ /** - * vue-class-component v7.2.5 + * vue-class-component v7.2.6 * (c) 2015-present Evan You * @license MIT */ diff --git a/dist/vue-class-component.esm.browser.min.js b/dist/vue-class-component.esm.browser.min.js index 164e0df..473e982 100644 --- a/dist/vue-class-component.esm.browser.min.js +++ b/dist/vue-class-component.esm.browser.min.js @@ -1,5 +1,5 @@ /** - * vue-class-component v7.2.5 + * vue-class-component v7.2.6 * (c) 2015-present Evan You * @license MIT */ diff --git a/dist/vue-class-component.esm.js b/dist/vue-class-component.esm.js index 3b5b64d..d8cefd6 100644 --- a/dist/vue-class-component.esm.js +++ b/dist/vue-class-component.esm.js @@ -1,5 +1,5 @@ /** - * vue-class-component v7.2.5 + * vue-class-component v7.2.6 * (c) 2015-present Evan You * @license MIT */ diff --git a/dist/vue-class-component.js b/dist/vue-class-component.js index 189d69a..94fd855 100644 --- a/dist/vue-class-component.js +++ b/dist/vue-class-component.js @@ -1,5 +1,5 @@ /** - * vue-class-component v7.2.5 + * vue-class-component v7.2.6 * (c) 2015-present Evan You * @license MIT */ diff --git a/dist/vue-class-component.min.js b/dist/vue-class-component.min.js index 4f43f04..6ee7b7c 100644 --- a/dist/vue-class-component.min.js +++ b/dist/vue-class-component.min.js @@ -1,5 +1,5 @@ /** - * vue-class-component v7.2.5 + * vue-class-component v7.2.6 * (c) 2015-present Evan You * @license MIT */ diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 552507b..a316ebb 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -44,7 +44,8 @@ module.exports = { 'guide/props-definition.md', 'guide/property-type-declaration.md', 'guide/refs-type-extension.md', - 'guide/hooks-auto-complete.md' + 'guide/hooks-auto-complete.md', + 'guide/annotate-component-type-in-decorator' ] } ] diff --git a/docs/README.md b/docs/README.md index 8e49fda..af49474 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,5 +1,12 @@ # Overview +:::warning +This library is no longer actively maintained. It is no longer recommend to use Class-based components in Vue 3. The recommended way to use Vue 3 in large applications is Single-File Components, Composition API, and `<script setup>`. If you still want to use classes, check out the community-maintained project [`vue-facing-decorator`](https://facing-dev.github.io/vue-facing-decorator/#/). + +Additionally, if you're interested in migrating out of class components, you might find the CLI tool [`vue-class-migrator`](https://github.com/getyourguide/vue-class-migrator) helpful for the transition. + +::: + Vue Class Component is a library that lets you make your Vue components in class-style syntax. For example, below is a simple counter component written with Vue Class Component: ```vue diff --git a/docs/api/README.md b/docs/api/README.md index c265eb1..9a38380 100644 --- a/docs/api/README.md +++ b/docs/api/README.md @@ -54,7 +54,7 @@ See also: [Hooks](../guide/class-component.md#Hooks) ## Built-in Hook Method Types -Only available in TypeScript. It enables built-in hooks methods auto-complete once your import it: +Only available in TypeScript. It enables built-in hooks methods auto-complete once you import it: ```ts import 'vue-class-component/hooks' diff --git a/docs/guide/annotate-component-type-in-decorator.md b/docs/guide/annotate-component-type-in-decorator.md new file mode 100644 index 0000000..cb3412d --- /dev/null +++ b/docs/guide/annotate-component-type-in-decorator.md @@ -0,0 +1,45 @@ +# Annotate Component Type in Decorator + +There are cases that you want to use your component type on a function in `@Component` decorator argument. +For example, to access component methods in a watch handler: + +```ts +@Component({ + watch: { + postId(id: string) { + // To fetch post data when the id is changed. + this.fetchPost(id) // -> Property 'fetchPost' does not exist on type 'Vue'. + } + } +}) +class Post extends Vue { + postId: string + + fetchPost(postId: string): Promise<void> { + // ... + } +} +``` + +The above code produces a type error that indicates `fetchPost` does not exist on `this` in the watch handler. This happens because `this` type in `@Component` decorator argument is the base `Vue` type. + +To use your own component type (in this case `Post`), you can annotate the decorator through its type parameter. + +```ts +// Annotate the decorator with the component type 'Post' so that `this` type in +// the decorator argument becomes 'Post'. +@Component<Post>({ + watch: { + postId(id: string) { + this.fetchPost(id) // -> No errors + } + } +}) +class Post extends Vue { + postId: string + + fetchPost(postId: string): Promise<void> { + // ... + } +} +``` diff --git a/docs/guide/refs-type-extension.md b/docs/guide/refs-type-extension.md index e0222f6..5962f13 100644 --- a/docs/guide/refs-type-extension.md +++ b/docs/guide/refs-type-extension.md @@ -1,6 +1,6 @@ # `$refs` Type Extension -`$refs` type of a component is declared as the broadest type to handle all possible type of ref. While it is theoretically collect, in most cases, each ref only has a specific element or a component in practice. +`$refs` type of a component is declared as the broadest type to handle all possible type of ref. While it is theoretically correct, in most cases, each ref only has a specific element or a component in practice. You can specify a specific ref type by overriding `$refs` type in a class component: diff --git a/package.json b/package.json index eed2725..b3d9e58 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-class-component", - "version": "7.2.5", + "version": "7.2.6", "description": "ES201X/TypeScript class decorator for Vue components", "main": "dist/vue-class-component.common.js", "module": "dist/vue-class-component.esm.js", diff --git a/src/util.ts b/src/util.ts index 3cdfbfa..846a836 100644 --- a/src/util.ts +++ b/src/util.ts @@ -52,6 +52,7 @@ export function mixins <A, B> (CtorA: VueClass<A>, CtorB: VueClass<B>): VueClass export function mixins <A, B, C> (CtorA: VueClass<A>, CtorB: VueClass<B>, CtorC: VueClass<C>): VueClass<A & B & C> export function mixins <A, B, C, D> (CtorA: VueClass<A>, CtorB: VueClass<B>, CtorC: VueClass<C>, CtorD: VueClass<D>): VueClass<A & B & C & D> export function mixins <A, B, C, D, E> (CtorA: VueClass<A>, CtorB: VueClass<B>, CtorC: VueClass<C>, CtorD: VueClass<D>, CtorE: VueClass<E>): VueClass<A & B & C & D & E> +export function mixins<T>(...Ctors: VueClass<Vue>[]): VueClass<T> export function mixins<T extends VueClass<Vue>[]>(...Ctors: T): MixedVueClass<T> export function mixins (...Ctors: VueClass<Vue>[]): VueClass<Vue> { diff --git a/yarn.lock b/yarn.lock index 3f38963..5333359 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1734,9 +1734,9 @@ bluebird@^3.5.5: integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== body-parser@1.19.0: version "1.19.0" @@ -2204,9 +2204,9 @@ cli-width@^2.0.0: integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= clipboard@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.4.tgz#836dafd66cf0fea5d71ce5d5b0bf6e958009112d" - integrity sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376" + integrity sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg== dependencies: good-listener "^1.2.2" select "^1.1.2" @@ -2769,7 +2769,7 @@ debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@3.2.6, debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: +debug@3.2.6, debug@^3.1.1, debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -3064,9 +3064,9 @@ domutils@^1.5.1, domutils@^1.7.0: domelementtype "1" dot-prop@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + version "4.2.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" + integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== dependencies: is-obj "^1.0.0" @@ -3099,9 +3099,9 @@ electron-to-chromium@^1.3.322: integrity sha512-GuDv5gkxwRROYnmIVFUohoyrNapWCKLNn80L7Pa+9WRF/oY4t7XLH7wBMsYBgIRwi8BvEvsGKLKh8kOciOp6kA== elliptic@^6.0.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" - integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -3397,9 +3397,9 @@ etag@~1.8.1: integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eventemitter3@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" - integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^1.1.0: version "1.1.1" @@ -3722,11 +3722,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.0.4" follow-redirects@^1.0.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.9.0.tgz#8d5bcdc65b7108fe1508649c79c12d732dcedb4f" - integrity sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A== - dependencies: - debug "^3.0.0" + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== for-in@^1.0.2: version "1.0.2" @@ -4153,9 +4151,9 @@ hash-sum@^1.0.2: integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ= hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" - integrity sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA== + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.1" @@ -4307,9 +4305,9 @@ http-proxy-middleware@0.19.1: micromatch "^3.1.10" http-proxy@^1.17.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" - integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" follow-redirects "^1.0.0" @@ -4441,25 +4439,25 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -inherits@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + version "1.3.7" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" + integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== inquirer@^7.0.0: version "7.0.3" @@ -6607,9 +6605,9 @@ pretty-time@^1.1.0: integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== prismjs@^1.13.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.18.0.tgz#8f04dd47fa232cbd27d1ca969107580ff43f06e4" - integrity sha512-N0r3i/Cto516V8+GKKamhsPVZSFcO0TMUBtIDW6uq6BVqoC3FNtZVZ+cmH16N2XtGQlgRN+sFUTjOdCsEP51qw== + version "1.21.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.21.0.tgz#36c086ec36b45319ec4218ee164c110f9fc015a3" + integrity sha512-uGdSIu1nk3kej2iZsLyDoJ7e9bnPzIgY0naW/HdknGj61zScaprVEVGHrPoXqI+M9sP0NDnTK2jpkvmldpuqDw== optionalDependencies: clipboard "^2.0.0"