├── .eslintignore
├── .browserslistrc
├── examples
├── vue-cli
│ ├── babel.config.js
│ ├── src
│ │ ├── main.js
│ │ └── App.vue
│ ├── README.md
│ ├── package.json
│ └── public
│ │ └── index.html
├── vite
│ ├── src
│ │ ├── main.js
│ │ ├── App.vue
│ │ └── components
│ │ │ ├── vimeo-np.vue
│ │ │ ├── youtube-np.vue
│ │ │ ├── youtube.vue
│ │ │ ├── vimeo.vue
│ │ │ ├── audio.vue
│ │ │ ├── demo.vue
│ │ │ └── video.vue
│ ├── index.html
│ ├── package.json
│ └── yarn.lock
├── nuxt
│ ├── pages
│ │ └── index.vue
│ ├── plugins
│ │ └── vue-plyr.js
│ ├── package.json
│ ├── README.md
│ └── nuxt.config.js
├── shared
│ ├── vimeo-np.vue
│ ├── youtube-np.vue
│ ├── youtube.vue
│ ├── vimeo.vue
│ ├── audio.vue
│ ├── demo.vue
│ └── video.vue
└── html
│ ├── README.md
│ ├── package.json
│ ├── index.html
│ └── yarn.lock
├── babel.config.js
├── .editorconfig
├── prettier.config.js
├── src
├── index.js
└── vue-plyr.vue
├── .gitignore
├── .npmignore
├── public
└── index.html
├── .eslintrc.js
├── .github
└── workflows
│ └── npm.yml
├── LICENSE.md
├── package.json
├── changelog.md
├── rollup.config.js
├── docs
└── index.html
└── README.md
/.eslintignore:
--------------------------------------------------------------------------------
1 | /dist
2 | /examples
3 |
--------------------------------------------------------------------------------
/.browserslistrc:
--------------------------------------------------------------------------------
1 | > 1%
2 | last 2 versions
3 | not ie <= 8
4 |
--------------------------------------------------------------------------------
/examples/vue-cli/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: ['@vue/cli-plugin-babel/preset']
3 | }
4 |
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: ['@vue/cli-plugin-babel/preset'],
3 | plugins: ['@babel/plugin-transform-runtime']
4 | }
5 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | [*.{js, jsx, ts, tsx, vue}]
2 | indent_style = space
3 | indent_size = 2
4 | trim_trailing_whitespace = true
5 | insert_final_newline = true
6 |
--------------------------------------------------------------------------------
/examples/vite/src/main.js:
--------------------------------------------------------------------------------
1 | import { createApp } from 'vue'
2 | import App from './App.vue'
3 | import VuePlyr from 'vue-plyr'
4 | import 'vue-plyr/dist/vue-plyr.css'
5 |
6 | createApp(App).use(VuePlyr).mount('#app')
7 |
--------------------------------------------------------------------------------
/examples/vue-cli/src/main.js:
--------------------------------------------------------------------------------
1 | import { createApp } from 'vue'
2 | import App from './App.vue'
3 |
4 | import VuePlyr from 'vue-plyr'
5 | import 'vue-plyr/dist/vue-plyr.css'
6 |
7 | createApp(App).use(VuePlyr).mount('#app')
8 |
--------------------------------------------------------------------------------
/examples/nuxt/pages/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
14 |
--------------------------------------------------------------------------------
/prettier.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | useTabs: true,
3 | arrowParens: 'avoid',
4 | proseWrap: 'always',
5 | trailingComma: 'none',
6 | semi: false,
7 | singleQuote: true,
8 | vueIndentScriptAndStyle: true
9 | }
10 |
--------------------------------------------------------------------------------
/examples/shared/vimeo-np.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
vimeo (not progressive-enhancement)
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/examples/shared/youtube-np.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
youtube (not progressive-enhancement)
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/examples/html/README.md:
--------------------------------------------------------------------------------
1 | # vue-plyr-html
2 | > An example of how to use vue-plyr with just html.
3 |
4 | ## Usage
5 |
6 | ``` bash
7 | # install dependencies
8 | $ yarn install
9 |
10 | # run the server on port 5000
11 | $ yarn start
12 | ```
13 |
--------------------------------------------------------------------------------
/examples/vite/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
15 |
--------------------------------------------------------------------------------
/examples/vite/src/components/vimeo-np.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
vimeo (not progressive-enhancement)
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/examples/vue-cli/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
15 |
--------------------------------------------------------------------------------
/examples/vite/src/components/youtube-np.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
youtube (not progressive-enhancement)
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/examples/nuxt/plugins/vue-plyr.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import VuePlyr from 'vue-plyr/dist/vue-plyr.ssr.js'
3 | import 'vue-plyr/dist/vue-plyr.css'
4 |
5 | // The second argument is optional and sets the default config values for every player.
6 | Vue.use(VuePlyr, {
7 | plyr: {}
8 | })
9 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import VuePlyr from './vue-plyr.vue'
2 |
3 | VuePlyr.install = (app, options = {}) => {
4 | if (options.plyr) {
5 | VuePlyr.props.options.default = () => {
6 | return { ...options.plyr }
7 | }
8 | }
9 |
10 | app.component(VuePlyr.name, VuePlyr)
11 | }
12 |
13 | export default VuePlyr
14 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /dist
4 | .nuxt
5 |
6 | # local env files
7 | .env.local
8 | .env.*.local
9 |
10 | # Log files
11 | npm-debug.log*
12 | yarn-debug.log*
13 | yarn-error.log*
14 |
15 | # Editor directories and files
16 | .idea
17 | .vscode
18 | *.suo
19 | *.ntvs*
20 | *.njsproj
21 | *.sln
22 | *.sw?
23 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | .directory
2 | .idea
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | demo/
9 | node_modules/
10 | public/
11 | .env
12 | tests
13 | .browserslistrc
14 | .editorconfig
15 | .eslintignore
16 | .eslintrc.js
17 | .gitignore
18 | babel.config.js
19 | changelog.md
20 | postcss.config.js
21 | vue.config.js
22 |
--------------------------------------------------------------------------------
/examples/html/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-plyr-html",
3 | "version": "1.0.0",
4 | "description": "An example of how to use vue-plyr with just html.",
5 | "author": "Gabe Dunn",
6 | "scripts": {
7 | "start": "serve ."
8 | },
9 | "dependencies": {
10 | "serve": "^11.3.2",
11 | "vue-plyr": "^7.0.0-beta.1"
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/examples/vite/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | vue-plyr-vite
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/examples/vue-cli/README.md:
--------------------------------------------------------------------------------
1 | # cli
2 |
3 | ## Project setup
4 | ```
5 | yarn install
6 | ```
7 |
8 | ### Compiles and hot-reloads for development
9 | ```
10 | yarn serve
11 | ```
12 |
13 | ### Compiles and minifies for production
14 | ```
15 | yarn build
16 | ```
17 |
18 | ### Customize configuration
19 | See [Configuration Reference](https://cli.vuejs.org/config/).
20 |
--------------------------------------------------------------------------------
/examples/vite/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-plyr-vite",
3 | "version": "0.0.0",
4 | "scripts": {
5 | "dev": "vite",
6 | "build": "vite build"
7 | },
8 | "dependencies": {
9 | "vue": "^3.0.2",
10 | "vue-plyr": "^7.0.0-beta.1"
11 | },
12 | "devDependencies": {
13 | "@vue/compiler-sfc": "^3.0.2",
14 | "vite": "^1.0.0-rc.8"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/examples/nuxt/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-plyr-nuxt",
3 | "version": "1.0.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "nuxt",
7 | "build": "nuxt build",
8 | "start": "nuxt start",
9 | "generate": "nuxt generate"
10 | },
11 | "dependencies": {
12 | "core-js": "^3.6.5",
13 | "nuxt": "^2.14.6",
14 | "vue-plyr": "^7.0.0-beta.1"
15 | },
16 | "devDependencies": {}
17 | }
18 |
--------------------------------------------------------------------------------
/examples/nuxt/README.md:
--------------------------------------------------------------------------------
1 | # vue-plyr-nuxt
2 |
3 | ## Build Setup
4 |
5 | ```bash
6 | # install dependencies
7 | $ yarn install
8 |
9 | # serve with hot reload at localhost:3000
10 | $ yarn dev
11 |
12 | # build for production and launch server
13 | $ yarn build
14 | $ yarn start
15 |
16 | # generate static project
17 | $ yarn generate
18 | ```
19 |
20 | For detailed explanation on how things work, check out [Nuxt.js docs](https://nuxtjs.org).
21 |
--------------------------------------------------------------------------------
/examples/shared/youtube.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
youtube embed
4 |
5 |
6 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/examples/shared/vimeo.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
vimeo embed
4 |
5 |
6 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/examples/vite/src/components/youtube.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
youtube embed
4 |
5 |
6 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/examples/vite/src/components/vimeo.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
vimeo embed
4 |
5 |
6 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/examples/shared/audio.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
audio player
4 |
5 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/examples/vite/src/components/audio.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
audio player
4 |
5 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/examples/nuxt/nuxt.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | // Global page headers (https://go.nuxtjs.dev/config-head)
3 | head: {
4 | title: 'vue-plyr-nuxt',
5 | meta: [
6 | { charset: 'utf-8' },
7 | { name: 'viewport', content: 'width=device-width, initial-scale=1' },
8 | { hid: 'description', name: 'description', content: '' }
9 | ]
10 | },
11 |
12 | // Plugins to run before rendering page (https://go.nuxtjs.dev/config-plugins)
13 | plugins: [{ src: '~/plugins/vue-plyr.js', mode: 'client' }]
14 | }
15 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | vue-plyr
8 |
9 |
10 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | env: {
4 | node: true
5 | },
6 | extends: [
7 | 'plugin:vue/vue3-recommended',
8 | 'eslint:recommended',
9 | '@vue/prettier'
10 | ],
11 | rules: {
12 | 'vue/script-indent': [
13 | 'error',
14 | 'tab',
15 | {
16 | baseIndent: 1
17 | }
18 | ],
19 | 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
20 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
21 | },
22 | parser: 'vue-eslint-parser',
23 | parserOptions: {
24 | parser: 'babel-eslint'
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/examples/vue-cli/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-plyr-cli",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "serve": "vue-cli-service serve",
7 | "build": "vue-cli-service build"
8 | },
9 | "dependencies": {
10 | "core-js": "^3.6.5",
11 | "vue": "^3.0.0",
12 | "vue-plyr": "^7.0.0-beta.1"
13 | },
14 | "devDependencies": {
15 | "@vue/cli-plugin-babel": "~4.5.0",
16 | "@vue/cli-service": "~4.5.0",
17 | "@vue/compiler-sfc": "^3.0.0"
18 | },
19 | "browserslist": [
20 | "> 1%",
21 | "last 2 versions",
22 | "not dead"
23 | ]
24 | }
25 |
--------------------------------------------------------------------------------
/examples/vue-cli/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | <%= htmlWebpackPlugin.options.title %>
8 |
9 |
10 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/.github/workflows/npm.yml:
--------------------------------------------------------------------------------
1 | on:
2 | push:
3 | tags: v*.*.*
4 |
5 | jobs:
6 | npm:
7 | runs-on: ubuntu-latest
8 | steps:
9 | - uses: actions/checkout@v2
10 | - uses: actions/setup-node@v2-beta
11 | with:
12 | node-version: '15.x'
13 | registry-url: 'https://registry.npmjs.org'
14 | - name: Install dependencies
15 | run: yarn install
16 | - name: Lint code
17 | run: yarn lint
18 | - name: Build package
19 | run: yarn build
20 | - name: Publish to NPM
21 | run: yarn publish
22 | env:
23 | NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
24 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | # The MIT License (MIT)
2 | >Copyright (c) 2018
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in all
12 | copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20 | SOFTWARE.
21 |
--------------------------------------------------------------------------------
/src/vue-plyr.vue:
--------------------------------------------------------------------------------
1 |
60 |
--------------------------------------------------------------------------------
/examples/shared/demo.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
vue-plyr demo.
4 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
41 |
42 |
68 |
--------------------------------------------------------------------------------
/examples/vite/src/components/demo.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
vue-plyr demo.
4 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
41 |
42 |
68 |
--------------------------------------------------------------------------------
/examples/shared/video.vue:
--------------------------------------------------------------------------------
1 |
2 |
48 |
49 |
50 |
60 |
--------------------------------------------------------------------------------
/examples/vite/src/components/video.vue:
--------------------------------------------------------------------------------
1 |
2 |
48 |
49 |
50 |
60 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-plyr",
3 | "version": "7.0.0",
4 | "description": "A vue component for the plyr video & audio player.",
5 | "license": "MIT",
6 | "author": {
7 | "name": "Gabe Dunn",
8 | "email": "gabe@redxtech.ca",
9 | "url": "https://gabedunn.dev"
10 | },
11 | "repository": "github:redxtech/vue-plyr",
12 | "scripts": {
13 | "prebuild": "rm -rf dist/",
14 | "build": "NODE_ENV=production rollup --c rollup.config.js",
15 | "build:es": "NODE_ENV=production rollup --c rollup.config.js --format=es",
16 | "build:es:watch": "NODE_ENV=production rollup --c rollup.config.js --format=es --watch",
17 | "build:cjs": "NODE_ENV=production rollup --c rollup.config.js --format=cjs",
18 | "build:cjs:watch": "NODE_ENV=production rollup --c rollup.config.js --format=cjs --watch",
19 | "build:iife": "NODE_ENV=production rollup --c rollup.config.js --format=iife",
20 | "build:iife:watch": "NODE_ENV=production rollup --c rollup.config.js --format=iife --watch",
21 | "lint": "vue-cli-service lint -f pretty"
22 | },
23 | "main": "dist/vue-plyr.ssr.js",
24 | "module": "dist/vue-plyr.esm.js",
25 | "unpkg": "dist/vue-plyr.min.js",
26 | "style": "dist/vue-plyr.css",
27 | "files": [
28 | "dist/*",
29 | "src/**/*.vue"
30 | ],
31 | "dependencies": {
32 | "plyr": "github:sampotts/plyr#develop",
33 | "vue": "^2.6.12"
34 | },
35 | "devDependencies": {
36 | "@babel/plugin-transform-runtime": "^7.12.1",
37 | "@rollup/plugin-babel": "^5.2.1",
38 | "@rollup/plugin-commonjs": "^16.0.0",
39 | "@rollup/plugin-node-resolve": "^10.0.0",
40 | "@rollup/plugin-replace": "^2.3.4",
41 | "@vue/cli-plugin-babel": "^4.5.8",
42 | "@vue/cli-plugin-eslint": "^4.5.8",
43 | "@vue/cli-service": "^4.5.8",
44 | "@vue/compiler-sfc": "^3.0.2",
45 | "@vue/eslint-config-prettier": "^6.0.0",
46 | "babel-eslint": "^10.1.0",
47 | "core-js": "^3.6.5",
48 | "eslint": "^7.12.1",
49 | "eslint-formatter-pretty": "^4.0.0",
50 | "eslint-plugin-prettier": "^3.1.4",
51 | "eslint-plugin-vue": "^7.1.0",
52 | "minimist": "^1.2.5",
53 | "prettier": "^2.1.2",
54 | "rollup": "^2.33.0",
55 | "rollup-plugin-css-only": "^2.1.0",
56 | "rollup-plugin-filesize": "^9.0.2",
57 | "rollup-plugin-terser": "^7.0.2",
58 | "rollup-plugin-vue": "^6.0.0-beta.11",
59 | "vue-template-compiler": "^2.6.12"
60 | },
61 | "keywords": [
62 | "vue-plyr",
63 | "vue",
64 | "plyr",
65 | "video",
66 | "audio",
67 | "youtube",
68 | "vimeo",
69 | "media",
70 | "player",
71 | "js",
72 | "javascript",
73 | "rollup"
74 | ]
75 | }
76 |
--------------------------------------------------------------------------------
/changelog.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | #### 7.0.0
4 | - Vue 3 support.
5 | - Updated plyr version.
6 | - Removed `emit` option.
7 | - Removed unnecessary `` wrapper for components.
8 | - Completely redid the bundling process.
9 | - Added polyfilled versions.
10 | - Updated examples and added some more of them.
11 | - Some other things.
12 | - Maybe some other small thi ngs I've forgotten about.
13 |
14 | #### 6.0.4
15 | - Remove useless nuxt plugin.
16 |
17 | #### 6.0.3
18 | - Update docs.
19 | - Bump version number.
20 |
21 | #### 6.0.1
22 | - Fix `vue-runtime-helper` being a dependency by bundling it.
23 | - Reorganize exports (yeah breaking but I honestly don't want to bump the version again).
24 | - Add nuxt plugin file.
25 |
26 | ### 6.0.0
27 | - Change import to be more natural.
28 | - Move to esm export.
29 | - Change demo.
30 | - Revamp how using the plugin works.
31 | - Remove player event.
32 |
33 | #### 5.1.2
34 | - Fix readme because I forgot to bump it previously.
35 |
36 | #### 5.1.1
37 | - Update plyr to [3.5.2](https://github.com/sampotts/plyr/blob/master/changelog.md#v352).
38 |
39 | #### 5.1.0
40 | - Remove auto import of CSS within JS to prevent CJS errors.
41 | - Import CSS with `` so bili would find it.
42 | - Restructure demos.
43 | - Add nuxt demo.
44 | - Change all & to be &.
45 | - Change `refs="player"` to `refs="plyr"` in readme.
46 | - Update nuxt usage in readme.
47 | - Update dependencies to latest version.
48 |
49 | #### 5.0.4
50 | - Update documentation to include new and better methods to access
51 | player instance and events.
52 | - Slightly reorganize readme.
53 |
54 | #### 5.0.3
55 | - Prevent default option from being accidentally overwritten.
56 | - Fix readme footer.
57 | - Update readme to reflect installation methods.
58 | - Re-Add named exports.
59 |
60 | #### 5.0.2
61 | - Fix default export.
62 | - Fix component not registered issue.
63 |
64 | #### 5.0.1
65 | - Update Plyr version.
66 |
67 | #### 5.0.0
68 | - Major change because of breaking fix.
69 | - Change import scheme to be more common (`Vue.use(VuePlyr)`)
70 | - Remove sass/scss from dependencies because it wasn't needed.
71 | - Update dependencies to latest versions.
72 | - Remove demo build
73 | - Remove 1440p video from demo (CDN no longer hosted video file)
74 | - Add and refactor some tests
75 | - Streamline installation by adding from NPM.
76 | - Streamline installation by including in `
148 |
149 |
158 |