├── .devcontainer ├── Dockerfile ├── devcontainer.json ├── docker-compose.yml └── init.sh ├── .gitattributes ├── .gitignore ├── .gitmojirc.json ├── .husky ├── pre-commit └── prepare-commit-msg ├── .lintstagedrc.js ├── .npmignore ├── .prettierignore ├── .prettierrc.js ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── LICENSE ├── README.MD ├── cspell.config.js ├── eslint.config.mjs ├── knip.js ├── notes.md ├── package-lock.json ├── package.json ├── src ├── data │ ├── country.data.ts │ └── currency.data.ts ├── index.ts ├── interfaces │ ├── search-params.interface.ts │ └── search-result.interface.ts ├── scrape.ts ├── search.ts └── types │ ├── condition.type.ts │ ├── currency.type.ts │ ├── format-description.type.ts │ ├── format.type.ts │ ├── from.type.ts │ ├── genre.type.ts │ ├── lang.type.ts │ ├── limit.type.ts │ ├── search-type.type.ts │ ├── sort.type.ts │ └── style.type.ts ├── test └── app.test.ts ├── tsconfig.build.json └── tsconfig.json /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:22.04 2 | 3 | # This Dockerfile adds a non-root user with sudo access. 4 | ARG USERNAME=vscode 5 | ARG USER_UID=1000 6 | ARG USER_GID=$USER_UID 7 | 8 | # Create the user 9 | RUN groupadd --gid $USER_GID $USERNAME \ 10 | && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \ 11 | && apt-get update \ 12 | && apt-get install -y sudo \ 13 | && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ 14 | && chmod 0440 /etc/sudoers.d/$USERNAME 15 | 16 | # Set the default user 17 | USER $USERNAME 18 | 19 | RUN sudo apt-get clean 20 | RUN sudo apt-get update 21 | RUN sudo apt-get -y install curl 22 | RUN sudo apt-get -y install nano 23 | RUN sudo apt-get -y install git 24 | RUN sudo apt-get update --fix-missing 25 | RUN export EDITOR="/usr/bin/nano" 26 | 27 | # install nodejs 22.x 28 | RUN sudo apt-get install -y ca-certificates gnupg 29 | RUN sudo mkdir -p /etc/apt/keyrings 30 | RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg 31 | RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list 32 | RUN sudo apt-get update 33 | RUN sudo apt-get install nodejs -y 34 | RUN sudo npm i -g np@10.2.0 35 | RUN sudo npm i -g gitmoji-cli@9.5.0 36 | RUN sudo npx playwright install-deps chromium 37 | 38 | WORKDIR /app_discogs-marketplace-api-nodejs -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "discogs-marketplace-api-nodejs", 3 | "dockerComposeFile": "docker-compose.yml", 4 | "postCreateCommand": "bash .devcontainer/init.sh", 5 | "service": "discogs-marketplace-api-nodejs_container", 6 | "workspaceFolder": "/app_discogs-marketplace-api-nodejs", 7 | "customizations": { 8 | "vscode": { 9 | "extensions": [ 10 | "gruntfuggly.todo-tree", 11 | "davidanson.vscode-markdownlint", 12 | "dbaeumer.vscode-eslint", 13 | "pflannery.vscode-versionlens", 14 | "esbenp.prettier-vscode", 15 | "streetsidesoftware.code-spell-checker" 16 | ] 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /.devcontainer/docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | discogs-marketplace-api-nodejs_container: 3 | build: 4 | context: ./ 5 | dockerfile: ./Dockerfile 6 | stdin_open: true 7 | tty: true 8 | volumes: 9 | - ../:/app_discogs-marketplace-api-nodejs:rw 10 | - /etc/timezone:/etc/timezone:ro 11 | - /etc/localtime:/etc/localtime:ro 12 | ports: 13 | - 5000:5000 14 | - 3000:3000 15 | networks: 16 | - discogs-marketplace-api-nodejs_network 17 | 18 | networks: 19 | discogs-marketplace-api-nodejs_network: 20 | driver: 'bridge' 21 | -------------------------------------------------------------------------------- /.devcontainer/init.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | echo "🏠 Installing packages" 4 | (npm ci && chmod ug+x .husky/*) -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | test/html/* linguist-vendored -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Node ### 2 | # Logs 3 | logs 4 | *.log 5 | npm-debug.log* 6 | yarn-debug.log* 7 | yarn-error.log* 8 | lerna-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # TypeScript v1 declaration files 46 | typings/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional REPL history 58 | .node_repl_history 59 | 60 | # Output of 'npm pack' 61 | *.tgz 62 | 63 | # Yarn Integrity file 64 | .yarn-integrity 65 | 66 | # dotenv environment variables file 67 | .env 68 | .env.test 69 | 70 | # parcel-bundler cache (https://parceljs.org/) 71 | .cache 72 | 73 | # next.js build output 74 | .next 75 | 76 | # nuxt.js build output 77 | .nuxt 78 | 79 | # rollup.js default build output 80 | dist/ 81 | 82 | # Uncomment the public line if your project uses Gatsby 83 | # https://nextjs.org/blog/next-9-1#public-directory-support 84 | # https://create-react-app.dev/docs/using-the-public-folder/#docsNav 85 | # public 86 | 87 | # Storybook build outputs 88 | .out 89 | .storybook-out 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # Temporary folders 104 | tmp/ 105 | temp/ 106 | 107 | # End of https://www.gitignore.io/api/node 108 | -------------------------------------------------------------------------------- /.gitmojirc.json: -------------------------------------------------------------------------------- 1 | { 2 | "autoAdd": false, 3 | "emojiFormat": "emoji", 4 | "scopePrompt": true, 5 | "gitmojisUrl": "https://gitmoji.dev/api/gitmojis" 6 | } 7 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | 2 | npx lint-staged -------------------------------------------------------------------------------- /.husky/prepare-commit-msg: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # gitmoji as a commit hook 3 | exec < /dev/tty 4 | gitmoji --hook $1 $2 -------------------------------------------------------------------------------- /.lintstagedrc.js: -------------------------------------------------------------------------------- 1 | /** 2 | * {@link https://github.com/okonet/lint-staged#configuration} Documentation 3 | * @type {import('lint-staged').Config} 4 | */ 5 | module.exports = { 6 | '*.{ts,tsx,js,jsx}': ['prettier --ignore-unknown', 'eslint', 'cspell --no-progress --no-must-find-files'], 7 | '*.{html,json,svg,yml,xml}': ['prettier --ignore-unknown', 'cspell --no-progress --no-must-find-files'], 8 | } 9 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src/ 2 | tsconfig.json 3 | tsconfig.build.json 4 | test/ 5 | coverage 6 | .vscode/ 7 | .devcontainer/ 8 | eslint.config.mjs 9 | .gitattributes 10 | .gitignore 11 | notes.md 12 | .prettierignore 13 | .prettierrc.js 14 | .gitmojirc.json 15 | .lintstagedrc.js 16 | .husky/ 17 | cspell.config.js 18 | knip.js -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | *.md -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | /** 2 | * {@link https://prettier.io/docs/en/configuration.html} Documentation 3 | * @type {import('prettier').Config} 4 | */ 5 | module.exports = { 6 | tabWidth: 4, 7 | semi: false, 8 | singleQuote: true, 9 | printWidth: 140, 10 | quoteProps: 'as-needed', 11 | trailingComma: 'all', 12 | arrowParens: 'avoid', 13 | singleAttributePerLine: true, 14 | overrides: [ 15 | { 16 | files: '*.json', 17 | options: { 18 | tabWidth: 2, 19 | }, 20 | }, 21 | { 22 | files: '*.yml', 23 | options: { 24 | tabWidth: 2, 25 | }, 26 | }, 27 | ], 28 | } 29 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "🪲 Debug", 6 | "type": "node-terminal", 7 | "request": "launch", 8 | "command": "npm run start:dev" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "[typescript]": { 4 | "editor.defaultFormatter": "esbenp.prettier-vscode" 5 | }, 6 | "[javascript]": { 7 | "editor.defaultFormatter": "esbenp.prettier-vscode" 8 | }, 9 | "[html]": { 10 | "editor.defaultFormatter": "esbenp.prettier-vscode" 11 | }, 12 | "[json]": { 13 | "editor.defaultFormatter": "esbenp.prettier-vscode" 14 | }, 15 | "[jsonc]": { 16 | "editor.defaultFormatter": "esbenp.prettier-vscode" 17 | }, 18 | "[markdown]": { 19 | "editor.defaultFormatter": "vscode.markdown-language-features" 20 | }, 21 | "editor.codeActionsOnSave": { 22 | "source.fixAll": "explicit" 23 | }, 24 | "editor.lightbulb.enabled": "off", 25 | "eslint.workingDirectories": ["./"], 26 | "prettier.requireConfig": true, 27 | "versionlens.suggestions.showOnStartup": true, 28 | "terminal.integrated.defaultProfile.linux": "bash", 29 | "terminal.integrated.profiles.linux": { 30 | "bash": { 31 | "path": "/bin/bash", 32 | "icon": "terminal-bash" 33 | } 34 | }, 35 | "typescript.preferences.importModuleSpecifier": "non-relative", 36 | "javascript.preferences.importModuleSpecifier": "non-relative", 37 | "markdownlint.config": { 38 | "MD051": false 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [] 4 | } 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 KirianCaumes 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 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | # Discogs Marketplace API NodeJS 2 | 3 | [![NPM Version](https://img.shields.io/npm/v/discogs-marketplace-api-nodejs?logo=npm&color=CB3837)](https://www.npmjs.com/package/discogs-marketplace-api-nodejs) ![GitHub Repo stars](https://img.shields.io/github/stars/KirianCaumes/Discogs-Marketplace-API-NodeJS?style=flat&logo=github&label=Stars&color=%23181717) [![GitHub License](https://img.shields.io/github/license/KirianCaumes/Discogs-Marketplace-API-NodeJS?logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI%2FPg0KPHN2ZyBmaWxsPSIjZmZmIiBhcmlhLWhpZGRlbj0idHJ1ZSIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2IiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSIxNiIgZGF0YS12aWV3LWNvbXBvbmVudD0idHJ1ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgPg0KICAgIDxwYXRoIGQ9Ik04Ljc1Ljc1VjJoLjk4NWMuMzA0IDAgLjYwMy4wOC44NjcuMjMxbDEuMjkuNzM2Yy4wMzguMDIyLjA4LjAzMy4xMjQuMDMzaDIuMjM0YS43NS43NSAwIDAgMSAwIDEuNWgtLjQyN2wyLjExMSA0LjY5MmEuNzUuNzUgMCAwIDEtLjE1NC44MzhsLS41My0uNTMuNTI5LjUzMS0uMDAxLjAwMi0uMDAyLjAwMi0uMDA2LjAwNi0uMDA2LjAwNS0uMDEuMDEtLjA0NS4wNGMtLjIxLjE3Ni0uNDQxLjMyNy0uNjg2LjQ1QzE0LjU1NiAxMC43OCAxMy44OCAxMSAxMyAxMWE0LjQ5OCA0LjQ5OCAwIDAgMS0yLjAyMy0uNDU0IDMuNTQ0IDMuNTQ0IDAgMCAxLS42ODYtLjQ1bC0uMDQ1LS4wNC0uMDE2LS4wMTUtLjAwNi0uMDA2LS4wMDQtLjAwNHYtLjAwMWEuNzUuNzUgMCAwIDEtLjE1NC0uODM4TDEyLjE3OCA0LjVoLS4xNjJjLS4zMDUgMC0uNjA0LS4wNzktLjg2OC0uMjMxbC0xLjI5LS43MzZhLjI0NS4yNDUgMCAwIDAtLjEyNC0uMDMzSDguNzVWMTNoMi41YS43NS43NSAwIDAgMSAwIDEuNWgtNi41YS43NS43NSAwIDAgMSAwLTEuNWgyLjVWMy41aC0uOTg0YS4yNDUuMjQ1IDAgMCAwLS4xMjQuMDMzbC0xLjI4OS43MzdjLS4yNjUuMTUtLjU2NC4yMy0uODY5LjIzaC0uMTYybDIuMTEyIDQuNjkyYS43NS43NSAwIDAgMS0uMTU0LjgzOGwtLjUzLS41My41MjkuNTMxLS4wMDEuMDAyLS4wMDIuMDAyLS4wMDYuMDA2LS4wMTYuMDE1LS4wNDUuMDRjLS4yMS4xNzYtLjQ0MS4zMjctLjY4Ni40NUM0LjU1NiAxMC43OCAzLjg4IDExIDMgMTFhNC40OTggNC40OTggMCAwIDEtMi4wMjMtLjQ1NCAzLjU0NCAzLjU0NCAwIDAgMS0uNjg2LS40NWwtLjA0NS0uMDQtLjAxNi0uMDE1LS4wMDYtLjAwNi0uMDA0LS4wMDR2LS4wMDFhLjc1Ljc1IDAgMCAxLS4xNTQtLjgzOEwyLjE3OCA0LjVIMS43NWEuNzUuNzUgMCAwIDEgMC0xLjVoMi4yMzRhLjI0OS4yNDkgMCAwIDAgLjEyNS0uMDMzbDEuMjg4LS43MzdjLjI2NS0uMTUuNTY0LS4yMy44NjktLjIzaC45ODRWLjc1YS43NS43NSAwIDAgMSAxLjUgMFptMi45NDUgOC40NzdjLjI4NS4xMzUuNzE4LjI3MyAxLjMwNS4yNzNzMS4wMi0uMTM4IDEuMzA1LS4yNzNMMTMgNi4zMjdabS0xMCAwYy4yODUuMTM1LjcxOC4yNzMgMS4zMDUuMjczczEuMDItLjEzOCAxLjMwNS0uMjczTDMgNi4zMjdaIj48L3BhdGg%2BDQo8L3N2Zz4%3D&logoColor=fff&label=License)](https://github.com/KirianCaumes/Discogs-Marketplace-API-NodeJS/blob/master/LICENSE) [![Support this project](https://img.shields.io/badge/Support%20this%20project-003087?logo=PayPal&logoColor=fff)](https://www.paypal.me/KirianCaumes) 4 | 5 | Another (better ?) NodeJs library to fetch data from Discogs marketplace. 💿 6 | 7 | ## 📂 Installation (with npm) 8 | 9 | Run the following command in your project: 10 | 11 | ```sh 12 | npm i discogs-marketplace-api-nodejs 13 | ``` 14 | 15 | ## ▶️ Quick Start 16 | 17 | Import `DiscogsMarketplace` into your project: 18 | 19 | ```js 20 | import { DiscogsMarketplace } from 'discogs-marketplace-api-nodejs' 21 | ``` 22 | 23 | ## 🤔 Examples 24 | 25 | - Get top 250 items, of the 2nd page, filtered by Rock, listed by newest, for a given artist 26 | 27 | ```js 28 | // https://www.discogs.com/sell/list?sort=listed,desc&limit=250&artist_id=244819&page=2&genre=Rock 29 | const result = await DiscogsMarketplace.search({ 30 | limit: 250, 31 | page: 2, 32 | genre: 'Rock', 33 | sort: 'Listed Newest', 34 | searchType: 'artist_id', 35 | searchValue: 244819, 36 | }) 37 | ``` 38 | 39 | - Get top 50 items, of the 1st page, listed by price lowest, on a user wantlist 40 | 41 | ```js 42 | // https://www.discogs.com/sell/mywants?limit=50&user=Kirian_&sort=price,asc 43 | const result = await DiscogsMarketplace.search({ 44 | limit: 50, 45 | page: 1, 46 | sort: 'Price Lowest', 47 | searchType: 'user', 48 | searchValue: 'Kirian_', 49 | }) 50 | ``` 51 | 52 | - Get top 25 items, of the 1st page, listed by seller A-Z, on a release 53 | 54 | ```js 55 | // https://www.discogs.com/sell/release/767931?sort=seller,asc&limit=25&page=1 56 | const result = await DiscogsMarketplace.search({ 57 | sort: 'Seller A-Z', 58 | page: 1, 59 | searchType: 'release_id', 60 | searchValue: '767931', 61 | }) 62 | ``` 63 | 64 | - Get top 100 items, of the 1st page, listed by newest, on a string search 65 | 66 | ```js 67 | // https://www.discogs.com/sell/list?sort=listed,desc&limit=100&q=in+flames&page=1 68 | const result = await DiscogsMarketplace.search({ 69 | limit: 100, 70 | page: 1, 71 | sort: 'Listed Newest', 72 | searchType: 'q', 73 | searchValue: 'in flames', 74 | }) 75 | ``` 76 | 77 | - Get top 25 items, of the 1st page, listed by newest, on a seller inventory 78 | 79 | ```js 80 | // https://www.discogs.com/seller/Kirian_/profile?sort=listed,desc&limit=25&page=1 81 | const result = await DiscogsMarketplace.search({ 82 | sort: 'Listed Newest', 83 | page: 1, 84 | searchType: 'q', 85 | searchValue: '', 86 | seller: 'Kirian_', 87 | }) 88 | ``` 89 | 90 | - Get top 25 items, of the 1st page, listed by newest, on a user wantlist, on a seller inventory 91 | 92 | ```js 93 | // https://www.discogs.com/seller/Kirian_/mywants?sort=listed,desc&limit=25&user=Kirian_&page=1 94 | const result = await DiscogsMarketplace.search({ 95 | sort: 'Listed Newest', 96 | page: 1, 97 | searchType: 'user', 98 | searchValue: 'Kirian_', 99 | seller: 'Kirian_', 100 | }) 101 | ``` 102 | 103 | - If you are making a lot of requests, you can pass a playwright page instance to reuse it: 104 | 105 | ```js 106 | const browser = await playwright.launch() 107 | const browserContext = await browser.newContext() 108 | const browserPage = await browserContext.newPage() 109 | 110 | const result = await DiscogsMarketplace.search({ searchType: 'q'}, browserPage) 111 | 112 | await browserContext.close() 113 | await browser.close() 114 | ``` 115 | 116 | ## 📃 Data format 117 | 118 | You can provide parameters to `DiscogsMarketplace.search` function according to this interface: 119 | 120 | ```ts 121 | interface SearchParams { 122 | /** 123 | * Type of elements to search. 124 | * | Name | Description | 125 | * |:---------: |:--------------------------:| 126 | * | q | Basic query search | 127 | * | master_id | Search in a master release | 128 | * | release_id | Search in a release | 129 | * | label_id | Search in a label | 130 | * | artist_id | Search in a artist | 131 | * | user | Search in user wantlist | 132 | * @default 'q' 133 | */ 134 | searchType: Search 135 | /** 136 | * Value to search corresponding to the search type 137 | */ 138 | searchValue?: string | number 139 | /** 140 | * Currency 141 | * @example 'USD' 142 | */ 143 | currency?: Currency 144 | /** 145 | * Genre 146 | * @example 'Rock' 147 | */ 148 | genre?: Genre 149 | /** 150 | * Styles 151 | * @example ['Death Metal', 'Heavy Metal'] 152 | */ 153 | style?: Array