This commit is contained in:
syuilo 2025-02-13 12:03:55 +09:00 committed by GitHub
commit 9737384ce1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 324 additions and 41 deletions

View File

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class GoogleAnalytics1739006797620 {
name = 'GoogleAnalytics1739006797620'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "googleAnalyticsMeasurementId" character varying(64)`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "googleAnalyticsMeasurementId"`);
}
}

View File

@ -97,6 +97,7 @@ export class MetaEntityService {
enableTurnstile: instance.enableTurnstile,
turnstileSiteKey: instance.turnstileSiteKey,
enableTestcaptcha: instance.enableTestcaptcha,
googleAnalyticsMeasurementId: instance.googleAnalyticsMeasurementId,
swPublickey: instance.swPublicKey,
themeColor: instance.themeColor,
mascotImageUrl: instance.mascotImageUrl ?? '/assets/ai.png',

View File

@ -658,4 +658,10 @@ export class MiMeta {
default: '{}',
})
public federationHosts: string[];
@Column('varchar', {
length: 64,
nullable: true,
})
public googleAnalyticsMeasurementId: string | null;
}

View File

@ -119,6 +119,10 @@ export const packedMetaLiteSchema = {
type: 'boolean',
optional: false, nullable: false,
},
googleAnalyticsMeasurementId: {
type: 'string',
optional: false, nullable: true,
},
swPublickey: {
type: 'string',
optional: false, nullable: true,

View File

@ -73,6 +73,10 @@ export const meta = {
type: 'boolean',
optional: false, nullable: false,
},
googleAnalyticsMeasurementId: {
type: 'string',
optional: false, nullable: true,
},
swPublickey: {
type: 'string',
optional: false, nullable: true,
@ -572,6 +576,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
enableTurnstile: instance.enableTurnstile,
turnstileSiteKey: instance.turnstileSiteKey,
enableTestcaptcha: instance.enableTestcaptcha,
googleAnalyticsMeasurementId: instance.googleAnalyticsMeasurementId,
swPublickey: instance.swPublicKey,
themeColor: instance.themeColor,
mascotImageUrl: instance.mascotImageUrl,

View File

@ -84,6 +84,7 @@ export const paramDef = {
turnstileSiteKey: { type: 'string', nullable: true },
turnstileSecretKey: { type: 'string', nullable: true },
enableTestcaptcha: { type: 'boolean' },
googleAnalyticsMeasurementId: { type: 'string', nullable: true },
sensitiveMediaDetection: { type: 'string', enum: ['none', 'all', 'local', 'remote'] },
sensitiveMediaDetectionSensitivity: { type: 'string', enum: ['medium', 'low', 'high', 'veryLow', 'veryHigh'] },
setSensitiveFlagAutomatically: { type: 'boolean' },
@ -371,6 +372,12 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
set.enableTestcaptcha = ps.enableTestcaptcha;
}
if (ps.googleAnalyticsMeasurementId !== undefined) {
// 空文字列をnullにしたいので??は使わない
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
set.googleAnalyticsMeasurementId = ps.googleAnalyticsMeasurementId || null;
}
if (ps.sensitiveMediaDetection !== undefined) {
set.sensitiveMediaDetection = ps.sensitiveMediaDetection;
}

View File

@ -16,6 +16,7 @@
"lint": "pnpm typecheck && pnpm eslint"
},
"dependencies": {
"@analytics/google-analytics": "^1.1.0",
"@discordapp/twemoji": "15.1.0",
"@github/webauthn-json": "2.1.1",
"@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
@ -29,6 +30,7 @@
"@vitejs/plugin-vue": "5.2.0",
"@vue/compiler-sfc": "3.5.12",
"aiscript-vscode": "github:aiscript-dev/aiscript-vscode#v0.1.15",
"analytics": "^0.8.16",
"astring": "1.9.0",
"broadcast-channel": "7.0.0",
"buraha": "0.0.1",

View File

@ -0,0 +1,107 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
import * as Misskey from 'misskey-js';
import type { AnalyticsInstance, AnalyticsPlugin } from 'analytics';
/**
* analytics moduleを読み込まなくても動作するようにするためのラッパー
*/
class AnalyticsProxy implements AnalyticsInstance {
private analytics?: AnalyticsInstance;
constructor(analytics?: AnalyticsInstance) {
if (analytics) {
this.analytics = analytics;
}
}
public setAnalytics(analytics: AnalyticsInstance) {
if (this.analytics) {
throw new Error('Analytics instance already exists.');
}
this.analytics = analytics;
}
public identify(...args: Parameters<AnalyticsInstance['identify']>) {
return this.analytics?.identify(...args) ?? Promise.resolve();
}
public track(...args: Parameters<AnalyticsInstance['track']>) {
return this.analytics?.track(...args) ?? Promise.resolve();
}
public page(...args: Parameters<AnalyticsInstance['page']>) {
return this.analytics?.page(...args) ?? Promise.resolve();
}
public user(...args: Parameters<AnalyticsInstance['user']>) {
return this.analytics?.user(...args) ?? Promise.resolve();
}
public reset(...args: Parameters<AnalyticsInstance['reset']>) {
return this.analytics?.reset(...args) ?? Promise.resolve();
}
public ready(...args: Parameters<AnalyticsInstance['ready']>) {
return this.analytics?.ready(...args) ?? function () { void 0; };
}
public on(...args: Parameters<AnalyticsInstance['on']>) {
return this.analytics?.on(...args) ?? function () { void 0; };
}
public once(...args: Parameters<AnalyticsInstance['once']>) {
return this.analytics?.once(...args) ?? function () { void 0; };
}
public getState(...args: Parameters<AnalyticsInstance['getState']>) {
return this.analytics?.getState(...args) ?? Promise.resolve();
}
public get storage() {
return this.analytics?.storage ?? {
getItem: () => null,
setItem: () => void 0,
removeItem: () => void 0,
};
}
public get plugins() {
return this.analytics?.plugins ?? {
enable: (p, c) => Promise.resolve(c ? c() : void 0),
disable: (p, c) => Promise.resolve(c ? c() : void 0),
};
}
}
export const analytics = new AnalyticsProxy();
export async function initAnalytics(instance: Misskey.entities.MetaDetailed) {
// アナリティクスプロバイダに関する設定がひとつもない場合は、アナリティクスモジュールを読み込まない
if (!instance.googleAnalyticsMeasurementId) {
return;
}
const { default: Analytics } = await import('analytics');
const plugins: AnalyticsPlugin[] = [];
// Google Analytics
if (instance.googleAnalyticsMeasurementId) {
const { default: googleAnalytics } = await import('@analytics/google-analytics');
plugins.push(googleAnalytics({
measurementIds: [instance.googleAnalyticsMeasurementId],
debug: _DEV_,
}));
}
analytics.setAnalytics(Analytics({
app: 'misskey',
version: _VERSION_,
debug: _DEV_,
plugins,
}));
}

View File

@ -21,6 +21,7 @@ import { reloadChannel } from '@/scripts/unison-reload.js';
import { getUrlWithoutLoginId } from '@/scripts/login-id.js';
import { getAccountFromId } from '@/scripts/get-account-from-id.js';
import { deckStore } from '@/ui/deck/deck-store.js';
import { analytics, initAnalytics } from '@/analytics.js';
import { miLocalStorage } from '@/local-storage.js';
import { fetchCustomEmojis } from '@/custom-emojis.js';
import { setupRouter } from '@/router/main.js';
@ -241,6 +242,14 @@ export async function common(createVue: () => App<Element>) {
await fetchCustomEmojis();
} catch (err) { /* empty */ }
await fetchInstanceMetaPromise;
await initAnalytics(instance);
if ($i) {
analytics.identify($i.id);
}
const app = createVue();
setupRouter(app, createMainRouter);

View File

@ -8,20 +8,34 @@ SPDX-License-Identifier: AGPL-3.0-only
<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template>
<MkSpacer :contentMax="700" :marginMin="16" :marginMax="32">
<FormSuspense :p="init">
<MkFolder>
<template #label>DeepL Translation</template>
<div class="_gaps_m">
<MkFolder>
<template #label>Google Analytics</template>
<div class="_gaps_m">
<MkInput v-model="deeplAuthKey">
<template #prefix><i class="ti ti-key"></i></template>
<template #label>DeepL Auth Key</template>
</MkInput>
<MkSwitch v-model="deeplIsPro">
<template #label>Pro account</template>
</MkSwitch>
<MkButton primary @click="save_deepl">Save</MkButton>
</div>
</MkFolder>
<div class="_gaps_m">
<MkInput v-model="googleAnalyticsMeasurementId">
<template #prefix><i class="ti ti-key"></i></template>
<template #label>Measurement ID</template>
</MkInput>
<MkButton primary @click="save_googleAnalytics">Save</MkButton>
</div>
</MkFolder>
<MkFolder>
<template #label>DeepL Translation</template>
<div class="_gaps_m">
<MkInput v-model="deeplAuthKey">
<template #prefix><i class="ti ti-key"></i></template>
<template #label>DeepL Auth Key</template>
</MkInput>
<MkSwitch v-model="deeplIsPro">
<template #label>Pro account</template>
</MkSwitch>
<MkButton primary @click="save_deepl">Save</MkButton>
</div>
</MkFolder>
</div>
</FormSuspense>
</MkSpacer>
</MkStickyContainer>
@ -44,10 +58,13 @@ import MkFolder from '@/components/MkFolder.vue';
const deeplAuthKey = ref<string>('');
const deeplIsPro = ref<boolean>(false);
const googleAnalyticsMeasurementId = ref<string>('');
async function init() {
const meta = await misskeyApi('admin/meta');
deeplAuthKey.value = meta.deeplAuthKey;
deeplAuthKey.value = meta.deeplAuthKey ?? '';
deeplIsPro.value = meta.deeplIsPro;
googleAnalyticsMeasurementId.value = meta.googleAnalyticsMeasurementId ?? '';
}
function save_deepl() {
@ -59,6 +76,14 @@ function save_deepl() {
});
}
function save_googleAnalytics() {
os.apiWithDialog('admin/update-meta', {
googleAnalyticsMeasurementId: googleAnalyticsMeasurementId.value,
}).then(() => {
fetchInstance(true);
});
}
const headerActions = computed(() => []);
const headerTabs = computed(() => []);

View File

@ -5042,6 +5042,7 @@ export type components = {
enableTurnstile: boolean;
turnstileSiteKey: string | null;
enableTestcaptcha: boolean;
googleAnalyticsMeasurementId: string | null;
swPublickey: string | null;
/** @default /assets/ai.png */
mascotImageUrl: string;
@ -8251,6 +8252,7 @@ export type operations = {
enableTurnstile: boolean;
turnstileSiteKey: string | null;
enableTestcaptcha: boolean;
googleAnalyticsMeasurementId: string | null;
swPublickey: string | null;
/** @default /assets/ai.png */
mascotImageUrl: string | null;
@ -10617,6 +10619,7 @@ export type operations = {
turnstileSiteKey?: string | null;
turnstileSecretKey?: string | null;
enableTestcaptcha?: boolean;
googleAnalyticsMeasurementId?: string | null;
/** @enum {string} */
sensitiveMediaDetection?: 'none' | 'all' | 'local' | 'remote';
/** @enum {string} */

View File

@ -685,6 +685,9 @@ importers:
packages/frontend:
dependencies:
'@analytics/google-analytics':
specifier: ^1.1.0
version: 1.1.0
'@discordapp/twemoji':
specifier: 15.1.0
version: 15.1.0
@ -724,6 +727,9 @@ importers:
aiscript-vscode:
specifier: github:aiscript-dev/aiscript-vscode#v0.1.15
version: https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/c3cde89e79a41d93540cf8a48cd619c3f2dcb1b7
analytics:
specifier: ^0.8.16
version: 0.8.16(@types/dlv@1.1.5)
astring:
specifier: 1.9.0
version: 1.9.0
@ -1454,6 +1460,30 @@ packages:
resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==}
engines: {node: '>=6.0.0'}
'@analytics/cookie-utils@0.2.12':
resolution: {integrity: sha512-2h/yuIu3kmu+ZJlKmlT6GoRvUEY2k1BbQBezEv5kGhnn9KpmzPz715Y3GmM2i+m7Y0QmBdVUoA260dQZkofs2A==}
'@analytics/core@0.12.17':
resolution: {integrity: sha512-GMxRm5Dp3Wam/w5NNvqNKMO6zWecozbVv21Kn4WhftCx6OjJI7zMlVtiLpjGjxa0RRZfVG80YhupF0Qh9XL2gw==}
'@analytics/global-storage-utils@0.1.7':
resolution: {integrity: sha512-V+spzGLZYm4biZT4uefaylm80SrLXf8WOTv9hCgA46cLcyxx3LD4GCpssp1lj+RcWLl/uXJQBRO4Mnn/o1x6Gw==}
'@analytics/google-analytics@1.1.0':
resolution: {integrity: sha512-i8uGyELMtwEUAf3GNWNLNBzhRvReDn1RUxvMdMhjUA7+GNGxPOM4kkzFfv3giQXKNxTEjfsh75kqNcscbJsuaA==}
'@analytics/localstorage-utils@0.1.10':
resolution: {integrity: sha512-uJS+Jp1yLG5VFCgA5T82ZODYBS0xuDQx0NtAZrgbqt9j51BX3TcgmOez5LVkrUNu/lpbxjCLq35I4TKj78VmOQ==}
'@analytics/session-storage-utils@0.0.7':
resolution: {integrity: sha512-PSv40UxG96HVcjY15e3zOqU2n8IqXnH8XvTkg1X43uXNTKVSebiI2kUjA3Q7ESFbw5DPwcLbJhV7GforpuBLDw==}
'@analytics/storage-utils@0.4.2':
resolution: {integrity: sha512-AXObwyVQw9h2uJh1t2hUgabtVxzYpW+7uKVbdHQK80vr3Td5rrmCxrCxarh7HUuAgSDZ0bZWqmYxVgmwKceaLg==}
'@analytics/type-utils@0.6.2':
resolution: {integrity: sha512-TD+xbmsBLyYy/IxFimW/YL/9L2IEnM7/EoV9Aeh56U64Ify8o27HJcKjo38XY9Tcn0uOq1AX3thkKgvtWvwFQg==}
'@apidevtools/swagger-methods@3.0.2':
resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==}
@ -4334,6 +4364,9 @@ packages:
'@types/disposable-email-domains@1.0.2':
resolution: {integrity: sha512-SDKwyYTjk3y5aZBxxc38yRecpJPjsqn57STz1bNxYYlv4k11bBe7QB8w4llXDTmQXKT1mFvgGmJv+8Zdu3YmJw==}
'@types/dlv@1.1.5':
resolution: {integrity: sha512-JHOWNfiWepAhfwlSw17kiWrWrk6od2dEQgHltJw9AS0JPFoLZJBge5+Dnil2NfdjAvJ/+vGSX60/BRW20PpUXw==}
'@types/doctrine@0.0.9':
resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==}
@ -4963,6 +4996,14 @@ packages:
alien-signals@0.2.1:
resolution: {integrity: sha512-FlEQrDJe9r2RI4cDlnK2zYqJezvx1uJaWEuwxsnlFqnPwvJbgitNBRumWrLDv8lA+7cCikpMxfJD2TTHiaTklA==}
analytics-utils@1.0.14:
resolution: {integrity: sha512-9v0kPd8v0GuBvfQcg5BO48AElaEAr9IXMAfJWXYMAhrD3QprgozEIUgMp/de0vS136PUOBB+10XQH9eBgBmfMw==}
peerDependencies:
'@types/dlv': ^1.0.0
analytics@0.8.16:
resolution: {integrity: sha512-LEFQ47G9V1zVp9WIh2xhnbmSFEJq+WEzSv6voJ5uba88lefiIIYeG2nq87gFu83ocz1qtb9u7XgeaKKVBbbgWA==}
ansi-colors@4.1.3:
resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
engines: {node: '>=6'}
@ -6054,6 +6095,9 @@ packages:
disposable-email-domains@1.0.62:
resolution: {integrity: sha512-LBQvhRw7mznQTPoyZbsmYeNOZt1pN5aCsx4BAU/3siVFuiM9f2oyKzUaB8v1jbxFjE3aYqYiMo63kAL4pHgfWQ==}
dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
doctrine@2.1.0:
resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
engines: {node: '>=0.10.0'}
@ -7854,6 +7898,7 @@ packages:
lodash.get@4.4.2:
resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
deprecated: This package is deprecated. Use the optional chaining (?.) operator instead.
lodash.isarguments@3.1.0:
resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==}
@ -11139,6 +11184,42 @@ snapshots:
'@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25
'@analytics/cookie-utils@0.2.12':
dependencies:
'@analytics/global-storage-utils': 0.1.7
'@analytics/core@0.12.17(@types/dlv@1.1.5)':
dependencies:
'@analytics/global-storage-utils': 0.1.7
'@analytics/type-utils': 0.6.2
analytics-utils: 1.0.14(@types/dlv@1.1.5)
transitivePeerDependencies:
- '@types/dlv'
'@analytics/global-storage-utils@0.1.7':
dependencies:
'@analytics/type-utils': 0.6.2
'@analytics/google-analytics@1.1.0': {}
'@analytics/localstorage-utils@0.1.10':
dependencies:
'@analytics/global-storage-utils': 0.1.7
'@analytics/session-storage-utils@0.0.7':
dependencies:
'@analytics/global-storage-utils': 0.1.7
'@analytics/storage-utils@0.4.2':
dependencies:
'@analytics/cookie-utils': 0.2.12
'@analytics/global-storage-utils': 0.1.7
'@analytics/localstorage-utils': 0.1.10
'@analytics/session-storage-utils': 0.0.7
'@analytics/type-utils': 0.6.2
'@analytics/type-utils@0.6.2': {}
'@apidevtools/swagger-methods@3.0.2': {}
'@aws-crypto/crc32@5.2.0':
@ -11675,7 +11756,7 @@ snapshots:
'@babel/traverse': 7.23.5
'@babel/types': 7.24.7
convert-source-map: 2.0.0
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
@ -11695,7 +11776,7 @@ snapshots:
'@babel/traverse': 7.24.7
'@babel/types': 7.24.7
convert-source-map: 2.0.0
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
@ -11954,7 +12035,7 @@ snapshots:
'@babel/helper-split-export-declaration': 7.22.6
'@babel/parser': 7.25.6
'@babel/types': 7.24.7
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
globals: 11.12.0
transitivePeerDependencies:
- supports-color
@ -11969,7 +12050,7 @@ snapshots:
'@babel/helper-split-export-declaration': 7.24.7
'@babel/parser': 7.25.6
'@babel/types': 7.25.6
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
globals: 11.12.0
transitivePeerDependencies:
- supports-color
@ -12360,7 +12441,7 @@ snapshots:
'@eslint/config-array@0.18.0':
dependencies:
'@eslint/object-schema': 2.1.4
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
@ -12370,7 +12451,7 @@ snapshots:
'@eslint/eslintrc@3.1.0':
dependencies:
ajv: 6.12.6
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
espree: 10.3.0
globals: 14.0.0
ignore: 5.3.1
@ -14787,6 +14868,8 @@ snapshots:
'@types/disposable-email-domains@1.0.2': {}
'@types/dlv@1.1.5': {}
'@types/doctrine@0.0.9': {}
'@types/eslint@7.29.0':
@ -15145,7 +15228,7 @@ snapshots:
dependencies:
'@typescript-eslint/typescript-estree': 7.1.0(typescript@5.6.3)
'@typescript-eslint/utils': 7.1.0(eslint@9.14.0)(typescript@5.6.3)
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
eslint: 9.14.0
ts-api-utils: 1.0.1(typescript@5.6.3)
optionalDependencies:
@ -15157,7 +15240,7 @@ snapshots:
dependencies:
'@typescript-eslint/typescript-estree': 7.17.0(typescript@5.6.3)
'@typescript-eslint/utils': 7.17.0(eslint@9.14.0)(typescript@5.6.3)
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
eslint: 9.14.0
ts-api-utils: 1.3.0(typescript@5.6.3)
optionalDependencies:
@ -15173,7 +15256,7 @@ snapshots:
dependencies:
'@typescript-eslint/types': 7.1.0
'@typescript-eslint/visitor-keys': 7.1.0
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.3
@ -15188,7 +15271,7 @@ snapshots:
dependencies:
'@typescript-eslint/types': 7.17.0
'@typescript-eslint/visitor-keys': 7.17.0
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.4
@ -15518,14 +15601,14 @@ snapshots:
agent-base@6.0.2:
dependencies:
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
optional: true
agent-base@7.1.0:
dependencies:
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
@ -15590,6 +15673,19 @@ snapshots:
alien-signals@0.2.1: {}
analytics-utils@1.0.14(@types/dlv@1.1.5):
dependencies:
'@analytics/type-utils': 0.6.2
'@types/dlv': 1.1.5
dlv: 1.1.3
analytics@0.8.16(@types/dlv@1.1.5):
dependencies:
'@analytics/core': 0.12.17(@types/dlv@1.1.5)
'@analytics/storage-utils': 0.4.2
transitivePeerDependencies:
- '@types/dlv'
ansi-colors@4.1.3: {}
ansi-escapes@4.3.2:
@ -16842,6 +16938,8 @@ snapshots:
disposable-email-domains@1.0.62: {}
dlv@1.1.3: {}
doctrine@2.1.0:
dependencies:
esutils: 2.0.3
@ -17123,7 +17221,7 @@ snapshots:
esbuild-register@3.5.0(esbuild@0.24.0):
dependencies:
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
esbuild: 0.24.0
transitivePeerDependencies:
- supports-color
@ -17365,7 +17463,7 @@ snapshots:
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.3
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
escape-string-regexp: 4.0.0
eslint-scope: 8.2.0
eslint-visitor-keys: 4.2.0
@ -17810,7 +17908,7 @@ snapshots:
follow-redirects@1.15.9(debug@4.3.7):
optionalDependencies:
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
for-each@0.3.3:
dependencies:
@ -18249,7 +18347,7 @@ snapshots:
http-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.0
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
@ -18282,7 +18380,7 @@ snapshots:
https-proxy-agent@5.0.1:
dependencies:
agent-base: 6.0.2
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
optional: true
@ -18290,14 +18388,14 @@ snapshots:
https-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.0
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
https-proxy-agent@7.0.5:
dependencies:
agent-base: 7.1.0
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
@ -18639,7 +18737,7 @@ snapshots:
istanbul-lib-source-maps@4.0.1:
dependencies:
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
istanbul-lib-coverage: 3.2.2
source-map: 0.6.1
transitivePeerDependencies:
@ -18648,7 +18746,7 @@ snapshots:
istanbul-lib-source-maps@5.0.4:
dependencies:
'@jridgewell/trace-mapping': 0.3.25
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
istanbul-lib-coverage: 3.2.2
transitivePeerDependencies:
- supports-color
@ -19739,7 +19837,7 @@ snapshots:
micromark@4.0.0:
dependencies:
'@types/debug': 4.1.12
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
decode-named-character-reference: 1.0.2
devlop: 1.1.0
micromark-core-commonmark: 2.0.0
@ -21136,7 +21234,7 @@ snapshots:
require-in-the-middle@7.3.0:
dependencies:
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
module-details-from-path: 1.0.3
resolve: 1.22.8
transitivePeerDependencies:
@ -21561,7 +21659,7 @@ snapshots:
socks-proxy-agent@8.0.2:
dependencies:
agent-base: 7.1.0
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
socks: 2.7.1
transitivePeerDependencies:
- supports-color
@ -21670,7 +21768,7 @@ snapshots:
arg: 5.0.2
bluebird: 3.7.2
check-more-types: 2.24.0
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
execa: 5.1.1
lazy-ass: 1.6.0
ps-tree: 1.2.0
@ -22404,7 +22502,7 @@ snapshots:
vite-node@1.6.0(@types/node@22.9.0)(sass@1.79.3)(terser@5.36.0):
dependencies:
cac: 6.7.14
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
pathe: 1.1.2
picocolors: 1.0.1
vite: 5.4.11(@types/node@22.9.0)(sass@1.79.3)(terser@5.36.0)
@ -22422,7 +22520,7 @@ snapshots:
vite-node@1.6.0(@types/node@22.9.0)(sass@1.79.4)(terser@5.36.0):
dependencies:
cac: 6.7.14
debug: 4.3.7(supports-color@8.1.1)
debug: 4.3.7(supports-color@5.5.0)
pathe: 1.1.2
picocolors: 1.0.1
vite: 5.4.11(@types/node@22.9.0)(sass@1.79.4)(terser@5.36.0)