mirror of
https://github.com/stronk-dev/RandomChad.git
synced 2025-07-06 10:55:10 +02:00
Added config file and cleanup
This commit is contained in:
parent
8717eefd21
commit
603aa7c5b2
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,3 +4,4 @@ build/
|
|||||||
notes.txt
|
notes.txt
|
||||||
output
|
output
|
||||||
converted
|
converted
|
||||||
|
package-lock.json
|
48
config/default.json
Normal file
48
config/default.json
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"control": {
|
||||||
|
"iterations": 500,
|
||||||
|
"threads": 1,
|
||||||
|
"minId": 1,
|
||||||
|
"maxId": 999998,
|
||||||
|
"path": "./output/"
|
||||||
|
},
|
||||||
|
"generate": {
|
||||||
|
"helmet": {
|
||||||
|
"classic": 0.2,
|
||||||
|
"racer": 0.1,
|
||||||
|
"punk": 0.1,
|
||||||
|
"knight": 0.2,
|
||||||
|
"geek": 0.2
|
||||||
|
},
|
||||||
|
"patch": {
|
||||||
|
"livepeer": 0.2,
|
||||||
|
"nimbus": 0.1,
|
||||||
|
"teku": 0.1,
|
||||||
|
"lighthouse": 0.1,
|
||||||
|
"prysm": 0.2,
|
||||||
|
"rocketpool": 0.3
|
||||||
|
},
|
||||||
|
"backpack": {
|
||||||
|
"yes": 0.9,
|
||||||
|
"no": 0.1
|
||||||
|
},
|
||||||
|
"panel": {
|
||||||
|
"yes": 0.9,
|
||||||
|
"no": 0.1
|
||||||
|
},
|
||||||
|
"background": {
|
||||||
|
"planets": 0.2,
|
||||||
|
"system": 0.2,
|
||||||
|
"playful": 0.1,
|
||||||
|
"moon": 0.05,
|
||||||
|
"galaxy": 0.2,
|
||||||
|
"chip": 0.05
|
||||||
|
},
|
||||||
|
"backgroundComplexity": {
|
||||||
|
"complex": 0.1,
|
||||||
|
"med": 0.15,
|
||||||
|
"low": 0.25,
|
||||||
|
"basic": 0.50
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +1,9 @@
|
|||||||
import os
|
import os
|
||||||
import cairosvg
|
import cairosvg
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
# Create path
|
||||||
Path("./converted/").mkdir(parents=True, exist_ok=True)
|
Path("./converted/").mkdir(parents=True, exist_ok=True)
|
||||||
|
# Convert all .svg's in the ./output folder to ./converted/ as .png
|
||||||
for file in os.listdir('./output'):
|
for file in os.listdir('./output'):
|
||||||
name = file.split('.svg')[0]
|
name = file.split('.svg')[0]
|
||||||
print('Converting ' + './output/' + name + '.svg' + ' -> ./converted/' + name + '.png')
|
print('Converting ' + './output/' + name + '.svg' + ' -> ./converted/' + name + '.png')
|
||||||
|
21
index.js
21
index.js
@ -1,11 +1,26 @@
|
|||||||
|
const config = require('config');
|
||||||
|
const iterations = config.get('control.iterations');
|
||||||
|
const threads = config.get('control.threads');
|
||||||
|
const minId = config.get('control.minId');
|
||||||
|
const maxId = config.get('control.maxId');
|
||||||
|
const basePath = config.get('control.path');
|
||||||
const { generateRocketeer } = require("./nft-media/rocketeer");
|
const { generateRocketeer } = require("./nft-media/rocketeer");
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
try {
|
try {
|
||||||
while (true) {
|
// Sanity check on config variables
|
||||||
const id = Math.floor(Math.random() * (999998) + 1)
|
let todo = iterations;
|
||||||
|
if (isNaN(todo)){
|
||||||
|
console.log("Cannot create `" + todo + "' amount Captain Chads");
|
||||||
|
return;
|
||||||
|
}else if (todo < 1){todo = 1;}
|
||||||
|
if (minId >= maxId){return;}
|
||||||
|
// Generate new Captain Chad's
|
||||||
|
while (todo) {
|
||||||
|
const id = Math.floor(Math.random() * (maxId) + minId)
|
||||||
console.log("Generating Cpn Chad " + id);
|
console.log("Generating Cpn Chad " + id);
|
||||||
console.log(await generateRocketeer(id));
|
console.log(await generateRocketeer(id, basePath));
|
||||||
|
todo--;
|
||||||
}
|
}
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -1,16 +1,5 @@
|
|||||||
// ///////////////////////////////
|
const config = require("config");
|
||||||
// Helper functions
|
const parameters = config.get("generate");
|
||||||
// ///////////////////////////////
|
|
||||||
exports.dev = !!process.env.development;
|
|
||||||
const log = (...messages) => {
|
|
||||||
if (process.env.development) console.log(...messages);
|
|
||||||
};
|
|
||||||
exports.log = log;
|
|
||||||
|
|
||||||
// Wait in async
|
|
||||||
const wait = (timeInMs) =>
|
|
||||||
new Promise((resolve) => setTimeout(resolve), timeInMs);
|
|
||||||
exports.wait = wait;
|
|
||||||
|
|
||||||
// Pick random item from an array
|
// Pick random item from an array
|
||||||
const pickRandomArrayEntry = (array) =>
|
const pickRandomArrayEntry = (array) =>
|
||||||
@ -50,91 +39,61 @@ exports.pickRandomAttributes = (attributes) => {
|
|||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
const nameColor = require("color-namer");
|
// Define all Captain Chad attributes
|
||||||
const Color = require("color");
|
|
||||||
exports.getColorName = (rgb) => {
|
|
||||||
try {
|
|
||||||
return nameColor(rgb).basic[0].name;
|
|
||||||
} catch (e) {
|
|
||||||
return rgb;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
exports.getRgbArrayFromColorName = (name) => {
|
|
||||||
const { hex } = nameColor(name).basic[0];
|
|
||||||
const color = Color(hex);
|
|
||||||
return color.rgb().array();
|
|
||||||
};
|
|
||||||
|
|
||||||
// ///////////////////////////////
|
|
||||||
// Attribute sources
|
|
||||||
// ///////////////////////////////
|
|
||||||
exports.globalAttributes = [
|
exports.globalAttributes = [
|
||||||
{
|
{
|
||||||
trait_type: "helmet",
|
trait_type: "helmet",
|
||||||
values: [
|
values: [
|
||||||
{ value: "classic", probability: 0.2 },
|
{ value: "classic", probability: parameters.helmet.classic },
|
||||||
{ value: "racer", probability: 0.1 },
|
{ value: "racer", probability: parameters.helmet.racer },
|
||||||
{ value: "punk", probability: 0.1 },
|
{ value: "punk", probability: parameters.helmet.punk },
|
||||||
{ value: "knight", probability: 0.2 },
|
{ value: "knight", probability: parameters.helmet.knight },
|
||||||
{ value: "geek", probability: 0.2 },
|
{ value: "geek", probability: parameters.helmet.geek },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
trait_type: "patch",
|
trait_type: "patch",
|
||||||
values: [
|
values: [
|
||||||
{ value: "livepeer", probability: 0.2 },
|
{ value: "livepeer", probability: parameters.patch.livepeer },
|
||||||
{ value: "nimbus", probability: 0.1 },
|
{ value: "nimbus", probability: parameters.patch.livepeer },
|
||||||
{ value: "teku", probability: 0.1 },
|
{ value: "teku", probability: parameters.patch.livepeer },
|
||||||
{ value: "lighthouse", probability: 0.1 },
|
{ value: "lighthouse", probability: parameters.patch.livepeer },
|
||||||
{ value: "prysm", probability: 0.2 },
|
{ value: "prysm", probability: parameters.patch.livepeer },
|
||||||
{ value: "rocketpool", probability: 0.3 },
|
{ value: "rocketpool", probability: parameters.patch.livepeer },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
trait_type: "backpack",
|
trait_type: "backpack",
|
||||||
values: [
|
values: [
|
||||||
{ value: "yes", probability: 0.9 },
|
{ value: "yes", probability: parameters.backpack.yes },
|
||||||
{ value: "no", probability: 0.1 },
|
{ value: "no", probability: parameters.backpack.no },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
trait_type: "panel",
|
trait_type: "panel",
|
||||||
values: [
|
values: [
|
||||||
{ value: "yes", probability: 0.9 },
|
{ value: "yes", probability: parameters.panel.yes },
|
||||||
{ value: "no", probability: 0.1 },
|
{ value: "no", probability: parameters.panel.no },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
trait_type: "background",
|
trait_type: "background",
|
||||||
values: [
|
values: [
|
||||||
{ value: "planets", probability: 0.2 },
|
{ value: "planets", probability: parameters.background.planets },
|
||||||
{ value: "system", probability: 0.2 },
|
{ value: "system", probability: parameters.background.system },
|
||||||
{ value: "playful", probability: 0.1 },
|
{ value: "playful", probability: parameters.background.playful },
|
||||||
{ value: "moon", probability: 0.05 },
|
{ value: "moon", probability: parameters.background.moon },
|
||||||
{ value: "galaxy", probability: 0.2 },
|
{ value: "galaxy", probability: parameters.background.galaxy },
|
||||||
{ value: "chip", probability: 0.05 },
|
{ value: "chip", probability: parameters.background.chip },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
trait_type: "background complexity",
|
trait_type: "background complexity",
|
||||||
values: [
|
values: [
|
||||||
{ value: 1, probability: 0.05 },
|
{ value: 1, probability: parameters.backgroundComplexity.complex },
|
||||||
{ value: 2, probability: 0.1 },
|
{ value: 2, probability: parameters.backgroundComplexity.med },
|
||||||
{ value: 3, probability: 0.1 },
|
{ value: 3, probability: parameters.backgroundComplexity.low },
|
||||||
{ value: 4, probability: 0.75 },
|
{ value: 4, probability: parameters.backgroundComplexity.basic },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
exports.heavenlyBodies = [
|
|
||||||
"Mercury",
|
|
||||||
"Venus",
|
|
||||||
"Earth",
|
|
||||||
"Mars",
|
|
||||||
"Jupiter",
|
|
||||||
"Saturn",
|
|
||||||
"Uranus",
|
|
||||||
"Neptune",
|
|
||||||
"Pluto",
|
|
||||||
"the Moon",
|
|
||||||
"the Sun",
|
|
||||||
];
|
|
||||||
|
@ -1,44 +1,19 @@
|
|||||||
const name = require("random-name");
|
|
||||||
const {
|
const {
|
||||||
pickRandomArrayEntry,
|
|
||||||
pickRandomAttributes,
|
pickRandomAttributes,
|
||||||
randomNumberBetween,
|
randomNumberBetween,
|
||||||
globalAttributes,
|
globalAttributes
|
||||||
heavenlyBodies,
|
|
||||||
getColorName,
|
|
||||||
} = require("../modules/helpers");
|
} = require("../modules/helpers");
|
||||||
const svgFromAttributes = require("./svg-generator");
|
const svgFromAttributes = require("./svg-generator");
|
||||||
|
|
||||||
// ///////////////////////////////
|
// Generates a random Chad names as basePath/id.svg
|
||||||
// Rocketeer generator
|
async function generateRocketeer(id, basePath) {
|
||||||
// ///////////////////////////////
|
|
||||||
async function generateRocketeer(id) {
|
|
||||||
// The base object of a new Rocketeer
|
|
||||||
const rocketeer = {
|
const rocketeer = {
|
||||||
name: `${name.first()} ${name.middle()} ${name.last()} of ${
|
|
||||||
id % 42 == 0 ? "the Towel" : pickRandomArrayEntry(heavenlyBodies)
|
|
||||||
}`,
|
|
||||||
description: "",
|
|
||||||
image: ``,
|
image: ``,
|
||||||
attributes: [],
|
attributes: [],
|
||||||
};
|
};
|
||||||
|
// Pick random attributes based on configured probabilities
|
||||||
// Generate randomized attributes
|
|
||||||
rocketeer.attributes = pickRandomAttributes(globalAttributes);
|
rocketeer.attributes = pickRandomAttributes(globalAttributes);
|
||||||
|
// Randomize colours
|
||||||
// Set birthday
|
|
||||||
rocketeer.attributes.push({
|
|
||||||
display_type: "date",
|
|
||||||
trait_type: "birthday",
|
|
||||||
value: Math.floor(Date.now() / 1000),
|
|
||||||
});
|
|
||||||
|
|
||||||
// Create description
|
|
||||||
rocketeer.description = `${rocketeer.name} is a proud member of the ${
|
|
||||||
rocketeer.attributes.find(({ trait_type }) => trait_type == "patch").value
|
|
||||||
} guild.`;
|
|
||||||
|
|
||||||
// Generate color attributes
|
|
||||||
rocketeer.attributes.push({
|
rocketeer.attributes.push({
|
||||||
trait_type: "outfit color",
|
trait_type: "outfit color",
|
||||||
value: `rgb( ${randomNumberBetween(0, 255)}, ${randomNumberBetween(
|
value: `rgb( ${randomNumberBetween(0, 255)}, ${randomNumberBetween(
|
||||||
@ -67,27 +42,10 @@ async function generateRocketeer(id) {
|
|||||||
255
|
255
|
||||||
)}, ${randomNumberBetween(0, 255)} )`,
|
)}, ${randomNumberBetween(0, 255)} )`,
|
||||||
});
|
});
|
||||||
|
// Generate SVG
|
||||||
// Generate, compile and upload image
|
let path = basePath + id;
|
||||||
const { NODE_ENV: mode } = process.env;
|
|
||||||
let path = "./output/" + id;
|
|
||||||
// if (mode == "production") {
|
|
||||||
// path = "/var/www/avatars/" + id;
|
|
||||||
// } else {
|
|
||||||
// path = "./output/" + id;
|
|
||||||
// }
|
|
||||||
rocketeer.image = await svgFromAttributes(rocketeer.attributes, path);
|
rocketeer.image = await svgFromAttributes(rocketeer.attributes, path);
|
||||||
|
return "@" + rocketeer.image;
|
||||||
// Namify the attributes
|
|
||||||
rocketeer.attributes = rocketeer.attributes.map((attribute) => {
|
|
||||||
if (!attribute.trait_type.includes("color")) return attribute;
|
|
||||||
return {
|
|
||||||
...attribute,
|
|
||||||
value: getColorName(attribute.value),
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
return rocketeer.name + ": `" + rocketeer.description + "' @ " + rocketeer.image;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
@ -9,9 +9,7 @@ module.exports = async function svgFromAttributes(attributes = [], path = "") {
|
|||||||
if (!attributes.length)
|
if (!attributes.length)
|
||||||
throw new Error("svgFromAttributes missing attributes");
|
throw new Error("svgFromAttributes missing attributes");
|
||||||
|
|
||||||
console.log("Checking attributes");
|
console.log("Getting attributes...");
|
||||||
|
|
||||||
// Get properties
|
|
||||||
const { value: primary_color } = attributes.find(
|
const { value: primary_color } = attributes.find(
|
||||||
({ trait_type }) => trait_type == "outfit color"
|
({ trait_type }) => trait_type == "outfit color"
|
||||||
);
|
);
|
||||||
@ -43,20 +41,15 @@ module.exports = async function svgFromAttributes(attributes = [], path = "") {
|
|||||||
({ trait_type }) => trait_type == "background complexity"
|
({ trait_type }) => trait_type == "background complexity"
|
||||||
);
|
);
|
||||||
|
|
||||||
console.log("Reading master file");
|
console.log("Reading master file...");
|
||||||
|
|
||||||
// Generate DOM to work with
|
// Generate DOM to work with
|
||||||
const svgString = await fs.readFile(masterPath, { encoding: "utf8" });
|
const svgString = await fs.readFile(masterPath, { encoding: "utf8" });
|
||||||
const {
|
const {
|
||||||
window: { document },
|
window: { document },
|
||||||
} = new JSDOM(svgString);
|
} = new JSDOM(svgString);
|
||||||
|
|
||||||
// ///////////////////////////////
|
|
||||||
// Attribute selection
|
|
||||||
// ///////////////////////////////
|
|
||||||
console.log("Removing unused attributes from master");
|
console.log("Removing unused attributes from master");
|
||||||
|
// Remove unused patches
|
||||||
// Remove obsolete patches
|
|
||||||
const obsoletePatches = [
|
const obsoletePatches = [
|
||||||
"livepeer",
|
"livepeer",
|
||||||
"nimbus",
|
"nimbus",
|
||||||
@ -71,7 +64,7 @@ module.exports = async function svgFromAttributes(attributes = [], path = "") {
|
|||||||
else console.log(`Could not find #${obsoletePatches[i]}`);
|
else console.log(`Could not find #${obsoletePatches[i]}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove obsolete hemets
|
// Remove unused helmets
|
||||||
const obsoleteHelmets = ["classic", "racer", "punk", "knight", "geek"].filter(
|
const obsoleteHelmets = ["classic", "racer", "punk", "knight", "geek"].filter(
|
||||||
(p) => p !== helmet
|
(p) => p !== helmet
|
||||||
);
|
);
|
||||||
@ -88,21 +81,21 @@ module.exports = async function svgFromAttributes(attributes = [], path = "") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove panel if need be
|
// Remove unused panels
|
||||||
if (panel === "no") {
|
if (panel === "no") {
|
||||||
const element = document.querySelector(`#panel`);
|
const element = document.querySelector(`#panel`);
|
||||||
if (element) element.remove();
|
if (element) element.remove();
|
||||||
else console.log(`Could not find #panel`);
|
else console.log(`Could not find #panel`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove backpack if need be
|
// Remove unused backpacks
|
||||||
if (backpack === "no") {
|
if (backpack === "no") {
|
||||||
const element = document.querySelector(`#backpack`);
|
const element = document.querySelector(`#backpack`);
|
||||||
if (element) element.remove();
|
if (element) element.remove();
|
||||||
else console.log("Could not find #backpack");
|
else console.log("Could not find #backpack");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove obsolete backgrounds
|
// Remove unused backgrounds
|
||||||
const obsoleteBackgrounds = [
|
const obsoleteBackgrounds = [
|
||||||
"planets",
|
"planets",
|
||||||
"system",
|
"system",
|
||||||
@ -117,11 +110,7 @@ module.exports = async function svgFromAttributes(attributes = [], path = "") {
|
|||||||
else console.log(`Could not find #${obsoleteBackgrounds[i]}`);
|
else console.log(`Could not find #${obsoleteBackgrounds[i]}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ///////////////////////////////
|
// With a playful background: more rarity->less complexity
|
||||||
// Background customisation
|
|
||||||
// ///////////////////////////////
|
|
||||||
|
|
||||||
// In playful, keeping things is basic, removing them is cool
|
|
||||||
if (background === "playful") {
|
if (background === "playful") {
|
||||||
const toRemove = background_complexity;
|
const toRemove = background_complexity;
|
||||||
for (let i = 1; i <= toRemove; i++) {
|
for (let i = 1; i <= toRemove; i++) {
|
||||||
@ -130,8 +119,7 @@ module.exports = async function svgFromAttributes(attributes = [], path = "") {
|
|||||||
else console.log(`Could not find #playful-element-${5 - i}`);
|
else console.log(`Could not find #playful-element-${5 - i}`);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// In others, keeping is cool, and removing is less cool
|
// With a playful background: more rarity->more complexity
|
||||||
// so higher rarity means less looping
|
|
||||||
const toRemove = 4 - background_complexity;
|
const toRemove = 4 - background_complexity;
|
||||||
for (let i = 1; i <= toRemove; i++) {
|
for (let i = 1; i <= toRemove; i++) {
|
||||||
const element = document.querySelector(`#${background}-element-${5 - i}`);
|
const element = document.querySelector(`#${background}-element-${5 - i}`);
|
||||||
@ -140,9 +128,7 @@ module.exports = async function svgFromAttributes(attributes = [], path = "") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ///////////////////////////////
|
// Substitute master colours for generated ones
|
||||||
// Color substitutions
|
|
||||||
// ///////////////////////////////
|
|
||||||
console.log("Substituting colours from master");
|
console.log("Substituting colours from master");
|
||||||
const defaultPrimary = /rgb\( ?252 ?, ?186 ?, ?157 ?\)/gi;
|
const defaultPrimary = /rgb\( ?252 ?, ?186 ?, ?157 ?\)/gi;
|
||||||
const defaultVisor = /rgb\( ?71 ?, ?22 ?, ?127 ?\)/gi;
|
const defaultVisor = /rgb\( ?71 ?, ?22 ?, ?127 ?\)/gi;
|
||||||
@ -159,18 +145,19 @@ module.exports = async function svgFromAttributes(attributes = [], path = "") {
|
|||||||
replace(defaultVisor, visor_color);
|
replace(defaultVisor, visor_color);
|
||||||
replace(defaultBackpack, backpack_color);
|
replace(defaultBackpack, backpack_color);
|
||||||
|
|
||||||
console.log("Baking SVG now...");
|
console.log("Generating SVG...");
|
||||||
const bakedSvg = [
|
const bakedSvg = [
|
||||||
`<?xml version="1.0" encoding="UTF-8" standalone="no"?>`,
|
`<?xml version="1.0" encoding="UTF-8" standalone="no"?>`,
|
||||||
`<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">`,
|
`<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">`,
|
||||||
document.querySelector("svg").outerHTML,
|
document.querySelector("svg").outerHTML,
|
||||||
].join("");
|
].join("");
|
||||||
|
|
||||||
|
// Write SVG to file
|
||||||
const dir = path.split('/').slice(0, -1).join('/');
|
const dir = path.split('/').slice(0, -1).join('/');
|
||||||
await fs.mkdir(dir, { recursive: true });
|
await fs.mkdir(dir, { recursive: true });
|
||||||
console.log("Writing to `" + path + ".svg`...");
|
console.log("Writing to `" + path + ".svg`...");
|
||||||
await fs.writeFile(`${path}.svg`, bakedSvg);
|
await fs.writeFile(`${path}.svg`, bakedSvg);
|
||||||
|
|
||||||
// Return public url
|
// Return output location
|
||||||
return "Paths: '" + `${path}.svg` + "'";
|
return `${path}.svg`;
|
||||||
};
|
};
|
||||||
|
1709
package-lock.json
generated
1709
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "RandomChad",
|
"name": "RandomChad",
|
||||||
"version": "0.1.0",
|
"version": "0.1.1",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"module": "index.js",
|
"module": "index.js",
|
||||||
@ -12,10 +12,8 @@
|
|||||||
"author": "",
|
"author": "",
|
||||||
"license": "",
|
"license": "",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"color": "^4.2.3",
|
"config": "^3.3.8",
|
||||||
"color-namer": "^1.4.0",
|
"jsdom": "^18.1.1"
|
||||||
"jsdom": "^18.1.1",
|
|
||||||
"random-name": "^0.1.2"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"nodemon": "^2.0.20"
|
"nodemon": "^2.0.20"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user