chore(root): migrate to biome

This commit is contained in:
Carl-Gerhard Lindesvärd
2024-09-16 12:20:40 +02:00
parent 1f6e198336
commit 32e91959f6
383 changed files with 1943 additions and 3085 deletions

View File

@@ -7,8 +7,8 @@ import type {
} from '@openpanel/validation';
import {
formatClickhouseDate,
TABLE_NAMES,
formatClickhouseDate,
toDate,
} from '../clickhouse-client';
import { createSqlBuilder } from '../sql-builder';
@@ -32,7 +32,7 @@ export function getSelectPropertyKey(property: string) {
if (property.startsWith('properties.')) {
if (property.includes('*')) {
return `arrayMap(x -> trim(x), mapValues(mapExtractKeyLike(properties, ${escape(
transformPropertyKey(property)
transformPropertyKey(property),
)})))`;
}
return `properties['${property.replace(/^properties\./, '')}']`;
@@ -64,7 +64,7 @@ export function getChartSql({
sb.select.label_0 = `'*' as label_0`;
}
sb.select.count = `count(*) as count`;
sb.select.count = 'count(*) as count';
switch (interval) {
case 'minute': {
sb.select.date = `toStartOfMinute(toTimeZone(created_at, '${getTimezoneFromDateString(startDate)}')) as date`;
@@ -111,15 +111,16 @@ export function getChartSql({
});
if (event.segment === 'user') {
sb.select.count = `countDistinct(profile_id) as count`;
sb.select.count = 'countDistinct(profile_id) as count';
}
if (event.segment === 'session') {
sb.select.count = `countDistinct(session_id) as count`;
sb.select.count = 'countDistinct(session_id) as count';
}
if (event.segment === 'user_average') {
sb.select.count = `COUNT(*)::float / COUNT(DISTINCT profile_id)::float as count`;
sb.select.count =
'COUNT(*)::float / COUNT(DISTINCT profile_id)::float as count';
}
if (event.segment === 'property_sum' && event.property) {
@@ -136,7 +137,7 @@ export function getChartSql({
sb.from = `(
SELECT DISTINCT ON (profile_id) * from ${TABLE_NAMES.events} WHERE ${join(
sb.where,
' AND '
' AND ',
)}
ORDER BY profile_id, created_at DESC
) as subQuery`;
@@ -157,9 +158,9 @@ export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
if (name === 'has_profile') {
if (value.includes('true')) {
where[id] = `profile_id != device_id`;
where[id] = 'profile_id != device_id';
} else {
where[id] = `profile_id = device_id`;
where[id] = 'profile_id = device_id';
}
return;
}
@@ -211,7 +212,7 @@ export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
where[id] = value
.map(
(val) =>
`${whereFrom} LIKE ${escape(`%${String(val).trim()}%`)}`
`${whereFrom} LIKE ${escape(`%${String(val).trim()}%`)}`,
)
.join(' OR ');
}
@@ -226,7 +227,7 @@ export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
where[id] = value
.map(
(val) =>
`${whereFrom} NOT LIKE ${escape(`%${String(val).trim()}%`)}`
`${whereFrom} NOT LIKE ${escape(`%${String(val).trim()}%`)}`,
)
.join(' OR ');
}
@@ -240,7 +241,8 @@ export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
} else {
where[id] = value
.map(
(val) => `${whereFrom} LIKE ${escape(`${String(val).trim()}%`)}`
(val) =>
`${whereFrom} LIKE ${escape(`${String(val).trim()}%`)}`,
)
.join(' OR ');
}
@@ -254,7 +256,8 @@ export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
} else {
where[id] = value
.map(
(val) => `${whereFrom} LIKE ${escape(`%${String(val).trim()}`)}`
(val) =>
`${whereFrom} LIKE ${escape(`%${String(val).trim()}`)}`,
)
.join(' OR ');
}
@@ -268,7 +271,7 @@ export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
} else {
where[id] = value
.map(
(val) => `match(${whereFrom}, ${escape(String(val).trim())})`
(val) => `match(${whereFrom}, ${escape(String(val).trim())})`,
)
.join(' OR ');
}
@@ -306,7 +309,7 @@ export function getEventFiltersWhereClause(filters: IChartEventFilter[]) {
case 'doesNotContain': {
where[id] = value
.map(
(val) => `${name} NOT LIKE ${escape(`%${String(val).trim()}%`)}`
(val) => `${name} NOT LIKE ${escape(`%${String(val).trim()}%`)}`,
)
.join(' OR ');
break;

View File

@@ -8,11 +8,11 @@ import type { IChartEventFilter } from '@openpanel/validation';
import { botBuffer, eventBuffer } from '../buffers';
import {
TABLE_NAMES,
ch,
chQuery,
convertClickhouseDateToJs,
formatClickhouseDate,
TABLE_NAMES,
} from '../clickhouse-client';
import type { EventMeta, Prisma } from '../prisma-client';
import { db } from '../prisma-client';
@@ -211,7 +211,7 @@ function maskString(str: string, mask = '*') {
}
export function transformMinimalEvent(
event: IServiceEvent
event: IServiceEvent,
): IServiceEventMinimal {
return {
id: event.id,
@@ -242,7 +242,7 @@ export async function getLiveVisitors(projectId: string) {
export async function getEvents(
sql: string,
options: GetEventsOptions = {}
options: GetEventsOptions = {},
): Promise<IServiceEvent[]> {
const events = await chQuery<IClickhouseEvent>(sql);
const projectId = events[0]?.project_id;
@@ -278,7 +278,7 @@ export async function createEvent(payload: IServiceCreateEventPayload) {
payload.profileId = payload.deviceId;
}
console.log(
`create event ${payload.name} for [deviceId]: ${payload.deviceId} [profileId]: ${payload.profileId} [projectId]: ${payload.projectId} [path]: ${payload.path}`
`create event ${payload.name} for [deviceId]: ${payload.deviceId} [profileId]: ${payload.profileId} [projectId]: ${payload.projectId} [path]: ${payload.path}`,
);
if (payload.profileId !== '') {
@@ -389,7 +389,7 @@ export async function getEventList({
os: true,
browser: true,
},
incomingSelect ?? {}
incomingSelect ?? {},
);
if (select.id) {
@@ -491,7 +491,7 @@ export async function getEventList({
if (events && events.length > 0) {
sb.where.events = `name IN (${join(
events.map((event) => escape(event)),
','
',',
)})`;
}
@@ -537,7 +537,7 @@ export async function getEventsCount({
if (events && events.length > 0) {
sb.where.events = `name IN (${join(
events.map((event) => escape(event)),
','
',',
)})`;
}
@@ -549,7 +549,7 @@ export async function getEventsCount({
}
const res = await chQuery<{ count: number }>(
getSql().replace('*', 'count(*) as count')
getSql().replace('*', 'count(*) as count'),
);
return res[0]?.count ?? 0;
@@ -593,7 +593,7 @@ export async function getLastScreenViewFromProfileId({
}
const eventInBuffer = await eventBuffer.find(
(item) => item.event.profile_id === profileId
(item) => item.event.profile_id === profileId,
);
if (eventInBuffer) {
@@ -602,7 +602,7 @@ export async function getLastScreenViewFromProfileId({
const [eventInDb] = profileId
? await getEvents(
`SELECT * FROM ${TABLE_NAMES.events} WHERE name = 'screen_view' AND profile_id = ${escape(profileId)} AND project_id = ${escape(projectId)} AND created_at >= now() - INTERVAL 30 MINUTE ORDER BY created_at DESC LIMIT 1`
`SELECT * FROM ${TABLE_NAMES.events} WHERE name = 'screen_view' AND profile_id = ${escape(profileId)} AND project_id = ${escape(projectId)} AND created_at >= now() - INTERVAL 30 MINUTE ORDER BY created_at DESC LIMIT 1`,
)
: [];

View File

@@ -4,7 +4,7 @@ import { db } from '../prisma-client';
export async function getId(
tableName: 'project' | 'dashboard' | 'organization',
name: string
name: string,
) {
const newId = slug(name);
if (!db[tableName]) {

View File

@@ -7,10 +7,10 @@ import type { IChartEventFilter } from '@openpanel/validation';
import { profileBuffer } from '../buffers';
import {
TABLE_NAMES,
ch,
chQuery,
formatClickhouseDate,
TABLE_NAMES,
} from '../clickhouse-client';
import { createSqlBuilder } from '../sql-builder';
@@ -49,7 +49,7 @@ export async function getProfileById(id: string, projectId: string) {
}
const [profile] = await chQuery<IClickhouseProfile>(
`SELECT * FROM ${TABLE_NAMES.profiles} WHERE id = ${escape(String(id))} AND project_id = ${escape(projectId)} ORDER BY created_at DESC LIMIT 1`
`SELECT * FROM ${TABLE_NAMES.profiles} WHERE id = ${escape(String(id))} AND project_id = ${escape(projectId)} ORDER BY created_at DESC LIMIT 1`,
);
if (!profile) {
@@ -82,7 +82,7 @@ export async function getProfiles(ids: string[], projectId: string) {
WHERE
project_id = ${escape(projectId)} AND
id IN (${filteredIds.map((id) => escape(id)).join(',')})
`
`,
);
return data.map(transformProfile);
@@ -251,7 +251,7 @@ export async function getProfileId({
profile_id: string;
project_id: string;
}>(
`SELECT * FROM ${TABLE_NAMES.alias} WHERE project_id = '${projectId}' AND (alias = '${profileId}' OR profile_id = '${profileId}')`
`SELECT * FROM ${TABLE_NAMES.alias} WHERE project_id = '${projectId}' AND (alias = '${profileId}' OR profile_id = '${profileId}')`,
);
if (res[0]) {

View File

@@ -87,7 +87,7 @@ export async function getCurrentProjects(organizationSlug: string) {
if (access.length > 0) {
return projects.filter((project) =>
access.some((a) => a.projectId === project.id)
access.some((a) => a.projectId === project.id),
);
}

View File

@@ -19,20 +19,20 @@ export type IServiceReport = Awaited<ReturnType<typeof getReportById>>;
export function transformFilter(
filter: Partial<IChartEventFilter>,
index: number
index: number,
): IChartEventFilter {
return {
id: filter.id ?? alphabetIds[index] ?? 'A',
name: filter.name ?? 'Unknown Filter',
operator: filter.operator ?? 'is',
value:
typeof filter.value === 'string' ? [filter.value] : filter.value ?? [],
typeof filter.value === 'string' ? [filter.value] : (filter.value ?? []),
};
}
export function transformReportEvent(
event: Partial<IChartEvent>,
index: number
index: number,
): IChartEvent {
return {
segment: event.segment ?? 'event',
@@ -45,7 +45,7 @@ export function transformReportEvent(
}
export function transformReport(
report: DbReport
report: DbReport,
): IChartProps & { id: string } {
return {
id: report.id,

View File

@@ -1,6 +1,6 @@
import { escape } from 'sqlstring';
import { chQuery, TABLE_NAMES } from '../clickhouse-client';
import { TABLE_NAMES, chQuery } from '../clickhouse-client';
type IGetWeekRetentionInput = {
projectId: string;

View File

@@ -1,4 +1,4 @@
import { generateSalt } from '@openpanel/common';
import { generateSalt } from '@openpanel/common/server';
import { db } from '../prisma-client';
@@ -61,17 +61,14 @@ export async function createInitialSalts() {
} else {
console.log('Error getting salts', error);
if (retryCount < MAX_RETRIES) {
const delay = BASE_DELAY * Math.pow(2, retryCount);
const delay = BASE_DELAY * 2 ** retryCount;
console.log(
`Retrying in ${delay}ms... (Attempt ${retryCount + 1}/${MAX_RETRIES})`
`Retrying in ${delay}ms... (Attempt ${retryCount + 1}/${MAX_RETRIES})`,
);
await new Promise((resolve) => setTimeout(resolve, delay));
return createSaltsWithRetry(retryCount + 1);
} else {
throw new Error(
`Failed to create salts after ${MAX_RETRIES} attempts`
);
}
throw new Error(`Failed to create salts after ${MAX_RETRIES} attempts`);
}
}
};