@@ -28,7 +39,7 @@
{{ url }}
- {{ title }}
+ {{ title }}
{{ i18n.ts.cannotLoad }}
@@ -37,7 +48,7 @@
?
-
{{ sitename }}
+
{{ sitename }}
@@ -59,6 +70,7 @@
+
diff --git a/packages/frontend/src/pages/emojis.emoji.vue b/packages/frontend/src/pages/emojis.emoji.vue
index 0edc29080..bdd21b29e 100644
--- a/packages/frontend/src/pages/emojis.emoji.vue
+++ b/packages/frontend/src/pages/emojis.emoji.vue
@@ -34,6 +34,17 @@ function menu(ev) {
copyToClipboard(`:${props.emoji.name}:`);
os.success();
},
+ }, {
+ text: i18n.ts.info,
+ icon: 'ti ti-info-circle',
+ action: () => {
+ os.apiGet('emoji', { name: props.emoji.name }).then(res => {
+ os.alert({
+ type: 'info',
+ text: `License: ${res.license}`,
+ });
+ });
+ },
}], ev.currentTarget ?? ev.target);
}
diff --git a/packages/frontend/src/pages/flash/flash-edit.vue b/packages/frontend/src/pages/flash/flash-edit.vue
index 242ca5e89..35edcc7cd 100644
--- a/packages/frontend/src/pages/flash/flash-edit.vue
+++ b/packages/frontend/src/pages/flash/flash-edit.vue
@@ -33,7 +33,7 @@ import MkTextarea from '@/components/MkTextarea.vue';
import MkInput from '@/components/MkInput.vue';
import { useRouter } from '@/router';
-const PRESET_DEFAULT = `/// @ 0.13.0
+const PRESET_DEFAULT = `/// @ 0.13.1
var name = ""
@@ -51,7 +51,7 @@ Ui:render([
])
`;
-const PRESET_OMIKUJI = `/// @ 0.13.0
+const PRESET_OMIKUJI = `/// @ 0.13.1
// ユーザーごとに日替わりのおみくじのプリセット
// 選択肢
@@ -94,7 +94,7 @@ Ui:render([
])
`;
-const PRESET_SHUFFLE = `/// @ 0.13.0
+const PRESET_SHUFFLE = `/// @ 0.13.1
// 巻き戻し可能な文字シャッフルのプリセット
let string = "ペペロンチーノ"
@@ -173,7 +173,7 @@ var cursor = 0
do()
`;
-const PRESET_QUIZ = `/// @ 0.13.0
+const PRESET_QUIZ = `/// @ 0.13.1
let title = '地理クイズ'
let qas = [{
@@ -286,7 +286,7 @@ qaEls.push(Ui:C:container({
Ui:render(qaEls)
`;
-const PRESET_TIMELINE = `/// @ 0.13.0
+const PRESET_TIMELINE = `/// @ 0.13.1
// APIリクエストを行いローカルタイムラインを表示するプリセット
@fetch() {
diff --git a/packages/frontend/src/router.ts b/packages/frontend/src/router.ts
index 5f184881b..590c5765f 100644
--- a/packages/frontend/src/router.ts
+++ b/packages/frontend/src/router.ts
@@ -197,6 +197,9 @@ export const routes = [{
}, {
path: '/about-misskey',
component: page(() => import('./pages/about-misskey.vue')),
+}, {
+ path: '/ads',
+ component: page(() => import('./pages/ads.vue')),
}, {
path: '/theme-editor',
component: page(() => import('./pages/theme-editor.vue')),
diff --git a/packages/frontend/src/ui/_common_/common.ts b/packages/frontend/src/ui/_common_/common.ts
index a90ec6172..eae4f0091 100644
--- a/packages/frontend/src/ui/_common_/common.ts
+++ b/packages/frontend/src/ui/_common_/common.ts
@@ -29,6 +29,11 @@ export function openInstanceMenu(ev: MouseEvent) {
icon: 'ti ti-chart-line',
to: '/about#charts',
}, null, {
+ type: 'link',
+ text: i18n.ts.ads,
+ icon: 'ti ti-ad',
+ to: '/ads',
+ }, {
type: 'parent',
text: i18n.ts.tools,
icon: 'ti ti-tool',
diff --git a/packages/frontend/test/init.ts b/packages/frontend/test/init.ts
index 96730e7b5..295107e14 100644
--- a/packages/frontend/test/init.ts
+++ b/packages/frontend/test/init.ts
@@ -1,4 +1,8 @@
import { vi } from 'vitest';
+import createFetchMock from 'vitest-fetch-mock';
+
+const fetchMocker = createFetchMock(vi);
+fetchMocker.enableMocks();
// Set i18n
import locales from '../../../locales';
diff --git a/packages/frontend/test/url-preview.test.ts b/packages/frontend/test/url-preview.test.ts
new file mode 100644
index 000000000..205982a40
--- /dev/null
+++ b/packages/frontend/test/url-preview.test.ts
@@ -0,0 +1,140 @@
+import { describe, test, assert, afterEach } from 'vitest';
+import { render, cleanup, type RenderResult } from '@testing-library/vue';
+import './init';
+import type { summaly } from 'summaly';
+import { directives } from '@/directives';
+import MkUrlPreview from '@/components/MkUrlPreview.vue';
+
+type SummalyResult = Awaited
>;
+
+describe('MkMediaImage', () => {
+ const renderPreviewBy = async (summary: Partial): Promise => {
+ if (!summary.player) {
+ summary.player = {
+ url: null,
+ width: null,
+ height: null,
+ allow: [],
+ };
+ }
+
+ fetchMock.mockOnceIf(/^\/url?/, () => {
+ return {
+ status: 200,
+ body: JSON.stringify(summary),
+ };
+ });
+
+ const result = render(MkUrlPreview, {
+ props: { url: summary.url },
+ global: { directives },
+ });
+
+ await new Promise(resolve => {
+ const observer = new MutationObserver(() => {
+ resolve();
+ observer.disconnect();
+ });
+ observer.observe(result.container, { childList: true, subtree: true });
+ });
+
+ return result;
+ };
+
+ const renderAndOpenPreview = async (summary: Partial): Promise => {
+ const mkUrlPreview = await renderPreviewBy(summary);
+ const buttons = mkUrlPreview.getAllByRole('button');
+ buttons[0].click();
+ // Wait for the click event to be fired
+ await Promise.resolve();
+
+ return mkUrlPreview.container.querySelector('iframe');
+ };
+
+ afterEach(() => {
+ fetchMock.resetMocks();
+ cleanup();
+ });
+
+ test('Should render the description', async () => {
+ const mkUrlPreview = await renderPreviewBy({
+ url: 'https://example.local',
+ description: 'Mocked description',
+ });
+ mkUrlPreview.getByText('Mocked description');
+ });
+
+ test('Having a player should render a button', async () => {
+ const mkUrlPreview = await renderPreviewBy({
+ url: 'https://example.local',
+ player: {
+ url: 'https://example.local/player',
+ width: null,
+ height: null,
+ allow: [],
+ },
+ });
+ const buttons = mkUrlPreview.getAllByRole('button');
+ assert.strictEqual(buttons.length, 2, 'two buttons');
+ });
+
+ test('Having a player should setup the iframe', async () => {
+ const iframe = await renderAndOpenPreview({
+ url: 'https://example.local',
+ player: {
+ url: 'https://example.local/player',
+ width: null,
+ height: null,
+ allow: [],
+ },
+ });
+ assert.exists(iframe, 'iframe should exist');
+ assert.strictEqual(iframe?.src, 'https://example.local/player?autoplay=1&auto_play=1');
+ assert.strictEqual(
+ iframe?.sandbox.toString(),
+ 'allow-popups allow-scripts allow-storage-access-by-user-activation allow-same-origin',
+ );
+ });
+
+ test('Having a player with `allow` field should set permissions', async () => {
+ const iframe = await renderAndOpenPreview({
+ url: 'https://example.local',
+ player: {
+ url: 'https://example.local/player',
+ width: null,
+ height: null,
+ allow: ['fullscreen', 'web-share'],
+ },
+ });
+ assert.exists(iframe, 'iframe should exist');
+ assert.strictEqual(iframe?.allow, 'fullscreen;web-share');
+ });
+
+ test('Having a player width should keep the fixed aspect ratio', async () => {
+ const iframe = await renderAndOpenPreview({
+ url: 'https://example.local',
+ player: {
+ url: 'https://example.local/player',
+ width: 400,
+ height: 200,
+ allow: [],
+ },
+ });
+ assert.exists(iframe, 'iframe should exist');
+ assert.strictEqual(iframe?.parentElement?.style.paddingTop, '50%');
+ });
+
+ test('Having a player width should keep the fixed height', async () => {
+ const iframe = await renderAndOpenPreview({
+ url: 'https://example.local',
+ player: {
+ url: 'https://example.local/player',
+ width: null,
+ height: 200,
+ allow: [],
+ },
+ });
+ assert.exists(iframe, 'iframe should exist');
+ assert.strictEqual(iframe?.parentElement?.style.paddingTop, '200px');
+ });
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2b03ad29d..d2397b154 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -398,7 +398,7 @@ importers:
'@rollup/plugin-alias': 4.0.3
'@rollup/plugin-json': 6.0.0
'@rollup/pluginutils': 5.0.2
- '@syuilo/aiscript': 0.13.0
+ '@syuilo/aiscript': 0.13.1
'@tabler/icons-webfont': 2.10.0
'@testing-library/vue': ^6.6.1
'@types/escape-regexp': 0.0.1
@@ -462,6 +462,7 @@ importers:
seedrandom: 3.0.5
start-server-and-test: 2.0.0
strict-event-emitter-types: 2.0.0
+ summaly: github:misskey-dev/summaly
syuilo-password-strength: 0.0.1
textarea-caret: 3.1.0
three: 0.150.1
@@ -475,6 +476,7 @@ importers:
vanilla-tilt: 1.8.0
vite: 4.1.4
vitest: ^0.29.2
+ vitest-fetch-mock: ^0.2.2
vue: 3.2.47
vue-eslint-parser: 9.1.0
vue-plyr: 7.0.0
@@ -486,7 +488,7 @@ importers:
'@rollup/plugin-alias': 4.0.3_rollup@3.19.0
'@rollup/plugin-json': 6.0.0_rollup@3.19.0
'@rollup/pluginutils': 5.0.2_rollup@3.19.0
- '@syuilo/aiscript': 0.13.0
+ '@syuilo/aiscript': 0.13.1
'@tabler/icons-webfont': 2.10.0
'@vitejs/plugin-vue': 4.0.0_vite@4.1.4+vue@3.2.47
'@vue/compiler-sfc': 3.2.47
@@ -567,7 +569,9 @@ importers:
eslint-plugin-vue: 9.9.0_eslint@8.35.0
happy-dom: 8.9.0
start-server-and-test: 2.0.0
+ summaly: github.com/misskey-dev/summaly/1bab7afee616429b8bbf7a7cbcbb8ebcef66d992
vitest: 0.29.2_zcjcryjt4bqcdu7ggonulipgea
+ vitest-fetch-mock: 0.2.2_vitest@0.29.2
vue-eslint-parser: 9.1.0_eslint@8.35.0
vue-tsc: 1.2.0_typescript@4.9.5
@@ -2312,7 +2316,6 @@ packages:
/@sindresorhus/is/5.3.0:
resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==}
engines: {node: '>=14.16'}
- dev: false
/@sinonjs/commons/2.0.0:
resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==}
@@ -2473,8 +2476,8 @@ packages:
dev: false
optional: true
- /@syuilo/aiscript/0.13.0:
- resolution: {integrity: sha512-zikuEpQEp1lyNoLxsqNnR2UqyRVV1ZdTOTIyKkEU/4gX90M4t1LIvevbzfyiwoUqLkOMqhdU/poARPL3pCwygg==}
+ /@syuilo/aiscript/0.13.1:
+ resolution: {integrity: sha512-WJduqlsm7pq8r1oYbPSAf5cqR6Pve6ipGoPUUSgti51dMytMnxE2dn7d7i8759RF3yftyoclZbL/DC7IjPsTng==}
dependencies:
autobind-decorator: 2.4.0
seedrandom: 3.0.5
@@ -2494,7 +2497,6 @@ packages:
engines: {node: '>=14.16'}
dependencies:
defer-to-connect: 2.0.1
- dev: false
/@tabler/icons-webfont/2.10.0:
resolution: {integrity: sha512-5WvGhztlM3la7NWf8Y6ktT+KD7zb/Hz/zdMeFjExXvEFupGvuANEnbGo1wXI4ADdSWUaRDtnQHcSGIjZ+gZ+OQ==}
@@ -2847,7 +2849,6 @@ packages:
/@types/http-cache-semantics/4.0.1:
resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==}
- dev: false
/@types/ioredis/4.28.10:
resolution: {integrity: sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==}
@@ -4240,7 +4241,7 @@ packages:
/axios/0.24.0:
resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==}
dependencies:
- follow-redirects: 1.15.2
+ follow-redirects: 1.15.2_debug@4.3.4
transitivePeerDependencies:
- debug
dev: false
@@ -4248,7 +4249,7 @@ packages:
/axios/0.27.2_debug@4.3.4:
resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==}
dependencies:
- follow-redirects: 1.15.2
+ follow-redirects: 1.15.2_debug@4.3.4
form-data: 4.0.0
transitivePeerDependencies:
- debug
@@ -4694,7 +4695,6 @@ packages:
/cacheable-lookup/7.0.0:
resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==}
engines: {node: '>=14.16'}
- dev: false
/cacheable-request/10.2.8:
resolution: {integrity: sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==}
@@ -4707,7 +4707,6 @@ packages:
mimic-response: 4.0.0
normalize-url: 8.0.0
responselike: 3.0.0
- dev: false
/cacheable-request/7.0.2:
resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==}
@@ -4923,7 +4922,6 @@ packages:
domelementtype: 2.3.0
domhandler: 5.0.3
domutils: 3.0.1
- dev: false
/cheerio/1.0.0-rc.12:
resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==}
@@ -4936,7 +4934,6 @@ packages:
htmlparser2: 8.0.1
parse5: 7.1.2
parse5-htmlparser2-tree-adapter: 7.0.0
- dev: false
/chokidar/3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
@@ -5416,12 +5413,10 @@ packages:
domhandler: 5.0.3
domutils: 3.0.1
nth-check: 2.1.1
- dev: false
/css-what/6.1.0:
resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
engines: {node: '>= 6'}
- dev: false
/css.escape/1.5.1:
resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
@@ -5704,7 +5699,6 @@ packages:
engines: {node: '>=10'}
dependencies:
mimic-response: 3.1.0
- dev: false
/dedent/0.7.0:
resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
@@ -5777,7 +5771,6 @@ packages:
/defer-to-connect/2.0.1:
resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
engines: {node: '>=10'}
- dev: false
/define-properties/1.1.4:
resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==}
@@ -6417,7 +6410,6 @@ packages:
/escape-regexp/0.0.1:
resolution: {integrity: sha512-jVgdsYRa7RKxTT6MKNC3gdT+BF0Gfhpel19+HMRZJC2L0PufB0XOBuXBoXj29NKHwuktnAXd1Z1lyiH/8vOTpw==}
- dev: false
/escape-string-regexp/1.0.5:
resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
@@ -7406,7 +7398,7 @@ packages:
readable-stream: 2.3.7
dev: false
- /follow-redirects/1.15.2:
+ /follow-redirects/1.15.2_debug@4.3.4:
resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
engines: {node: '>=4.0'}
peerDependencies:
@@ -7414,6 +7406,8 @@ packages:
peerDependenciesMeta:
debug:
optional: true
+ dependencies:
+ debug: 4.3.4
/for-each/0.3.3:
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
@@ -7446,7 +7440,6 @@ packages:
/form-data-encoder/2.1.4:
resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==}
engines: {node: '>= 14.17'}
- dev: false
/form-data/2.3.3:
resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
@@ -7901,7 +7894,6 @@ packages:
lowercase-keys: 3.0.0
p-cancelable: 3.0.0
responselike: 3.0.0
- dev: false
/graceful-fs/4.2.10:
resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
@@ -8164,7 +8156,6 @@ packages:
/html-entities/2.3.2:
resolution: {integrity: sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==}
- dev: false
/html-escaper/2.0.2:
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
@@ -8180,7 +8171,6 @@ packages:
/http-cache-semantics/4.1.1:
resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
- dev: false
/http-errors/2.0.0:
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
@@ -8236,7 +8226,6 @@ packages:
dependencies:
quick-lru: 5.1.1
resolve-alpn: 1.2.1
- dev: false
/http_ece/1.1.0:
resolution: {integrity: sha512-bptAfCDdPJxOs5zYSe7Y3lpr772s1G346R4Td5LgRUeCwIGpCGDUTJxRrhTNcAXbx37spge0kWEIH7QAYWNTlA==}
@@ -8464,7 +8453,6 @@ packages:
/ip-regex/4.3.0:
resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==}
engines: {node: '>=8'}
- dev: false
/ip-regex/5.0.0:
resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==}
@@ -8483,7 +8471,6 @@ packages:
/ipaddr.js/2.0.1:
resolution: {integrity: sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==}
engines: {node: '>= 10'}
- dev: false
/irregular-plurals/3.5.0:
resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==}
@@ -8699,7 +8686,6 @@ packages:
engines: {node: '>=8'}
dependencies:
ip-regex: 4.3.0
- dev: false
/is-lambda/1.0.1:
resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==}
@@ -9606,7 +9592,6 @@ packages:
/jschardet/3.0.0:
resolution: {integrity: sha512-lJH6tJ77V8Nzd5QWRkFYCLc13a3vADkh3r/Fi8HupZGWk2OVVDfnZP8V/VgQgZ+lzW0kG2UGb5hFgt3V3ndotQ==}
engines: {node: '>=0.1.90'}
- dev: false
/jsdom/21.1.0:
resolution: {integrity: sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg==}
@@ -9657,7 +9642,6 @@ packages:
/json-buffer/3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
- dev: false
/json-parse-even-better-errors/2.3.1:
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
@@ -9786,7 +9770,6 @@ packages:
resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==}
dependencies:
json-buffer: 3.0.1
- dev: false
/kind-of/3.2.2:
resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
@@ -10059,7 +10042,6 @@ packages:
/lowercase-keys/3.0.0:
resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- dev: false
/lru-cache/4.1.5:
resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==}
@@ -10287,12 +10269,10 @@ packages:
/mimic-response/3.1.0:
resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
engines: {node: '>=10'}
- dev: false
/mimic-response/4.0.0:
resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- dev: false
/min-indent/1.0.1:
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
@@ -10602,7 +10582,6 @@ packages:
/netmask/2.0.2:
resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==}
engines: {node: '>= 0.4.0'}
- dev: false
/next-tick/1.1.0:
resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
@@ -10758,7 +10737,6 @@ packages:
/normalize-url/8.0.0:
resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==}
engines: {node: '>=14.16'}
- dev: false
/now-and-later/2.0.1:
resolution: {integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==}
@@ -11038,7 +11016,6 @@ packages:
/p-cancelable/3.0.0:
resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==}
engines: {node: '>=12.20'}
- dev: false
/p-finally/1.0.0:
resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
@@ -11175,7 +11152,6 @@ packages:
dependencies:
domhandler: 5.0.3
parse5: 7.1.2
- dev: false
/parse5/5.1.1:
resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==}
@@ -11791,7 +11767,6 @@ packages:
ipaddr.js: 2.0.1
is-ip: 3.1.0
netmask: 2.0.2
- dev: false
/private-ip/3.0.0:
resolution: {integrity: sha512-HkMBs4nMtrP+cvcw0bDi2BAZIGgiKI4Zq8Oc+dMqNBpHS8iGL4+WO/pRtc8Bwnv9rjnV0QwMDwEBymFtqv7Kww==}
@@ -12099,7 +12074,6 @@ packages:
/quick-lru/5.1.1:
resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
engines: {node: '>=10'}
- dev: false
/random-seed/0.3.0:
resolution: {integrity: sha512-y13xtn3kcTlLub3HKWXxJNeC2qK4mB59evwZ5EkeRlolx+Bp2ztF7LbcZmyCnOqlHQrLnfuNbi1sVmm9lPDlDA==}
@@ -12470,7 +12444,6 @@ packages:
/resolve-alpn/1.2.1:
resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
- dev: false
/resolve-cwd/3.0.0:
resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
@@ -12539,7 +12512,6 @@ packages:
engines: {node: '>=14.16'}
dependencies:
lowercase-keys: 3.0.0
- dev: false
/restore-cursor/3.1.0:
resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
@@ -13706,7 +13678,6 @@ packages:
/trace-redirect/1.0.6:
resolution: {integrity: sha512-UUfa1DjjU5flcjMdaFIiIEGDTyu2y/IiMjOX4uGXa7meKBS4vD4f2Uy/tken9Qkd4Jsm4sRsfZcIIPqrRVF3Mg==}
- dev: false
/traverse/0.3.9:
resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==}
@@ -14425,6 +14396,18 @@ packages:
optionalDependencies:
fsevents: 2.3.2
+ /vitest-fetch-mock/0.2.2_vitest@0.29.2:
+ resolution: {integrity: sha512-XmH6QgTSjCWrqXoPREIdbj40T7i1xnGmAsTAgfckoO75W1IEHKR8hcPCQ7SO16RsdW1t85oUm6pcQRLeBgjVYQ==}
+ engines: {node: '>=14.14.0'}
+ peerDependencies:
+ vitest: '>=0.16.0'
+ dependencies:
+ cross-fetch: 3.1.5
+ vitest: 0.29.2_zcjcryjt4bqcdu7ggonulipgea
+ transitivePeerDependencies:
+ - encoding
+ dev: true
+
/vitest/0.29.2_zcjcryjt4bqcdu7ggonulipgea:
resolution: {integrity: sha512-ydK9IGbAvoY8wkg29DQ4ivcVviCaUi3ivuPKfZEVddMTenFHUfB8EEDXQV8+RasEk1ACFLgMUqAaDuQ/Nk+mQA==}
engines: {node: '>=v14.16.0'}
@@ -15013,7 +14996,6 @@ packages:
jschardet: 3.0.0
private-ip: 2.3.3
trace-redirect: 1.0.6
- dev: false
github.com/sampotts/plyr/d434c9af16e641400aaee93188594208d88f2658:
resolution: {tarball: https://codeload.github.com/sampotts/plyr/tar.gz/d434c9af16e641400aaee93188594208d88f2658}