Compare commits

...

16 Commits
0.6.0 ... 0.6.1

Author SHA1 Message Date
Nicolai Ort 4a476e93af 🚀RELEASE 0.6.1
continuous-integration/drone/push Build is failing Details
2022-01-12 17:31:58 +01:00
Nicolai Ort 3bfcd64589 Merge pull request 'Update dependency fastify-jwt to v4' (#12) from renovate/fastify-jwt-4.x into main
continuous-integration/drone/push Build is passing Details
Reviewed-on: #12
2022-01-12 16:30:00 +00:00
Nicolai Ort d17825cabf Merge pull request 'Update registry.odit.services/hub/library/node Docker tag to v17' (#11) from renovate/registry.odit.services-hub-library-node-17.x into main
continuous-integration/drone/push Build is passing Details
Reviewed-on: #11
2022-01-12 16:29:36 +00:00
Nicolai Ort 6205151d53 Merge pull request 'Update dependency dotenv to v11' (#13) from renovate/dotenv-11.x into main
continuous-integration/drone/push Build is passing Details
Reviewed-on: #13
2022-01-12 16:29:24 +00:00
ODIT Renovate Bot 4861ca7f3e Update dependency dotenv to v11
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/pr Build is passing Details
2022-01-11 07:02:02 +00:00
ODIT Renovate Bot 575685f24d Update dependency fastify-jwt to v4
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/pr Build is passing Details
2021-11-25 09:00:46 +00:00
ODIT Renovate Bot 0e9f7a526c Update registry.odit.services/hub/library/node Docker tag to v17
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/pr Build is passing Details
2021-11-18 19:00:32 +00:00
Nicolai Ort efb11f6047
Enabled dep dashboard
continuous-integration/drone/push Build is passing Details
2021-10-15 16:23:21 +02:00
Nicolai Ort e95ca8045a Merge pull request 'Update dependency knex to ^0.95.0' (#5) from renovate/knex-0.x into main
continuous-integration/drone/push Build is passing Details
Reviewed-on: #5
2021-10-15 14:22:03 +00:00
ODIT Renovate Bot 2b93f3ea8a Update dependency knex to ^0.95.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/pr Build is passing Details
2021-10-15 14:18:41 +00:00
Nicolai Ort 2a7a32fda6 Merge pull request 'Configure Renovate' (#4) from renovate/configure into main
continuous-integration/drone/push Build is passing Details
Reviewed-on: #4
2021-10-15 14:17:08 +00:00
ODIT Renovate Bot d7428af1d8 Add renovate.json
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/pr Build is passing Details
2021-10-15 14:16:47 +00:00
Nicolai Ort 3ca5f6b3b4
Preleminary emoji support
continuous-integration/drone/push Build is passing Details
2021-09-25 19:29:23 +02:00
Nicolai Ort eb96408d33
Working clientside stuff
continuous-integration/drone/push Build is passing Details
closes #3
2021-09-25 18:45:52 +02:00
Nicolai Ort 11bd1b4f1f
Added 'clientside' flag to getters and setters 2021-09-25 18:28:49 +02:00
Nicolai Ort e3214084f6
Added migration for clientside redirects
ref #3
2021-09-25 18:25:53 +02:00
8 changed files with 1270 additions and 946 deletions

View File

@ -2,8 +2,29 @@
All notable changes to this project will be documented in this file. Dates are displayed in UTC. All notable changes to this project will be documented in this file. Dates are displayed in UTC.
#### [0.6.1](https://git.odit.services/kauft.es/linkylinky/compare/0.6.0...0.6.1)
- Working clientside stuff [`#3`](https://git.odit.services/kauft.es/linkylinky/issues/3)
- Merge pull request 'Update dependency fastify-jwt to v4' (#12) from renovate/fastify-jwt-4.x into main [`3bfcd64`](https://git.odit.services/kauft.es/linkylinky/commit/3bfcd645890253813cc2e4c740f67d577682934b)
- Merge pull request 'Update registry.odit.services/hub/library/node Docker tag to v17' (#11) from renovate/registry.odit.services-hub-library-node-17.x into main [`d17825c`](https://git.odit.services/kauft.es/linkylinky/commit/d17825cabf2d46d040bd33a3d1ad5a9d0bccfbe5)
- Merge pull request 'Update dependency dotenv to v11' (#13) from renovate/dotenv-11.x into main [`6205151`](https://git.odit.services/kauft.es/linkylinky/commit/6205151d53b374d890276d294d0abc6e6114abe5)
- Update dependency knex to ^0.95.0 [`2b93f3e`](https://git.odit.services/kauft.es/linkylinky/commit/2b93f3ea8a9b2f4be73829fb1041e6233d81fa91)
- Preleminary emoji support [`3ca5f6b`](https://git.odit.services/kauft.es/linkylinky/commit/3ca5f6b3b468ca739bc77e1d9b751625e03f300d)
- Update dependency fastify-jwt to v4 [`575685f`](https://git.odit.services/kauft.es/linkylinky/commit/575685f24d1d0a2c0574741e540f448642990cd5)
- Added 'clientside' flag to getters and setters [`11bd1b4`](https://git.odit.services/kauft.es/linkylinky/commit/11bd1b4f1f4d079b3ca047472da9da34fb64732d)
- Update dependency dotenv to v11 [`4861ca7`](https://git.odit.services/kauft.es/linkylinky/commit/4861ca7f3e3ed3e62ee774d59cb13a38d5e5e1e1)
- Update registry.odit.services/hub/library/node Docker tag to v17 [`0e9f7a5`](https://git.odit.services/kauft.es/linkylinky/commit/0e9f7a526ce5188e964e7beb78a5fb63870b473f)
- Enabled dep dashboard [`efb11f6`](https://git.odit.services/kauft.es/linkylinky/commit/efb11f6047e37901e20c613393d435f869e8a1f9)
- Merge pull request 'Update dependency knex to ^0.95.0' (#5) from renovate/knex-0.x into main [`e95ca80`](https://git.odit.services/kauft.es/linkylinky/commit/e95ca8045af6afcbc9dfcc9976d107a231d12953)
- Merge pull request 'Configure Renovate' (#4) from renovate/configure into main [`2a7a32f`](https://git.odit.services/kauft.es/linkylinky/commit/2a7a32fda615fa01751deffadafa6df1a5d0fede)
- Added migration for clientside redirects [`e321408`](https://git.odit.services/kauft.es/linkylinky/commit/e3214084f6dbf3e1595c54a9594e6d5f12323991)
- Add renovate.json [`d7428af`](https://git.odit.services/kauft.es/linkylinky/commit/d7428af1d81c820fdca7220959485f361956b86e)
#### [0.6.0](https://git.odit.services/kauft.es/linkylinky/compare/0.5.1...0.6.0) #### [0.6.0](https://git.odit.services/kauft.es/linkylinky/compare/0.5.1...0.6.0)
> 25 September 2021
- 🚀RELEASE 0.6.0 [`3803ac9`](https://git.odit.services/kauft.es/linkylinky/commit/3803ac9197a1d4c6535606cde43b1e04b3056f9c)
- Now with custom opengraph (tm) [`9d7125a`](https://git.odit.services/kauft.es/linkylinky/commit/9d7125a31186f3b7f33df4875db12c67cf91f536) - Now with custom opengraph (tm) [`9d7125a`](https://git.odit.services/kauft.es/linkylinky/commit/9d7125a31186f3b7f33df4875db12c67cf91f536)
- Added rudementary page content [`e1621b7`](https://git.odit.services/kauft.es/linkylinky/commit/e1621b72ade1fce381f30bcf310a6dcf8d1c65ea) - Added rudementary page content [`e1621b7`](https://git.odit.services/kauft.es/linkylinky/commit/e1621b72ade1fce381f30bcf310a6dcf8d1c65ea)
- Added migration for disallowing bot previews [`0a500f1`](https://git.odit.services/kauft.es/linkylinky/commit/0a500f16cde0b0e38a115dd4e76185a2a45dda49) - Added migration for disallowing bot previews [`0a500f1`](https://git.odit.services/kauft.es/linkylinky/commit/0a500f16cde0b0e38a115dd4e76185a2a45dda49)

View File

@ -1,4 +1,4 @@
FROM registry.odit.services/hub/library/node:16.6.2-alpine3.14 FROM registry.odit.services/hub/library/node:17.0.1-alpine3.14
WORKDIR /app WORKDIR /app
COPY package.json . COPY package.json .
COPY yarn.lock . COPY yarn.lock .
@ -9,7 +9,7 @@ COPY knexfile.js ./
RUN mkdir db RUN mkdir db
# #
# FROM astefanutti/scratch-node:16.0.0 # FROM astefanutti/scratch-node:16.0.0
FROM registry.odit.services/hub/library/node:16.6.2-alpine3.14 FROM registry.odit.services/hub/library/node:17.0.1-alpine3.14
WORKDIR /app WORKDIR /app
COPY --from=0 /app /app COPY --from=0 /app /app
ENV NODE_ENV production ENV NODE_ENV production

View File

@ -0,0 +1,9 @@
exports.up = function(knex) {
return knex.schema.table('urls', function (table) {
table.boolean('clientside').defaultTo(false);
});
};
exports.down = function(knex) {
};

View File

@ -1,6 +1,6 @@
{ {
"name": "@odit/shortener-backend", "name": "@odit/shortener-backend",
"version": "0.6.0", "version": "0.6.1",
"main": "index.js", "main": "index.js",
"license": "MIT", "license": "MIT",
"private": false, "private": false,
@ -25,14 +25,14 @@
}, },
"dependencies": { "dependencies": {
"argon2": "^0.28.2", "argon2": "^0.28.2",
"dotenv": "^10.0.0", "dotenv": "^11.0.0",
"fastify": "^3.20.1", "fastify": "^3.20.1",
"fastify-auth": "^1.1.0", "fastify-auth": "^1.1.0",
"fastify-basic-auth": "^2.1.0", "fastify-basic-auth": "^2.1.0",
"fastify-cors": "^6.0.2", "fastify-cors": "^6.0.2",
"fastify-jwt": "^3.0.1", "fastify-jwt": "^4.0.0",
"isbot": "^3.3.3", "isbot": "^3.3.3",
"knex": "^0.21.21", "knex": "^0.95.0",
"sqlite3": "^5.0.2", "sqlite3": "^5.0.2",
"uniqid": "^5.3.0" "uniqid": "^5.3.0"
}, },

4
renovate.json Normal file
View File

@ -0,0 +1,4 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"dependencyDashboard": true
}

View File

@ -104,7 +104,7 @@ fastify.get('/:shortcode', async (req, res) => {
if (!shortcode) { if (!shortcode) {
return 404; return 404;
} }
const target = await knex.select('target', 'no_preview') const target = await knex.select('target', 'no_preview', 'clientside')
.from('urls') .from('urls')
.where('shortcode', '=', shortcode) .where('shortcode', '=', shortcode)
.limit(1); .limit(1);
@ -113,33 +113,13 @@ fastify.get('/:shortcode', async (req, res) => {
} }
if (isBot(req.headers['user-agent']) && target[0].no_preview) { if (isBot(req.headers['user-agent']) && target[0].no_preview) {
return ` res.type("text/html");
<!DOCTYPE html> return bot_html;
<html lang="en"> }
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta property="og:title" content="LinkyLinky">
<meta property="og:site_name" content="LinkyLinky by Kauft.es">
<meta property="og:url" content="https://kauft.es/">
<meta property="og:description" content="LinkyLinky by Kauft.es is a custom url shortener. You're reading this, b/c someone doesn't want their shorturl to be indexed by bots/crawlers/spiders.">
<meta property="og:type" content="article">
<meta property="og:image" content="https://kauft.es/dashboard/icon_128.png">
<title>LinkyLinky</title> if (target[0].clientside) {
</head> res.type("text/html");
<body> return clientside_html.replace("{{targeturl}}", target[0].target)
<p align="center">
<img height="150" src="https://kauft.es/dashboard/icon_128.png">
<h1 align="center">LinkyLinky 🔗</h1>
<h3 align="center">A small url shortener, originaly developed for kauft.es</h3>
<p>LinkyLinky by Kauft.es is a custom url shortener.<br>
You're reading this, b/c someone doesn't want their shorturl to be indexed by bots/crawlers/spiders.</p>
</p>
</body>
</html>
`;
} }
res.redirect(302, target[0].target); res.redirect(302, target[0].target);
@ -154,6 +134,7 @@ const newUrlSchema = {
target: { type: 'string' }, target: { type: 'string' },
shortcode: { type: 'string' }, shortcode: { type: 'string' },
no_preview: { type: 'boolean' }, no_preview: { type: 'boolean' },
clientside: { type: 'boolean' }
} }
} }
}; };
@ -163,6 +144,7 @@ fastify.post('/api', { newUrlSchema }, async (req, res) => {
const target = req.body?.target; const target = req.body?.target;
let shortcode = req.body?.shortcode; let shortcode = req.body?.shortcode;
let no_preview = req.body?.no_preview || false; let no_preview = req.body?.no_preview || false;
let clientside = req.body?.clientside || false;
//Check if the user provided a target //Check if the user provided a target
if (!target) { if (!target) {
@ -182,7 +164,7 @@ fastify.post('/api', { newUrlSchema }, async (req, res) => {
return response; return response;
} }
} }
const exists = await knex.select('shortcode', 'no_preview') const exists = await knex.select('shortcode', 'no_preview', 'clientside')
.from('urls') .from('urls')
.where('target', '=', target) .where('target', '=', target)
.limit(1); .limit(1);
@ -192,7 +174,8 @@ fastify.post('/api', { newUrlSchema }, async (req, res) => {
url: `${config.getBaseUrl()}/${shortcode}`, url: `${config.getBaseUrl()}/${shortcode}`,
shortcode, shortcode,
target, target,
no_preview: exists[0].no_preview no_preview: exists[0].no_preview,
clientside: exists[0].clientside
} }
} }
shortcode = uniqid(); shortcode = uniqid();
@ -214,13 +197,14 @@ fastify.post('/api', { newUrlSchema }, async (req, res) => {
} }
//Create a new db entry //Create a new db entry
await knex('urls').insert({ target, shortcode, no_preview }); await knex('urls').insert({ target, shortcode, no_preview, clientside });
return { return {
url: `${config.getBaseUrl()}/${shortcode}`, url: `${config.getBaseUrl()}/${shortcode}`,
shortcode, shortcode,
target, target,
no_preview no_preview,
clientside
} }
}); });
@ -247,7 +231,7 @@ fastify.get('/api/:shortcode', async (req, res) => {
return 404; return 404;
} }
const exists = await knex.select('shortcode', 'target', 'no_preview') const exists = await knex.select('shortcode', 'target', 'no_preview', 'clientside')
.from('urls') .from('urls')
.where('shortcode', '=', shortcode) .where('shortcode', '=', shortcode)
.limit(1); .limit(1);
@ -264,6 +248,7 @@ fastify.get('/api/:shortcode', async (req, res) => {
shortcode: exists[0].shortcode, shortcode: exists[0].shortcode,
target: exists[0].target, target: exists[0].target,
no_preview: exists[0].no_preview, no_preview: exists[0].no_preview,
clientside: exists[0].clientside,
visits: visits.length visits: visits.length
} }
}); });
@ -350,7 +335,7 @@ fastify.after(() => {
//Get all urls api route //Get all urls api route
fastify.get('/api', { onRequest: fastify.auth([fastify.basicAuth, fastify.verifyJWT]) }, async (req, res) => { fastify.get('/api', { onRequest: fastify.auth([fastify.basicAuth, fastify.verifyJWT]) }, async (req, res) => {
urls = await knex.select('target', 'shortcode', 'no_preview') urls = await knex.select('target', 'shortcode', 'no_preview', 'clientside')
.from('urls'); .from('urls');
for (let url of urls) { for (let url of urls) {
@ -474,6 +459,286 @@ async function validate(username, password, req, reply) {
req.user = username; req.user = username;
} }
const bot_html = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta property="og:title" content="LinkyLinky">
<meta property="og:site_name" content="LinkyLinky by Kauft.es">
<meta property="og:url" content="https://kauft.es/">
<meta property="og:description" content="LinkyLinky by Kauft.es is a custom url shortener. You're reading this, b/c someone doesn't want their shorturl to be indexed by bots/crawlers/spiders.">
<meta property="og:type" content="article">
<meta property="og:image" content="https://kauft.es/dashboard/icon_128.png">
<title>LinkyLinky</title>
</head>
<body>
<p align="center">
<img height="150" src="https://kauft.es/dashboard/icon_128.png">
<h1 align="center">LinkyLinky 🔗</h1>
<h3 align="center">A small url shortener, originaly developed for kauft.es</h3>
<p>LinkyLinky by Kauft.es is a custom url shortener.<br>
You're reading this, b/c someone doesn't want their shorturl to be indexed by bots/crawlers/spiders.</p>
</p>
</body>
</html>
`;
const clientside_html = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="robot" content="no-index">
</head>
<body>
<style>
body {
background: black;
overflow: hidden;
}
.containCube {
position: relative;
height: 100vh;
width: 100%;
perspective: 800px;
}
.containCube .cube {
position: absolute;
height: 300px;
width: 300px;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: auto;
box-sizing: border-box;
transform-style: preserve-3d;
transform-origin: 50% 50%;
-webkit-animation: rotate 20s ease-in-out infinite alternate;
animation: rotate 20s ease-in-out infinite alternate;
}
.containCube .cubeGroup {
position: absolute;
display: grid;
box-sizing: border-box;
height: 100%;
width: 100%;
color: white;
text-shadow: 0 0 1px black;
border: 3px dashed white;
}
.containCube .cubeGroup h1 {
margin: auto;
}
.containCube .cube-front {
transform: translatez(150px);
}
.containCube .cube-rear {
transform: translatez(-150px) rotatey(180deg);
}
.containCube .cube-right {
transform-origin: 100%;
transform: rotatey(90deg) translatex(150px);
}
.containCube .cube-left {
transform-origin: 0%;
transform: rotatey(-90deg) translatex(-150px);
}
.containCube .cube-bottom {
transform-origin: 50% 100%;
transform: rotatex(-90deg) translatey(150px);
}
.containCube .cube-top {
transform-origin: 50% 0%;
transform: rotatex(90deg) translatey(-150px);
}
.containCube .cube-1 {
background: red;
}
.containCube .cube-2 {
background: red;
}
.containCube .cube-3 {
background: red;
}
.containCube .cube-4 {
background: red;
}
.containCube .cube-5 {
background: red;
}
.containCube .cube-6 {
background: red;
}
@-webkit-keyframes rotate {
10% {
transform: rotate3d(1, 1, 0, 320deg);
}
20% {
transform: rotate3d(1, 0, 0, -90deg);
}
30% {
transform: rotate3d(1, 1, 0, 440deg);
}
40% {
transform: rotate3d(1, 0, 0, -180deg);
}
50% {
transform: rotate3d(1, 1, 0, 460deg);
}
60% {
transform: rotate3d(0, 1, 0, -195deg);
}
70% {
transform: rotate3d(1, 1, 0, 172deg);
}
80% {
transform: rotate3d(0, 1, 0, -360deg);
}
90% {
transform: rotate3d(1, 1, 0, 280deg);
}
}
@keyframes rotate {
10% {
transform: rotate3d(1, 1, 0, 320deg);
}
20% {
transform: rotate3d(1, 0, 0, -90deg);
}
30% {
transform: rotate3d(1, 1, 0, 440deg);
}
40% {
transform: rotate3d(1, 0, 0, -180deg);
}
50% {
transform: rotate3d(1, 1, 0, 460deg);
}
60% {
transform: rotate3d(0, 1, 0, -195deg);
}
70% {
transform: rotate3d(1, 1, 0, 172deg);
}
80% {
transform: rotate3d(0, 1, 0, -360deg);
}
90% {
transform: rotate3d(1, 1, 0, 280deg);
}
}
@-webkit-keyframes rotateZed {
20% {
transform: translatez(100px);
}
40% {
transform: translatez(-100px);
}
60% {
transform: translatez(100px);
}
80% {
transform: translatez(-100px);
}
}
@keyframes rotateZed {
20% {
transform: translatez(100px);
}
40% {
transform: translatez(-100px);
}
60% {
transform: translatez(100px);
}
80% {
transform: translatez(-100px);
}
}
</style>
<div class="containCube">
<div class="cube">
<div class="cubeGroup cube-front cube-1">
<h1>kauft.es</h1>
</div>
<div class="cubeGroup cube-top cube-2">
<h1>kauft.es</h1>
</div>
<div class="cubeGroup cube-left cube-3">
<h1>kauft.es</h1>
</div>
<div class="cubeGroup cube-right cube-4">
<h1>kauft.es</h1>
</div>
<div class="cubeGroup cube-rear cube-5">
<h1>kauft.es</h1>
</div>
<div class="cubeGroup cube-bottom cube-6">
<h1>kauft.es</h1>
</div>
</div>
</div>
<script>
setTimeout(function () {
location.replace("{{targeturl}}");
}, 3000);//Delay 3 seconds
</script>
</body>
</html>
`;
// Run the server! // Run the server!
const start = async () => { const start = async () => {
try { try {

837
src/🥵🥵🥵.js Normal file
View File

@ -0,0 +1,837 @@
const emojis = [
"😀",
"😃",
"😄",
"😁",
"😆",
"😅",
"😂",
"🤣",
"😊",
"😇",
"🙂",
"🙃",
"😉",
"😌",
"😍",
"😘",
"😗",
"😙",
"😚",
"😋",
"😛",
"😝",
"😜",
"🤪",
"🤨",
"🧐",
"🤓",
"😎",
"🤩",
"😏",
"🤯",
"😳",
"🤗",
"🤔",
"🤭",
"🤫",
"🤥",
"😶",
"😯",
"😮",
"😲",
"😴",
"🤤",
"🤐",
"🤧",
"😷",
"🤒",
"🤑",
"🤠",
"😈",
"👿",
"👹",
"👺",
"🤡",
"💩",
"👻",
"👽",
"👾",
"🤖",
"🎃",
"😺",
"😸",
"😹",
"😻",
"😼",
"😽",
"🙀",
"😿",
"😾",
"🤲",
"👐",
"🙌",
"👏",
"🤝",
"👍",
"👊",
"✊",
"🤛",
"🤜",
"🤞",
"✌️",
"🤟",
"🤘",
"👈",
"👉",
"👆",
"👇",
"☝️",
"✋",
"🤚",
"🖐",
"🖖",
"👋",
"🤙",
"💪",
"✍️",
"💁‍",
"🙅‍",
"🙋‍",
"🤷‍",
"💃",
"🕺🏻",
"🧥",
"👚",
"👕",
"👖",
"👔",
"👗",
"👙",
"👘",
"👠",
"👡",
"👢",
"👞",
"👟",
"🧦",
"🧤",
"🧣",
"🎩",
"🧢",
"👒",
"🎓",
"⛑",
"👑",
"💍",
"👝",
"👛",
"👜",
"💼",
"🎒",
"👓",
"🕶",
"🌂",
"💢",
"♨️",
"❗️",
"❕",
"❓",
"❔",
"⁉️",
"🔅",
"🔆",
"🚸",
"🔰",
"♻️",
"✅",
"🌀",
"💤",
"🚮",
"🆗",
"🔣",
"🆒",
"🔜",
"✔️",
"🔈",
"🔉",
"🔊",
"📢",
"💬",
"💭",
"🗯",
"🀄️",
"🃏",
"🎴",
"🐶",
"🐱",
"🐭",
"🐹",
"🐰",
"🦊",
"🐻",
"🐼",
"🐨",
"🐯",
"🦁",
"🐮",
"🐷",
"🐽",
"🐸",
"🐵",
"🙈",
"🙉",
"🙊",
"🐒",
"🐔",
"🐧",
"🐦",
"🐤",
"🐣",
"🐥",
"🦆",
"🦅",
"🦉",
"🦇",
"🐺",
"🐗",
"🐴",
"🦄",
"🐝",
"🐌",
"🐞",
"🐜",
"🦗",
"🕷",
"🕸",
"🦂",
"🐢",
"🐍",
"🦎",
"🦖",
"🦕",
"🐙",
"🦑",
"🦐",
"🦀",
"🐡",
"🐠",
"🐟",
"🐬",
"🐳",
"🐋",
"🦈",
"🐊",
"🐅",
"🐆",
"🦓",
"🦍",
"🐘",
"🦏",
"🐪",
"🐫",
"🦒",
"🐃",
"🐂",
"🐄",
"🐎",
"🐖",
"🐏",
"🐑",
"🐐",
"🦌",
"🐕",
"🐩",
"🐈",
"🐓",
"🦃",
"🕊",
"🐇",
"🐁",
"🐀",
"🐿",
"🦔",
"🐾",
"🐉",
"🐲",
"🌵",
"🎄",
"🌲",
"🌳",
"🌴",
"🌱",
"🌿",
"☘️",
"🍀",
"🎍",
"🎋",
"🍃",
"🍂",
"🍁",
"🍄",
"🐚",
"🌾",
"💐",
"🌷",
"🌹",
"🥀",
"🌺",
"🌸",
"🌼",
"🌻",
"🌞",
"🌝",
"🌛",
"🌜",
"🌚",
"🌕",
"🌖",
"🌗",
"🌘",
"🌑",
"🌒",
"🌓",
"🌔",
"🌙",
"🌎",
"🌏",
"💫",
"🌟",
"⚡️",
"☄️",
"🌪",
"☀️",
"🌤",
"⛅️",
"🌥",
"☁️",
"🌦",
"🌧",
"⛈",
"🌩",
"🌨",
"❄️",
"☃️",
"⛄️",
"🌬",
"💨",
"☔️",
"☂️",
"🌊",
"🌫",
"🕐",
"🕑",
"🕒",
"🕓",
"🕔",
"🕕",
"🕖",
"🕗",
"🕘",
"🕙",
"🕚",
"🕛",
"🕜",
"🕝",
"🕞",
"🕟",
"🕠",
"🕡",
"🕢",
"🕣",
"🕤",
"🕥",
"🕦",
"🕧",
"🍏",
"🍎",
"🍐",
"🍊",
"🍋",
"🍌",
"🍉",
"🍇",
"🍓",
"🍈",
"🍒",
"🍍",
"🥥",
"🥝",
"🍅",
"🥑",
"🥦",
"🥒",
"🌶",
"🌽",
"🥕",
"🥔",
"🍠",
"🥐",
"🍞",
"🥖",
"🥨",
"🧀",
"🥚",
"🍳",
"🥞",
"🥓",
"🥩",
"🍗",
"🍖",
"🌭",
"🍔",
"🍟",
"🍕",
"🥪",
"🥙",
"🌮",
"🌯",
"🥗",
"🥘",
"🥫",
"🍝",
"🍲",
"🍛",
"🍣",
"🍱",
"🥟",
"🍤",
"🍙",
"🍚",
"🍘",
"🍥",
"🥠",
"🍢",
"🍡",
"🍧",
"🍨",
"🍦",
"🥧",
"🍰",
"🎂",
"🍮",
"🍭",
"🍬",
"🍫",
"🍿",
"🍩",
"🍪",
"🌰",
"🥜",
"🍯",
"🥛",
"🍼",
"☕️",
"🍵",
"🥤",
"🍶",
"🍺",
"🍻",
"🥂",
"🍷",
"🥃",
"🍸",
"🍹",
"🍾",
"🥄",
"🍴",
"🍽",
"🥣",
"🥡",
"🥢",
"⚽️",
"🏀",
"🏈",
"⚾",
"️🎾",
"🏐",
"🏉",
"🎱",
"🏓",
"🏸",
"🏑",
"🏒",
"🏏",
"🥅",
"⛳️",
"🏹",
"🎣",
"🥊",
"🥋",
"🎽",
"🛷",
"⛸",
"🥌",
"🎿",
"⛷",
"🏂",
"🏆",
"🥇",
"🥈",
"🥉",
"🏅",
"🎖",
"🏵",
"🎗",
"🎫",
"🎟",
"🎪",
"🎭",
"🎨",
"🎬",
"🎤",
"🎧",
"🎼",
"🎹",
"🥁",
"🎷",
"🎺",
"🎸",
"🎻",
"🎲",
"🎳",
"🎮",
"🎰",
"🚗",
"🚕",
"🚙",
"🚌",
"🚎",
"🏎",
"🚓",
"🚑",
"🚒",
"🚐",
"🚚",
"🚛",
"🚜",
"🛴",
"🚲",
"🛵",
"🏍",
"🚔",
"🚍",
"🚘",
"🚖",
"🚡",
"🚠",
"🚟",
"🚃",
"🚋",
"🚞",
"🚝",
"🚄",
"🚅",
"🚈",
"🚂",
"🚆",
"🚇",
"🚊",
"🚉",
"✈️",
"🛫",
"🛬",
"🛩",
"💺",
"🛰",
"🚀",
"🛸",
"🚁",
"🛶",
"⛵️",
"🚤",
"🛥",
"🛳",
"⛴",
"🚢",
"⚓️",
"⛽️",
"🚧",
"🚦",
"🚥",
"🚏",
"🗺",
"🗿",
"🗽",
"🗼",
"🏰",
"🏯",
"🏟",
"🎡",
"🎢",
"🎠",
"⛲️",
"⛱",
"🏖",
"🏝",
"🏜",
"🌋",
"⛰",
"🏔",
"🗻",
"🏕",
"⛺️",
"🏠",
"🏡",
"🏘",
"🏚",
"🏗",
"🏭",
"🏢",
"🏬",
"🏣",
"🏤",
"🏥",
"🏦",
"🏨",
"🏪",
"🏫",
"🏩",
"💒",
"🏛",
"⛪️",
"🕌",
"🕍",
"🕋",
"⛩",
"🛤",
"🛣",
"🗾",
"🎑",
"🏞",
"🌅",
"🌄",
"🌠",
"🎇",
"🎆",
"🌇",
"🏙",
"🌃",
"🌌",
"🌉",
"🌁",
"⌚️",
"📱",
"📲",
"💻",
"⌨️",
"🖥",
"🖨",
"🖱",
"🖲",
"🕹",
"🗜",
"💽",
"💾",
"💿",
"📀",
"📼",
"📷",
"📸",
"📹",
"🎥",
"📽",
"🎞",
"📞",
"☎️",
"📟",
"📠",
"📺",
"📻",
"🎙",
"🎚",
"🎛",
"⏱",
"⏲",
"⏰",
"🕰",
"⏳",
"📡",
"🔋",
"🔌",
"🔦",
"🕯",
"🛢",
"💵",
"💴",
"💶",
"💷",
"💰",
"💳",
"💎",
"⚖️",
"🔧",
"🔨",
"🛠",
"⛏",
"🔩",
"⚙️",
"⛓",
"🔫",
"💣",
"🔪",
"🗡",
"⚔️",
"🛡",
"🏺",
"📿",
"💈",
"⚗️",
"🔭",
"🔬",
"🕳",
"💊",
"💉",
"🌡",
"🚽",
"🚰",
"🚿",
"🛁",
"🛎",
"🔑",
"🗝",
"🚪",
"🛋",
"🛏",
"🛌",
"🖼",
"🛍",
"🛒",
"🎏",
"🎀",
"🎎",
"🏮",
"🎐",
"✉️",
"📩",
"📨",
"📧",
"💌",
"📥",
"📤",
"📦",
"🏷",
"📪",
"📫",
"📬",
"📭",
"📮",
"📯",
"📜",
"📃",
"📄",
"📑",
"📊",
"📈",
"📉",
"🗒",
"🗓",
"📆",
"📅",
"🗑",
"📇",
"🗃",
"🗳",
"🗄",
"📋",
"📁",
"📂",
"🗂",
"🗞",
"📰",
"📓",
"📔",
"📒",
"📕",
"📗",
"📘",
"📙",
"📖",
"🔖",
"🔗",
"📎",
"🖇",
"📐",
"📏",
"📌",
"📍",
"✂️",
"🖊",
"🖋",
"✒️",
"🖌",
"🖍",
"📝",
"✏️",
"🔍",
"🔎",
"🔏",
"🔐",
"🔒",
"🔓",
"🏳️",
"🏁",
"🚩",
"❤️",
"🧡",
"💛",
"💚",
"💙",
"💜",
"🖤",
"💔",
"❣️",
"💕",
"💞",
"💓",
"💗",
"💖",
"💘",
"💝",
"✨",
"💥",
"🔥",
"🌈",
"💧",
"💦",
"🍑",
"🍆",
"🍜",
"🎯",
"🚨",
"💡",
"💸",
"🔮",
"🎁",
"🎈",
"🎊",
"🎉",
"📚",
"🔔",
"📣",
"💅",
"👀",
"🧠",
"🏳️‍🌈",
"🐛",
"🦋",
"💄",
"💋",
"👄",
"💯",
"🎵",
"🎶",
"🙏",
"⭐️"
];
const getEmoji = (number = 10) => {
let id = "";
while (number > 0) {
id += emojis[Math.floor(Math.random() * emojis.length)];
number--;
}
return id;
}
module.exports = getEmoji;

1002
yarn.lock

File diff suppressed because it is too large Load Diff