├── .gitignore ├── index.js ├── modules ├── time.js ├── function.js └── class.js ├── .hintrc ├── .eslintrc.json ├── .stylelintrc.json ├── LICENSE ├── index.html ├── .github └── workflows │ └── linters.yml ├── index.css ├── README.md └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // import * as Book from './modules/class.js'; 2 | import eventslistner from './modules/function.js'; 3 | import currenttimeanddate from './modules/time.js'; 4 | 5 | // Book.init(); 6 | eventslistner(); 7 | currenttimeanddate(); -------------------------------------------------------------------------------- /modules/time.js: -------------------------------------------------------------------------------- 1 | import { DateTime } from '../node_modules/luxon/src/luxon.js'; 2 | 3 | const currenttimeanddate = () => { 4 | const currentTime = DateTime.now().toLocaleString(DateTime.DATETIME_FULL); 5 | const date = document.getElementById('now'); 6 | date.textContent = currentTime; 7 | }; 8 | export default currenttimeanddate; -------------------------------------------------------------------------------- /.hintrc: -------------------------------------------------------------------------------- 1 | { 2 | "connector": { 3 | "name": "local", 4 | "options": { 5 | "pattern": ["**", "!.git/**", "!node_modules/**"] 6 | } 7 | }, 8 | "extends": ["development"], 9 | "formatters": ["stylish"], 10 | "hints": [ 11 | "button-type", 12 | "disown-opener", 13 | "html-checker", 14 | "meta-charset-utf-8", 15 | "meta-viewport", 16 | "no-inline-styles:error" 17 | ] 18 | } -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es6": true, 5 | "jest": true 6 | }, 7 | "parser": "babel-eslint", 8 | "parserOptions": { 9 | "ecmaVersion": 2018, 10 | "sourceType": "module" 11 | }, 12 | "extends": ["airbnb-base"], 13 | "rules": { 14 | "no-shadow": "off", 15 | "no-param-reassign": "off", 16 | "eol-last": "off", 17 | "import/extensions": [ 18 | 1, 19 | { 20 | "js": "always", 21 | "json": "always" 22 | } 23 | ] 24 | }, 25 | "ignorePatterns": ["dist/", "build/"] 26 | } 27 | -------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["stylelint-config-standard"], 3 | "plugins": ["stylelint-scss", "stylelint-csstree-validator"], 4 | "rules": { 5 | "at-rule-no-unknown": [ 6 | true, 7 | { 8 | "ignoreAtRules": ["tailwind", "apply", "variants", "responsive", "screen"] 9 | } 10 | ], 11 | "scss/at-rule-no-unknown": [ 12 | true, 13 | { 14 | "ignoreAtRules": ["tailwind", "apply", "variants", "responsive", "screen"] 15 | } 16 | ], 17 | "csstree/validator": true 18 | }, 19 | "ignoreFiles": ["build/**", "dist/**", "**/reset*.css", "**/bootstrap*.css", "**/*.js", "**/*.jsx"] 20 | } -------------------------------------------------------------------------------- /modules/function.js: -------------------------------------------------------------------------------- 1 | import Book from './class.js'; 2 | 3 | const eventslistner = () => { 4 | const book = new Book(); 5 | book.add(); 6 | const header = document.querySelector('header'); 7 | const stickyHeader = header.offsetTop; 8 | 9 | window.onscroll = () => { 10 | if (window.pageXOffset > stickyHeader) { 11 | header.classList.add('sticky'); 12 | } else { 13 | header.classList.remove('sticky'); 14 | } 15 | }; 16 | 17 | window.addEventListener('load', () => { 18 | const localBooks = book.getLocalBooks(); 19 | if (localBooks.length === 0) { 20 | const bookList = document.querySelector('#book-list'); 21 | bookList.innerHTML = 'No recorded book list found'; 22 | } else { 23 | book.createBookListItem(); 24 | } 25 | }); 26 | 27 | if (document.location.hash === '' || document.location.hash === '#') { 28 | document.location.hash = '#books'; 29 | } 30 | }; 31 | export default eventslistner; -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | mit License 2 | 3 | Copyright (c) 2023 tajulafreen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | the above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the software. 14 | the software is provided "AS IS", 15 | without warranty of any kind, 16 | express or 17 | implied, 18 | including but not limited to the warranties of merchantability, 19 | fitness for a particular purpose and noninfringement. in no event shall the 20 | authors or copyright holders be liable for any claim, 21 | damages or other 22 | liability, 23 | whether in an action of contract, 24 | tort or otherwise, 25 | arising from, 26 | out of or in connection with the software or the use or other dealings in the 27 | software.;LicenseCopyright2023tajulafreenPermissionisherebygranted,freeofcharge,toanypersonobtainingacopyofthissoftwareandassociateddocumentationfilesthetodealintheSoftwarewithoutrestriction,includingwithoutlimitationtherightstouse,copy,modify,merge,publish,distribute,sublicense,and/orsellcopiesoftheSoftware,andtopermitpersonstowhomtheSoftwareisfurnishedtodoso,subjecttothefollowingconditions 28 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 14 | Awesome Books 15 | 16 | 17 |
18 |

Awesome Books

19 | 30 |
31 |
32 |
33 |
34 |

All Awesome Books

35 | 38 |
39 |
40 |

Add a new Book

41 |
42 |
43 | 49 | 55 |
56 | 57 |
58 |
59 |
60 |

Contact Us

61 |

62 | Do you have any questions or you just want to say "Hello" ? You can 63 | reach out of us! 64 |

