Browse Source

serverside meta tag rendering using knex + handlebars

pull/191/head
DashEightMate 5 months ago
parent
commit
87e608c4d1
  1. 28
      index.html
  2. 6
      server/.eslintrc.json
  3. 5
      server/package.json
  4. 62
      server/src/index.ts
  5. 120
      server/src/meta.ts
  6. 254
      server/yarn.lock

28
index.html

@ -6,25 +6,22 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Primary Meta Tags -->
<title>Hexbear</title>
<meta name="title" content="Hexbear">
<meta name="description"
content="Hexbear is a leftist social platform for discussion, posting memes, and sharing content. Join a community today.">
<meta name="title" content="{{title}}">
<meta name="description" content="{{description}}">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://www.hexbear.net/">
<meta property="og:title" content="Hexbear">
<meta property="og:description"
content="Hexbear is a leftist social platform for discussion, posting memes, and sharing content. Join a community today!">
<meta property="og:image" content="https://www.hexbear.net/static/assets/meta-preview.png">
<meta property="og:url" content="{{url}}">
<meta property="og:title" content="{{title}}">
<meta property="og:description" content="{{description}}">
<meta property="og:image" content="{{image}}">
<!-- Twitter -->
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://www.hexbear.net/">
<meta property="twitter:title" content="Hexbear">
<meta property="twitter:description"
content="Hexbear is a leftist social platform for discussion, posting memes, and sharing content. Join a community today!">
<meta property="twitter:image" content="https://www.hexbear.net/static/assets/meta-preview.png">
<meta property="twitter:url" content="{{url}}">
<meta property="twitter:title" content="{{title}}">
<meta property="twitter:description" content="{{description}}">
<meta property="twitter:image" content="{{image}}">
<!-- Icons -->
<link rel="shortcut icon" type="image/svg+xml" href="/favicon.ico" />
@ -51,11 +48,6 @@
<!-- Scripts -->
<script src="https://hcaptcha.com/1/api.js"></script>
<script async src="/libs/sortable/sortable.min.js"></script>
<!-- <script>
!function (t, e) { var o, n, p, r; e.__SV || (window.posthog = e, e._i = [], e.init = function (i, s, a) { function g(t, e) { var o = e.split("."); 2 == o.length && (t = t[o[0]], e = o[1]), t[e] = function () { t.push([e].concat(Array.prototype.slice.call(arguments, 0))) } } (p = t.createElement("script")).type = "text/javascript", p.async = !0, p.src = s.api_host + "/static/array.js", (r = t.getElementsByTagName("script")[0]).parentNode.insertBefore(p, r); var u = e; for (void 0 !== a ? u = e[a] = [] : a = "posthog", u.people = u.people || [], u.toString = function (t) { var e = "posthog"; return "posthog" !== a && (e += "." + a), t || (e += " (stub)"), e }, u.people.toString = function () { return u.toString(1) + ".people (stub)" }, o = "capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags".split(" "), n = 0; n < o.length; n++)g(u, o[n]); e._i.push([i, s, a]) }, e.__SV = 1) }(document, window.posthog || []);
posthog.init('XfBi9ZNwNM4BClVuam7cUTLFhBZJcOhxlmLz-bCIJs0', { api_host: 'https://chapo-posthog.herokuapp.com' })
</script> -->
</head>
<body>

6
server/.eslintrc.json

@ -14,5 +14,9 @@
"@typescript-eslint"
],
"rules": {
}
//Eslint was complaining about valid imports, we'll disable this.
"import/no-unresolved": "off",
"import/extensions": "off"
},
"root": true //Stop eslint from scanning into parent directories.
}

5
server/package.json

@ -6,7 +6,7 @@
"license": "AGPL-3.0",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "NODE_ENV=development nodemon src/index.ts",
"start": "NODE_ENV=development PG_CONN_URL=\"postgresql://lemmy:[email protected]:5432/lemmy\" nodemon src/index.ts",
"lint": "eslint --quiet --report-unused-disable-directives --ext .js,.ts,.tsx src"
},
"keywords": [],
@ -26,7 +26,10 @@
},
"dependencies": {
"express": "^4.17.1",
"handlebars": "^4.7.7",
"http-proxy-middleware": "^2.0.1",
"knex": "^0.95.6",
"pg": "^8.6.0",
"ts-node": "^10.0.0"
}
}

62
server/src/index.ts

