cleanup & updates

This commit is contained in:
cupcakearmy 2021-03-15 18:14:19 +01:00
parent 842e1ba94f
commit 170023f7bb
No known key found for this signature in database
GPG Key ID: D28129AE5654D9D9
21 changed files with 6589 additions and 183 deletions

12
.gitignore vendored
View File

@ -1,14 +1,10 @@
# Editors
# General
.vscode
.idea
# Node
node_modules/
package-lock.json
yarn.lock
# Build
lib
dist
build
.cache
src/*.js
.parcel-cache
.vercel

View File

@ -1,2 +0,0 @@
*
!lib/*

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2019 Nicco
Copyright (c) 2021 Niccolo Borgioli
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

39
demo/index.html Normal file
View File

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html>
<head>
<title>canihazusername</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="./main.css" />
</head>
<body>
<main class="w-100 h-100">
<div>
<h1 class="title is-2"><span>CAN</span>I<span>HAZ</span>USERNAME</h1>
<div class="content mt-6">
<h2>Demo</h2>
<input id="format" class="input is-rounded" type="text" placeholder="format" value="{character}_{english}" />
<button id="button" class="button is-link is-rounded my-2">👇 Generate 👇</button>
<input id="username" class="input is-rounded" type="text" placeholder="" readonly />
</div>
<div class="content mt-6">
<h2>Quickstart</h2>
<a target="blank" href="https://github.com/cupcakearmy/canihazusername">
<button id="button" class="button is-link is-rounded is-fullwidth mb-3">🔗 Github & Docs 🔗</button>
</a>
<pre>yarn add canihazusername</pre>
<pre>
import { generate } from 'canihazusername'
generate('{character}_{english}')</pre
>
</div>
<div class="content">
<h5 class="title is-5">Available lists</h5>
<p id="lists"></p>
</div>
</div>
</main>
<script src="./main.ts"></script>
</body>
</html>

View File

@ -2,23 +2,12 @@
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}
body {
width: 100vw;
height: 100vh;
}
#main {
main{
padding: 4rem 1rem;
text-align: center;
padding: 1em;
display: flex;
/* justify-content: center;
align-items: center; */
height: 100%;
width: 100%;
overflow: auto;
}
#main > div {
main > div {
width: 100%;
max-width: 35em;
margin: auto;
@ -31,5 +20,6 @@ pre {
}
h2 span{
color: #3273dc
color: #3273dc;
margin: 0 0.5rem;
}

View File

@ -7,7 +7,7 @@ const list = window.document.getElementById('lists')
const button = window.document.getElementById('button')
const calculate = () => {
output.value = generate(input.value)
output.value = generate(input.value)
}
// Init

View File

@ -1,3 +0,0 @@
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="main.0f857996.css"><link rel="stylesheet" href="main.b89d2493.css"></head><body> <div id="main" class="w-100 h-100"> <div> <h2 class="title is-2"><span>can</span>i<span>haz</span>username</h2> <input id="format" class="input is-rounded" type="text" placeholder="format" value="{character}_{english}"> <br><br> <button id="button" class="button is-link is-rounded">👇 Generate 👇</button> <br><br> <input id="username" class="input is-rounded" type="text" placeholder="" readonly=""> <br><br> <div class="content"> <a target="blank" href="https://github.com/cupcakearmy/canihazusername"> <button id="button" class="button is-link is-rounded">🔗 Github & Docs 🔗</button> </a> <br><br> <pre>yarn add canihazusername</pre> <pre>import { generate } from 'canihazusername'
generate('{character}_{english}')</pre> </div> <div class="content"> <h5 class="title is-5">Available lists</h5> <p id="lists"></p> </div> </div> </div> <script src="main.d216365b.js"></script>
</body></html>

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

View File

@ -1 +0,0 @@
<?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"><svg width="100%" height="100%" viewBox="0 0 842 596" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><rect x="0" y="0" width="841.89" height="595.276" style="fill:#f0ffe9;"/><clipPath id="_clip1"><rect x="228.006" y="41.638" width="385.877" height="385.877"/></clipPath><g clip-path="url(#_clip1)"><g><path d="M401.651,192.773l-115.763,0c-7.101,0.006 -12.855,5.761 -12.863,12.863l-6.431,0c-7.101,0.006 -12.855,5.761 -12.863,12.862l0,12.863c0.007,7.101 5.762,12.855 12.863,12.863l6.431,0l0,38.587l-6.431,0c-7.101,0.007 -12.855,5.762 -12.863,12.863l0,12.863c0.007,7.101 5.762,12.855 12.863,12.862l6.431,0c0.007,7.101 5.762,12.856 12.863,12.863l115.763,0c7.101,-0.007 12.855,-5.762 12.863,-12.863l0,-115.763c-0.008,-7.102 -5.762,-12.856 -12.863,-12.863Zm-128.626,115.763l-6.431,0l0,-12.863l6.431,0l0,12.863Zm0,-77.176l-6.431,0l0,-12.862l6.431,0l0,12.862Zm12.863,90.039l0,-115.763l115.763,0l0.009,115.763l-115.772,0Z" style="fill-rule:nonzero;"/><path d="M330.907,276.38l-25.725,0c-3.552,0 -6.431,2.879 -6.431,6.431c0,3.552 2.879,6.431 6.431,6.431l25.725,0c3.552,0 6.431,-2.879 6.431,-6.431c0,-3.552 -2.879,-6.431 -6.431,-6.431Z" style="fill-rule:nonzero;"/><path d="M330.907,295.674l-25.725,0c-3.552,0 -6.431,2.879 -6.431,6.431c0,3.552 2.879,6.431 6.431,6.431l25.725,0c3.552,0 6.431,-2.88 6.431,-6.431c0,-3.552 -2.879,-6.431 -6.431,-6.431Z" style="fill-rule:nonzero;"/><path d="M382.357,250.654c-3.552,0 -6.431,2.88 -6.431,6.431l0,12.863c0,3.552 2.879,6.431 6.431,6.431c3.552,0 6.431,-2.879 6.431,-6.431l0,-12.863c0,-3.551 -2.879,-6.431 -6.431,-6.431Z" style="fill-rule:nonzero;"/><path d="M536.708,179.911l-96.469,0c-7.101,0.006 -12.856,5.761 -12.863,12.862l0,51.45c0.007,7.101 5.762,12.855 12.863,12.863l96.469,0c7.101,-0.007 12.855,-5.762 12.863,-12.863l0,-51.45c-0.008,-7.101 -5.762,-12.856 -12.863,-12.862Zm-96.469,64.312l0,-51.45l96.469,0l0.009,51.45l-96.478,0Z" style="fill-rule:nonzero;"/><path d="M536.708,269.948l-96.469,0c-7.101,0.007 -12.856,5.762 -12.863,12.863l0,51.45c0.007,7.101 5.762,12.856 12.863,12.863l96.469,0c7.101,-0.007 12.855,-5.762 12.863,-12.863l0,-51.45c-0.008,-7.101 -5.762,-12.855 -12.863,-12.863Zm-96.469,64.313l0,-51.45l96.469,0l0.009,51.45l-96.478,0Z" style="fill-rule:nonzero;"/><path d="M498.12,295.674l-19.294,0c-3.552,0 -6.431,2.879 -6.431,6.431c0,3.552 2.88,6.431 6.431,6.431l19.294,0c3.552,0 6.431,-2.88 6.431,-6.431c0,-3.552 -2.879,-6.431 -6.431,-6.431Z" style="fill-rule:nonzero;"/><path d="M607.452,392.143l-45.018,0l0,-19.294c7.101,-0.007 12.855,-5.762 12.862,-12.863l0,-218.663l19.294,0c3.065,0 5.705,-2.163 6.306,-5.169l12.863,-64.312c0.378,-1.89 -0.111,-3.849 -1.332,-5.339c-1.221,-1.49 -3.047,-2.355 -4.973,-2.355l-45.019,0c-31.952,0.037 -57.844,25.93 -57.881,57.882l0,32.157l-64.315,0l0,-12.863c-0.028,-24.852 -20.168,-44.991 -45.019,-45.019l-6.431,0c0,-3.552 -2.88,-6.431 -6.431,-6.431l-77.176,0c-3.552,0 -6.431,2.879 -6.431,6.431l-64.314,0c-3.552,-0.002 -6.431,2.878 -6.431,6.43l0,25.725c0,3.552 2.879,6.431 6.431,6.431l19.294,0l0,19.294l-12.862,0c-7.101,0.008 -12.856,5.762 -12.863,12.863l0,192.938c0.007,7.101 5.762,12.856 12.863,12.863l0,19.294l-6.432,0c-3.552,0 -6.431,2.879 -6.431,6.431c0,3.552 2.879,6.431 6.431,6.431l373.015,0c3.552,0 6.431,-2.88 6.431,-6.431c0,-3.552 -2.879,-6.431 -6.431,-6.431Zm-32.156,-315.133l24.311,0l-10.29,51.45l-14.021,0l0,-51.45Zm-57.882,45.019c0.028,-24.851 20.167,-44.991 45.019,-45.019l0,51.45l-45.019,0l0,-6.431Zm0,19.294l45.019,0l0,12.863l-45.019,0l0,-12.863Zm-128.626,-32.157l6.431,0c17.751,0.021 32.136,14.406 32.157,32.157l0,12.863l-38.588,0l0,-45.02Zm-77.175,-6.431l64.312,0l0,25.725l-64.312,0l0,-25.725Zm-6.431,38.588l70.744,0l0,12.863l-109.332,0l0,-19.294l32.157,0c0,3.551 2.879,6.431 6.431,6.431Zm-64.313,-19.294l0,-12.863l57.882,0l0,12.863l-57.882,0Zm0,45.019l321.565,0l0.009,192.938l-321.574,0l0,-192.938Zm308.702,225.095l-295.84,0l0,-19.294l295.839,0l0,19.294l0.001,0Z" style="fill-rule:nonzero;"/></g></g><g transform="matrix(0.24,0,0,0.24,-167.38,22.3541)"><text x="880.105px" y="2103.3px" style="font-family:'Moon2.0-Bold', 'Moon 2.0';font-size:416.667px;fill:#0006ff;">c<tspan x="1095.11px 1334.27px " y="2103.3px 2103.3px ">an</tspan></text><text x="1541.36px" y="2103.3px" style="font-family:'Moon2.0-Bold', 'Moon 2.0';font-size:416.667px;">i</text><text x="1618.44px" y="2103.3px" style="font-family:'Moon2.0-Bold', 'Moon 2.0';font-size:416.667px;fill:#0006ff;">haz</text><text x="2277.61px" y="2103.3px" style="font-family:'Moon2.0-Bold', 'Moon 2.0';font-size:416.667px;">username</text></g></svg>

Before

Width:  |  Height:  |  Size: 4.7 KiB

View File

@ -1 +0,0 @@
*{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}body{width:100vw;height:100vh}#main{text-align:center;padding:1em;display:flex;height:100%;width:100%;overflow:auto}#main>div{width:100%;max-width:35em;margin:auto}pre{text-align:left;padding:1em .5em;border-radius:1.5em}h2 span{color:#3273dc}

View File

@ -1 +0,0 @@
*{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}body{width:100vw;height:100vh}#main{text-align:center;padding:1em;display:flex;height:100%;width:100%;overflow:auto}#main>div{max-width:35em;margin:auto}pre{text-align:left;padding:1em .5em;border-radius:1.5em}h2 span{color:#3273dc}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,3 @@
/* jshint esversion: 8, asi: true */
const fs = require('fs')
const path = require('path')
const util = require('util')
@ -7,35 +5,36 @@ const util = require('util')
const endsWithTxt = /^.*\.txt$/
function walkDir(dir, callback) {
fs.readdirSync(dir).forEach(f => {
const dirPath = path.join(dir, f)
const isDirectory = fs.statSync(dirPath).isDirectory()
isDirectory
? walkDir(dirPath, callback)
: callback(path.join(dir, f))
})
fs.readdirSync(dir).forEach((f) => {
const dirPath = path.join(dir, f)
const isDirectory = fs.statSync(dirPath).isDirectory()
isDirectory ? walkDir(dirPath, callback) : callback(path.join(dir, f))
})
}
function convertAndSaveWordlistAsJSON() {
const wordlist = {}
const wordlist = {}
walkDir('./generate/wordlist', (filename) => {
// Not a txt file
if (!endsWithTxt.test(filename)) return
walkDir('./generate/wordlist', (filename) => {
// Not a txt file
if (!endsWithTxt.test(filename)) return
// Read the file
const file = fs.readFileSync(filename, 'utf-8')
// Read the file
const file = fs.readFileSync(filename, 'utf-8')
// Each line of the file to an array removing the empty lines
const lines = file.split('\n').filter(entry => entry !== '').map(entry => entry.trim())
// Each line of the file to an array removing the empty lines
const lines = file
.split('\n')
.filter((entry) => entry !== '')
.map((entry) => entry.trim())
// Remove duplicates
const set = new Set(lines)
const name = path.basename(filename, 'utf-8').slice(0, -4)
wordlist[name] = [...set]
})
// Remove duplicates
const set = new Set(lines)
const name = path.basename(filename, 'utf-8').slice(0, -4)
wordlist[name] = [...set]
})
fs.writeFileSync('./src/wordlist.json', JSON.stringify(wordlist))
fs.writeFileSync('./src/wordlist.json', JSON.stringify(wordlist))
}
convertAndSaveWordlistAsJSON()
convertAndSaveWordlistAsJSON()

View File

@ -2,12 +2,21 @@
"name": "canihazusername",
"version": "2.0.5",
"description": "username generator. typed, simple and customizable",
"main": "./lib/index.js",
"types": "./lib/index.d.ts",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"files": [
"./dist"
],
"targets": {
"docs": {
"distDir": "./build",
"context": "browser"
}
},
"scripts": {
"generate": "git -C ./generate/wordlist pull && node ./generate/wordlist.js",
"docs": "parcel build --no-source-maps --out-dir ./docs --public-url ./ ./website/index.html",
"docs:dev": "parcel ./website/index.html",
"generate": "git submodule update && node ./generate/wordlist.js",
"docs": "parcel build --target docs demo/index.html ",
"docs:dev": "parcel --target docs demo/index.html",
"prepublishOnly": "rm -rf ./lib && tsc"
},
"repository": {
@ -27,9 +36,9 @@
},
"homepage": "https://github.com/CupCakeArmy/canihazusername#readme",
"devDependencies": {
"bulma": "^0.8.0",
"parcel-bundler": "^1.12.4",
"ts-node-dev": "^1.0.0-pre.44",
"typescript": "3.7"
"bulma": "^0.9",
"parcel": "^2.0.0-nightly.626",
"ts-node-dev": "^1",
"typescript": "^4"
}
}