65 | 70 |
71 |
72 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /.github/workflows/linters.yml: -------------------------------------------------------------------------------- 1 | name: Linters 2 | 3 | on: pull_request 4 | 5 | env: 6 | FORCE_COLOR: 1 7 | 8 | jobs: 9 | lighthouse: 10 | name: Lighthouse 11 | runs-on: ubuntu-22.04 12 | steps: 13 | - uses: actions/checkout@v3 14 | - uses: actions/setup-node@v3 15 | with: 16 | node-version: "18.x" 17 | - name: Setup Lighthouse 18 | run: npm install -g @lhci/cli@0.11.x 19 | - name: Lighthouse Report 20 | run: lhci autorun --upload.target=temporary-public-storage --collect.staticDistDir=. 21 | webhint: 22 | name: Webhint 23 | runs-on: ubuntu-22.04 24 | steps: 25 | - uses: actions/checkout@v3 26 | - uses: actions/setup-node@v3 27 | with: 28 | node-version: "18.x" 29 | - name: Setup Webhint 30 | run: | 31 | npm install --save-dev hint@7.x 32 | [ -f .hintrc ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.hintrc 33 | - name: Webhint Report 34 | run: npx hint . 35 | stylelint: 36 | name: Stylelint 37 | runs-on: ubuntu-22.04 38 | steps: 39 | - uses: actions/checkout@v3 40 | - uses: actions/setup-node@v3 41 | with: 42 | node-version: "18.x" 43 | - name: Setup Stylelint 44 | run: | 45 | npm install --save-dev stylelint@13.x stylelint-scss@3.x stylelint-config-standard@21.x stylelint-csstree-validator@1.x 46 | [ -f .stylelintrc.json ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.stylelintrc.json 47 | - name: Stylelint Report 48 | run: npx stylelint "**/*.{css,scss}" 49 | eslint: 50 | name: ESLint 51 | runs-on: ubuntu-22.04 52 | steps: 53 | - uses: actions/checkout@v3 54 | - uses: actions/setup-node@v3 55 | with: 56 | node-version: "18.x" 57 | - name: Setup ESLint 58 | run: | 59 | npm install --save-dev eslint@7.x eslint-config-airbnb-base@14.x eslint-plugin-import@2.x babel-eslint@10.x 60 | [ -f .eslintrc.json ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.eslintrc.json 61 | - name: ESLint Report 62 | run: npx eslint . 63 | nodechecker: 64 | name: node_modules checker 65 | runs-on: ubuntu-22.04 66 | steps: 67 | - uses: actions/checkout@v3 68 | - name: Check node_modules existence 69 | run: | 70 | if [ -d "node_modules/" ]; then echo -e "\e[1;31mThe node_modules/ folder was pushed to the repo. Please remove it from the GitHub repository and try again."; echo -e "\e[1;32mYou can set up a .gitignore file with this folder included on it to prevent this from happening in the future." && exit 1; fi -------------------------------------------------------------------------------- /modules/class.js: -------------------------------------------------------------------------------- 1 | export default class Book { 2 | constructor() { 3 | this.books = []; 4 | this.id = null; 5 | this.title = ''; 6 | this.author = ''; 7 | this.Title = document.querySelector('#book-title'); 8 | this.Author = document.querySelector('#book-author'); 9 | this.bookList = document.querySelector('#book-list'); 10 | this.addBtn = document.querySelector('#addBtn'); 11 | } 12 | 13 | add() { 14 | this.addBtn.addEventListener('click', (event) => { 15 | event.preventDefault(); 16 | this.books = this.getLocalBooks(); 17 | const tmpObject = { 18 | id: this.createBookId(), 19 | title: this.Title.value, 20 | author: this.Author.value, 21 | }; 22 | this.books.push(tmpObject); 23 | this.Title.value = ''; 24 | this.Author.value = ''; 25 | const booksString = JSON.stringify([this.books, tmpObject.id]); 26 | localStorage.setItem('books', booksString); 27 | this.createBookListItem(); 28 | }); 29 | } 30 | 31 | removeItem(id) { 32 | const newArray = this.books.filter((item) => item.id !== id); 33 | const currentStateId1 = this.getLocalId(); 34 | const objectString = JSON.stringify([newArray, currentStateId1]); 35 | localStorage.setItem('books', objectString); 36 | } 37 | 38 | getLocalStorageObject = () => JSON.parse(localStorage.getItem('books')); 39 | 40 | getLocalId() { 41 | const currStorageObj = this.getLocalStorageObject(); 42 | if (!currStorageObj) { 43 | return 1; 44 | } 45 | return currStorageObj[1]; 46 | } 47 | 48 | getLocalBooks() { 49 | const currStorageObj = this.getLocalStorageObject(); 50 | if (!currStorageObj) { 51 | return []; 52 | } 53 | return currStorageObj[0]; 54 | } 55 | 56 | createLocalStorage = (id) => { 57 | const init = JSON.stringify([[], id]); 58 | localStorage.setItem('books', init); 59 | }; 60 | 61 | createBookId() { 62 | const bookID = this.getLocalId(); 63 | if (!bookID) return 1; 64 | return bookID + 1; 65 | } 66 | 67 | createBookListItem() { 68 | if (!this.getLocalStorageObject()) { 69 | this.createLocalStorage(null); 70 | } 71 | 72 | this.books = this.getLocalBooks(); 73 | 74 | this.bookList.innerHTML = ''; 75 | 76 | this.books.forEach((element) => { 77 | const bookItem = document.createElement('li'); 78 | bookItem.id = element.id; 79 | 80 | const bookDetailsEl = document.createElement('p'); 81 | 82 | const removeBtn = document.createElement('button'); 83 | removeBtn.id = element.id; 84 | removeBtn.classList.add('remove-btn'); 85 | 86 | removeBtn.textContent = 'Remove'; 87 | 88 | removeBtn.addEventListener('click', () => { 89 | this.removeItem(Number(removeBtn.id)); 90 | this.createBookListItem(); 91 | }); 92 | 93 | bookDetailsEl.textContent = `"${element.title}" by ${element.author}`; 94 | 95 | bookItem.appendChild(bookDetailsEl); 96 | bookItem.appendChild(removeBtn); 97 | 98 | this.bookList.appendChild(bookItem); 99 | }); 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /index.css: -------------------------------------------------------------------------------- 1 | /* Meta description */ 2 | 3 | * { 4 | padding: 0; 5 | margin: 0; 6 | box-sizing: border-box; 7 | } 8 | 9 | /* general */ 10 | 11 | body { 12 | flex-direction: column; 13 | font-family: 'Outfit', sans-serif; 14 | } 15 | 16 | .contact-us h1, 17 | .add-books h1, 18 | #books h1 { 19 | text-align: center; 20 | font-size: 40px; 21 | font-weight: 700; 22 | margin-bottom: 3%; 23 | } 24 | 25 | section { 26 | display: none; 27 | } 28 | 29 | section:target { 30 | display: block; 31 | } 32 | 33 | .content { 34 | display: flex; 35 | justify-content: center; 36 | align-items: center; 37 | } 38 | 39 | .content > * { 40 | width: 100%; 41 | } 42 | 43 | /* header */ 44 | 45 | header { 46 | position: sticky; 47 | top: 0; 48 | z-index: 100; 49 | display: flex; 50 | justify-content: space-between; 51 | padding: 20px; 52 | border: 2px solid #000; 53 | margin: 5px 10px; 54 | background-color: #fff; 55 | } 56 | 57 | .sticky { 58 | position: fixed; 59 | top: 0; 60 | } 61 | 62 | .nav-link-list { 63 | display: flex; 64 | list-style-type: none; 65 | } 66 | 67 | .nav-item { 68 | padding: 10px 25px; 69 | border-right: 2px solid #000; 70 | } 71 | 72 | .nav-item:last-child { 73 | border-right: none; 74 | } 75 | 76 | .nav-link:link, 77 | .nav-link:visited { 78 | text-decoration: none; 79 | color: #000; 80 | } 81 | 82 | .nav-link:hover, 83 | .nav-link:active { 84 | color: rgb(93, 93, 169); 85 | } 86 | 87 | /** stylelint quick fixes */ 88 | 89 | #contact-us > p { 90 | text-align: center; 91 | font-size: 22px; 92 | } 93 | 94 | /* book section */ 95 | 96 | #books { 97 | padding-top: 5%; 98 | margin-bottom: 2%; 99 | } 100 | 101 | #book-list { 102 | list-style: none; 103 | border: 2px solid black; 104 | width: 98%; 105 | min-height: 50px; 106 | height: max-content; 107 | margin: auto; 108 | } 109 | 110 | #book-list li { 111 | padding: 20px; 112 | display: flex; 113 | align-items: center; 114 | justify-content: space-between; 115 | } 116 | 117 | #book-list li:nth-child(odd) { 118 | background-color: #dbd7d7; 119 | } 120 | 121 | #book-list > li > p { 122 | padding-bottom: 5px; 123 | } 124 | 125 | .remove-btn { 126 | border: 2px solid black; 127 | padding: 5px 5px; 128 | display: block; 129 | cursor: pointer; 130 | } 131 | 132 | /* add book section */ 133 | 134 | #add-books { 135 | margin-left: 25%; 136 | margin-right: 20%; 137 | } 138 | 139 | form { 140 | text-align: right; 141 | width: 80%; 142 | } 143 | 144 | form div { 145 | display: flex; 146 | flex-direction: column; 147 | align-items: center; 148 | gap: 10px; 149 | width: 100%; 150 | } 151 | 152 | input { 153 | padding: 10px; 154 | width: 100%; 155 | height: 45px; 156 | border: 2px solid black; 157 | } 158 | 159 | #addBtn { 160 | margin-top: 15px; 161 | background-color: #fff; 162 | border: 2px solid black; 163 | padding: 5px; 164 | cursor: pointer; 165 | } 166 | 167 | /* contact us section */ 168 | 169 | .contact-list { 170 | display: flex; 171 | flex-direction: column; 172 | gap: 15px; 173 | margin-left: 30%; 174 | margin-right: 20%; 175 | width: 60%; 176 | margin-top: 3%; 177 | font-size: 22px; 178 | } 179 | 180 | /* footer section */ 181 | 182 | .footer { 183 | height: 10%; 184 | width: 96%; 185 | padding: 15px; 186 | border: 2px solid black; 187 | margin: 2%; 188 | position: fixed; 189 | bottom: 0; 190 | background-color: #fff; 191 | } 192 | 193 | #now { 194 | margin-left: 75%; 195 | } 196 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |

Awesome Book

6 | 7 |
8 | 9 | 10 | 11 | # 📗 Table of Contents 12 | 13 | - [📖 About the Project](#about-project) 14 | - [🛠 Built With](#built-with) 15 | - [Tech Stack](#tech-stack) 16 | - [Key Features](#key-features) 17 | - [🚀 Live Demo](#live-demo) 18 | - [💻 Getting Started](#getting-started) 19 | - [Setup](#setup) 20 | - [Prerequisites](#prerequisites) 21 | - [Install](#install) 22 | - [Usage](#usage) 23 | - [Run tests](#run-tests) 24 | - [Deployment](#deployment) 25 | - [👥 Authors](#authors) 26 | - [🔭 Future Features](#future-features) 27 | - [🤝 Contributing](#contributing) 28 | - [⭐️ Show your support](#support) 29 | - [🙏 Acknowledgements](#acknowledgements) 30 | 31 | - [📝 License](#license) 32 | 33 | 34 | 35 | # 📖 [Awesome Book] 36 | 37 | **[Awesome Book]** is an online book archive where user can add or remove diffrent books 38 | 39 | ## 🛠 Built With 40 | 41 | ### Tech Stack 42 | 43 |
44 | Client 45 | 50 |
51 | 52 | 53 | 54 | ### Key Features 55 | 56 | - **[Add button]** 57 | - **[Remove button]** 58 | - **[Local storage]** 59 | 60 |

(back to top)

61 | 62 | 63 | 64 | ## 🚀 Live Demo 65 | 66 | - [Live Demo Link](https://tajulafreen.github.io/Awesome-Books/#books) 67 | 68 |

(back to top)

69 | 70 | 71 | 72 | ## 💻 Getting Started 73 | 74 | To get a local copy up and running, follow these steps. 75 | 76 | ``` 77 | git clone 78 | ``` 79 | 80 | ### Prerequisites 81 | 82 | In order to run this project you need: 83 | 84 | - A code editor of your choice(like vs code or Atom and so on) 85 | - Version control System (git is preferred) 86 | 87 | ### Setup 88 | 89 | Clone this repository to your desired folder: 90 | 91 | ``` 92 | cd my-folder 93 | git clone https://github.com/tajulafreen/Awesome-Books.git 94 | cd Awesome-Books 95 | ``` 96 | 97 | ### Install 98 | 99 | Install this project with: 100 | 101 | ``` 102 | cd Awesome-Books 103 | npm i 104 | ``` 105 | 106 | ### Usage 107 | 108 | To run the project, execute the following command: 109 | 110 | ``` 111 | live server 112 | ``` 113 | 114 | ### Run tests 115 | 116 | To run tests, run the following command: 117 | 118 | ``` 119 | npx eslint . 120 | ``` 121 | 122 |

(back to top)

123 | 124 | 125 | 126 | ## 👥 Authors 127 | 128 | 👤 **Afreen** 129 | 130 | - GitHub: [@githubhandle](https://github.com/tajulafreen) 131 | - Twitter: [@twitterhandle](https://twitter.com/tajulafreen) 132 | - LinkedIn: [LinkedIn](https://linkedin.com/in/linkedinhandle) 133 | 134 | 👤 **Devendra** 135 | 136 | - GitHub: [@githubhandle](https://github.com/devendra-alt) 137 | - Twitter: [@twitterhandle](https://twitter.com/Devendra5101) 138 | - LinkedIn: [LinkedIn](https://www.linkedin.com/in/devendramulewa/) 139 | 140 | 👤 **Melkamu** 141 | 142 | - Github:[@melkamu12](https://github.com/melkamu12) 143 | - LinkidIn: [Melkamu-almawu](https://www.linkedin.com/in/melkamu-almawu/) 144 | 145 |

(back to top)

146 | 147 | 148 | 149 | ## 🔭 Future Features 150 | 151 | - [ ] **[classes]** 152 | - [ ] **[prototype]** 153 | - [ ] **[sort]** 154 | 155 |

(back to top)

156 | 157 | 158 | 159 | ## ⭐️ Show your support 160 | 161 | If you like this project give me stars and follow me on social media. 162 | 163 |

(back to top)

164 | 165 | 166 | 167 | ## 🙏 Acknowledgments 168 | 169 | I would like to thank to microverse. 170 | 171 |

(back to top)

172 | 173 | 174 | 175 | ## 📝 License 176 | 177 | This project is [MIT](./LICENSE) licensed. 178 | 179 |

(back to top)

180 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "awesome-books", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": {}, 7 | "keywords": [], 8 | "author": "", 9 | "license": "ISC", 10 | "devDependencies": { 11 | "babel-eslint": "^10.1.0", 12 | "eslint": "^7.32.0", 13 | "eslint-config-airbnb-base": "^14.2.1", 14 | "eslint-plugin-import": "^2.27.5", 15 | "hint": "^2.0.0", 16 | "stylelint": "^13.13.1", 17 | "stylelint-config-standard": "^21.0.0", 18 | "stylelint-csstree-validator": "^1.9.0", 19 | "stylelint-scss": "^3.21.0" 20 | }, 21 | "dependencies": { 22 | "abab": "^2.0.6", 23 | "abbrev": "^1.1.1", 24 | "acorn": "^8.8.2", 25 | "acorn-globals": "^7.0.1", 26 | "acorn-jsx": "^5.3.2", 27 | "acorn-jsx-walk": "^2.0.0", 28 | "acorn-walk": "^8.2.0", 29 | "agent-base": "^6.0.2", 30 | "agentkeepalive": "^4.3.0", 31 | "aggregate-error": "^3.1.0", 32 | "ajv": "^8.12.0", 33 | "ajv-formats": "^2.1.1", 34 | "ansi-align": "^3.0.1", 35 | "ansi-colors": "^4.1.3", 36 | "ansi-regex": "^5.0.1", 37 | "ansi-styles": "^4.3.0", 38 | "anymatch": "^3.1.3", 39 | "aproba": "^2.0.0", 40 | "are-we-there-yet": "^2.0.0", 41 | "argparse": "^1.0.10", 42 | "array-buffer-byte-length": "^1.0.0", 43 | "array-includes": "^3.1.6", 44 | "array-union": "^2.1.0", 45 | "array.prototype.flat": "^1.3.1", 46 | "array.prototype.flatmap": "^1.3.1", 47 | "arrify": "^1.0.1", 48 | "ast-types": "^0.13.4", 49 | "astral-regex": "^2.0.0", 50 | "async": "^3.2.4", 51 | "asynckit": "^0.4.0", 52 | "autoprefixer": "^9.8.8", 53 | "available-typed-arrays": "^1.0.5", 54 | "axe-core": "^4.7.2", 55 | "bail": "^1.0.5", 56 | "balanced-match": "^1.0.2", 57 | "base64-js": "^1.5.1", 58 | "bcp47": "^1.1.2", 59 | "binary-extensions": "^2.2.0", 60 | "bl": "^4.1.0", 61 | "boolbase": "^1.0.0", 62 | "boxen": "^5.1.2", 63 | "brace-expansion": "^1.1.11", 64 | "braces": "^3.0.2", 65 | "browserslist": "^4.21.7", 66 | "buffer": "^5.7.1", 67 | "buffer-crc32": "^0.2.13", 68 | "builtins": "^5.0.1", 69 | "bytes": "^3.1.2", 70 | "cacache": "^17.1.3", 71 | "cacheable-lookup": "^5.0.4", 72 | "cacheable-request": "^7.0.2", 73 | "call-bind": "^1.0.2", 74 | "callsites": "^3.1.0", 75 | "camelcase": "^6.3.0", 76 | "camelcase-keys": "^6.2.2", 77 | "caniuse-lite": "^1.0.30001494", 78 | "canvas": "^2.11.2", 79 | "chalk": "^4.1.2", 80 | "character-entities": "^1.2.4", 81 | "character-entities-legacy": "^1.1.4", 82 | "character-reference-invalid": "^1.1.4", 83 | "chokidar": "^3.5.3", 84 | "chownr": "^2.0.0", 85 | "ci-info": "^3.8.0", 86 | "clean-stack": "^2.2.0", 87 | "cli-boxes": "^2.2.1", 88 | "cli-cursor": "^3.1.0", 89 | "cli-spinners": "^2.9.0", 90 | "clone": "^1.0.4", 91 | "clone-regexp": "^2.2.0", 92 | "clone-response": "^1.0.3", 93 | "cloudinary": "^1.37.0", 94 | "cloudinary-core": "^2.13.0", 95 | "color-convert": "^2.0.1", 96 | "color-name": "^1.1.4", 97 | "color-string": "^1.9.1", 98 | "color-support": "^1.1.3", 99 | "combined-stream": "^1.0.8", 100 | "concat-map": "^0.0.1", 101 | "configstore": "^5.0.1", 102 | "confusing-browser-globals": "^1.0.11", 103 | "console-control-strings": "^1.1.0", 104 | "content-type": "^1.0.5", 105 | "convert-source-map": "^1.9.0", 106 | "core-js": "^3.30.1", 107 | "core-util-is": "^1.0.3", 108 | "cosmiconfig": "^7.1.0", 109 | "cross-fetch": "^3.1.5", 110 | "cross-spawn": "^7.0.3", 111 | "crypto-random-string": "^2.0.0", 112 | "css-select": "^4.3.0", 113 | "css-tree": "^1.1.3", 114 | "css-what": "^6.1.0", 115 | "cssesc": "^3.0.0", 116 | "cssstyle": "^3.0.0", 117 | "data-uri-to-buffer": "^3.0.1", 118 | "data-urls": "^3.0.2", 119 | "debug": "^4.3.4", 120 | "decamelize": "^1.2.0", 121 | "decamelize-keys": "^1.1.1", 122 | "decimal.js": "^10.4.3", 123 | "decompress-response": "^6.0.0", 124 | "deep-extend": "^0.6.0", 125 | "deep-is": "^0.1.4", 126 | "defaults": "^1.0.4", 127 | "defer-to-connect": "^2.0.1", 128 | "define-properties": "^1.2.0", 129 | "degenerator": "^3.0.4", 130 | "delayed-stream": "^1.0.0", 131 | "delegates": "^1.0.0", 132 | "depd": "^2.0.0", 133 | "detect-libc": "^2.0.1", 134 | "devtools-protocol": "^0.0.981744", 135 | "dir-glob": "^3.0.1", 136 | "doctrine": "^3.0.0", 137 | "dom-serializer": "^1.4.1", 138 | "domelementtype": "^2.3.0", 139 | "domexception": "^4.0.0", 140 | "domhandler": "^4.3.1", 141 | "domutils": "^2.8.0", 142 | "dot-prop": "^5.3.0", 143 | "duplexer3": "^0.1.5", 144 | "eastasianwidth": "^0.2.0", 145 | "ejs": "^3.1.9", 146 | "electron-to-chromium": "^1.4.419", 147 | "emoji-regex": "^9.2.2", 148 | "encoding": "^0.1.13", 149 | "end-of-stream": "^1.4.4", 150 | "enquirer": "^2.3.6", 151 | "entities": "^2.2.0", 152 | "err-code": "^2.0.3", 153 | "error-ex": "^1.3.2", 154 | "es-abstract": "^1.21.2", 155 | "es-set-tostringtag": "^2.0.1", 156 | "es-shim-unscopables": "^1.0.0", 157 | "es-to-primitive": "^1.2.1", 158 | "escalade": "^3.1.1", 159 | "escape-goat": "^2.1.1", 160 | "escape-string-regexp": "^1.0.5", 161 | "escodegen": "^2.0.0", 162 | "eslint-import-resolver-node": "^0.3.7", 163 | "eslint-module-utils": "^2.8.0", 164 | "eslint-scope": "^5.1.1", 165 | "eslint-utils": "^2.1.0", 166 | "eslint-visitor-keys": "^3.4.1", 167 | "espree": "^7.3.1", 168 | "esprima": "^4.0.1", 169 | "esquery": "^1.5.0", 170 | "esrecurse": "^4.3.0", 171 | "estraverse": "^5.3.0", 172 | "esutils": "^2.0.3", 173 | "eventemitter2": "^6.4.9", 174 | "execa": "^4.1.0", 175 | "execall": "^2.0.0", 176 | "extend": "^3.0.2", 177 | "extract-zip": "^2.0.1", 178 | "fast-deep-equal": "^3.1.3", 179 | "fast-glob": "^3.2.12", 180 | "fast-json-stable-stringify": "^2.1.0", 181 | "fast-levenshtein": "^2.0.6", 182 | "fast-xml-parser": "^4.2.3", 183 | "fastest-levenshtein": "^1.0.16", 184 | "fastq": "^1.15.0", 185 | "fd-slicer": "^1.1.0", 186 | "file-entry-cache": "^6.0.1", 187 | "file-type": "^16.5.4", 188 | "file-uri-to-path": "^2.0.0", 189 | "filelist": "^1.0.4", 190 | "fill-range": "^7.0.1", 191 | "find-up": "^4.1.0", 192 | "flat-cache": "^3.0.4", 193 | "flatted": "^3.2.7", 194 | "for-each": "^0.3.3", 195 | "foreground-child": "^3.1.1", 196 | "form-data": "^4.0.0", 197 | "fs-constants": "^1.0.0", 198 | "fs-extra": "^11.1.1", 199 | "fs-minipass": "^3.0.2", 200 | "fs.realpath": "^1.0.0", 201 | "ftp": "^0.3.10", 202 | "function-bind": "^1.1.1", 203 | "function.prototype.name": "^1.1.5", 204 | "functional-red-black-tree": "^1.0.1", 205 | "functions-have-names": "^1.2.3", 206 | "gauge": "^3.0.2", 207 | "gensync": "^1.0.0-beta.2", 208 | "get-intrinsic": "^1.2.1", 209 | "get-stdin": "^8.0.0", 210 | "get-stream": "^5.2.0", 211 | "get-symbol-description": "^1.0.0", 212 | "get-uri": "^3.0.2", 213 | "glob": "^10.2.6", 214 | "glob-parent": "^5.1.2", 215 | "global-dirs": "^3.0.1", 216 | "global-modules": "^2.0.0", 217 | "global-prefix": "^3.0.0", 218 | "globals": "^11.12.0", 219 | "globalthis": "^1.0.3", 220 | "globby": "^11.1.0", 221 | "globjoin": "^0.1.4", 222 | "gonzales-pe": "^4.3.0", 223 | "gopd": "^1.0.1", 224 | "got": "^11.8.6", 225 | "graceful-fs": "^4.2.11", 226 | "hard-rejection": "^2.1.0", 227 | "has": "^1.0.3", 228 | "has-bigints": "^1.0.2", 229 | "has-flag": "^4.0.0", 230 | "has-property-descriptors": "^1.0.0", 231 | "has-proto": "^1.0.1", 232 | "has-symbols": "^1.0.3", 233 | "has-tostringtag": "^1.0.0", 234 | "has-unicode": "^2.0.1", 235 | "has-yarn": "^2.1.0", 236 | "hosted-git-info": "^6.1.1", 237 | "html-encoding-sniffer": "^3.0.0", 238 | "html-tags": "^3.3.1", 239 | "htmlparser2": "^3.10.1", 240 | "http-cache-semantics": "^4.1.1", 241 | "http-errors": "^2.0.0", 242 | "http-proxy-agent": "^5.0.0", 243 | "http2-wrapper": "^1.0.3", 244 | "https": "^1.0.0", 245 | "https-proxy-agent": "^5.0.1", 246 | "human-signals": "^1.1.1", 247 | "humanize-ms": "^1.2.1", 248 | "iconv-lite": "^0.6.3", 249 | "ieee754": "^1.2.1", 250 | "ignore": "^5.2.4", 251 | "image-size": "^1.0.2", 252 | "import-fresh": "^3.3.0", 253 | "import-lazy": "^2.1.0", 254 | "imurmurhash": "^0.1.4", 255 | "indent-string": "^4.0.0", 256 | "inflight": "^1.0.6", 257 | "inherits": "^2.0.4", 258 | "ini": "^2.0.0", 259 | "internal-slot": "^1.0.5", 260 | "invert-kv": "^3.0.1", 261 | "ip": "^1.1.8", 262 | "is-alphabetical": "^1.0.4", 263 | "is-alphanumerical": "^1.0.4", 264 | "is-array-buffer": "^3.0.2", 265 | "is-arrayish": "^0.3.2", 266 | "is-bigint": "^1.0.4", 267 | "is-binary-path": "^2.1.0", 268 | "is-boolean-object": "^1.1.2", 269 | "is-buffer": "^2.0.5", 270 | "is-callable": "^1.2.7", 271 | "is-ci": "^3.0.1", 272 | "is-core-module": "^2.12.1", 273 | "is-date-object": "^1.0.5", 274 | "is-decimal": "^1.0.4", 275 | "is-docker": "^2.2.1", 276 | "is-extglob": "^2.1.1", 277 | "is-fullwidth-code-point": "^3.0.0", 278 | "is-glob": "^4.0.3", 279 | "is-hexadecimal": "^1.0.4", 280 | "is-installed-globally": "^0.4.0", 281 | "is-interactive": "^1.0.0", 282 | "is-lambda": "^1.0.1", 283 | "is-negative-zero": "^2.0.2", 284 | "is-npm": "^5.0.0", 285 | "is-number": "^7.0.0", 286 | "is-number-object": "^1.0.7", 287 | "is-obj": "^2.0.0", 288 | "is-path-inside": "^3.0.3", 289 | "is-plain-obj": "^1.1.0", 290 | "is-potential-custom-element-name": "^1.0.1", 291 | "is-regex": "^1.1.4", 292 | "is-regexp": "^2.1.0", 293 | "is-shared-array-buffer": "^1.0.2", 294 | "is-stream": "^2.0.1", 295 | "is-string": "^1.0.7", 296 | "is-svg": "^4.4.0", 297 | "is-symbol": "^1.0.4", 298 | "is-typed-array": "^1.1.10", 299 | "is-typedarray": "^1.0.0", 300 | "is-unicode-supported": "^0.1.0", 301 | "is-weakref": "^1.0.2", 302 | "is-wsl": "^2.2.0", 303 | "is-yarn-global": "^0.3.0", 304 | "isarray": "^0.0.1", 305 | "isexe": "^2.0.0", 306 | "jackspeak": "^2.2.1", 307 | "jake": "^10.8.7", 308 | "js-library-detector": "^6.6.0", 309 | "js-tokens": "^4.0.0", 310 | "js-yaml": "^3.14.1", 311 | "jsdom": "^21.1.2", 312 | "jsesc": "^2.5.2", 313 | "json-buffer": "^3.0.1", 314 | "json-parse-even-better-errors": "^2.3.1", 315 | "json-schema-traverse": "^1.0.0", 316 | "json-stable-stringify-without-jsonify": "^1.0.1", 317 | "json5": "^2.2.3", 318 | "jsonc-parser": "^3.2.0", 319 | "jsonfile": "^6.1.0", 320 | "jsonparse": "^1.3.1", 321 | "keyv": "^4.5.2", 322 | "kind-of": "^6.0.3", 323 | "known-css-properties": "^0.21.0", 324 | "latest-version": "^7.0.0", 325 | "lcid": "^3.1.1", 326 | "levn": "^0.4.1", 327 | "lines-and-columns": "^1.2.4", 328 | "locate-path": "^5.0.0", 329 | "lockfile": "^1.0.4", 330 | "lodash": "^4.17.21", 331 | "lodash.merge": "^4.6.2", 332 | "lodash.truncate": "^4.4.2", 333 | "log-symbols": "^4.1.0", 334 | "longest-streak": "^2.0.4", 335 | "lowercase-keys": "^2.0.0", 336 | "lru-cache": "^7.18.3", 337 | "luxon": "^3.3.0", 338 | "make-dir": "^3.1.0", 339 | "make-fetch-happen": "^11.1.1", 340 | "map-age-cleaner": "^0.1.3", 341 | "map-obj": "^4.3.0", 342 | "mathml-tag-names": "^2.1.3", 343 | "mdast-util-from-markdown": "^0.8.5", 344 | "mdast-util-to-markdown": "^0.6.5", 345 | "mdast-util-to-string": "^2.0.0", 346 | "mdn-data": "^2.0.32", 347 | "mem": "^5.1.1", 348 | "meow": "^9.0.0", 349 | "merge-stream": "^2.0.0", 350 | "merge2": "^1.4.1", 351 | "metaviewport-parser": "^0.3.0", 352 | "micromark": "^2.11.4", 353 | "micromatch": "^4.0.5", 354 | "mime-db": "^1.52.0", 355 | "mime-types": "^2.1.35", 356 | "mimic-fn": "^2.1.0", 357 | "mimic-response": "^1.0.1", 358 | "min-indent": "^1.0.1", 359 | "minimatch": "^3.1.2", 360 | "minimist": "^1.2.8", 361 | "minimist-options": "^4.1.0", 362 | "minipass": "^5.0.0", 363 | "minipass-collect": "^1.0.2", 364 | "minipass-fetch": "^3.0.3", 365 | "minipass-flush": "^1.0.5", 366 | "minipass-json-stream": "^1.0.1", 367 | "minipass-pipeline": "^1.2.4", 368 | "minipass-sized": "^1.0.3", 369 | "minizlib": "^2.1.2", 370 | "mkdirp": "^1.0.4", 371 | "mkdirp-classic": "^0.5.3", 372 | "ms": "^2.1.2", 373 | "mutationobserver-shim": "^0.3.7", 374 | "nan": "^2.17.0", 375 | "nanoid": "^3.3.6", 376 | "natural-compare": "^1.4.0", 377 | "negotiator": "^0.6.3", 378 | "netmask": "^2.0.2", 379 | "node-fetch": "^2.6.11", 380 | "node-releases": "^2.0.12", 381 | "nopt": "^5.0.0", 382 | "normalize-package-data": "^3.0.3", 383 | "normalize-path": "^3.0.0", 384 | "normalize-range": "^0.1.2", 385 | "normalize-selector": "^0.2.0", 386 | "normalize-url": "^6.1.0", 387 | "npm-package-arg": "^10.1.0", 388 | "npm-registry-fetch": "^14.0.5", 389 | "npm-run-path": "^4.0.1", 390 | "npmlog": "^5.0.1", 391 | "nth-check": "^2.1.1", 392 | "num2fraction": "^1.2.2", 393 | "nwsapi": "^2.2.5", 394 | "object-assign": "^4.1.1", 395 | "object-inspect": "^1.12.3", 396 | "object-keys": "^1.1.1", 397 | "object.assign": "^4.1.4", 398 | "object.entries": "^1.1.6", 399 | "object.values": "^1.1.6", 400 | "once": "^1.4.0", 401 | "onetime": "^5.1.2", 402 | "optionator": "^0.9.1", 403 | "ora": "^5.4.1", 404 | "os-locale": "^5.0.0", 405 | "p-cancelable": "^2.1.1", 406 | "p-defer": "^1.0.0", 407 | "p-is-promise": "^2.1.0", 408 | "p-limit": "^2.3.0", 409 | "p-locate": "^4.1.0", 410 | "p-map": "^4.0.0", 411 | "p-try": "^2.2.0", 412 | "pac-proxy-agent": "^5.0.0", 413 | "pac-resolver": "^5.0.1", 414 | "package-json": "^8.1.0", 415 | "parent-module": "^1.0.1", 416 | "parse-entities": "^2.0.0", 417 | "parse-json": "^5.2.0", 418 | "parse5": "^6.0.1", 419 | "parse5-htmlparser2-tree-adapter": "^6.0.1", 420 | "path-exists": "^4.0.0", 421 | "path-is-absolute": "^1.0.1", 422 | "path-key": "^3.1.1", 423 | "path-parse": "^1.0.7", 424 | "path-scurry": "^1.9.2", 425 | "path-type": "^4.0.0", 426 | "peek-readable": "^4.1.0", 427 | "pend": "^1.2.0", 428 | "picocolors": "^1.0.0", 429 | "picomatch": "^2.3.1", 430 | "pkg-dir": "^4.2.0", 431 | "postcss": "^8.4.24", 432 | "postcss-html": "^0.36.0", 433 | "postcss-less": "^5.0.0", 434 | "postcss-media-query-parser": "^0.2.3", 435 | "postcss-resolve-nested-selector": "^0.1.1", 436 | "postcss-safe-parser": "^6.0.0", 437 | "postcss-sass": "^0.5.0", 438 | "postcss-scss": "^4.0.6", 439 | "postcss-selector-parser": "^6.0.13", 440 | "postcss-syntax": "^0.36.2", 441 | "postcss-value-parser": "^4.2.0", 442 | "prelude-ls": "^1.2.1", 443 | "prepend-http": "^2.0.0", 444 | "proc-log": "^3.0.0", 445 | "progress": "^2.0.3", 446 | "promise-retry": "^2.0.1", 447 | "proxy-agent": "^5.0.0", 448 | "proxy-from-env": "^1.1.0", 449 | "psl": "^1.9.0", 450 | "pump": "^3.0.0", 451 | "punycode": "^2.3.0", 452 | "pupa": "^2.1.1", 453 | "puppeteer-core": "^13.7.0", 454 | "q": "^1.5.1", 455 | "querystringify": "^2.2.0", 456 | "queue": "^6.0.2", 457 | "queue-microtask": "^1.2.3", 458 | "quick-lru": "^5.1.1", 459 | "raw-body": "^2.5.2", 460 | "rc": "^1.2.8", 461 | "read-pkg": "^5.2.0", 462 | "read-pkg-up": "^7.0.1", 463 | "readable-stream": "^3.6.2", 464 | "readable-web-to-node-stream": "^3.0.2", 465 | "readdirp": "^3.6.0", 466 | "redent": "^3.0.0", 467 | "regexp.prototype.flags": "^1.5.0", 468 | "regexpp": "^3.2.0", 469 | "registry-auth-token": "^4.2.2", 470 | "registry-url": "^5.1.0", 471 | "remark": "^13.0.0", 472 | "remark-parse": "^9.0.0", 473 | "remark-stringify": "^9.0.1", 474 | "repeat-string": "^1.6.1", 475 | "require-from-string": "^2.0.2", 476 | "requires-port": "^1.0.0", 477 | "resolve": "^1.22.2", 478 | "resolve-alpn": "^1.2.1", 479 | "resolve-from": "^5.0.0", 480 | "responselike": "^2.0.1", 481 | "restore-cursor": "^3.1.0", 482 | "retry": "^0.12.0", 483 | "reusify": "^1.0.4", 484 | "rimraf": "^3.0.2", 485 | "rrweb-cssom": "^0.6.0", 486 | "run-parallel": "^1.2.0", 487 | "safe-buffer": "^5.2.1", 488 | "safe-regex-test": "^1.0.0", 489 | "safer-buffer": "^2.1.2", 490 | "saxes": "^6.0.0", 491 | "semver": "^7.5.1", 492 | "semver-diff": "^3.1.1", 493 | "set-blocking": "^2.0.0", 494 | "setimmediate": "^1.0.5", 495 | "setprototypeof": "^1.2.0", 496 | "shebang-command": "^2.0.0", 497 | "shebang-regex": "^3.0.0", 498 | "side-channel": "^1.0.4", 499 | "signal-exit": "^3.0.7", 500 | "simple-concat": "^1.0.1", 501 | "simple-get": "^3.1.1", 502 | "simple-swizzle": "^0.2.2", 503 | "slash": "^3.0.0", 504 | "slice-ansi": "^4.0.0", 505 | "smart-buffer": "^4.2.0", 506 | "socks": "^2.7.1", 507 | "socks-proxy-agent": "^7.0.0", 508 | "source-map": "^0.6.1", 509 | "source-map-js": "^1.0.2", 510 | "spdx-correct": "^3.2.0", 511 | "spdx-exceptions": "^2.3.0", 512 | "spdx-expression-parse": "^3.0.1", 513 | "spdx-license-ids": "^3.0.13", 514 | "specificity": "^0.4.1", 515 | "sprintf-js": "^1.0.3", 516 | "ssri": "^10.0.4", 517 | "statuses": "^2.0.1", 518 | "string_decoder": "^1.3.0", 519 | "string-width": "^5.1.2", 520 | "string-width-cjs": "^4.2.3", 521 | "string.prototype.trim": "^1.2.7", 522 | "string.prototype.trimend": "^1.0.6", 523 | "string.prototype.trimstart": "^1.0.6", 524 | "strip-ansi": "^6.0.1", 525 | "strip-ansi-cjs": "^6.0.1", 526 | "strip-bom": "^3.0.0", 527 | "strip-final-newline": "^2.0.0", 528 | "strip-indent": "^3.0.0", 529 | "strip-json-comments": "^2.0.1", 530 | "strnum": "^1.0.5", 531 | "strtok3": "^6.3.0", 532 | "style-search": "^0.1.0", 533 | "stylelint-config-recommended": "^4.0.0", 534 | "sugarss": "^2.0.0", 535 | "supports-color": "^7.2.0", 536 | "supports-preserve-symlinks-flag": "^1.0.0", 537 | "svg-tags": "^1.0.0", 538 | "symbol-tree": "^3.2.4", 539 | "table": "^6.8.1", 540 | "tar": "^6.1.15", 541 | "tar-fs": "^2.1.1", 542 | "tar-stream": "^2.2.0", 543 | "text-table": "^0.2.0", 544 | "through": "^2.3.8", 545 | "to-fast-properties": "^2.0.0", 546 | "to-readable-stream": "^1.0.0", 547 | "to-regex-range": "^5.0.1", 548 | "toidentifier": "^1.0.1", 549 | "token-types": "^4.2.1", 550 | "tough-cookie": "^4.1.2", 551 | "tr46": "^3.0.0", 552 | "trim-newlines": "^3.0.1", 553 | "trough": "^1.0.5", 554 | "tsconfig-paths": "^3.14.2", 555 | "tslib": "^2.5.3", 556 | "tsutils": "^3.21.0", 557 | "type-check": "^0.4.0", 558 | "type-fest": "^0.20.2", 559 | "typed-array-length": "^1.0.4", 560 | "typedarray-to-buffer": "^3.1.5", 561 | "typescript": "^5.1.3", 562 | "unbox-primitive": "^1.0.2", 563 | "unbzip2-stream": "^1.4.3", 564 | "unified": "^9.2.2", 565 | "unique-filename": "^3.0.0", 566 | "unique-slug": "^4.0.0", 567 | "unique-string": "^2.0.0", 568 | "unist-util-find-all-after": "^3.0.2", 569 | "unist-util-is": "^4.1.0", 570 | "unist-util-stringify-position": "^2.0.3", 571 | "universalify": "^2.0.0", 572 | "unpipe": "^1.0.0", 573 | "update-browserslist-db": "^1.0.11", 574 | "update-notifier": "^6.0.2", 575 | "uri-js": "^4.4.1", 576 | "url-parse": "^1.5.10", 577 | "url-parse-lax": "^3.0.0", 578 | "util-deprecate": "^1.0.2", 579 | "v8-compile-cache": "^2.3.0", 580 | "validate-npm-package-license": "^3.0.4", 581 | "validate-npm-package-name": "^5.0.0", 582 | "vfile": "^4.2.1", 583 | "vfile-message": "^2.0.4", 584 | "vm2": "^3.9.19", 585 | "w3c-xmlserializer": "^4.0.0", 586 | "wcwidth": "^1.0.1", 587 | "webidl-conversions": "^7.0.0", 588 | "whatwg-encoding": "^2.0.0", 589 | "whatwg-mimetype": "^3.0.0", 590 | "whatwg-url": "^11.0.0", 591 | "which": "^2.0.2", 592 | "which-boxed-primitive": "^1.0.2", 593 | "which-typed-array": "^1.1.9", 594 | "wide-align": "^1.1.5", 595 | "widest-line": "^3.1.0", 596 | "word-wrap": "^1.2.3", 597 | "wrap-ansi": "^8.1.0", 598 | "wrap-ansi-cjs": "^7.0.0", 599 | "wrappy": "^1.0.2", 600 | "write-file-atomic": "^3.0.3", 601 | "ws": "^8.13.0", 602 | "xdg-basedir": "^4.0.0", 603 | "xml-name-validator": "^4.0.0", 604 | "xmlchars": "^2.2.0", 605 | "xregexp": "^2.0.0", 606 | "yallist": "^4.0.0", 607 | "yaml": "^1.10.2", 608 | "yargs-parser": "^20.2.9", 609 | "yauzl": "^2.10.0", 610 | "zwitch": "^1.0.5" 611 | } 612 | } 613 | --------------------------------------------------------------------------------