@ -2,34 +2,68 @@
An express server to host the frontend.
Before you use it, you have to build the frontend using `yarn build` in the root of the repository.
To run this for development, use `yarn run` in the /server directory. To run this for production, check the dockerfile in /docker.
To run this for development, use `yarn run` in the /server directory.
To run this for production, check the dockerfile in /docker.
This isn't reccomended for frontend development because you have to rebuild the frontend to propogate changes.
For an auto-reloading development server for the frontend, run `yarn run` in the root of the repository.
This isn't reccomended for frontend development
because you have to rebuild the frontend to propogate changes.
For an auto-reloading development server for the frontend,
run `yarn run` in the root of the repository.
*/
import express from 'express';
import { createProxyMiddleware } from 'http-proxy-middleware';
import path from 'path';
import {
handleComment, handleCommunity, handleGeneral, handlePost, handleUser,
} from './meta';
const app = express();
const PORT = 4444; /*this is the same port that we use for the dev environment*/
const PORT = 4444; /* this is the same port that we use for the dev environment */
const SERVICED_ROUTES = ["/", "/home/data_type/*/listing_type/*/sort/*/page/*", "/login", "/create_post", "/create_community", "/create_private_message", "/communities/page/*", "/communities",
"/post/*/comment/*", "/post/*", "/c/*", "/community/*", "/u/*", "/user/*", "/inbox", "/modlog", "/modlog/community/*", "/setup", "/admin", "/sitemod", "/search/q/*/type/*/sort/*/page/*",
"/search", "/sponsors", "/contributing", "/welcome", "/about", "/ppb", "/reports", "/privacy_policy", "/tos", "/password_change/*", "/instances"];
const GENERAL_ROUTES = ['/', '/home/data_type/*/listing_type/*/sort/*/page/*', '/login', '/create_post', '/create_community', '/create_private_message',
'/communities/page/*', '/communities', '/inbox', '/modlog', '/modlog/community/*', '/setup', '/admin', '/sitemod', '/search/q/*/type/*/sort/*/page/*',
'/search', '/sponsors', '/contributing', '/welcome', '/about', '/ppb', '/reports', '/privacy_policy', '/tos', '/password_change/*', '/instances'];
app.use('/static', express.static(path.resolve('../dist')));
app.get(SERVICED_ROUTES, (req, res) => {
res.sendFile(path.resolve("../dist/index.html"));
// handle posts
app.get('/post/:pid', (req, res) => {
handlePost(`${req.protocol}://${req.get('Host')}${req.url}`, Number(req.params.pid))
.then((html) => res.send(html))
.catch((e) => res.status(500).send(e));
});
//In a development environment (i.e. without nginx proxying) proxy backend requests to the backend
if (process.env.NODE_ENV === "development") {
app.use(['/api', '/pictrs'], createProxyMiddleware('http://localhost:8536'));
// handle communities
app.get(['/c/:cname', '/community/:cname'], (req, res) => {
handleCommunity(`${req.protocol}://${req.get('Host')}${req.url}`, req.params.cname)
.then((html) => res.send(html))
.catch((e) => res.status(500).send(e));
});
// handle comment
app.get('/post/:pid/comment/:cid', (req, res) => {
handleComment(`${req.protocol}://${req.get('Host')}${req.url}`, Number(req.params.cid))
.then((html) => res.send(html))
.catch((e) => res.status(500).send(e));
});
// handle users
app.get(['/u/:uname', '/user/:uname'], (req, res) => {
handleUser(`${req.protocol}://${req.get('Host')}${req.url}`, req.params.uname)
.then((html) => res.send(html))
.catch((e) => res.status(500).send(e));
});
app.get(GENERAL_ROUTES, (req, res) => {
res.send(handleGeneral(`${req.protocol}://${req.get('Host')}${req.url}`));
});
// In a development environment (i.e. without nginx proxying) proxy backend requests to the backend
if (process.env.NODE_ENV === 'development') {
app.use(['/api', '/pictrs'], createProxyMiddleware('http://localhost:8536'));
}
app.listen(PORT, () => {
console.log(`Frontend server running on port ${PORT}`)
})
console.log(`Frontend server running on port ${PORT}`);
});

120
server/src/meta.ts

@ -0,0 +1,120 @@
/* eslint-disable camelcase */
import fs from 'fs';
import path from 'path';
import { knex } from 'knex';
import Handlebars from 'handlebars';
interface MetaTags {
url: string,
title: string,
description: string,
image: string,
}
interface PostInfo {
id: number,
name: string,
body?: string,
url?: string,
}
interface CommunityInfo {
id: number,
title: string,
description: string,
}
interface CommentViewInfo {
id: number,
content: string,
creator_name: string,
score: number,
}
interface UserViewInfo {
id: number,
name: string,
number_of_posts: number,
number_of_comments: number
}
const metaDefaults: MetaTags = {
url: 'https://www.hexbear.net/',
title: 'Hexbear',
description: 'Hexbear is a leftist social platform for discussion, posting memes, and sharing content. Join a community today!',
image: 'https://www.hexbear.net/static/assets/meta-preview.png',
};
const db = knex({
client: 'pg',
connection: process.env.PG_CONN_URL,
});
const index = fs.readFileSync(path.resolve('../dist/index.html')).toString();
// console.log(index);
const htmlTemplate = Handlebars.compile(index);
export function transformHTML(tags: MetaTags): string {
return htmlTemplate(tags);
}
function isImage(url: string): boolean {
return url.match(/\.(jpeg|jpg|gif|png)$/) != null;
}
function pluralize(amount: number, root: string): string {
return `${amount} ${root}${amount === 1 ? '' : 's'}`;
}
export function handleGeneral(url: string): string {
const tags: MetaTags = { ...metaDefaults, url };
return transformHTML(tags);
}
export async function handlePost(url: string, postId: number): Promise<string> {
const post = await db<PostInfo>('post').where('id', postId).first();
if (post) {
const image = post.url && isImage(post.url) ? post.url : metaDefaults.image;
const tags: MetaTags = {
url, title: `"${post.name}" on Hexbear`, description: post.body ? `"${post.body}"` : metaDefaults.description, image,
};
console.log(tags);
return transformHTML(tags);
}
return handleGeneral(url);
}
export async function handleCommunity(url: string, commName: string): Promise<string> {
const comm = await db<CommunityInfo>('community').where('name', commName).first();
if (comm) {
const tags: MetaTags = {
...metaDefaults, url, title: `"${comm.title}" on Hexbear`, description: comm.description,
};
return transformHTML(tags);
}
return handleGeneral(url);
}
export async function handleComment(url: string, commentId: number): Promise<string> {
const comment = await db<CommentViewInfo>('hexbear.comment_fast_view').where('id', commentId).first();
if (comment) {
const tags: MetaTags = {
...metaDefaults, url, title: `Comment by ${comment.creator_name} on Hexbear`, description: `${pluralize(comment.score, 'upbear')}. "${comment.content}"`,
};
return transformHTML(tags);
}
return handleGeneral(url);
}
export async function handleUser(url: string, userName: string): Promise<string> {
const user = await db<UserViewInfo>('hexbear.user_view').where('name', userName).first();
if (user) {
const tags: MetaTags = {
...metaDefaults, url, title: `${userName} on Hexbear`, description: `${pluralize(user.number_of_posts, 'post')}, ${pluralize(user.number_of_comments, 'comment')}. ${metaDefaults.description}`,
};
return transformHTML(tags);
}
return handleGeneral(url);
}

254
server/yarn.lock

@ -440,6 +440,11 @@ [email protected]^1.0.0:
resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz"
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
[email protected]:
version "2.0.0"
resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04"
integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==
[email protected]:
version "3.1.0"
resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz"
@ -557,6 +562,16 @@ [email protected]~1.1.4:
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
[email protected]:
version "1.2.1"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==
[email protected]^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
[email protected]:
version "0.0.1"
resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
@ -627,6 +642,13 @@ [email protected], [email protected]^2.2.0, [email protected]^2.6.9:
dependencies:
ms "2.0.0"
[email protected], [email protected]^4.0.1, [email protected]^4.1.1, [email protected]^4.3.1:
version "4.3.1"
resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz"
integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
dependencies:
ms "2.1.2"
[email protected]^3.2.6, [email protected]^3.2.7:
version "3.2.7"
resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
@ -634,13 +656,6 @@ [email protected]^3.2.6, [email protected]^3.2.7:
dependencies:
ms "^2.1.1"
[email protected]^4.0.1, [email protected]^4.1.1, [email protected]^4.3.1:
version "4.3.1"
resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz"
integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
dependencies:
ms "2.1.2"
[email protected]^3.3.0:
version "3.3.0"
resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz"
@ -790,6 +805,11 @@ [email protected]^1.2.1:
is-date-object "^1.0.1"
is-symbol "^1.0.2"
[email protected]^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
[email protected]^2.0.0:
version "2.1.1"
resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz"
@ -933,6 +953,11 @@ [email protected]^7.29.0:
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
[email protected]^3.2.25:
version "3.2.25"
resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10"
integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==
[email protected]^7.3.0, [email protected]^7.3.1:
version "7.3.1"
resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz"
@ -1160,6 +1185,11 @@ [email protected]^5.1.0:
dependencies:
pump "^3.0.0"
[email protected]:
version "2.2.5"
resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.5.tgz#67a0fe471cacb9c687d817cab6450b96dde8313b"
integrity sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==
[email protected]^5.1.2, [email protected]~5.1.2:
version "5.1.2"
resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
@ -1227,6 +1257,18 @@ [email protected]^4.1.2:
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz"
integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
[email protected]^4.7.7:
version "4.7.7"
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1"
integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==
dependencies:
minimist "^1.2.5"
neo-async "^2.6.0"
source-map "^0.6.1"
wordwrap "^1.0.0"
optionalDependencies:
uglify-js "^3.1.4"
[email protected]^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz"
@ -1353,11 +1395,21 @@ [email protected], [email protected]:
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
[email protected]^2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
[email protected], [email protected]~1.3.0:
version "1.3.7"
resolved "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz"
integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==
[email protected]^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
[email protected]:
version "1.9.1"
resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"
@ -1563,6 +1615,25 @@ [email protected]^3.0.0:
dependencies:
json-buffer "3.0.0"
[email protected]^0.95.6:
version "0.95.6"
resolved "https://registry.yarnpkg.com/knex/-/knex-0.95.6.tgz#5fc60ffc2935567bf122925526b1b06b8dbca785"
integrity sha512-noRcmkJl1MdicUbezrcr8OtVLcqQ/cfLIwgAx5EaxNxQOIJff88rBeyLywUScGhQNd/b78DIKKXZzLMrm6h/cw==
dependencies:
colorette "1.2.1"
commander "^7.1.0"
debug "4.3.1"
escalade "^3.1.1"
esm "^3.2.25"
getopts "2.2.5"
interpret "^2.2.0"
lodash "^4.17.21"
pg-connection-string "2.4.0"
rechoir "^0.7.0"
resolve-from "^5.0.0"
tarn "^3.0.1"
tildify "2.0.0"
[email protected]^5.0.0:
version "5.1.0"
resolved "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz"
@ -1611,6 +1682,11 @@ [email protected]^4.4.2:
resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz"
integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
[email protected]^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
[email protected]^1.0.0, [email protected]^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz"
@ -1697,7 +1773,7 @@ [email protected]^3.0.4:
dependencies:
brace-expansion "^1.1.7"
[email protected]^1.2.0:
[email protected]^1.2.0, [email protected]^1.2.5:
version "1.2.5"
resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
@ -1732,6 +1808,11 @@ [email protected]:
resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz"
integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
[email protected]^2.6.0:
version "2.6.2"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
[email protected]^2.0.9:
version "2.0.9"
resolved "https://registry.npmjs.org/nodemon/-/nodemon-2.0.9.tgz"
@ -1873,6 +1954,11 @@ [email protected]^6.3.0:
registry-url "^5.0.0"
semver "^6.2.0"
[email protected]:
version "1.0.0"
resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74"
integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==
[email protected]^1.0.0:
version "1.0.1"
resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
@ -1930,6 +2016,62 @@ [email protected]^4.0.0:
resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
[email protected]:
version "2.4.0"
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.4.0.tgz#c979922eb47832999a204da5dbe1ebf2341b6a10"
integrity sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ==
[email protected]^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34"
integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==
[email protected]:
version "1.0.1"
resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==
[email protected]^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.3.0.tgz#12d5c7f65ea18a6e99ca9811bd18129071e562fc"
integrity sha512-0O5huCql8/D6PIRFAlmccjphLYWC+JIzvUhSzXSpGaf+tjTZc4nn+Lr7mLXBbFJfvwbP0ywDv73EiaBsxn7zdg==
[email protected]^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.5.0.tgz#b5dd452257314565e2d54ab3c132adc46565a6a0"
integrity sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==
[email protected]^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3"
integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==
dependencies:
pg-int8 "1.0.1"
postgres-array "~2.0.0"
postgres-bytea "~1.0.0"
postgres-date "~1.0.4"
postgres-interval "^1.1.0"
[email protected]^8.6.0:
version "8.6.0"
resolved "https://registry.yarnpkg.com/pg/-/pg-8.6.0.tgz#e222296b0b079b280cce106ea991703335487db2"
integrity sha512-qNS9u61lqljTDFvmk/N66EeGq3n6Ujzj0FFyNMGQr6XuEv4tgNTXvJQTfJdcvGit5p5/DWPu+wj920hAJFI+QQ==
dependencies:
buffer-writer "2.0.0"
packet-reader "1.0.0"
pg-connection-string "^2.5.0"
pg-pool "^3.3.0"
pg-protocol "^1.5.0"
pg-types "^2.1.0"
pgpass "1.x"
[email protected]:
version "1.0.4"
resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.4.tgz#85eb93a83800b20f8057a2b029bf05abaf94ea9c"
integrity sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==
dependencies:
split2 "^3.1.1"
[email protected]^2.0.4, [email protected]^2.2.1, [email protected]^2.2.3:
version "2.3.0"
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz"
@ -1954,6 +2096,28 @@ [email protected]^2.0.0:
dependencies:
find-up "^2.1.0"
[email protected]~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e"
integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==
[email protected]~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35"
integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=
[email protected]~1.0.4:
version "1.0.7"
resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8"
integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==
[email protected]^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695"
integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==
dependencies:
xtend "^4.0.0"
[email protected]^1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
@ -2054,6 +2218,15 @@ [email protected]^3.0.0:
normalize-package-data "^2.3.2"
path-type "^3.0.0"
[email protected]^3.0.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
[email protected]~3.6.0:
version "3.6.0"
resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz"
@ -2061,6 +2234,13 @@ [email protected]~3.6.0:
dependencies:
picomatch "^2.2.1"
[email protected]^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca"
integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==
dependencies:
resolve "^1.9.0"
[email protected]^3.1.0:
version "3.2.0"
resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz"
@ -2095,7 +2275,12 @@ [email protected]^4.0.0:
resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
[email protected]^1.10.0, [email protected]^1.13.1, [email protected]^1.20.0:
[email protected]^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
[email protected]^1.10.0, [email protected]^1.13.1, [email protected]^1.20.0, [email protected]^1.9.0:
version "1.20.0"
resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz"
integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
@ -2134,6 +2319,11 @@ [email protected]:
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
[email protected]~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
"[email protected]>= 2.1.2 < 3":
version "2.1.2"
resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
@ -2236,7 +2426,7 @@ [email protected]^0.5.17:
buffer-from "^1.0.0"
source-map "^0.6.0"
[email protected]^0.6.0:
[email protected]^0.6.0, [email protected]^0.6.1:
version "0.6.1"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@ -2267,6 +2457,13 @@ [email protected]^3.0.0:
resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz"
integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==
[email protected]^3.1.1:
version "3.2.2"
resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f"
integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==
dependencies:
readable-stream "^3.0.0"
[email protected]~1.0.2:
version "1.0.3"
resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"
@ -2311,6 +2508,13 @@ [email protected]^1.0.4:
call-bind "^1.0.2"
define-properties "^1.1.3"
[email protected]^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
[email protected]^5.1.0:
version "5.2.0"
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz"
@ -2366,6 +2570,11 @@ [email protected]^6.0.9:
string-width "^4.2.0"
strip-ansi "^6.0.0"
[email protected]^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.1.tgz#ebac2c6dbc6977d34d4526e0a7814200386a8aec"
integrity sha512-6usSlV9KyHsspvwu2duKH+FMUhqJnAh6J5J/4MITl8s94iSUQTLkJggdiewKv4RyARQccnigV48Z+khiuVZDJw==
[email protected]^2.1.0:
version "2.2.1"
resolved "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz"
@ -2376,6 +2585,11 @@ [email protected]^0.2.0:
resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
[email protected]:
version "2.0.0"
resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a"
integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==
[email protected]^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz"
@ -2475,6 +2689,11 @@ [email protected]^4.3.5:
resolved "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz"
integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==
[email protected]^3.1.4:
version "3.13.10"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.10.tgz#a6bd0d28d38f592c3adb6b180ea6e07e1e540a8d"
integrity sha512-57H3ACYFXeo1IaZ1w02sfA71wI60MGco/IQFjOqK+WtKoprh7Go2/yvd2HPtoJILO2Or84ncLccI4xoHMTSbGg==
[email protected]^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz"
@ -2537,6 +2756,11 @@ [email protected]^3.0.0:
dependencies:
prepend-http "^2.0.0"
[email protected]^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
[email protected]:
version "1.0.1"
resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"
@ -2590,6 +2814,11 @@ [email protected]^1.2.3:
resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
[email protected]^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
[email protected]:
version "1.0.2"
resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
@ -2610,6 +2839,11 @@ [email protected]^4.0.0:
resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz"
integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
[email protected]^4.0.0:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
[email protected]^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"

Loading…
Cancel
Save