View File

@ -1,36 +1,41 @@
import wordlist from './wordlist.json'
const DEFAULT_OPTIONS = {
maxReformats: 16,
lists: {} as { [name: string]: string[] }
maxReformats: 16,
lists: {} as Record<string, string[]>,
}
const randomElementFromArray = <T>(arr: T[]): T => arr[Math.floor(Math.random() * arr.length)]
export const showAvailableLists = () => Object.keys(wordlist)
export const generate = (format: string = '{character}_{english}', options: Partial<typeof DEFAULT_OPTIONS> = {}): string => {
const opt: typeof DEFAULT_OPTIONS = Object.assign(DEFAULT_OPTIONS, options)
const combined = Object.assign(wordlist, options.lists)
for (let i = 0; i < opt.maxReformats; i++) {
const match = /\{.*?\}/.exec(format)
if (match === null) break
const keys = match[0]
.slice(1, -1)
.split('|')
.map(key => key.trim())
.filter(key => key !== '') as [keyof typeof combined]
const lists = keys.map(key => Array.isArray(combined[key]) ? combined[key] : [])
const flatteded = lists.reduce((acc, val) => acc.concat(val), []);
const value: string = flatteded.length > 0
? randomElementFromArray(flatteded)
: ''
format = format.replace(match[0], value)
}
return format
function randomElementFromArray<T>(arr: T[]): T {
return arr[Math.floor(Math.random() * arr.length)]
}
export default generate
export function showAvailableLists(): string[] {
return Object.keys(wordlist)
}
export function generate(
format: string = '{character}_{english}',
options: Partial<typeof DEFAULT_OPTIONS> = {}
): string {
const opt: typeof DEFAULT_OPTIONS = { ...DEFAULT_OPTIONS, ...options }
const combined = { ...wordlist, ...options.lists }
for (let i = 0; i < opt.maxReformats; i++) {
const match = /\{.*?\}/.exec(format)
if (match === null) break
const keys = match[0]
.slice(1, -1)
.split('|')
.map((key) => key.trim())
.filter((key) => key !== '') as [keyof typeof combined]
const lists = keys.map((key) => (Array.isArray(combined[key]) ? combined[key] : []))
const flattened = lists.reduce((acc, val) => acc.concat(val), [])
const value: string = flattened.length > 0 ? randomElementFromArray(flattened) : ''
format = format.replace(match[0], value)
}
return format
}
export default generate

View File

@ -1,30 +1,73 @@
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"declaration": true,
"declarationMap": false,
"sourceMap": false,
"outDir": "./lib",
"rootDir": "./src",
"removeComments": true,
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictBindCallApply": true,
"strictPropertyInitialization": true,
"noImplicitThis": true,
"alwaysStrict": true,
// "noUnusedLocals": true,
// "noUnusedParameters": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"forceConsistentCasingInFileNames": true
},
"include": [
"./src"
]
}
"compilerOptions": {
/* Visit https://aka.ms/tsconfig.json to read more about this file */
/* Basic Options */
// "incremental": true, /* Enable incremental compilation */
"target": "es2018" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */,
"module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
// "lib": [], /* Specify library files to be included in the compilation. */
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
"declaration": true /* Generates corresponding '.d.ts' file. */,
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
"outDir": "./dist" /* Redirect output structure to the directory. */,
"rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */,
// "composite": true, /* Enable project compilation */
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
// "removeComments": true, /* Do not emit comments to output. */
// "noEmit": true, /* Do not emit outputs. */
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
/* Strict Type-Checking Options */
"strict": true /* Enable all strict type-checking options. */,
"noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */,
"strictNullChecks": true /* Enable strict null checks. */,
"strictFunctionTypes": true /* Enable strict checking of function types. */,
"strictBindCallApply": true /* Enable strict 'bind', 'call', and 'apply' methods on functions. */,
"strictPropertyInitialization": true /* Enable strict checking of property initialization in classes. */,
"noImplicitThis": true /* Raise error on 'this' expressions with an implied 'any' type. */,
"alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */,
/* Additional Checks */
// "noUnusedLocals": true, /* Report errors on unused locals. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
"noImplicitReturns": true /* Report error when not all code paths in function return a value. */,
"noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */,
// "noUncheckedIndexedAccess": true /* Include 'undefined' in index signature results */,
"noPropertyAccessFromIndexSignature": true /* Require undeclared properties from index signatures to use element accesses. */,
/* Module Resolution Options */
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
"resolveJsonModule": true,
/* Source Map Options */
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
/* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
/* Advanced Options */
"skipLibCheck": true /* Skip type checking of declaration files. */,
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
},
"include": ["./src"]
}

View File

@ -1,37 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="./main.css" />
</head>
<body>
<div id="main" class="w-100 h-100">
<div>
<h2 class="title is-2"><span>can</span>i<span>haz</span>username</h2>
<input id="format" class="input is-rounded" type="text" placeholder="format" value="{character}_{english}">
<br /><br />
<button id="button" class="button is-link is-rounded">👇 Generate 👇</button>
<br /><br />
<input id="username" class="input is-rounded" type="text" placeholder="" readonly>
<br /><br />
<div class="content">
<a target="blank" href="https://github.com/cupcakearmy/canihazusername">
<button id="button" class="button is-link is-rounded">🔗 Github & Docs 🔗</button>
</a>
<br /><br />
<pre>yarn add canihazusername</pre>
<pre>import { generate } from 'canihazusername'
generate('{character}_{english}')</pre>
</div>
<div class="content">
<h5 class="title is-5">Available lists</h5>
<p id="lists"></p>
</div>
</div>
</div>
<script src="./main.ts"></script>
</body>
</html>

6392
yarn.lock Normal file

File diff suppressed because it is too large Load Diff