├── .DS_Store ├── .gitignore ├── LICENSE ├── README.md ├── index.js ├── input ├── .DS_Store ├── ball │ ├── .DS_Store │ ├── original │ │ ├── .DS_Store │ │ ├── grey eye ball.png │ │ ├── red eye ball.png │ │ └── white eye ball.png │ ├── rare │ │ ├── .DS_Store │ │ ├── eye ball rare.png │ │ └── green eye ball rare.png │ └── super_rare │ │ ├── .DS_Store │ │ └── red eye ball super rare.png ├── bottom lid │ ├── .DS_Store │ ├── original │ │ ├── .DS_Store │ │ └── high bottom.png │ ├── rare │ │ ├── .DS_Store │ │ └── tilted bottom rare.png │ └── super_rare │ │ ├── .DS_Store │ │ └── low bottom super rare.png ├── config.js ├── eye color │ ├── .DS_Store │ ├── original │ │ ├── cyan big.png │ │ ├── cyan small.png │ │ ├── green big.png │ │ ├── green small.png │ │ ├── yellow big.png │ │ └── yellow small.png │ ├── rare │ │ ├── .DS_Store │ │ ├── pink big rare.png │ │ ├── pink small rare.png │ │ ├── purple big rare.png │ │ └── purple small rare.png │ └── super_rare │ │ ├── .DS_Store │ │ ├── red big super rare.png │ │ └── red small super rare.png ├── iris │ ├── .DS_Store │ ├── original │ │ ├── .DS_Store │ │ └── large.png │ ├── rare │ │ ├── .DS_Store │ │ └── medium rare.png │ └── super_rare │ │ ├── .DS_Store │ │ └── small super rare.png ├── shine │ ├── .DS_Store │ ├── original │ │ ├── .DS_Store │ │ └── shapes.png │ ├── rare │ │ ├── .DS_Store │ │ └── shapes rare.png │ └── super_rare │ │ ├── .DS_Store │ │ └── shapes super rare.png └── top lid │ ├── .DS_Store │ ├── original │ ├── .DS_Store │ └── high top.png │ ├── rare │ ├── .DS_Store │ └── low top rare.png │ └── super_rare │ ├── .DS_Store │ └── tilted top super rare.png ├── output ├── 1.png ├── 10.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png ├── 6.png ├── 7.png ├── 8.png ├── 9.png └── _metadata.json ├── package.json └── yarn.lock /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 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 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 HashLips 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. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Welcome to HashLips 👄 2 | 3 | Important: There is a new repo for this code. 4 | [https://github.com/HashLips/hashlips_art_engine](https://github.com/HashLips/hashlips_art_engine) 5 | 6 | All the code in these repos was created and explained by HashLips on the main YouTube channel. 7 | 8 | To find out more please visit: 9 | 10 | [📺 YouTube](https://www.youtube.com/channel/UC1LV4_VQGBJHTJjEWUmy8nA) 11 | 12 | [👄 Discord](https://discord.com/invite/qh6MWhMJDN) 13 | 14 | [💬 Telegram](https://t.me/hashlipsnft) 15 | 16 | [🐦 Twitter](https://twitter.com/hashlipsnft) 17 | 18 | [ℹ️ Website](https://hashlips.online/HashLips) 19 | 20 | # generative-art-opensource 21 | Create generative art by using the canvas api and node js, feel free to contribute to this repo with new ideas. 22 | 23 | # Project Setup 24 | - install `node.js` on your local system (https://nodejs.org/en/) 25 | - clone the repository to your local system `git@github.com:HashLips/generative-art-opensource.git` 26 | - run `yarn install` to install dependencies 27 | 28 | # How to use 29 | ## Run the code 30 | 1. Run `node index.js` 31 | 2. Open the `./output` folder to find your generated images to use as NFTs, as well as the metadata to use for NFT marketplaces. 32 | 33 | ## Adjust the provided configuration and resources 34 | ### Configuration file 35 | The file `./input/config.js` contains the following properties that can be adjusted to your preference in order to change the behavior of the NFT generation procedure: 36 | - width: - of your image in pixels. Default: `1000px` 37 | - height: - of your image in pixels. Default: `1000px` 38 | - dir: - where image parts are stored. Default: `./input` 39 | - description: - of your generated NFT. Default: `This is an NFT made by the coolest generative code.` 40 | - baseImageUri: - URL base to access your NFTs from. This will be used by platforms to find your image resource. This expects the image to be accessible by it's id like `${baseImageUri}/${id}`. 41 | - startEditionFrom: - number (int) to start naming NFTs from. Default: `1` 42 | - editionSize: - number (int) to end edition at. Default: `10` 43 | - editionDnaPrefix: - value (number or string) that indicates which dna from an edition is used there. I.e. dna `0` from to independent batches in the same edition may differ, and can be differentiated using this. Default: `0` 44 | - rarityWeights: - allows to provide rarity categories and how many of each type to include in an edition. Default: `1 super_rare, 4 rare, 5 original` 45 | - layers: list of layers that should be used to render the image. See next section for detail. 46 | 47 | ### Image layers 48 | The image layers are different parts that make up a full image by overlaying on top of each other. E.g. in the example input content of this repository we start with the eyeball and layer features like the eye lids or iris on top to create the completed and unique eye, which we can then use as part of our NFT collection. 49 | To ensure uniqueness, we want to add various features and multiple options for each of them in order to allow enough permutations for the amount of unique images we require. 50 | 51 | To start, copy the layers/features and their images in a flat hierarchy at a directory of your choice (by default we expect them in `./input/`). The features should contain options for each rarity that is provided via the config file. 52 | 53 | After adding the `layers`, adjust them accordingly in the `config.js` by providing the directory path, positioning and sizes. 54 | Use the existing `addLayers` calls as guidance for how to add layers. This can either only use the name of the layer and will use default positioning (x=0, y=0) and sizes (width=configured width, height=configure height), or positioning and sizes can be provided for more flexibility. 55 | 56 | ### Allowing different rarities for certain rarity/layer combinations 57 | It is possible to provide a percentage at which e.g. a rare item would contain a rare vs. common part in a given layer. This can be done via the `addRarityPercentForLayer` that can be found in the `config.js` as well. 58 | This allows for more fine grained control over how much randomness there should be during the generation process, and allows a combination of common and rare parts. 59 | 60 | # Development suggestions 61 | - Preferably use VSCode with the prettifier plugin for a consistent coding style (or equivalent js formatting rules) 62 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const { createCanvas, loadImage } = require("canvas"); 3 | const { 4 | layers, 5 | width, 6 | height, 7 | description, 8 | baseImageUri, 9 | editionSize, 10 | startEditionFrom, 11 | rarityWeights, 12 | } = require("./input/config.js"); 13 | const console = require("console"); 14 | const canvas = createCanvas(width, height); 15 | const ctx = canvas.getContext("2d"); 16 | 17 | // saves the generated image to the output folder, using the edition count as the name 18 | const saveImage = (_editionCount) => { 19 | fs.writeFileSync( 20 | `./output/${_editionCount}.png`, 21 | canvas.toBuffer("image/png") 22 | ); 23 | }; 24 | 25 | // adds a signature to the top left corner of the canvas 26 | const signImage = (_sig) => { 27 | ctx.fillStyle = "#000000"; 28 | ctx.font = "bold 30pt Courier"; 29 | ctx.textBaseline = "top"; 30 | ctx.textAlign = "left"; 31 | ctx.fillText(_sig, 40, 40); 32 | }; 33 | 34 | // generate a random color hue 35 | const genColor = () => { 36 | let hue = Math.floor(Math.random() * 360); 37 | let pastel = `hsl(${hue}, 100%, 85%)`; 38 | return pastel; 39 | }; 40 | 41 | const drawBackground = () => { 42 | ctx.fillStyle = genColor(); 43 | ctx.fillRect(0, 0, width, height); 44 | }; 45 | 46 | // add metadata for individual nft edition 47 | const generateMetadata = (_dna, _edition, _attributesList) => { 48 | let dateTime = Date.now(); 49 | let tempMetadata = { 50 | dna: _dna.join(""), 51 | name: `#${_edition}`, 52 | description: description, 53 | image: `${baseImageUri}/${_edition}`, 54 | edition: _edition, 55 | date: dateTime, 56 | attributes: _attributesList, 57 | }; 58 | return tempMetadata; 59 | }; 60 | 61 | // prepare attributes for the given element to be used as metadata 62 | const getAttributeForElement = (_element) => { 63 | let selectedElement = _element.layer.selectedElement; 64 | let attribute = { 65 | name: selectedElement.name, 66 | rarity: selectedElement.rarity, 67 | }; 68 | return attribute; 69 | }; 70 | 71 | // loads an image from the layer path 72 | // returns the image in a format usable by canvas 73 | const loadLayerImg = async (_layer) => { 74 | return new Promise(async (resolve) => { 75 | const image = await loadImage(`${_layer.selectedElement.path}`); 76 | resolve({ layer: _layer, loadedImage: image }); 77 | }); 78 | }; 79 | 80 | const drawElement = (_element) => { 81 | ctx.drawImage( 82 | _element.loadedImage, 83 | _element.layer.position.x, 84 | _element.layer.position.y, 85 | _element.layer.size.width, 86 | _element.layer.size.height 87 | ); 88 | }; 89 | 90 | // check the configured layer to find information required for rendering the layer 91 | // this maps the layer information to the generated dna and prepares it for 92 | // drawing on a canvas 93 | const constructLayerToDna = (_dna = [], _layers = [], _rarity) => { 94 | let mappedDnaToLayers = _layers.map((layer, index) => { 95 | let selectedElement = layer.elements.find(element => element.id === _dna[index]); 96 | return { 97 | location: layer.location, 98 | position: layer.position, 99 | size: layer.size, 100 | selectedElement: {...selectedElement, rarity: _rarity }, 101 | }; 102 | }); 103 | return mappedDnaToLayers; 104 | }; 105 | 106 | // check if the given dna is contained within the given dnaList 107 | // return true if it is, indicating that this dna is already in use and should be recalculated 108 | const isDnaUnique = (_DnaList = [], _dna = []) => { 109 | let foundDna = _DnaList.find((i) => i.join("") === _dna.join("")); 110 | return foundDna == undefined ? true : false; 111 | }; 112 | 113 | const getRandomRarity = (_rarityOptions) => { 114 | let randomPercent = Math.random() * 100; 115 | let percentCount = 0; 116 | 117 | for (let i = 0; i <= _rarityOptions.length; i++) { 118 | percentCount += _rarityOptions[i].percent; 119 | if (percentCount >= randomPercent) { 120 | console.log(`use random rarity ${_rarityOptions[i].id}`) 121 | return _rarityOptions[i].id; 122 | } 123 | } 124 | return _rarityOptions[0].id; 125 | } 126 | 127 | // create a dna based on the available layers for the given rarity 128 | // use a random part for each layer 129 | const createDna = (_layers, _rarity) => { 130 | let randNum = []; 131 | let _rarityWeight = rarityWeights.find(rw => rw.value === _rarity); 132 | _layers.forEach((layer) => { 133 | let num = Math.floor(Math.random() * layer.elementIdsForRarity[_rarity].length); 134 | if (_rarityWeight && _rarityWeight.layerPercent[layer.id]) { 135 | // if there is a layerPercent defined, we want to identify which dna to actually use here (instead of only picking from the same rarity) 136 | let _rarityForLayer = getRandomRarity(_rarityWeight.layerPercent[layer.id]); 137 | num = Math.floor(Math.random() * layer.elementIdsForRarity[_rarityForLayer].length); 138 | randNum.push(layer.elementIdsForRarity[_rarityForLayer][num]); 139 | } else { 140 | randNum.push(layer.elementIdsForRarity[_rarity][num]); 141 | } 142 | }); 143 | return randNum; 144 | }; 145 | 146 | // holds which rarity should be used for which image in edition 147 | let rarityForEdition; 148 | // get the rarity for the image by edition number that should be generated 149 | const getRarity = (_editionCount) => { 150 | if (!rarityForEdition) { 151 | // prepare array to iterate over 152 | rarityForEdition = []; 153 | rarityWeights.forEach((rarityWeight) => { 154 | for (let i = rarityWeight.from; i <= rarityWeight.to; i++) { 155 | rarityForEdition.push(rarityWeight.value); 156 | } 157 | }); 158 | } 159 | return rarityForEdition[editionSize - _editionCount]; 160 | }; 161 | 162 | const writeMetaData = (_data) => { 163 | fs.writeFileSync("./output/_metadata.json", _data); 164 | }; 165 | 166 | // holds which dna has already been used during generation 167 | let dnaListByRarity = {}; 168 | // holds metadata for all NFTs 169 | let metadataList = []; 170 | // Create generative art by using the canvas api 171 | const startCreating = async () => { 172 | console.log('##################'); 173 | console.log('# Generative Art'); 174 | console.log('# - Create your NFT collection'); 175 | console.log('##################'); 176 | 177 | console.log(); 178 | console.log('start creating NFTs.') 179 | 180 | // clear meta data from previous run 181 | writeMetaData(""); 182 | 183 | // prepare dnaList object 184 | rarityWeights.forEach((rarityWeight) => { 185 | dnaListByRarity[rarityWeight.value] = []; 186 | }); 187 | 188 | // create NFTs from startEditionFrom to editionSize 189 | let editionCount = startEditionFrom; 190 | while (editionCount <= editionSize) { 191 | console.log('-----------------') 192 | console.log('creating NFT %d of %d', editionCount, editionSize); 193 | 194 | // get rarity from to config to create NFT as 195 | let rarity = getRarity(editionCount); 196 | console.log('- rarity: ' + rarity); 197 | 198 | // calculate the NFT dna by getting a random part for each layer/feature 199 | // based on the ones available for the given rarity to use during generation 200 | let newDna = createDna(layers, rarity); 201 | while (!isDnaUnique(dnaListByRarity[rarity], newDna)) { 202 | // recalculate dna as this has been used before. 203 | console.log('found duplicate DNA ' + newDna.join('-') + ', recalculate...'); 204 | newDna = createDna(layers, rarity); 205 | } 206 | console.log('- dna: ' + newDna.join('-')); 207 | 208 | // propagate information about required layer contained within config into a mapping object 209 | // = prepare for drawing 210 | let results = constructLayerToDna(newDna, layers, rarity); 211 | let loadedElements = []; 212 | 213 | // load all images to be used by canvas 214 | results.forEach((layer) => { 215 | loadedElements.push(loadLayerImg(layer)); 216 | }); 217 | 218 | // elements are loaded asynchronously 219 | // -> await for all to be available before drawing the image 220 | await Promise.all(loadedElements).then((elementArray) => { 221 | // create empty image 222 | ctx.clearRect(0, 0, width, height); 223 | // draw a random background color 224 | drawBackground(); 225 | // store information about each layer to add it as meta information 226 | let attributesList = []; 227 | // draw each layer 228 | elementArray.forEach((element) => { 229 | drawElement(element); 230 | attributesList.push(getAttributeForElement(element)); 231 | }); 232 | // add an image signature as the edition count to the top left of the image 233 | signImage(`#${editionCount}`); 234 | // write the image to the output directory 235 | saveImage(editionCount); 236 | let nftMetadata = generateMetadata(newDna, editionCount, attributesList); 237 | metadataList.push(nftMetadata) 238 | console.log('- metadata: ' + JSON.stringify(nftMetadata)); 239 | console.log('- edition ' + editionCount + ' created.'); 240 | console.log(); 241 | }); 242 | dnaListByRarity[rarity].push(newDna); 243 | editionCount++; 244 | } 245 | writeMetaData(JSON.stringify(metadataList)); 246 | }; 247 | 248 | // Initiate code 249 | startCreating(); -------------------------------------------------------------------------------- /input/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/.DS_Store -------------------------------------------------------------------------------- /input/ball/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/ball/.DS_Store -------------------------------------------------------------------------------- /input/ball/original/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/ball/original/.DS_Store -------------------------------------------------------------------------------- /input/ball/original/grey eye ball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/ball/original/grey eye ball.png -------------------------------------------------------------------------------- /input/ball/original/red eye ball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/ball/original/red eye ball.png -------------------------------------------------------------------------------- /input/ball/original/white eye ball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/ball/original/white eye ball.png -------------------------------------------------------------------------------- /input/ball/rare/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/ball/rare/.DS_Store -------------------------------------------------------------------------------- /input/ball/rare/eye ball rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/ball/rare/eye ball rare.png -------------------------------------------------------------------------------- /input/ball/rare/green eye ball rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/ball/rare/green eye ball rare.png -------------------------------------------------------------------------------- /input/ball/super_rare/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/ball/super_rare/.DS_Store -------------------------------------------------------------------------------- /input/ball/super_rare/red eye ball super rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/ball/super_rare/red eye ball super rare.png -------------------------------------------------------------------------------- /input/bottom lid/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/bottom lid/.DS_Store -------------------------------------------------------------------------------- /input/bottom lid/original/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/bottom lid/original/.DS_Store -------------------------------------------------------------------------------- /input/bottom lid/original/high bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/bottom lid/original/high bottom.png -------------------------------------------------------------------------------- /input/bottom lid/rare/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/bottom lid/rare/.DS_Store -------------------------------------------------------------------------------- /input/bottom lid/rare/tilted bottom rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/bottom lid/rare/tilted bottom rare.png -------------------------------------------------------------------------------- /input/bottom lid/super_rare/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/bottom lid/super_rare/.DS_Store -------------------------------------------------------------------------------- /input/bottom lid/super_rare/low bottom super rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/bottom lid/super_rare/low bottom super rare.png -------------------------------------------------------------------------------- /input/config.js: -------------------------------------------------------------------------------- 1 | /************************************************************** 2 | * UTILITY FUNCTIONS 3 | * - scroll to BEGIN CONFIG to provide the config values 4 | *************************************************************/ 5 | const fs = require("fs"); 6 | const dir = __dirname; 7 | 8 | // adds a rarity to the configuration. This is expected to correspond with a directory containing the rarity for each defined layer 9 | // @param _id - id of the rarity 10 | // @param _from - number in the edition to start this rarity from 11 | // @param _to - number in the edition to generate this rarity to 12 | // @return a rarity object used to dynamically generate the NFTs 13 | const addRarity = (_id, _from, _to) => { 14 | const _rarityWeight = { 15 | value: _id, 16 | from: _from, 17 | to: _to, 18 | layerPercent: {} 19 | }; 20 | return _rarityWeight; 21 | }; 22 | 23 | // get the name without last 4 characters -> slice .png from the name 24 | const cleanName = (_str) => { 25 | let name = _str.slice(0, -4); 26 | return name; 27 | }; 28 | 29 | // reads the filenames of a given folder and returns it with its name and path 30 | const getElements = (_path, _elementCount) => { 31 | return fs 32 | .readdirSync(_path) 33 | .filter((item) => !/(^|\/)\.[^\/\.]/g.test(item)) 34 | .map((i) => { 35 | return { 36 | id: _elementCount, 37 | name: cleanName(i), 38 | path: `${_path}/${i}` 39 | }; 40 | }); 41 | }; 42 | 43 | // adds a layer to the configuration. The layer will hold information on all the defined parts and 44 | // where they should be rendered in the image 45 | // @param _id - id of the layer 46 | // @param _position - on which x/y value to render this part 47 | // @param _size - of the image 48 | // @return a layer object used to dynamically generate the NFTs 49 | const addLayer = (_id, _position, _size) => { 50 | if (!_id) { 51 | console.log('error adding layer, parameters id required'); 52 | return null; 53 | } 54 | if (!_position) { 55 | _position = { x: 0, y: 0 }; 56 | } 57 | if (!_size) { 58 | _size = { width: width, height: height } 59 | } 60 | // add two different dimension for elements: 61 | // - all elements with their path information 62 | // - only the ids mapped to their rarity 63 | let elements = []; 64 | let elementCount = 0; 65 | let elementIdsForRarity = {}; 66 | rarityWeights.forEach((rarityWeight) => { 67 | let elementsForRarity = getElements(`${dir}/${_id}/${rarityWeight.value}`); 68 | 69 | elementIdsForRarity[rarityWeight.value] = []; 70 | elementsForRarity.forEach((_elementForRarity) => { 71 | _elementForRarity.id = `${editionDnaPrefix}${elementCount}`; 72 | elements.push(_elementForRarity); 73 | elementIdsForRarity[rarityWeight.value].push(_elementForRarity.id); 74 | elementCount++; 75 | }) 76 | elements[rarityWeight.value] = elementsForRarity; 77 | }); 78 | 79 | let elementsForLayer = { 80 | id: _id, 81 | position: _position, 82 | size: _size, 83 | elements, 84 | elementIdsForRarity 85 | }; 86 | return elementsForLayer; 87 | }; 88 | 89 | // adds layer-specific percentages to use one vs another rarity 90 | // @param _rarityId - the id of the rarity to specifiy 91 | // @param _layerId - the id of the layer to specifiy 92 | // @param _percentages - an object defining the rarities and the percentage with which a given rarity for this layer should be used 93 | const addRarityPercentForLayer = (_rarityId, _layerId, _percentages) => { 94 | let _rarityFound = false; 95 | rarityWeights.forEach((_rarityWeight) => { 96 | if (_rarityWeight.value === _rarityId) { 97 | let _percentArray = []; 98 | for (let percentType in _percentages) { 99 | _percentArray.push({ 100 | id: percentType, 101 | percent: _percentages[percentType] 102 | }) 103 | } 104 | _rarityWeight.layerPercent[_layerId] = _percentArray; 105 | _rarityFound = true; 106 | } 107 | }); 108 | if (!_rarityFound) { 109 | console.log(`rarity ${_rarityId} not found, failed to add percentage information`); 110 | } 111 | } 112 | 113 | /************************************************************** 114 | * BEGIN CONFIG 115 | *************************************************************/ 116 | 117 | // image width in pixels 118 | const width = 1000; 119 | // image height in pixels 120 | const height = 1000; 121 | // description for NFT in metadata file 122 | const description = "This is an NFT made by the coolest generative code."; 123 | // base url to use in metadata file 124 | // the id of the nft will be added to this url, in the example e.g. https://hashlips/nft/1 for NFT with id 1 125 | const baseImageUri = "https://hashlips/nft"; 126 | // id for edition to start from 127 | const startEditionFrom = 1; 128 | // amount of NFTs to generate in edition 129 | const editionSize = 10; 130 | // prefix to add to edition dna ids (to distinguish dna counts from different generation processes for the same collection) 131 | const editionDnaPrefix = 0 132 | 133 | // create required weights 134 | // for each weight, call 'addRarity' with the id and from which to which element this rarity should be applied 135 | let rarityWeights = [ 136 | addRarity('super_rare', 1, 1), 137 | addRarity('rare', 2, 5), 138 | addRarity('original', 5, 10) 139 | ]; 140 | 141 | // create required layers 142 | // for each layer, call 'addLayer' with the id and optionally the positioning and size 143 | // the id would be the name of the folder in your input directory, e.g. 'ball' for ./input/ball 144 | const layers = [ 145 | addLayer('ball', { x: 0, y: 0 }, { width: width, height: height }), 146 | addLayer('eye color'), 147 | addLayer('iris'), 148 | addLayer('shine'), 149 | addLayer('bottom lid'), 150 | addLayer('top lid') 151 | ]; 152 | 153 | // provide any specific percentages that are required for a given layer and rarity level 154 | // all provided options are used based on their percentage values to decide which layer to select from 155 | addRarityPercentForLayer('super_rare', 'ball', { 'super_rare': 33, 'rare': 33, 'original': 33 }); 156 | addRarityPercentForLayer('super_rare', 'eye color', { 'super_rare': 50, 'rare': 25, 'original': 25 }); 157 | addRarityPercentForLayer('original', 'eye color', { 'super_rare': 50, 'rare': 25, 'original': 25 }); 158 | 159 | module.exports = { 160 | layers, 161 | width, 162 | height, 163 | description, 164 | baseImageUri, 165 | editionSize, 166 | startEditionFrom, 167 | rarityWeights, 168 | }; 169 | -------------------------------------------------------------------------------- /input/eye color/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/eye color/.DS_Store -------------------------------------------------------------------------------- /input/eye color/original/cyan big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/eye color/original/cyan big.png -------------------------------------------------------------------------------- /input/eye color/original/cyan small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/eye color/original/cyan small.png -------------------------------------------------------------------------------- /input/eye color/original/green big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/eye color/original/green big.png -------------------------------------------------------------------------------- /input/eye color/original/green small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/eye color/original/green small.png -------------------------------------------------------------------------------- /input/eye color/original/yellow big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/eye color/original/yellow big.png -------------------------------------------------------------------------------- /input/eye color/original/yellow small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/eye color/original/yellow small.png -------------------------------------------------------------------------------- /input/eye color/rare/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/eye color/rare/.DS_Store -------------------------------------------------------------------------------- /input/eye color/rare/pink big rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/eye color/rare/pink big rare.png -------------------------------------------------------------------------------- /input/eye color/rare/pink small rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/eye color/rare/pink small rare.png -------------------------------------------------------------------------------- /input/eye color/rare/purple big rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/eye color/rare/purple big rare.png -------------------------------------------------------------------------------- /input/eye color/rare/purple small rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/eye color/rare/purple small rare.png -------------------------------------------------------------------------------- /input/eye color/super_rare/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/eye color/super_rare/.DS_Store -------------------------------------------------------------------------------- /input/eye color/super_rare/red big super rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/eye color/super_rare/red big super rare.png -------------------------------------------------------------------------------- /input/eye color/super_rare/red small super rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/eye color/super_rare/red small super rare.png -------------------------------------------------------------------------------- /input/iris/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/iris/.DS_Store -------------------------------------------------------------------------------- /input/iris/original/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/iris/original/.DS_Store -------------------------------------------------------------------------------- /input/iris/original/large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/iris/original/large.png -------------------------------------------------------------------------------- /input/iris/rare/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/iris/rare/.DS_Store -------------------------------------------------------------------------------- /input/iris/rare/medium rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/iris/rare/medium rare.png -------------------------------------------------------------------------------- /input/iris/super_rare/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/iris/super_rare/.DS_Store -------------------------------------------------------------------------------- /input/iris/super_rare/small super rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/iris/super_rare/small super rare.png -------------------------------------------------------------------------------- /input/shine/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/shine/.DS_Store -------------------------------------------------------------------------------- /input/shine/original/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/shine/original/.DS_Store -------------------------------------------------------------------------------- /input/shine/original/shapes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/shine/original/shapes.png -------------------------------------------------------------------------------- /input/shine/rare/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/shine/rare/.DS_Store -------------------------------------------------------------------------------- /input/shine/rare/shapes rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/shine/rare/shapes rare.png -------------------------------------------------------------------------------- /input/shine/super_rare/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/shine/super_rare/.DS_Store -------------------------------------------------------------------------------- /input/shine/super_rare/shapes super rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/shine/super_rare/shapes super rare.png -------------------------------------------------------------------------------- /input/top lid/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/top lid/.DS_Store -------------------------------------------------------------------------------- /input/top lid/original/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/top lid/original/.DS_Store -------------------------------------------------------------------------------- /input/top lid/original/high top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/top lid/original/high top.png -------------------------------------------------------------------------------- /input/top lid/rare/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/top lid/rare/.DS_Store -------------------------------------------------------------------------------- /input/top lid/rare/low top rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/top lid/rare/low top rare.png -------------------------------------------------------------------------------- /input/top lid/super_rare/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/top lid/super_rare/.DS_Store -------------------------------------------------------------------------------- /input/top lid/super_rare/tilted top super rare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/input/top lid/super_rare/tilted top super rare.png -------------------------------------------------------------------------------- /output/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/output/1.png -------------------------------------------------------------------------------- /output/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/output/10.png -------------------------------------------------------------------------------- /output/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/output/2.png -------------------------------------------------------------------------------- /output/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/output/3.png -------------------------------------------------------------------------------- /output/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/output/4.png -------------------------------------------------------------------------------- /output/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/output/5.png -------------------------------------------------------------------------------- /output/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/output/6.png -------------------------------------------------------------------------------- /output/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/output/7.png -------------------------------------------------------------------------------- /output/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/output/8.png -------------------------------------------------------------------------------- /output/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashLips/generative-art-opensource/ed8a37d5c4277c5011dd21152f5f4e1761060894/output/9.png -------------------------------------------------------------------------------- /output/_metadata.json: -------------------------------------------------------------------------------- 1 | [{"dna":"000000","rarity":"SUPER_RARE","name":"#1","description":"This is an NFT made by the coolest generative code.","image":"https://hashlips/nft/1","edition":1,"date":1630062402020,"attributes":[{"name":"red eye ball super rare"},{"name":"red big super rare"},{"name":"small super rare"},{"name":"shapes super rare"},{"name":"low bottom super rare"},{"name":"tilted top super rare"}]},{"dna":"020000","rarity":"RARE","name":"#2","description":"This is an NFT made by the coolest generative code.","image":"https://hashlips/nft/2","edition":2,"date":1630062402374,"attributes":[{"name":"eye ball rare"},{"name":"purple big rare"},{"name":"medium rare"},{"name":"shapes rare"},{"name":"tilted bottom rare"},{"name":"low top rare"}]},{"dna":"130000","rarity":"RARE","name":"#3","description":"This is an NFT made by the coolest generative code.","image":"https://hashlips/nft/3","edition":3,"date":1630062402725,"attributes":[{"name":"green eye ball rare"},{"name":"purple small rare"},{"name":"medium rare"},{"name":"shapes rare"},{"name":"tilted bottom rare"},{"name":"low top rare"}]},{"dna":"110000","rarity":"RARE","name":"#4","description":"This is an NFT made by the coolest generative code.","image":"https://hashlips/nft/4","edition":4,"date":1630062403081,"attributes":[{"name":"green eye ball rare"},{"name":"pink small rare"},{"name":"medium rare"},{"name":"shapes rare"},{"name":"tilted bottom rare"},{"name":"low top rare"}]},{"dna":"010000","rarity":"ORIGINAL","name":"#5","description":"This is an NFT made by the coolest generative code.","image":"https://hashlips/nft/5","edition":5,"date":1630062403415,"attributes":[{"name":"grey eye ball"},{"name":"cyan small"},{"name":"large"},{"name":"shapes"},{"name":"high bottom"},{"name":"high top"}]},{"dna":"120000","rarity":"ORIGINAL","name":"#6","description":"This is an NFT made by the coolest generative code.","image":"https://hashlips/nft/6","edition":6,"date":1630062403813,"attributes":[{"name":"red eye ball"},{"name":"green big"},{"name":"large"},{"name":"shapes"},{"name":"high bottom"},{"name":"high top"}]},{"dna":"140000","rarity":"ORIGINAL","name":"#7","description":"This is an NFT made by the coolest generative code.","image":"https://hashlips/nft/7","edition":7,"date":1630062404211,"attributes":[{"name":"red eye ball"},{"name":"yellow big"},{"name":"large"},{"name":"shapes"},{"name":"high bottom"},{"name":"high top"}]},{"dna":"230000","rarity":"ORIGINAL","name":"#8","description":"This is an NFT made by the coolest generative code.","image":"https://hashlips/nft/8","edition":8,"date":1630062404553,"attributes":[{"name":"white eye ball"},{"name":"green small"},{"name":"large"},{"name":"shapes"},{"name":"high bottom"},{"name":"high top"}]},{"dna":"150000","rarity":"ORIGINAL","name":"#9","description":"This is an NFT made by the coolest generative code.","image":"https://hashlips/nft/9","edition":9,"date":1630062404938,"attributes":[{"name":"red eye ball"},{"name":"yellow small"},{"name":"large"},{"name":"shapes"},{"name":"high bottom"},{"name":"high top"}]},{"dna":"050000","rarity":"ORIGINAL","name":"#10","description":"This is an NFT made by the coolest generative code.","image":"https://hashlips/nft/10","edition":10,"date":1630062405268,"attributes":[{"name":"grey eye ball"},{"name":"yellow small"},{"name":"large"},{"name":"shapes"},{"name":"high bottom"},{"name":"high top"}]}] -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "art_generator", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Daniel Eugene Botha", 10 | "license": "ISC", 11 | "dependencies": { 12 | "all": "^0.0.0", 13 | "canvas": "^2.8.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@mapbox/node-pre-gyp@^1.0.0": 6 | version "1.0.5" 7 | resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz#2a0b32fcb416fb3f2250fd24cb2a81421a4f5950" 8 | integrity sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA== 9 | dependencies: 10 | detect-libc "^1.0.3" 11 | https-proxy-agent "^5.0.0" 12 | make-dir "^3.1.0" 13 | node-fetch "^2.6.1" 14 | nopt "^5.0.0" 15 | npmlog "^4.1.2" 16 | rimraf "^3.0.2" 17 | semver "^7.3.4" 18 | tar "^6.1.0" 19 | 20 | abbrev@1: 21 | version "1.1.1" 22 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 23 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 24 | 25 | agent-base@6: 26 | version "6.0.2" 27 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" 28 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 29 | dependencies: 30 | debug "4" 31 | 32 | all@^0.0.0: 33 | version "0.0.0" 34 | resolved "https://registry.yarnpkg.com/all/-/all-0.0.0.tgz#fb2aa75d4759d40e39ecbb118fabf0cc11ff554f" 35 | integrity sha1-+yqnXUdZ1A457LsRj6vwzBH/VU8= 36 | 37 | ansi-regex@^2.0.0: 38 | version "2.1.1" 39 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 40 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 41 | 42 | ansi-regex@^3.0.0: 43 | version "3.0.0" 44 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 45 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 46 | 47 | aproba@^1.0.3: 48 | version "1.2.0" 49 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 50 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 51 | 52 | are-we-there-yet@~1.1.2: 53 | version "1.1.5" 54 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 55 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 56 | dependencies: 57 | delegates "^1.0.0" 58 | readable-stream "^2.0.6" 59 | 60 | balanced-match@^1.0.0: 61 | version "1.0.2" 62 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 63 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 64 | 65 | brace-expansion@^1.1.7: 66 | version "1.1.11" 67 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 68 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 69 | dependencies: 70 | balanced-match "^1.0.0" 71 | concat-map "0.0.1" 72 | 73 | canvas@^2.8.0: 74 | version "2.8.0" 75 | resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.8.0.tgz#f99ca7f25e6e26686661ffa4fec1239bbef74461" 76 | integrity sha512-gLTi17X8WY9Cf5GZ2Yns8T5lfBOcGgFehDFb+JQwDqdOoBOcECS9ZWMEAqMSVcMYwXD659J8NyzjRY/2aE+C2Q== 77 | dependencies: 78 | "@mapbox/node-pre-gyp" "^1.0.0" 79 | nan "^2.14.0" 80 | simple-get "^3.0.3" 81 | 82 | chownr@^2.0.0: 83 | version "2.0.0" 84 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" 85 | integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== 86 | 87 | code-point-at@^1.0.0: 88 | version "1.1.0" 89 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 90 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 91 | 92 | concat-map@0.0.1: 93 | version "0.0.1" 94 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 95 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 96 | 97 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 98 | version "1.1.0" 99 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 100 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 101 | 102 | core-util-is@~1.0.0: 103 | version "1.0.2" 104 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 105 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 106 | 107 | debug@4: 108 | version "4.3.2" 109 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" 110 | integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== 111 | dependencies: 112 | ms "2.1.2" 113 | 114 | decompress-response@^4.2.0: 115 | version "4.2.1" 116 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" 117 | integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== 118 | dependencies: 119 | mimic-response "^2.0.0" 120 | 121 | delegates@^1.0.0: 122 | version "1.0.0" 123 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 124 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 125 | 126 | detect-libc@^1.0.3: 127 | version "1.0.3" 128 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 129 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 130 | 131 | fs-minipass@^2.0.0: 132 | version "2.1.0" 133 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" 134 | integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== 135 | dependencies: 136 | minipass "^3.0.0" 137 | 138 | fs.realpath@^1.0.0: 139 | version "1.0.0" 140 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 141 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 142 | 143 | gauge@~2.7.3: 144 | version "2.7.4" 145 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 146 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 147 | dependencies: 148 | aproba "^1.0.3" 149 | console-control-strings "^1.0.0" 150 | has-unicode "^2.0.0" 151 | object-assign "^4.1.0" 152 | signal-exit "^3.0.0" 153 | string-width "^1.0.1" 154 | strip-ansi "^3.0.1" 155 | wide-align "^1.1.0" 156 | 157 | glob@^7.1.3: 158 | version "7.1.7" 159 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" 160 | integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== 161 | dependencies: 162 | fs.realpath "^1.0.0" 163 | inflight "^1.0.4" 164 | inherits "2" 165 | minimatch "^3.0.4" 166 | once "^1.3.0" 167 | path-is-absolute "^1.0.0" 168 | 169 | has-unicode@^2.0.0: 170 | version "2.0.1" 171 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 172 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 173 | 174 | https-proxy-agent@^5.0.0: 175 | version "5.0.0" 176 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" 177 | integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== 178 | dependencies: 179 | agent-base "6" 180 | debug "4" 181 | 182 | inflight@^1.0.4: 183 | version "1.0.6" 184 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 185 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 186 | dependencies: 187 | once "^1.3.0" 188 | wrappy "1" 189 | 190 | inherits@2, inherits@~2.0.3: 191 | version "2.0.4" 192 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 193 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 194 | 195 | is-fullwidth-code-point@^1.0.0: 196 | version "1.0.0" 197 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 198 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 199 | dependencies: 200 | number-is-nan "^1.0.0" 201 | 202 | is-fullwidth-code-point@^2.0.0: 203 | version "2.0.0" 204 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 205 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 206 | 207 | isarray@~1.0.0: 208 | version "1.0.0" 209 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 210 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 211 | 212 | lru-cache@^6.0.0: 213 | version "6.0.0" 214 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 215 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 216 | dependencies: 217 | yallist "^4.0.0" 218 | 219 | make-dir@^3.1.0: 220 | version "3.1.0" 221 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 222 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 223 | dependencies: 224 | semver "^6.0.0" 225 | 226 | mimic-response@^2.0.0: 227 | version "2.1.0" 228 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" 229 | integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== 230 | 231 | minimatch@^3.0.4: 232 | version "3.0.4" 233 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 234 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 235 | dependencies: 236 | brace-expansion "^1.1.7" 237 | 238 | minipass@^3.0.0: 239 | version "3.1.3" 240 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" 241 | integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== 242 | dependencies: 243 | yallist "^4.0.0" 244 | 245 | minizlib@^2.1.1: 246 | version "2.1.2" 247 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" 248 | integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== 249 | dependencies: 250 | minipass "^3.0.0" 251 | yallist "^4.0.0" 252 | 253 | mkdirp@^1.0.3: 254 | version "1.0.4" 255 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 256 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 257 | 258 | ms@2.1.2: 259 | version "2.1.2" 260 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 261 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 262 | 263 | nan@^2.14.0: 264 | version "2.15.0" 265 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" 266 | integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== 267 | 268 | node-fetch@^2.6.1: 269 | version "2.6.1" 270 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" 271 | integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 272 | 273 | nopt@^5.0.0: 274 | version "5.0.0" 275 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" 276 | integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== 277 | dependencies: 278 | abbrev "1" 279 | 280 | npmlog@^4.1.2: 281 | version "4.1.2" 282 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 283 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 284 | dependencies: 285 | are-we-there-yet "~1.1.2" 286 | console-control-strings "~1.1.0" 287 | gauge "~2.7.3" 288 | set-blocking "~2.0.0" 289 | 290 | number-is-nan@^1.0.0: 291 | version "1.0.1" 292 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 293 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 294 | 295 | object-assign@^4.1.0: 296 | version "4.1.1" 297 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 298 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 299 | 300 | once@^1.3.0, once@^1.3.1: 301 | version "1.4.0" 302 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 303 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 304 | dependencies: 305 | wrappy "1" 306 | 307 | path-is-absolute@^1.0.0: 308 | version "1.0.1" 309 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 310 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 311 | 312 | process-nextick-args@~2.0.0: 313 | version "2.0.1" 314 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 315 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 316 | 317 | readable-stream@^2.0.6: 318 | version "2.3.7" 319 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 320 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 321 | dependencies: 322 | core-util-is "~1.0.0" 323 | inherits "~2.0.3" 324 | isarray "~1.0.0" 325 | process-nextick-args "~2.0.0" 326 | safe-buffer "~5.1.1" 327 | string_decoder "~1.1.1" 328 | util-deprecate "~1.0.1" 329 | 330 | rimraf@^3.0.2: 331 | version "3.0.2" 332 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 333 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 334 | dependencies: 335 | glob "^7.1.3" 336 | 337 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 338 | version "5.1.2" 339 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 340 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 341 | 342 | semver@^6.0.0: 343 | version "6.3.0" 344 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 345 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 346 | 347 | semver@^7.3.4: 348 | version "7.3.5" 349 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" 350 | integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== 351 | dependencies: 352 | lru-cache "^6.0.0" 353 | 354 | set-blocking@~2.0.0: 355 | version "2.0.0" 356 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 357 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 358 | 359 | signal-exit@^3.0.0: 360 | version "3.0.3" 361 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 362 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 363 | 364 | simple-concat@^1.0.0: 365 | version "1.0.1" 366 | resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" 367 | integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== 368 | 369 | simple-get@^3.0.3: 370 | version "3.1.0" 371 | resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" 372 | integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== 373 | dependencies: 374 | decompress-response "^4.2.0" 375 | once "^1.3.1" 376 | simple-concat "^1.0.0" 377 | 378 | string-width@^1.0.1: 379 | version "1.0.2" 380 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 381 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 382 | dependencies: 383 | code-point-at "^1.0.0" 384 | is-fullwidth-code-point "^1.0.0" 385 | strip-ansi "^3.0.0" 386 | 387 | "string-width@^1.0.2 || 2": 388 | version "2.1.1" 389 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 390 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 391 | dependencies: 392 | is-fullwidth-code-point "^2.0.0" 393 | strip-ansi "^4.0.0" 394 | 395 | string_decoder@~1.1.1: 396 | version "1.1.1" 397 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 398 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 399 | dependencies: 400 | safe-buffer "~5.1.0" 401 | 402 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 403 | version "3.0.1" 404 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 405 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 406 | dependencies: 407 | ansi-regex "^2.0.0" 408 | 409 | strip-ansi@^4.0.0: 410 | version "4.0.0" 411 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 412 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 413 | dependencies: 414 | ansi-regex "^3.0.0" 415 | 416 | tar@^6.1.0: 417 | version "6.1.11" 418 | resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" 419 | integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== 420 | dependencies: 421 | chownr "^2.0.0" 422 | fs-minipass "^2.0.0" 423 | minipass "^3.0.0" 424 | minizlib "^2.1.1" 425 | mkdirp "^1.0.3" 426 | yallist "^4.0.0" 427 | 428 | util-deprecate@~1.0.1: 429 | version "1.0.2" 430 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 431 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 432 | 433 | wide-align@^1.1.0: 434 | version "1.1.3" 435 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 436 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 437 | dependencies: 438 | string-width "^1.0.2 || 2" 439 | 440 | wrappy@1: 441 | version "1.0.2" 442 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 443 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 444 | 445 | yallist@^4.0.0: 446 | version "4.0.0" 447 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 448 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 449 | --------------------------------------------------------------------------------