├── .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 |
58 |
59 |
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 |
--------------------------------------------------------------------------------