mirror of
https://github.com/immich-app/services.git
synced 2026-09-30 21:27:59 +08:00
chore(deps): update dependency eslint-plugin-unicorn to v76 (#141)
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
This commit is contained in:
co-authored by
Daniel Dietzler
parent
79511fee1b
commit
b6b72932d9
@@ -237,10 +237,13 @@ export class CloudflareMetricsCollector {
|
|||||||
const zoneNames: string[] = [];
|
const zoneNames: string[] = [];
|
||||||
for (const tag of cache.bulkZoneTags) {
|
for (const tag of cache.bulkZoneTags) {
|
||||||
const name = cache.zones.get(tag);
|
const name = cache.zones.get(tag);
|
||||||
if (name !== undefined) {
|
|
||||||
zoneTags.push(tag);
|
if (name === undefined) {
|
||||||
zoneNames.push(name);
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
zoneTags.push(tag);
|
||||||
|
zoneNames.push(name);
|
||||||
}
|
}
|
||||||
if (zoneTags.length === 0) {
|
if (zoneTags.length === 0) {
|
||||||
this.metrics.push(
|
this.metrics.push(
|
||||||
@@ -287,12 +290,14 @@ export class CloudflareMetricsCollector {
|
|||||||
row.dimensions = { zoneTag };
|
row.dimensions = { zoneTag };
|
||||||
}
|
}
|
||||||
const metric = buildMetric(dataset, row, this.accountTag, cache);
|
const metric = buildMetric(dataset, row, this.accountTag, cache);
|
||||||
if (metric) {
|
if (!metric) {
|
||||||
metric.addTag('zone_tag', zoneTag);
|
continue;
|
||||||
metric.addTag('zone_name', zoneName);
|
|
||||||
this.metrics.pushRaw(metric);
|
|
||||||
totalPoints++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metric.addTag('zone_tag', zoneTag);
|
||||||
|
metric.addTag('zone_name', zoneName);
|
||||||
|
this.metrics.pushRaw(metric);
|
||||||
|
totalPoints++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -322,10 +327,12 @@ export class CloudflareMetricsCollector {
|
|||||||
let emitted = 0;
|
let emitted = 0;
|
||||||
for (const row of rows) {
|
for (const row of rows) {
|
||||||
const metric = buildMetric(dataset, row, this.accountTag, cache);
|
const metric = buildMetric(dataset, row, this.accountTag, cache);
|
||||||
if (metric) {
|
if (!metric) {
|
||||||
this.metrics.pushRaw(metric);
|
continue;
|
||||||
emitted++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.metrics.pushRaw(metric);
|
||||||
|
emitted++;
|
||||||
}
|
}
|
||||||
return emitted;
|
return emitted;
|
||||||
}
|
}
|
||||||
@@ -367,10 +374,7 @@ function errorMessage(error: unknown): string {
|
|||||||
const body = error.responseBody?.slice(0, 200) ?? '';
|
const body = error.responseBody?.slice(0, 200) ?? '';
|
||||||
return body ? `${error.message}: ${body}` : error.message;
|
return body ? `${error.message}: ${body}` : error.message;
|
||||||
}
|
}
|
||||||
if (error instanceof Error) {
|
return error instanceof Error ? error.message : String(error);
|
||||||
return error.message;
|
|
||||||
}
|
|
||||||
return String(error);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function errorTag(error: unknown): string {
|
function errorTag(error: unknown): string {
|
||||||
@@ -404,8 +408,5 @@ function errorTag(error: unknown): string {
|
|||||||
Truncate a string for use as a metric tag value.
|
Truncate a string for use as a metric tag value.
|
||||||
*/
|
*/
|
||||||
function truncateTag(value: string, maxLength: number): string {
|
function truncateTag(value: string, maxLength: number): string {
|
||||||
if (value.length <= maxLength) {
|
return value.length <= maxLength ? value : value.slice(0, maxLength - 3) + '...';
|
||||||
return value;
|
|
||||||
}
|
|
||||||
return value.slice(0, maxLength - 3) + '...';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,11 +37,13 @@ function getTagEnricher(dataset: DatasetQuery): TagEnricher {
|
|||||||
case 'd1QueriesAdaptiveGroups': {
|
case 'd1QueriesAdaptiveGroups': {
|
||||||
cached = (metric, row, cache) => {
|
cached = (metric, row, cache) => {
|
||||||
const id = row.dimensions?.databaseId;
|
const id = row.dimensions?.databaseId;
|
||||||
if (typeof id === 'string' && id !== '') {
|
if (typeof id !== 'string' || id === '') {
|
||||||
const name = cache.d1Databases.get(id);
|
return;
|
||||||
if (name) {
|
}
|
||||||
metric.addTag('database_name', name);
|
|
||||||
}
|
const name = cache.d1Databases.get(id);
|
||||||
|
if (name) {
|
||||||
|
metric.addTag('database_name', name);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
@@ -50,11 +52,13 @@ function getTagEnricher(dataset: DatasetQuery): TagEnricher {
|
|||||||
case 'queueBacklogAdaptiveGroups': {
|
case 'queueBacklogAdaptiveGroups': {
|
||||||
cached = (metric, row, cache) => {
|
cached = (metric, row, cache) => {
|
||||||
const id = row.dimensions?.queueId;
|
const id = row.dimensions?.queueId;
|
||||||
if (typeof id === 'string' && id !== '') {
|
if (typeof id !== 'string' || id === '') {
|
||||||
const name = cache.queues.get(id);
|
return;
|
||||||
if (name) {
|
}
|
||||||
metric.addTag('queue_name', name);
|
|
||||||
}
|
const name = cache.queues.get(id);
|
||||||
|
if (name) {
|
||||||
|
metric.addTag('queue_name', name);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
@@ -125,11 +129,7 @@ export function buildMetric(
|
|||||||
hasField = true;
|
hasField = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hasField) {
|
return hasField ? metric : null;
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return metric;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function resolveTimestamp(dataset: DatasetQuery, row: DatasetRow): Date | null {
|
export function resolveTimestamp(dataset: DatasetQuery, row: DatasetRow): Date | null {
|
||||||
@@ -144,10 +144,7 @@ export function resolveTimestamp(dataset: DatasetQuery, row: DatasetRow): Date |
|
|||||||
return new Date(`${str}T00:00:00Z`);
|
return new Date(`${str}T00:00:00Z`);
|
||||||
}
|
}
|
||||||
const date = new Date(str);
|
const date = new Date(str);
|
||||||
if (Number.isNaN(date.getTime())) {
|
return Number.isNaN(date.getTime()) ? null : date;
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return date;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function normalizeTagValue(raw?: unknown): string | undefined {
|
export function normalizeTagValue(raw?: unknown): string | undefined {
|
||||||
@@ -157,8 +154,5 @@ export function normalizeTagValue(raw?: unknown): string | undefined {
|
|||||||
if (typeof raw === 'string') {
|
if (typeof raw === 'string') {
|
||||||
return raw === '' ? undefined : raw;
|
return raw === '' ? undefined : raw;
|
||||||
}
|
}
|
||||||
if (typeof raw === 'number' || typeof raw === 'boolean') {
|
return typeof raw === 'number' || typeof raw === 'boolean' ? String(raw) : undefined;
|
||||||
return String(raw);
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,10 +98,12 @@ export function groupErrorsByAlias(
|
|||||||
}
|
}
|
||||||
for (const error of errors) {
|
for (const error of errors) {
|
||||||
const alias = findAliasInPath(error.path);
|
const alias = findAliasInPath(error.path);
|
||||||
if (alias) {
|
if (!alias) {
|
||||||
const existing = result[alias];
|
continue;
|
||||||
result[alias] = existing ? `${existing}; ${error.message}` : error.message;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const existing = result[alias];
|
||||||
|
result[alias] = existing ? `${existing}; ${error.message}` : error.message;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -117,10 +119,7 @@ function findAliasInPath(path: readonly (string | number)[] | undefined): string
|
|||||||
// the `dimensions` / `sum` / etc. internals.
|
// the `dimensions` / `sum` / etc. internals.
|
||||||
for (let i = 0; i < path.length; i++) {
|
for (let i = 0; i < path.length; i++) {
|
||||||
const segment = path[i];
|
const segment = path[i];
|
||||||
if (typeof segment !== 'string') {
|
if (typeof segment !== 'string' || ['viewer', 'accounts', 'zones'].includes(segment)) {
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (['viewer', 'accounts', 'zones'].includes(segment)) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
return segment;
|
return segment;
|
||||||
@@ -132,8 +131,5 @@ function orderByClause(dataset: DatasetQuery): string {
|
|||||||
const timestampDim = dataset.timestampDimension ?? 'datetimeMinute';
|
const timestampDim = dataset.timestampDimension ?? 'datetimeMinute';
|
||||||
// Grouping implicitly takes place on the dimensions, so orderBy helps
|
// Grouping implicitly takes place on the dimensions, so orderBy helps
|
||||||
// make sure we get the most recent buckets within the limit.
|
// make sure we get the most recent buckets within the limit.
|
||||||
if (dataset.dimensions.includes(timestampDim)) {
|
return dataset.dimensions.includes(timestampDim) ? `, orderBy: [${timestampDim}_ASC]` : '';
|
||||||
return `, orderBy: [${timestampDim}_ASC]`;
|
|
||||||
}
|
|
||||||
return '';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,17 +131,11 @@ function computeWindowMs(isColdStart: boolean, lastSuccessfulEndMs: number | nul
|
|||||||
// (scheduled - lag) - lastEnd. Using scheduled time (not wall clock)
|
// (scheduled - lag) - lastEnd. Using scheduled time (not wall clock)
|
||||||
// so catch-up invocations compute the gap correctly.
|
// so catch-up invocations compute the gap correctly.
|
||||||
const gapMs = scheduledMs - DEFAULT_LAG_MS - lastSuccessfulEndMs;
|
const gapMs = scheduledMs - DEFAULT_LAG_MS - lastSuccessfulEndMs;
|
||||||
if (gapMs > DEFAULT_WINDOW_MS) {
|
return gapMs > DEFAULT_WINDOW_MS ? Math.min(gapMs, MAX_BACKFILL_MS) : DEFAULT_WINDOW_MS;
|
||||||
return Math.min(gapMs, MAX_BACKFILL_MS);
|
|
||||||
}
|
|
||||||
return DEFAULT_WINDOW_MS;
|
|
||||||
}
|
}
|
||||||
// Fresh isolate with no prior state — use a shorter backfill window
|
// Fresh isolate with no prior state — use a shorter backfill window
|
||||||
// since cold-start ticks already do extra work resolving resource caches.
|
// since cold-start ticks already do extra work resolving resource caches.
|
||||||
if (isColdStart) {
|
return isColdStart ? 15 * 60 * 1000 : DEFAULT_WINDOW_MS;
|
||||||
return 15 * 60 * 1000;
|
|
||||||
}
|
|
||||||
return DEFAULT_WINDOW_MS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function runCollection(
|
async function runCollection(
|
||||||
|
|||||||
@@ -96,10 +96,12 @@ describe.skipIf(!hasCredentials)('Cloudflare GraphQL integration', () => {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const blockData = (row as unknown as Record<string, Record<string, unknown> | undefined>)[block];
|
const blockData = (row as unknown as Record<string, Record<string, unknown> | undefined>)[block];
|
||||||
if (blockData && key in blockData) {
|
if (!blockData || !(key in blockData)) {
|
||||||
const value = blockData[key];
|
continue;
|
||||||
expect(value === null || typeof value === 'number', `${dataset.key}.${block}.${key}`).toBe(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const value = blockData[key];
|
||||||
|
expect(value === null || typeof value === 'number', `${dataset.key}.${block}.${key}`).toBe(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,37 +39,31 @@ export class HeaderMetricsProvider implements IMetricsProviderRepository {
|
|||||||
// Measurement: escape `,` and ` `.
|
// Measurement: escape `,` and ` `.
|
||||||
// Tag key / tag value / field key: escape `,`, `=`, ` `.
|
// Tag key / tag value / field key: escape `,`, `=`, ` `.
|
||||||
function escapeMeasurement(s: string): string {
|
function escapeMeasurement(s: string): string {
|
||||||
if (!s.includes(',') && !s.includes(' ')) {
|
return !s.includes(',') && !s.includes(' ') ? s : s.replaceAll(',', String.raw`\,`).replaceAll(' ', String.raw`\ `);
|
||||||
return s;
|
|
||||||
}
|
|
||||||
return s.replaceAll(',', String.raw`\,`).replaceAll(' ', String.raw`\ `);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function escapeTagKey(s: string): string {
|
function escapeTagKey(s: string): string {
|
||||||
if (!s.includes(',') && !s.includes('=') && !s.includes(' ')) {
|
return !s.includes(',') && !s.includes('=') && !s.includes(' ')
|
||||||
return s;
|
? s
|
||||||
}
|
: s
|
||||||
return s
|
.replaceAll(',', String.raw`\,`)
|
||||||
.replaceAll(',', String.raw`\,`)
|
.replaceAll('=', String.raw`\=`)
|
||||||
.replaceAll('=', String.raw`\=`)
|
.replaceAll(' ', String.raw`\ `);
|
||||||
.replaceAll(' ', String.raw`\ `);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function escapeTagValue(s: string): string {
|
function escapeTagValue(s: string): string {
|
||||||
if (!s.includes(',') && !s.includes('=') && !s.includes(' ')) {
|
return !s.includes(',') && !s.includes('=') && !s.includes(' ')
|
||||||
return s;
|
? s
|
||||||
}
|
: s
|
||||||
return s
|
.replaceAll(',', String.raw`\,`)
|
||||||
.replaceAll(',', String.raw`\,`)
|
.replaceAll('=', String.raw`\=`)
|
||||||
.replaceAll('=', String.raw`\=`)
|
.replaceAll(' ', String.raw`\ `);
|
||||||
.replaceAll(' ', String.raw`\ `);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getMetricsWriteUrl(environment: string): string {
|
function getMetricsWriteUrl(environment: string): string {
|
||||||
if (environment === 'prod') {
|
return environment === 'prod'
|
||||||
return 'https://cf-workers.monitoring.immich.cloud/write';
|
? 'https://cf-workers.monitoring.immich.cloud/write'
|
||||||
}
|
: `https://cf-workers.monitoring.${environment || 'dev'}.immich.cloud/write`;
|
||||||
return `https://cf-workers.monitoring.${environment || 'dev'}.immich.cloud/write`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export class InfluxMetricsProvider implements IMetricsProviderRepository {
|
export class InfluxMetricsProvider implements IMetricsProviderRepository {
|
||||||
|
|||||||
@@ -214,15 +214,9 @@ export class ResourceCacheService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function errorMessage(error: unknown): string {
|
function errorMessage(error: unknown): string {
|
||||||
if (error instanceof Error) {
|
return error instanceof Error ? error.message : String(error);
|
||||||
return error.message;
|
|
||||||
}
|
|
||||||
return String(error);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function errorTag(error: unknown): string {
|
function errorTag(error: unknown): string {
|
||||||
if (error instanceof Error) {
|
return error instanceof Error ? error.name : 'unknown';
|
||||||
return error.name;
|
|
||||||
}
|
|
||||||
return 'unknown';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,15 +14,9 @@ const MAX_BACKFILL_MS = 30 * 60 * 1000;
|
|||||||
function computeWindowMs(isColdStart: boolean, lastSuccessfulEndMs: number | null, scheduledMs: number): number {
|
function computeWindowMs(isColdStart: boolean, lastSuccessfulEndMs: number | null, scheduledMs: number): number {
|
||||||
if (lastSuccessfulEndMs !== null) {
|
if (lastSuccessfulEndMs !== null) {
|
||||||
const gapMs = scheduledMs - DEFAULT_LAG_MS - lastSuccessfulEndMs;
|
const gapMs = scheduledMs - DEFAULT_LAG_MS - lastSuccessfulEndMs;
|
||||||
if (gapMs > DEFAULT_WINDOW_MS) {
|
return gapMs > DEFAULT_WINDOW_MS ? Math.min(gapMs, MAX_BACKFILL_MS) : DEFAULT_WINDOW_MS;
|
||||||
return Math.min(gapMs, MAX_BACKFILL_MS);
|
|
||||||
}
|
|
||||||
return DEFAULT_WINDOW_MS;
|
|
||||||
}
|
}
|
||||||
if (isColdStart) {
|
return isColdStart ? 15 * 60 * 1000 : DEFAULT_WINDOW_MS;
|
||||||
return 15 * 60 * 1000;
|
|
||||||
}
|
|
||||||
return DEFAULT_WINDOW_MS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
describe('computeWindowMs', () => {
|
describe('computeWindowMs', () => {
|
||||||
|
|||||||
@@ -137,10 +137,7 @@ export class FakeRestClient implements ICloudflareRestClient {
|
|||||||
// eslint-disable-next-line @typescript-eslint/require-await
|
// eslint-disable-next-line @typescript-eslint/require-await
|
||||||
async getZone(zoneId: string) {
|
async getZone(zoneId: string) {
|
||||||
this.zoneCalls.push(zoneId);
|
this.zoneCalls.push(zoneId);
|
||||||
if (zoneId in this.individualZones) {
|
return zoneId in this.individualZones ? this.individualZones[zoneId] : null;
|
||||||
return this.individualZones[zoneId];
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -118,12 +118,14 @@ export class ApprovalValidator {
|
|||||||
};
|
};
|
||||||
allReviews.push(reviewInfo);
|
allReviews.push(reviewInfo);
|
||||||
|
|
||||||
if (review.state === 'APPROVED') {
|
if (review.state !== 'APPROVED') {
|
||||||
const isAuthorized = authorizedApprovers.some((approver) => approver.id === userId);
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (isAuthorized) {
|
const isAuthorized = authorizedApprovers.some((approver) => approver.id === userId);
|
||||||
validApprovals.push(review.user.login);
|
|
||||||
}
|
if (isAuthorized) {
|
||||||
|
validApprovals.push(review.user.login);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,10 +5,7 @@
|
|||||||
export const CHECK_NAME = 'Approval Check';
|
export const CHECK_NAME = 'Approval Check';
|
||||||
|
|
||||||
export function getCheckName(environment?: string): string {
|
export function getCheckName(environment?: string): string {
|
||||||
if (environment && environment !== 'prod') {
|
return environment && environment !== 'prod' ? `${CHECK_NAME} (${environment})` : CHECK_NAME;
|
||||||
return `${CHECK_NAME} (${environment})`;
|
|
||||||
}
|
|
||||||
return CHECK_NAME;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const GREPTILE = { username: 'greptile-apps[bot]', id: 165_735_046 };
|
const GREPTILE = { username: 'greptile-apps[bot]', id: 165_735_046 };
|
||||||
|
|||||||
@@ -24,9 +24,7 @@ export class DocsService {
|
|||||||
function toDocsVersion(version: SemVer): DocsVersion {
|
function toDocsVersion(version: SemVer): DocsVersion {
|
||||||
const label = `v${version.version}`;
|
const label = `v${version.version}`;
|
||||||
|
|
||||||
if (gte(version, FIRST_DOCS_SUBDOMAIN)) {
|
return gte(version, FIRST_DOCS_SUBDOMAIN)
|
||||||
return { label, url: `https://docs.${label}.archive.immich.app` };
|
? { label, url: `https://docs.${label}.archive.immich.app` }
|
||||||
}
|
: { label, url: `https://${label}.archive.immich.app`, rootPath: '/docs' };
|
||||||
|
|
||||||
return { label, url: `https://${label}.archive.immich.app`, rootPath: '/docs' };
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,10 +60,7 @@ export class GitHubRepository implements IGitHubRepository {
|
|||||||
allReleases.sort((a, b) => {
|
allReleases.sort((a, b) => {
|
||||||
const semverA = semver.parse(a.tag_name);
|
const semverA = semver.parse(a.tag_name);
|
||||||
const semverB = semver.parse(b.tag_name);
|
const semverB = semver.parse(b.tag_name);
|
||||||
if (!semverA || !semverB) {
|
return !semverA || !semverB ? 0 : semver.compare(semverB, semverA);
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return semver.compare(semverB, semverA);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return allReleases;
|
return allReleases;
|
||||||
|
|||||||
@@ -758,6 +758,7 @@ describe('Cron sync', () => {
|
|||||||
const request = new Request(input, init);
|
const request = new Request(input, init);
|
||||||
const url = new URL(request.url);
|
const url = new URL(request.url);
|
||||||
|
|
||||||
|
// eslint-disable-next-line unicorn/prefer-ternary
|
||||||
if (
|
if (
|
||||||
request.method === 'GET' &&
|
request.method === 'GET' &&
|
||||||
url.origin === 'https://api.github.com' &&
|
url.origin === 'https://api.github.com' &&
|
||||||
@@ -836,10 +837,9 @@ describe('GitHubRepository', () => {
|
|||||||
|
|
||||||
vi.spyOn(globalThis, 'fetch').mockImplementation((input, init) => {
|
vi.spyOn(globalThis, 'fetch').mockImplementation((input, init) => {
|
||||||
const url = new URL(new Request(input, init).url);
|
const url = new URL(new Request(input, init).url);
|
||||||
if (url.origin === 'https://api.github.com' && url.pathname === '/repos/immich-app/immich/releases') {
|
return url.origin === 'https://api.github.com' && url.pathname === '/repos/immich-app/immich/releases'
|
||||||
return Promise.resolve(Response.json(githubReleases));
|
? Promise.resolve(Response.json(githubReleases))
|
||||||
}
|
: Promise.reject(new Error(`unexpected fetch: ${url.href}`));
|
||||||
return Promise.reject(new Error(`unexpected fetch: ${url.href}`));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const releases = await new GitHubRepository().fetchReleases();
|
const releases = await new GitHubRepository().fetchReleases();
|
||||||
|
|||||||
@@ -109,10 +109,7 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const latest = await versionService.getLatestVersion(deferredRepository, channel);
|
const latest = await versionService.getLatestVersion(deferredRepository, channel);
|
||||||
if (!latest) {
|
return latest ? jsonResponse(latest) : errorResponse('No releases found', 404);
|
||||||
return errorResponse('No releases found', 404);
|
|
||||||
}
|
|
||||||
return jsonResponse(latest);
|
|
||||||
},
|
},
|
||||||
)();
|
)();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,10 +94,9 @@ export class HeaderMetricsProvider implements IMetricsProviderRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getMetricsWriteUrl(environment: string): string {
|
function getMetricsWriteUrl(environment: string): string {
|
||||||
if (environment === 'prod') {
|
return environment === 'prod'
|
||||||
return 'https://cf-workers.monitoring.immich.cloud/write';
|
? 'https://cf-workers.monitoring.immich.cloud/write'
|
||||||
}
|
: `https://cf-workers.monitoring.${environment || 'dev'}.immich.cloud/write`;
|
||||||
return `https://cf-workers.monitoring.${environment || 'dev'}.immich.cloud/write`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export class InfluxMetricsProvider implements IMetricsProviderRepository {
|
export class InfluxMetricsProvider implements IMetricsProviderRepository {
|
||||||
|
|||||||
@@ -146,15 +146,17 @@ export class VersionService {
|
|||||||
|
|
||||||
async emitLatestVersion(): Promise<void> {
|
async emitLatestVersion(): Promise<void> {
|
||||||
const latest = await this.releaseRepository.getLatest();
|
const latest = await this.releaseRepository.getLatest();
|
||||||
if (latest) {
|
if (!latest) {
|
||||||
const version = latest.tag_name.replace(/^v/, '');
|
return;
|
||||||
this.metrics.push(
|
|
||||||
Metric.create('latest_version')
|
|
||||||
.addTag('version', version)
|
|
||||||
.addTag('user_agent', `immich-server/${version}`)
|
|
||||||
.intField('count', 1),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const version = latest.tag_name.replace(/^v/, '');
|
||||||
|
this.metrics.push(
|
||||||
|
Metric.create('latest_version')
|
||||||
|
.addTag('version', version)
|
||||||
|
.addTag('user_agent', `immich-server/${version}`)
|
||||||
|
.intField('count', 1),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
isValidChannel(channel: string): channel is ReleaseChannel {
|
isValidChannel(channel: string): channel is ReleaseChannel {
|
||||||
|
|||||||
+1
-1
@@ -22,7 +22,7 @@
|
|||||||
"eslint": "^10.0.0",
|
"eslint": "^10.0.0",
|
||||||
"eslint-config-prettier": "^10.0.1",
|
"eslint-config-prettier": "^10.0.1",
|
||||||
"eslint-plugin-prettier": "^5.5.4",
|
"eslint-plugin-prettier": "^5.5.4",
|
||||||
"eslint-plugin-unicorn": "^74.0.0",
|
"eslint-plugin-unicorn": "^76.0.0",
|
||||||
"globals": "^17.0.0",
|
"globals": "^17.0.0",
|
||||||
"prettier": "^3.4.2",
|
"prettier": "^3.4.2",
|
||||||
"prettier-plugin-organize-imports": "^4.2.0",
|
"prettier-plugin-organize-imports": "^4.2.0",
|
||||||
|
|||||||
Generated
+6
-80
@@ -36,8 +36,8 @@ importers:
|
|||||||
specifier: ^5.5.4
|
specifier: ^5.5.4
|
||||||
version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.10.0(supports-color@10.2.2)))(eslint@10.10.0(supports-color@10.2.2))(prettier@3.9.6)
|
version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.10.0(supports-color@10.2.2)))(eslint@10.10.0(supports-color@10.2.2))(prettier@3.9.6)
|
||||||
eslint-plugin-unicorn:
|
eslint-plugin-unicorn:
|
||||||
specifier: ^74.0.0
|
specifier: ^76.0.0
|
||||||
version: 74.0.0(eslint@10.10.0(supports-color@10.2.2))
|
version: 76.0.0(eslint@10.10.0(supports-color@10.2.2))
|
||||||
globals:
|
globals:
|
||||||
specifier: ^17.0.0
|
specifier: ^17.0.0
|
||||||
version: 17.12.0
|
version: 17.12.0
|
||||||
@@ -1161,10 +1161,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-AIi5H6p0xk5uknXcN3/rmhP8jgp69OfSe/JuKiQAFprJ7UGw7mwj7m4XcmDzlrnJDG+cGpphAINGdU3g3g7kDw==}
|
resolution: {integrity: sha512-AIi5H6p0xk5uknXcN3/rmhP8jgp69OfSe/JuKiQAFprJ7UGw7mwj7m4XcmDzlrnJDG+cGpphAINGdU3g3g7kDw==}
|
||||||
engines: {node: '>=22'}
|
engines: {node: '>=22'}
|
||||||
|
|
||||||
convert-hrtime@5.0.0:
|
|
||||||
resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==}
|
|
||||||
engines: {node: '>=12'}
|
|
||||||
|
|
||||||
convert-source-map@2.0.0:
|
convert-source-map@2.0.0:
|
||||||
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
|
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
|
||||||
|
|
||||||
@@ -1246,8 +1242,8 @@ packages:
|
|||||||
eslint-config-prettier:
|
eslint-config-prettier:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
eslint-plugin-unicorn@74.0.0:
|
eslint-plugin-unicorn@76.0.0:
|
||||||
resolution: {integrity: sha512-AGnsGi2SxHg1HEAXxn9nSnZfyjvTWkxm8E8hpd/9tD6dLjBUdcD7+D6ZN64HmmCXTSXlrwVyUqe20Uyb2CaurA==}
|
resolution: {integrity: sha512-3ywJrCMHKYhcBP5yFzGaOOX3dY7+iR3hvpuoS/0EnhRFgVWLejly+t4fOdJvWQxJdHZl1C+QBW7hybXPDld4Pw==}
|
||||||
engines: {node: '>=22'}
|
engines: {node: '>=22'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: '>=10.4'
|
eslint: '>=10.4'
|
||||||
@@ -1344,10 +1340,6 @@ packages:
|
|||||||
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
function-timeout@1.0.2:
|
|
||||||
resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==}
|
|
||||||
engines: {node: '>=18'}
|
|
||||||
|
|
||||||
glob-parent@6.0.2:
|
glob-parent@6.0.2:
|
||||||
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
|
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
|
||||||
engines: {node: '>=10.13.0'}
|
engines: {node: '>=10.13.0'}
|
||||||
@@ -1398,10 +1390,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
|
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
is-identifier@1.1.0:
|
|
||||||
resolution: {integrity: sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw==}
|
|
||||||
engines: {node: '>=18'}
|
|
||||||
|
|
||||||
isexe@2.0.0:
|
isexe@2.0.0:
|
||||||
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
|
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
|
||||||
|
|
||||||
@@ -1511,10 +1499,6 @@ packages:
|
|||||||
magic-string@0.30.21:
|
magic-string@0.30.21:
|
||||||
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
|
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
|
||||||
|
|
||||||
make-asynchronous@1.1.0:
|
|
||||||
resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==}
|
|
||||||
engines: {node: '>=18'}
|
|
||||||
|
|
||||||
mdn-data@2.29.0:
|
mdn-data@2.29.0:
|
||||||
resolution: {integrity: sha512-pVxQFCcaYUEAH853+v7yoI/qzhxXSq1bTb9obMYGYAN1c3Hen+XDCEvr296XhstrwlSTNgOR7mCSD4JPjbJe5A==}
|
resolution: {integrity: sha512-pVxQFCcaYUEAH853+v7yoI/qzhxXSq1bTb9obMYGYAN1c3Hen+XDCEvr296XhstrwlSTNgOR7mCSD4JPjbJe5A==}
|
||||||
|
|
||||||
@@ -1553,10 +1537,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
|
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
|
||||||
engines: {node: '>= 0.8.0'}
|
engines: {node: '>= 0.8.0'}
|
||||||
|
|
||||||
p-event@6.0.1:
|
|
||||||
resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==}
|
|
||||||
engines: {node: '>=16.17'}
|
|
||||||
|
|
||||||
p-limit@3.1.0:
|
p-limit@3.1.0:
|
||||||
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
|
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
@@ -1565,10 +1545,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
|
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
p-timeout@6.1.4:
|
|
||||||
resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==}
|
|
||||||
engines: {node: '>=14.16'}
|
|
||||||
|
|
||||||
path-exists@4.0.0:
|
path-exists@4.0.0:
|
||||||
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
|
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@@ -1680,10 +1656,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==}
|
resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
super-regex@1.1.0:
|
|
||||||
resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==}
|
|
||||||
engines: {node: '>=18'}
|
|
||||||
|
|
||||||
supports-color@10.2.2:
|
supports-color@10.2.2:
|
||||||
resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==}
|
resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
@@ -1692,10 +1664,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==}
|
resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==}
|
||||||
engines: {node: ^14.18.0 || >=16.0.0}
|
engines: {node: ^14.18.0 || >=16.0.0}
|
||||||
|
|
||||||
time-span@5.1.0:
|
|
||||||
resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==}
|
|
||||||
engines: {node: '>=12'}
|
|
||||||
|
|
||||||
tinybench@2.9.0:
|
tinybench@2.9.0:
|
||||||
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
|
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
|
||||||
|
|
||||||
@@ -1728,10 +1696,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
|
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
|
||||||
engines: {node: '>= 0.8.0'}
|
engines: {node: '>= 0.8.0'}
|
||||||
|
|
||||||
type-fest@4.41.0:
|
|
||||||
resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==}
|
|
||||||
engines: {node: '>=16'}
|
|
||||||
|
|
||||||
typescript-eslint@8.70.0:
|
typescript-eslint@8.70.0:
|
||||||
resolution: {integrity: sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==}
|
resolution: {integrity: sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
@@ -1858,9 +1822,6 @@ packages:
|
|||||||
jsdom:
|
jsdom:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
web-worker@1.5.0:
|
|
||||||
resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==}
|
|
||||||
|
|
||||||
which@2.0.2:
|
which@2.0.2:
|
||||||
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
|
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
@@ -2809,8 +2770,6 @@ snapshots:
|
|||||||
|
|
||||||
content-type@3.0.0: {}
|
content-type@3.0.0: {}
|
||||||
|
|
||||||
convert-hrtime@5.0.0: {}
|
|
||||||
|
|
||||||
convert-source-map@2.0.0: {}
|
convert-source-map@2.0.0: {}
|
||||||
|
|
||||||
cookie@1.1.1: {}
|
cookie@1.1.1: {}
|
||||||
@@ -2891,7 +2850,7 @@ snapshots:
|
|||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
eslint-config-prettier: 10.1.8(eslint@10.10.0(supports-color@10.2.2))
|
eslint-config-prettier: 10.1.8(eslint@10.10.0(supports-color@10.2.2))
|
||||||
|
|
||||||
eslint-plugin-unicorn@74.0.0(eslint@10.10.0(supports-color@10.2.2)):
|
eslint-plugin-unicorn@76.0.0(eslint@10.10.0(supports-color@10.2.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(supports-color@10.2.2))
|
'@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(supports-color@10.2.2))
|
||||||
'@eslint/css-tree': 4.0.5
|
'@eslint/css-tree': 4.0.5
|
||||||
@@ -2904,9 +2863,9 @@ snapshots:
|
|||||||
eslint: 10.10.0(supports-color@10.2.2)
|
eslint: 10.10.0(supports-color@10.2.2)
|
||||||
find-up-simple: 1.0.1
|
find-up-simple: 1.0.1
|
||||||
globals: 17.12.0
|
globals: 17.12.0
|
||||||
|
identifier-regex: 1.1.0
|
||||||
indent-string: 5.0.0
|
indent-string: 5.0.0
|
||||||
is-builtin-module: 5.0.0
|
is-builtin-module: 5.0.0
|
||||||
is-identifier: 1.1.0
|
|
||||||
pluralize: 8.0.0
|
pluralize: 8.0.0
|
||||||
quote-js-string: 0.1.0
|
quote-js-string: 0.1.0
|
||||||
regjsparser: 0.13.2
|
regjsparser: 0.13.2
|
||||||
@@ -3019,8 +2978,6 @@ snapshots:
|
|||||||
fsevents@2.3.3:
|
fsevents@2.3.3:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
function-timeout@1.0.2: {}
|
|
||||||
|
|
||||||
glob-parent@6.0.2:
|
glob-parent@6.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
@@ -3057,11 +3014,6 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-extglob: 2.1.1
|
is-extglob: 2.1.1
|
||||||
|
|
||||||
is-identifier@1.1.0:
|
|
||||||
dependencies:
|
|
||||||
identifier-regex: 1.1.0
|
|
||||||
super-regex: 1.1.0
|
|
||||||
|
|
||||||
isexe@2.0.0: {}
|
isexe@2.0.0: {}
|
||||||
|
|
||||||
jsesc@3.1.0: {}
|
jsesc@3.1.0: {}
|
||||||
@@ -3140,12 +3092,6 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/sourcemap-codec': 1.5.5
|
'@jridgewell/sourcemap-codec': 1.5.5
|
||||||
|
|
||||||
make-asynchronous@1.1.0:
|
|
||||||
dependencies:
|
|
||||||
p-event: 6.0.1
|
|
||||||
type-fest: 4.41.0
|
|
||||||
web-worker: 1.5.0
|
|
||||||
|
|
||||||
mdn-data@2.29.0: {}
|
mdn-data@2.29.0: {}
|
||||||
|
|
||||||
miniflare@5.20260815.0-alpha:
|
miniflare@5.20260815.0-alpha:
|
||||||
@@ -3195,10 +3141,6 @@ snapshots:
|
|||||||
type-check: 0.4.0
|
type-check: 0.4.0
|
||||||
word-wrap: 1.2.5
|
word-wrap: 1.2.5
|
||||||
|
|
||||||
p-event@6.0.1:
|
|
||||||
dependencies:
|
|
||||||
p-timeout: 6.1.4
|
|
||||||
|
|
||||||
p-limit@3.1.0:
|
p-limit@3.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
yocto-queue: 0.1.0
|
yocto-queue: 0.1.0
|
||||||
@@ -3207,8 +3149,6 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
p-limit: 3.1.0
|
p-limit: 3.1.0
|
||||||
|
|
||||||
p-timeout@6.1.4: {}
|
|
||||||
|
|
||||||
path-exists@4.0.0: {}
|
path-exists@4.0.0: {}
|
||||||
|
|
||||||
path-key@3.1.1: {}
|
path-key@3.1.1: {}
|
||||||
@@ -3327,22 +3267,12 @@ snapshots:
|
|||||||
|
|
||||||
strip-indent@4.1.1: {}
|
strip-indent@4.1.1: {}
|
||||||
|
|
||||||
super-regex@1.1.0:
|
|
||||||
dependencies:
|
|
||||||
function-timeout: 1.0.2
|
|
||||||
make-asynchronous: 1.1.0
|
|
||||||
time-span: 5.1.0
|
|
||||||
|
|
||||||
supports-color@10.2.2: {}
|
supports-color@10.2.2: {}
|
||||||
|
|
||||||
synckit@0.11.13:
|
synckit@0.11.13:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@pkgr/core': 0.3.6
|
'@pkgr/core': 0.3.6
|
||||||
|
|
||||||
time-span@5.1.0:
|
|
||||||
dependencies:
|
|
||||||
convert-hrtime: 5.0.0
|
|
||||||
|
|
||||||
tinybench@2.9.0: {}
|
tinybench@2.9.0: {}
|
||||||
|
|
||||||
tinyexec@1.2.4: {}
|
tinyexec@1.2.4: {}
|
||||||
@@ -3367,8 +3297,6 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
prelude-ls: 1.2.1
|
prelude-ls: 1.2.1
|
||||||
|
|
||||||
type-fest@4.41.0: {}
|
|
||||||
|
|
||||||
typescript-eslint@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@10.2.2))(supports-color@10.2.2):
|
typescript-eslint@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@10.2.2))(supports-color@10.2.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/eslint-plugin': 8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@10.2.2))(supports-color@10.2.2))(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@10.2.2))(supports-color@10.2.2)
|
'@typescript-eslint/eslint-plugin': 8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@10.2.2))(supports-color@10.2.2))(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@10.2.2))(supports-color@10.2.2)
|
||||||
@@ -3467,8 +3395,6 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- msw
|
- msw
|
||||||
|
|
||||||
web-worker@1.5.0: {}
|
|
||||||
|
|
||||||
which@2.0.2:
|
which@2.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
isexe: 2.0.0
|
isexe: 2.0.0
|
||||||
|
|||||||
Reference in New Issue
Block a user