server: remove summaly

Changelog: Removed
This commit is contained in:
Johann150 2024-09-07 09:48:25 +02:00
parent 91c63388c7
commit 35735342c1
Signed by: Johann150
GPG key ID: 9EE6577A2A06F8F1
16 changed files with 20 additions and 822 deletions

View file

@ -0,0 +1,11 @@
export class removeSummaly1725695130950 {
name = 'removeSummaly1725695130950'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "summalyProxy"`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "summalyProxy" character varying(128)`);
}
}

View file

@ -96,7 +96,6 @@
"strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0",
"style-loader": "3.3.1",
"summaly": "2.7.0",
"systeminformation": "5.11.22",
"tinycolor2": "1.4.2",
"tmp": "0.2.1",

View file

@ -175,12 +175,6 @@ export class Meta {
})
public remoteDriveCapacityMb: number;
@Column('varchar', {
length: 128,
nullable: true,
})
public summalyProxy: string | null;
@Column('boolean', {
default: false,
})

View file

@ -288,7 +288,6 @@ export default define(meta, paramDef, async () => {
hcaptchaSecretKey: instance.hcaptchaSecretKey,
recaptchaSecretKey: instance.recaptchaSecretKey,
proxyAccountId: instance.proxyAccountId,
summalyProxy: instance.summalyProxy,
email: instance.email,
smtpSecure: instance.smtpSecure,
smtpHost: instance.smtpHost,

View file

@ -48,7 +48,6 @@ export const paramDef = {
langs: { type: 'array', items: {
type: 'string',
} },
summalyProxy: { type: 'string', nullable: true },
translationService: { type: 'string', nullable: true, enum: [null, ...Object.values(TranslationService)] },
deeplAuthKey: { type: 'string', nullable: true },
libreTranslateAuthKey: { type: 'string', nullable: true },
@ -198,10 +197,6 @@ export default define(meta, paramDef, async (ps, me) => {
set.langs = ps.langs.filter(Boolean);
}
if (ps.summalyProxy !== undefined) {
set.summalyProxy = ps.summalyProxy;
}
if (ps.enableEmail !== undefined) {
set.enableEmail = ps.enableEmail;
}

View file

@ -24,7 +24,6 @@ import { getNoteSummary } from '@/misc/get-note-summary.js';
import { queues } from '@/queue/queues.js';
import { MINUTE, DAY } from '@/const.js';
import { genOpenapiSpec } from '../api/openapi/gen-spec.js';
import { urlPreviewHandler } from './url-preview.js';
import { manifestHandler } from './manifest.js';
import { packFeed } from './feed.js';
@ -210,9 +209,6 @@ router.get('/api-doc', async ctx => {
});
});
// URL preview endpoint
router.get('/url', urlPreviewHandler);
router.get('/api.json', async ctx => {
ctx.body = genOpenapiSpec();
});

View file

@ -1,71 +0,0 @@
import Koa from 'koa';
import summaly from 'summaly';
import { fetchMeta } from '@/misc/fetch-meta.js';
import Logger from '@/services/logger.js';
import config from '@/config/index.js';
import { query } from '@/prelude/url.js';
import { getJson } from '@/misc/fetch.js';
const logger = new Logger('url-preview');
export const urlPreviewHandler = async (ctx: Koa.Context): Promise<void> => {
const url = ctx.query.url;
if (typeof url !== 'string') {
ctx.status = 400;
return;
}
const lang = ctx.query.lang;
if (Array.isArray(lang)) {
ctx.status = 400;
return;
}
const meta = await fetchMeta();
logger.info(meta.summalyProxy
? `(Proxy) Getting preview of ${url}@${lang} ...`
: `Getting preview of ${url}@${lang} ...`);
try {
const summary = meta.summalyProxy ? await getJson(`${meta.summalyProxy}?${query({
url,
lang: lang ?? 'en-US',
})}`) : await summaly.default(url, {
followRedirects: false,
lang: lang ?? 'en-US',
});
logger.succ(`Got preview of ${url}: ${summary.title}`);
if (summary.url && !(summary.url.startsWith('http://') || summary.url.startsWith('https://'))) {
throw new Error('unsupported schema included');
}
if (summary.player?.url && !(summary.player.url.startsWith('http://') || summary.player.url.startsWith('https://'))) {
throw new Error('unsupported schema included');
}
summary.icon = wrap(summary.icon);
summary.thumbnail = wrap(summary.thumbnail);
// Cache 7days
ctx.set('Cache-Control', 'max-age=604800, immutable');
ctx.body = summary;
} catch (err) {
logger.warn(`Failed to get preview of ${url}: ${err}`);
ctx.status = 200;
ctx.set('Cache-Control', 'max-age=86400, immutable');
ctx.body = '{}';
}
};
function wrap(url?: string): string | null {
if (url == null) return null;
if (!['http:', 'https:'].includes(new URL(url).protocol)) return null;
return config.url + '/proxy/preview.webp?' + query({
url,
preview: '1',
});
}

View file

@ -19,12 +19,9 @@
</template>
<script lang="ts" setup>
import { defineAsyncComponent } from 'vue';
import { toUnicode as decodePunycode } from 'punycode/';
import { removeTracking } from '@/filters/url';
import { url as local } from '@/config';
import * as os from '@/os';
import { useTooltip } from '@/scripts/use-tooltip';
import { safeURIDecode } from '@/scripts/safe-uri-decode';
const props = withDefaults(defineProps<{
@ -37,7 +34,6 @@ const props = withDefaults(defineProps<{
const self = props.url.startsWith(local);
const uri = new URL(removeTracking(props.url));
if (!['http:', 'https:'].includes(uri.protocol)) throw new Error('invalid url');
let el: HTMLElement | null = $ref(null);
let schema = $ref(uri.protocol);
let hostname = $ref(decodePunycode(uri.hostname));
@ -47,14 +43,6 @@ let query = $ref(safeURIDecode(uri.search));
let hash = $ref(safeURIDecode(uri.hash));
let attr = $ref(self ? 'to' : 'href');
let target = $ref(self ? null : '_blank');
useTooltip($$(el), (showing) => {
os.popup(defineAsyncComponent(() => import('@/components/url-preview-popup.vue')), {
showing,
url: uri.href,
source: el,
}, {}, 'closed');
});
</script>
<style lang="scss" scoped>

View file

@ -9,11 +9,8 @@
</template>
<script lang="ts" setup>
import { defineAsyncComponent } from 'vue';
import { url as local } from '@/config';
import { removeTracking } from '@/filters/url';
import { useTooltip } from '@/scripts/use-tooltip';
import * as os from '@/os';
const props = withDefaults(defineProps<{
url: string;
@ -25,16 +22,6 @@ const self = props.url.startsWith(local);
const attr = self ? 'to' : 'href';
const target = self ? null : '_blank';
const cleanUrl = self ? props.url : removeTracking(props.url);
const el = $ref();
useTooltip($$(el), (showing) => {
os.popup(defineAsyncComponent(() => import('@/components/url-preview-popup.vue')), {
showing,
url: cleanUrl,
source: el,
}, {}, 'closed');
});
</script>
<style lang="scss" scoped>

View file

@ -69,7 +69,6 @@
<XMediaList :media-list="appearNote.files"/>
</div>
<XPoll v-if="appearNote.poll" ref="pollViewer" :note="appearNote" class="poll"/>
<MkUrlPreview v-for="url in urls" :key="url" :url="url" :compact="true" :detail="true" class="url-preview"/>
<div v-if="appearNote.renote" class="renote"><XNoteSimple :note="appearNote.renote"/></div>
</div>
<MkA v-if="appearNote.channel && !inChannel" class="channel" :to="`/channels/${appearNote.channel.id}`"><i class="fas fa-satellite-dish"></i> {{ appearNote.channel.name }}</MkA>
@ -129,7 +128,6 @@ import XMediaList from './media-list.vue';
import XCwButton from './cw-button.vue';
import XPoll from './poll.vue';
import XRenoteButton from './renote-button.vue';
import MkUrlPreview from '@/components/url-preview.vue';
import MkInstanceTicker from '@/components/instance-ticker.vue';
import MkVisibility from '@/components/visibility.vue';
import { pleaseLoginOrRemote, urlForNote } from '@/scripts/please-login';
@ -478,10 +476,6 @@ if (appearNote.replyId) {
}
}
> .url-preview {
margin-top: 8px;
}
> .poll {
font-size: 80%;
}

View file

@ -57,7 +57,6 @@
<XMediaList :media-list="appearNote.files"/>
</div>
<XPoll v-if="appearNote.poll" ref="pollViewer" :note="appearNote" class="poll"/>
<MkUrlPreview v-for="url in urls" :key="url" :url="url" :compact="true" :detail="false" class="url-preview"/>
<div v-if="appearNote.renote" class="renote"><XNoteSimple :note="appearNote.renote"/></div>
<button v-if="isLong && collapsed" class="fade _button" @click="collapsed = false">
<span>{{ i18n.ts.showMore }}</span>
@ -112,7 +111,6 @@ import XMediaList from './media-list.vue';
import XCwButton from './cw-button.vue';
import XPoll from './poll.vue';
import XRenoteButton from './renote-button.vue';
import MkUrlPreview from '@/components/url-preview.vue';
import MkInstanceTicker from '@/components/instance-ticker.vue';
import MkVisibility from '@/components/visibility.vue';
import { pleaseLoginOrRemote, urlForNote } from '@/scripts/please-login';
@ -505,10 +503,6 @@ function focusAfter() {
}
}
> .url-preview {
margin-top: 8px;
}
> .poll {
font-size: 80%;
}

View file

@ -1,42 +0,0 @@
<template>
<div class="fgmtyycl" :style="{ zIndex, top: top + 'px', left: left + 'px' }">
<transition :name="$store.state.animation ? 'zoom' : ''" @after-leave="emit('closed')">
<MkUrlPreview v-if="showing" class="_popup _shadow" :url="url"/>
</transition>
</div>
</template>
<script lang="ts" setup>
import { onMounted } from 'vue';
import MkUrlPreview from '@/components/url-preview.vue';
import * as os from '@/os';
const emit = defineEmits<{
(ev: 'closed'): void;
}>();
const props = defineProps<{
url: string;
source: HTMLElement;
showing: boolean;
}>();
let top = $ref(0);
let left = $ref(0);
const zIndex = os.claimZIndex('middle');
onMounted((): void => {
const rect = props.source.getBoundingClientRect();
top = Math.max((rect.left + (props.source.offsetWidth / 2)) - (300 / 2), 6) + window.pageXOffset;
left = rect.top + props.source.offsetHeight + window.pageYOffset;
});
</script>
<style lang="scss" scoped>
.fgmtyycl {
position: absolute;
width: 500px;
max-width: calc(90vw - 12px);
pointer-events: none;
}
</style>

View file

@ -1,275 +0,0 @@
<template>
<div v-if="playerEnabled" class="player" :style="`padding: ${(player.height || 0) / (player.width || 1) * 100}% 0 0`">
<button class="disablePlayer" :title="i18n.ts.disablePlayer" @click="playerEnabled = false"><i class="fas fa-times"></i></button>
<iframe :src="player.url + (player.url.match(/\?/) ? '&autoplay=1&auto_play=1' : '?autoplay=1&auto_play=1')" :width="player.width || '100%'" :heigth="player.height || 250" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen/>
</div>
<div v-else v-size="{ max: [400, 350] }" class="mk-url-preview">
<transition :name="$store.state.animation ? 'zoom' : ''" mode="out-in">
<component :is="self ? 'MkA' : 'a'" v-if="!fetching" :class="{ compact }" :[attr]="self ? url.substr(local.length) : url" rel="nofollow noopener" :target="target" :title="url">
<div v-if="thumbnail" class="thumbnail" :style="`background-image: url('${thumbnail}')`">
<button v-if="!playerEnabled && player.url" class="_button" :title="i18n.ts.enablePlayer" @click.prevent="playerEnabled = true"><i class="fas fa-play-circle"></i></button>
</div>
<article>
<header>
<h1 :title="title">{{ title }}</h1>
</header>
<p v-if="description" :title="description">{{ description.length > 85 ? description.slice(0, 85) + '…' : description }}</p>
<footer>
<img v-if="icon" class="icon" :src="icon"/>
<p :title="sitename">{{ sitename }}</p>
</footer>
</article>
</component>
</transition>
</div>
</template>
<script lang="ts" setup>
import { url as local, lang } from '@/config';
import { i18n } from '@/i18n';
const props = withDefaults(defineProps<{
url: string;
detail?: boolean;
compact?: boolean;
}>(), {
detail: false,
compact: false,
});
const self = props.url.startsWith(local);
const attr = self ? 'to' : 'href';
const target = self ? null : '_blank';
let fetching = $ref(true);
let title = $ref<string | null>(null);
let description = $ref<string | null>(null);
let thumbnail = $ref<string | null>(null);
let icon = $ref<string | null>(null);
let sitename = $ref<string | null>(null);
let player = $ref({
url: null,
width: null,
height: null,
});
let playerEnabled = $ref(false);
const requestUrl = new URL(props.url);
if(!['http:', 'https:'].includes(requestUrl.protocol)) throw new Error('invalid url');
if (requestUrl.hostname === 'music.youtube.com' && requestUrl.pathname.match('^/(?:watch|channel)')) {
requestUrl.hostname = 'www.youtube.com';
}
const requestLang = lang || 'en-US';
requestUrl.hash = '';
fetch(`/url?url=${encodeURIComponent(requestUrl.href)}&lang=${requestLang}`).then(res => {
res.json().then(info => {
if (info.url == null) return;
title = info.title;
description = info.description;
thumbnail = info.thumbnail;
icon = info.icon;
sitename = info.sitename;
fetching = false;
if (info.player.url != null && ['http:', 'https:'].includes(new URL(info.player.url).protocol)) {
player = info.player;
}
});
});
</script>
<style lang="scss" scoped>
.player {
position: relative;
width: 100%;
> button {
position: absolute;
top: -1.5em;
right: 0;
font-size: 1em;
width: 1.5em;
height: 1.5em;
padding: 0;
margin: 0;
color: var(--fg);
background: rgba(128, 128, 128, 0.2);
opacity: 0.7;
&:hover {
opacity: 0.9;
}
}
> iframe {
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
}
.mk-url-preview {
&.max-width_400px {
> a {
font-size: 12px;
> .thumbnail {
height: 80px;
}
> article {
padding: 12px;
}
}
}
&.max-width_350px {
> a {
font-size: 10px;
> .thumbnail {
height: 70px;
}
> article {
padding: 8px;
> header {
margin-bottom: 4px;
}
> footer {
margin-top: 4px;
> img {
width: 12px;
height: 12px;
}
}
}
&.compact {
> .thumbnail {
position: absolute;
width: 56px;
height: 100%;
}
> article {
left: 56px;
width: calc(100% - 56px);
padding: 4px;
> header {
margin-bottom: 2px;
}
> footer {
margin-top: 2px;
}
}
}
}
}
> a {
position: relative;
display: block;
font-size: 14px;
box-shadow: 0 0 0 1px var(--divider);
border-radius: 8px;
overflow: hidden;
&:hover {
text-decoration: none;
border-color: rgba(0, 0, 0, 0.2);
> article > header > h1 {
text-decoration: underline;
}
}
> .thumbnail {
position: absolute;
width: 100px;
height: 100%;
background-position: center;
background-size: cover;
display: flex;
justify-content: center;
align-items: center;
> button {
font-size: 3.5em;
opacity: 0.7;
&:hover {
font-size: 4em;
opacity: 0.9;
}
}
& + article {
left: 100px;
width: calc(100% - 100px);
}
}
> article {
position: relative;
box-sizing: border-box;
padding: 16px;
> header {
margin-bottom: 8px;
> h1 {
margin: 0;
font-size: 1em;
}
}
> p {
margin: 0;
font-size: 0.8em;
}
> footer {
margin-top: 8px;
height: 16px;
> img {
display: inline-block;
width: 16px;
height: 16px;
margin-right: 4px;
vertical-align: top;
}
> p {
display: inline-block;
margin: 0;
color: var(--urlPreviewInfo);
font-size: 0.8em;
line-height: 16px;
vertical-align: top;
}
}
}
&.compact {
> article {
> header h1, p, footer {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
}
}
}
</style>

View file

@ -13,19 +13,6 @@
<XBotProtection/>
</FormFolder>
<FormFolder class="_formBlock">
<template #label>Summaly Proxy</template>
<div class="_formRoot">
<FormInput v-model="summalyProxy" class="_formBlock">
<template #prefix><i class="fas fa-link"></i></template>
<template #label>Summaly Proxy URL</template>
</FormInput>
<MkButton primary class="_formBlock" @click="save"><i class="fas fa-save"></i> {{ i18n.ts.save }}</MkButton>
</div>
</FormFolder>
</div>
</FormSuspense>
</MkSpacer>
@ -43,25 +30,15 @@ import { fetchInstance } from '@/instance';
import { i18n } from '@/i18n';
import { definePageMetadata } from '@/scripts/page-metadata';
let summalyProxy: string = $ref('');
let enableHcaptcha: boolean = $ref(false);
let enableRecaptcha: boolean = $ref(false);
async function init(): Promise<void> {
const meta = await os.api('admin/meta');
summalyProxy = meta.summalyProxy;
enableHcaptcha = meta.enableHcaptcha;
enableRecaptcha = meta.enableRecaptcha;
}
function save(): void {
os.apiWithDialog('admin/update-meta', {
summalyProxy,
}).then(() => {
fetchInstance();
});
}
definePageMetadata({
title: i18n.ts.security,
icon: 'fas fa-lock',

View file

@ -20,7 +20,6 @@
</div>
</div>
<div></div>
<MkUrlPreview v-for="url in urls" :key="url" :url="url" style="margin: 8px 0;"/>
<footer>
<template v-if="isGroup">
<span v-if="message.reads.length > 0" class="read">{{ i18n.ts.messageRead }} {{ message.reads.length }}</span>
@ -39,7 +38,6 @@
import * as mfm from 'mfm-js';
import * as foundkey from 'foundkey-js';
import { extractUrlFromMfm } from '@/scripts/extract-url-from-mfm';
import MkUrlPreview from '@/components/url-preview.vue';
import * as os from '@/os';
import { $i } from '@/account';
import { i18n } from '@/i18n';

364
yarn.lock
View file

@ -1353,13 +1353,6 @@ __metadata:
languageName: node
linkType: hard
"@sindresorhus/is@npm:^4.0.0":
version: 4.6.0
resolution: "@sindresorhus/is@npm:4.6.0"
checksum: 83839f13da2c29d55c97abc3bc2c55b250d33a0447554997a85c539e058e57b8da092da396e252b11ec24a0279a0bed1f537fa26302209327060643e327f81d2
languageName: node
linkType: hard
"@sindresorhus/is@npm:^5.2.0":
version: 5.3.0
resolution: "@sindresorhus/is@npm:5.3.0"
@ -1450,15 +1443,6 @@ __metadata:
languageName: node
linkType: hard
"@szmarczak/http-timer@npm:^4.0.5":
version: 4.0.6
resolution: "@szmarczak/http-timer@npm:4.0.6"
dependencies:
defer-to-connect: ^2.0.0
checksum: c29df3bcec6fc3bdec2b17981d89d9c9fc9bd7d0c9bcfe92821dc533f4440bc890ccde79971838b4ceed1921d456973c4180d7175ee1d0023ad0562240a58d95
languageName: node
linkType: hard
"@szmarczak/http-timer@npm:^5.0.1":
version: 5.0.1
resolution: "@szmarczak/http-timer@npm:5.0.1"
@ -1608,7 +1592,7 @@ __metadata:
languageName: node
linkType: hard
"@types/cacheable-request@npm:^6.0.1, @types/cacheable-request@npm:^6.0.2":
"@types/cacheable-request@npm:^6.0.2":
version: 6.0.2
resolution: "@types/cacheable-request@npm:6.0.2"
dependencies:
@ -3587,7 +3571,6 @@ __metadata:
strict-event-emitter-types: 2.0.0
stringz: 2.1.0
style-loader: 3.3.1
summaly: 2.7.0
systeminformation: 5.11.22
tinycolor2: 1.4.2
tmp: 0.2.1
@ -3727,7 +3710,7 @@ __metadata:
languageName: node
linkType: hard
"boolbase@npm:^1.0.0, boolbase@npm:~1.0.0":
"boolbase@npm:^1.0.0":
version: 1.0.0
resolution: "boolbase@npm:1.0.0"
checksum: 3e25c80ef626c3a3487c73dbfc70ac322ec830666c9ad915d11b701142fab25ec1e63eff2c450c74347acfd2de854ccde865cd79ef4db1683f7c7b046ea43bb0
@ -4036,13 +4019,6 @@ __metadata:
languageName: node
linkType: hard
"cacheable-lookup@npm:^5.0.3":
version: 5.0.4
resolution: "cacheable-lookup@npm:5.0.4"
checksum: 763e02cf9196bc9afccacd8c418d942fc2677f22261969a4c2c2e760fa44a2351a81557bd908291c3921fe9beb10b976ba8fa50c5ca837c5a0dd945f16468f2d
languageName: node
linkType: hard
"cacheable-lookup@npm:^6.0.4":
version: 6.1.0
resolution: "cacheable-lookup@npm:6.1.0"
@ -4252,30 +4228,6 @@ __metadata:
languageName: node
linkType: hard
"cheerio@npm:0.22.0":
version: 0.22.0
resolution: "cheerio@npm:0.22.0"
dependencies:
css-select: ~1.2.0
dom-serializer: ~0.1.0
entities: ~1.1.1
htmlparser2: ^3.9.1
lodash.assignin: ^4.0.9
lodash.bind: ^4.1.4
lodash.defaults: ^4.0.1
lodash.filter: ^4.4.0
lodash.flatten: ^4.2.0
lodash.foreach: ^4.3.0
lodash.map: ^4.4.0
lodash.merge: ^4.4.0
lodash.pick: ^4.2.1
lodash.reduce: ^4.4.0
lodash.reject: ^4.4.0
lodash.some: ^4.4.0
checksum: b0a6cfa61eb7ae96e4cb8cfeeb14eb45bb790fa40098509268629c4cecca5b99124aabe6daa1154c497ac8def47bc3f9706cef5f0e8a6177a0c137d4bdaaf8b7
languageName: node
linkType: hard
"chokidar@npm:^3.3.1":
version: 3.3.1
resolution: "chokidar@npm:3.3.1"
@ -4990,25 +4942,6 @@ __metadata:
languageName: node
linkType: hard
"css-select@npm:~1.2.0":
version: 1.2.0
resolution: "css-select@npm:1.2.0"
dependencies:
boolbase: ~1.0.0
css-what: 2.1
domutils: 1.5.1
nth-check: ~1.0.1
checksum: 607cca60d2f5c56701fe5f800bbe668b114395c503d4e4808edbbbe70b8be3c96a6407428dc0227fcbdf335b20468e6a9e7fd689185edfb57d402e1e4837c9b7
languageName: node
linkType: hard
"css-what@npm:2.1":
version: 2.1.3
resolution: "css-what@npm:2.1.3"
checksum: a52d56c591a7e1c37506d0d8c4fdef72537fb8eb4cb68711485997a88d76b5a3342b73a7c79176268f95b428596c447ad7fa3488224a6b8b532e2f1f2ee8545c
languageName: node
linkType: hard
"cssesc@npm:^3.0.0":
version: 3.0.0
resolution: "cssesc@npm:3.0.0"
@ -5190,18 +5123,6 @@ __metadata:
languageName: node
linkType: hard
"debug@npm:4.3.3":
version: 4.3.3
resolution: "debug@npm:4.3.3"
dependencies:
ms: 2.1.2
peerDependenciesMeta:
supports-color:
optional: true
checksum: 14472d56fe4a94dbcfaa6dbed2dd3849f1d72ba78104a1a328047bb564643ca49df0224c3a17fa63533fd11dd3d4c8636cd861191232a2c6735af00cc2d4de16
languageName: node
linkType: hard
"debug@npm:^3.1.0, debug@npm:^3.2.6, debug@npm:^3.2.7":
version: 3.2.7
resolution: "debug@npm:3.2.7"
@ -5384,7 +5305,7 @@ __metadata:
languageName: node
linkType: hard
"defer-to-connect@npm:^2.0.0, defer-to-connect@npm:^2.0.1":
"defer-to-connect@npm:^2.0.1":
version: 2.0.1
resolution: "defer-to-connect@npm:2.0.1"
checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b
@ -5582,16 +5503,6 @@ __metadata:
languageName: node
linkType: hard
"dom-serializer@npm:0":
version: 0.2.2
resolution: "dom-serializer@npm:0.2.2"
dependencies:
domelementtype: ^2.0.1
entities: ^2.0.0
checksum: 376344893e4feccab649a14ca1a46473e9961f40fe62479ea692d4fee4d9df1c00ca8654811a79c1ca7b020096987e1ca4fb4d7f8bae32c1db800a680a0e5d5e
languageName: node
linkType: hard
"dom-serializer@npm:^1.0.1":
version: 1.4.1
resolution: "dom-serializer@npm:1.4.1"
@ -5603,23 +5514,6 @@ __metadata:
languageName: node
linkType: hard
"dom-serializer@npm:~0.1.0":
version: 0.1.1
resolution: "dom-serializer@npm:0.1.1"
dependencies:
domelementtype: ^1.3.0
entities: ^1.1.1
checksum: 4f6a3eff802273741931cfd3c800fab4e683236eed10628d6605f52538a6bc0ce4770f3ca2ad68a27412c103ae9b6cdaed3c0a8e20d2704192bde497bc875215
languageName: node
linkType: hard
"domelementtype@npm:1, domelementtype@npm:^1.3.0, domelementtype@npm:^1.3.1":
version: 1.3.1
resolution: "domelementtype@npm:1.3.1"
checksum: 7893da40218ae2106ec6ffc146b17f203487a52f5228b032ea7aa470e41dfe03e1bd762d0ee0139e792195efda765434b04b43cddcf63207b098f6ae44b36ad6
languageName: node
linkType: hard
"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0":
version: 2.3.0
resolution: "domelementtype@npm:2.3.0"
@ -5645,15 +5539,6 @@ __metadata:
languageName: node
linkType: hard
"domhandler@npm:^2.3.0":
version: 2.4.2
resolution: "domhandler@npm:2.4.2"
dependencies:
domelementtype: 1
checksum: 49bd70c9c784f845cd047e1dfb3611bd10891c05719acfc93f01fc726a419ed09fbe0b69f9064392d556a63fffc5a02010856cedae9368f4817146d95a97011f
languageName: node
linkType: hard
"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0":
version: 4.3.1
resolution: "domhandler@npm:4.3.1"
@ -5663,26 +5548,6 @@ __metadata:
languageName: node
linkType: hard
"domutils@npm:1.5.1":
version: 1.5.1
resolution: "domutils@npm:1.5.1"
dependencies:
dom-serializer: 0
domelementtype: 1
checksum: 800d1f9d1c2e637267dae078ff6e24461e6be1baeb52fa70f2e7e7520816c032a925997cd15d822de53ef9896abb1f35e5c439d301500a9cd6b46a395f6f6ca0
languageName: node
linkType: hard
"domutils@npm:^1.5.1":
version: 1.7.0
resolution: "domutils@npm:1.7.0"
dependencies:
dom-serializer: 0
domelementtype: 1
checksum: f60a725b1f73c1ae82f4894b691601ecc6ecb68320d87923ac3633137627c7865725af813ae5d188ad3954283853bcf46779eb50304ec5d5354044569fcefd2b
languageName: node
linkType: hard
"domutils@npm:^2.5.2":
version: 2.8.0
resolution: "domutils@npm:2.8.0"
@ -5844,13 +5709,6 @@ __metadata:
languageName: node
linkType: hard
"entities@npm:^1.1.1, entities@npm:~1.1.1":
version: 1.1.2
resolution: "entities@npm:1.1.2"
checksum: d537b02799bdd4784ffd714d000597ed168727bddf4885da887c5a491d735739029a00794f1998abbf35f3f6aeda32ef5c15010dca1817d401903a501b6d3e05
languageName: node
linkType: hard
"entities@npm:^2.0.0, entities@npm:^2.0.3":
version: 2.2.0
resolution: "entities@npm:2.2.0"
@ -6512,8 +6370,8 @@ __metadata:
"eslint-plugin-foundkey-custom-rules@file:../shared/custom-rules::locator=backend%40workspace%3Apackages%2Fbackend":
version: 0.0.0
resolution: "eslint-plugin-foundkey-custom-rules@file:../shared/custom-rules#../shared/custom-rules::hash=45c4fe&locator=backend%40workspace%3Apackages%2Fbackend"
checksum: 420d8341c1208ab068d9c8dd875241d452b199e46ebe9b75c07449051475e7814eed1c812d9552bdc0fbe2054d4dfd467577f7890ad050ab812347ccf04ae063
resolution: "eslint-plugin-foundkey-custom-rules@file:../shared/custom-rules#../shared/custom-rules::hash=ce195c&locator=backend%40workspace%3Apackages%2Fbackend"
checksum: 19bea576c17860ccfa923e648e87db3fa4356a10b12a6c3082b2760e0c0d69f117605d3bd5fce5a065f1e3c8bfaf44174161b7834e2460c90c78877e6914e773
languageName: node
linkType: hard
@ -7750,25 +7608,6 @@ __metadata:
languageName: node
linkType: hard
"got@npm:11.8.5":
version: 11.8.5
resolution: "got@npm:11.8.5"
dependencies:
"@sindresorhus/is": ^4.0.0
"@szmarczak/http-timer": ^4.0.5
"@types/cacheable-request": ^6.0.1
"@types/responselike": ^1.0.0
cacheable-lookup: ^5.0.3
cacheable-request: ^7.0.2
decompress-response: ^6.0.0
http2-wrapper: ^1.0.0-beta.5.2
lowercase-keys: ^2.0.0
p-cancelable: ^2.0.0
responselike: ^2.0.0
checksum: 2de8a1bbda4e9b6b2b72b2d2100bc055a59adc1740529e631f61feb44a8b9a1f9f8590941ed9da9df0090b6d6d0ed8ffee94cd9ac086ec3409b392b33440f7d2
languageName: node
linkType: hard
"got@npm:12.3.1":
version: 12.3.1
resolution: "got@npm:12.3.1"
@ -8095,13 +7934,6 @@ __metadata:
languageName: node
linkType: hard
"html-entities@npm:2.3.2":
version: 2.3.2
resolution: "html-entities@npm:2.3.2"
checksum: 522d8d202df301ff51b517a379e642023ed5c81ea9fb5674ffad88cff386165733d00b6089d5c2fcc644e44777d6072017b6216d8fa40f271d3610420d00a886
languageName: node
linkType: hard
"html-entities@npm:^1.4.0":
version: 1.4.0
resolution: "html-entities@npm:1.4.0"
@ -8116,20 +7948,6 @@ __metadata:
languageName: node
linkType: hard
"htmlparser2@npm:^3.9.1":
version: 3.10.1
resolution: "htmlparser2@npm:3.10.1"
dependencies:
domelementtype: ^1.3.1
domhandler: ^2.3.0
domutils: ^1.5.1
entities: ^1.1.1
inherits: ^2.0.1
readable-stream: ^3.1.1
checksum: 6875f7dd875aa10be17d9b130e3738cd8ed4010b1f2edaf4442c82dfafe9d9336b155870dcc39f38843cbf7fef5e4fcfdf0c4c1fd4db3a1b91a1e0ee8f6c3475
languageName: node
linkType: hard
"htmlparser2@npm:^6.0.0":
version: 6.1.0
resolution: "htmlparser2@npm:6.1.0"
@ -8219,16 +8037,6 @@ __metadata:
languageName: node
linkType: hard
"http2-wrapper@npm:^1.0.0-beta.5.2":
version: 1.0.3
resolution: "http2-wrapper@npm:1.0.3"
dependencies:
quick-lru: ^5.1.1
resolve-alpn: ^1.0.0
checksum: 74160b862ec699e3f859739101ff592d52ce1cb207b7950295bf7962e4aa1597ef709b4292c673bece9c9b300efad0559fc86c71b1409c7a1e02b7229456003e
languageName: node
linkType: hard
"http2-wrapper@npm:^2.1.10":
version: 2.1.11
resolution: "http2-wrapper@npm:2.1.11"
@ -8519,13 +8327,6 @@ __metadata:
languageName: node
linkType: hard
"ip-regex@npm:^4.0.0, ip-regex@npm:^4.3.0":
version: 4.3.0
resolution: "ip-regex@npm:4.3.0"
checksum: 7ff904b891221b1847f3fdf3dbb3e6a8660dc39bc283f79eb7ed88f5338e1a3d1104b779bc83759159be266249c59c2160e779ee39446d79d4ed0890dfd06f08
languageName: node
linkType: hard
"ip@npm:^2.0.0":
version: 2.0.0
resolution: "ip@npm:2.0.0"
@ -8540,13 +8341,6 @@ __metadata:
languageName: node
linkType: hard
"ipaddr.js@npm:^2.0.1":
version: 2.0.1
resolution: "ipaddr.js@npm:2.0.1"
checksum: dd194a394a843d470f88d17191b0948f383ed1c8e320813f850c336a0fcb5e9215d97ec26ca35ab4fbbd31392c8b3467f3e8344628029ed3710b2ff6b5d1034e
languageName: node
linkType: hard
"irregular-plurals@npm:^3.2.0":
version: 3.3.0
resolution: "irregular-plurals@npm:3.3.0"
@ -8786,15 +8580,6 @@ __metadata:
languageName: node
linkType: hard
"is-ip@npm:^3.1.0":
version: 3.1.0
resolution: "is-ip@npm:3.1.0"
dependencies:
ip-regex: ^4.0.0
checksum: da2c2b282407194adf2320bade0bad94be9c9d0bdab85ff45b1b62d8185f31c65dff3884519d57bf270277e5ea2046c7916a6e5a6db22fe4b7ddcdd3760f23eb
languageName: node
linkType: hard
"is-lambda@npm:^1.0.1":
version: 1.0.1
resolution: "is-lambda@npm:1.0.1"
@ -9806,13 +9591,6 @@ __metadata:
languageName: node
linkType: hard
"jschardet@npm:3.0.0":
version: 3.0.0
resolution: "jschardet@npm:3.0.0"
checksum: f391df4512bbd7edf97f82be09ba841a80cb4408c3ab96cf7e9c307737bd08cd8b3d10986f3db844d04151530395dcd174b3288f17144206d42675ecf482c286
languageName: node
linkType: hard
"jsdom@npm:20.0.0":
version: 20.0.0
resolution: "jsdom@npm:20.0.0"
@ -10488,21 +10266,7 @@ __metadata:
languageName: node
linkType: hard
"lodash.assignin@npm:^4.0.9":
version: 4.2.0
resolution: "lodash.assignin@npm:4.2.0"
checksum: 4b55bc1d65ccd7648fdba8a4316d10546929bf0beb5950830d86c559948cf170f0e65b77c95e66b45b511b85a31161714de8b2008d2537627ef3c7759afe36a6
languageName: node
linkType: hard
"lodash.bind@npm:^4.1.4":
version: 4.2.1
resolution: "lodash.bind@npm:4.2.1"
checksum: cf0e41de2fca7704fc0adadc00f7fc871f8cf428990972f072136e4cd153c4d42d88c1418218121380914021c5547be05e4252e61f6280c736a2195cc8b6f4e5
languageName: node
linkType: hard
"lodash.defaults@npm:^4.0.1, lodash.defaults@npm:^4.2.0":
"lodash.defaults@npm:^4.2.0":
version: 4.2.0
resolution: "lodash.defaults@npm:4.2.0"
checksum: 84923258235592c8886e29de5491946ff8c2ae5c82a7ac5cddd2e3cb697e6fbdfbbb6efcca015795c86eec2bb953a5a2ee4016e3735a3f02720428a40efbb8f1
@ -10516,27 +10280,13 @@ __metadata:
languageName: node
linkType: hard
"lodash.filter@npm:^4.4.0":
version: 4.6.0
resolution: "lodash.filter@npm:4.6.0"
checksum: f21d245d24818e15b560cb6cadc8404a1bf98bd87d037e5e51858aad57ca2b9db64d87e450a23c8f72dd2c66968efd09b034055ce86d93eef4a4eb6f1bbaf100
languageName: node
linkType: hard
"lodash.flatten@npm:^4.2.0, lodash.flatten@npm:^4.4.0":
"lodash.flatten@npm:^4.4.0":
version: 4.4.0
resolution: "lodash.flatten@npm:4.4.0"
checksum: 0ac34a393d4b795d4b7421153d27c13ae67e08786c9cbb60ff5b732210d46f833598eee3fb3844bb10070e8488efe390ea53bb567377e0cb47e9e630bf0811cb
languageName: node
linkType: hard
"lodash.foreach@npm:^4.3.0":
version: 4.5.0
resolution: "lodash.foreach@npm:4.5.0"
checksum: a940386b158ca0d62994db41fc16529eb8ae67138f29ced38e91f912cb5435d1b0ed34b18e6f7b9ddfc32ab676afc6dfec60d1e22633d8e3e4b33413402ab4ad
languageName: node
linkType: hard
"lodash.get@npm:^4.4.2":
version: 4.4.2
resolution: "lodash.get@npm:4.4.2"
@ -10572,13 +10322,6 @@ __metadata:
languageName: node
linkType: hard
"lodash.map@npm:^4.4.0":
version: 4.6.0
resolution: "lodash.map@npm:4.6.0"
checksum: 7369a41d7d24d15ce3bbd02a7faa3a90f6266c38184e64932571b9b21b758bd10c04ffd117d1859be1a44156f29b94df5045eff172bf8a97fddf68bf1002d12f
languageName: node
linkType: hard
"lodash.memoize@npm:4.x, lodash.memoize@npm:^4.1.2":
version: 4.1.2
resolution: "lodash.memoize@npm:4.1.2"
@ -10586,41 +10329,13 @@ __metadata:
languageName: node
linkType: hard
"lodash.merge@npm:^4.4.0, lodash.merge@npm:^4.6.2":
"lodash.merge@npm:^4.6.2":
version: 4.6.2
resolution: "lodash.merge@npm:4.6.2"
checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005
languageName: node
linkType: hard
"lodash.pick@npm:^4.2.1":
version: 4.4.0
resolution: "lodash.pick@npm:4.4.0"
checksum: 2c36cab7da6b999a20bd3373b40e31a3ef81fa264f34a6979c852c5bc8ac039379686b27380f0cb8e3781610844fafec6949c6fbbebc059c98f8fa8570e3675f
languageName: node
linkType: hard
"lodash.reduce@npm:^4.4.0":
version: 4.6.0
resolution: "lodash.reduce@npm:4.6.0"
checksum: 81f2a1045440554f8427f895ef479f1de5c141edd7852dde85a894879312801efae0295116e5cf830c531c1a51cdab8f3628c3ad39fa21a9874bb9158d9ea075
languageName: node
linkType: hard
"lodash.reject@npm:^4.4.0":
version: 4.6.0
resolution: "lodash.reject@npm:4.6.0"
checksum: 730acc78d29ab0a60e0f3cd87bbfe9071625a835791ef66daac7a405c43ec21209fd795fdf9b7485aecead4869f645801bd65c27b9acadce80dee26393793111
languageName: node
linkType: hard
"lodash.some@npm:^4.4.0":
version: 4.6.0
resolution: "lodash.some@npm:4.6.0"
checksum: 4469e76a389446d1166a29f844fb21398c36060d00258ce799710e046c55ed3c1af150c31b4856504e252bc813ba3fdcb6f255c490d9846738dd363a44665322
languageName: node
linkType: hard
"lodash.union@npm:^4.6.0":
version: 4.6.0
resolution: "lodash.union@npm:4.6.0"
@ -11359,13 +11074,6 @@ __metadata:
languageName: node
linkType: hard
"netmask@npm:^2.0.2":
version: 2.0.2
resolution: "netmask@npm:2.0.2"
checksum: c65cb8d3f7ea5669edddb3217e4c96910a60d0d9a4b52d9847ff6b28b2d0277cd8464eee0ef85133cdee32605c57940cacdd04a9a019079b091b6bba4cb0ec22
languageName: node
linkType: hard
"next-tick@npm:~1.0.0":
version: 1.0.0
resolution: "next-tick@npm:1.0.0"
@ -11694,15 +11402,6 @@ __metadata:
languageName: node
linkType: hard
"nth-check@npm:~1.0.1":
version: 1.0.2
resolution: "nth-check@npm:1.0.2"
dependencies:
boolbase: ~1.0.0
checksum: 59e115fdd75b971d0030f42ada3aac23898d4c03aa13371fa8b3339d23461d1badf3fde5aad251fb956aaa75c0a3b9bfcd07c08a34a83b4f9dadfdce1d19337c
languageName: node
linkType: hard
"num2fraction@npm:^1.2.2":
version: 1.2.2
resolution: "num2fraction@npm:1.2.2"
@ -11955,13 +11654,6 @@ __metadata:
languageName: node
linkType: hard
"p-cancelable@npm:^2.0.0":
version: 2.1.1
resolution: "p-cancelable@npm:2.1.1"
checksum: 3dba12b4fb4a1e3e34524535c7858fc82381bbbd0f247cc32dedc4018592a3950ce66b106d0880b4ec4c2d8d6576f98ca885dc1d7d0f274d1370be20e9523ddf
languageName: node
linkType: hard
"p-cancelable@npm:^3.0.0":
version: 3.0.0
resolution: "p-cancelable@npm:3.0.0"
@ -12943,18 +12635,6 @@ __metadata:
languageName: node
linkType: hard
"private-ip@npm:2.3.3":
version: 2.3.3
resolution: "private-ip@npm:2.3.3"
dependencies:
ip-regex: ^4.3.0
ipaddr.js: ^2.0.1
is-ip: ^3.1.0
netmask: ^2.0.2
checksum: c362d1b07ecbcc01127333b659e6240f80fca8df597b87011c5276412acfc5ff2ef0453b545bcea28bd45e3642e2bfeaf07de2c431352b366f48e221e6ec6a3a
languageName: node
linkType: hard
"probe-image-size@npm:7.2.3":
version: 7.2.3
resolution: "probe-image-size@npm:7.2.3"
@ -13752,7 +13432,7 @@ __metadata:
languageName: node
linkType: hard
"resolve-alpn@npm:^1.0.0, resolve-alpn@npm:^1.2.0":
"resolve-alpn@npm:^1.2.0":
version: 1.2.1
resolution: "resolve-alpn@npm:1.2.1"
checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0
@ -14857,25 +14537,6 @@ __metadata:
languageName: node
linkType: hard
"summaly@npm:2.7.0":
version: 2.7.0
resolution: "summaly@npm:2.7.0"
dependencies:
cheerio: 0.22.0
debug: 4.3.3
escape-regexp: 0.0.1
got: 11.8.5
html-entities: 2.3.2
iconv-lite: 0.6.3
jschardet: 3.0.0
koa: 2.13.4
private-ip: 2.3.3
require-all: 3.0.0
trace-redirect: 1.0.6
checksum: f5d5b845328ff80ab74229a08816990062153ac15b6581123c62283ecfa32c03ccfa446c3985285d3cfd3108868ab24f5c2bfc939ed781830148e0a39e03018e
languageName: node
linkType: hard
"supports-color@npm:^2.0.0":
version: 2.0.0
resolution: "supports-color@npm:2.0.0"
@ -15363,13 +15024,6 @@ __metadata:
languageName: node
linkType: hard
"trace-redirect@npm:1.0.6":
version: 1.0.6
resolution: "trace-redirect@npm:1.0.6"
checksum: c378538d0b3a2f314846231bae879ebf2f62319d4a1f8449588954637f8ce6c6910b0df13fce07c2c84fefd35fb7632c7e087b511c7a6a5194f1cae7538fba23
languageName: node
linkType: hard
"trim-newlines@npm:^3.0.0":
version: 3.0.1
resolution: "trim-newlines@npm:3.0.1"