Conversation
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.7 to 3.3.8. - [Release notes](https://github.com/ai/nanoid/releases) - [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md) - [Commits](ai/nanoid@3.3.7...3.3.8) --- updated-dependencies: - dependency-name: nanoid dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com>
…nanoid-3.3.8 Bump nanoid from 3.3.7 to 3.3.8
chore(translation): update Persian (fa) translation and fix all issues
Update ga-ES.json
Update mn-MN.json
Format time using dateLocale
Fix store import
|
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
There was a problem hiding this comment.
PR Summary
This version bump (v2.16.0) introduces significant architectural and dependency updates to the Umami analytics platform. Here are the key changes:
- Migrates API routes from Next.js Pages Router to App Router, moving all endpoints from
/pages/apito/app/apiwith improved request handling and validation using Zod - Updates Node.js to version 22-alpine in Dockerfile and upgrades Prisma to 6.1.0, with changes to binary targets and database schema
- Implements new authentication system using bcryptjs and JWT tokens, with Redis integration for session management
- Adds new channel analytics functionality with domain grouping and traffic source categorization
- Introduces proper CORS configuration with configurable max age and standardizes import paths using '@/' alias prefix across the codebase
The changes represent a significant modernization of the codebase with improved type safety and security measures.
💡 (1/5) You can manually trigger the bot by mentioning @greptileai in a comment!
468 file(s) reviewed, 166 comment(s)
Edit PR Review Bot Settings | Greptile
| @@ -9,7 +9,7 @@ RUN yarn config set network-timeout 300000 | |||
| RUN yarn install --frozen-lockfile | |||
There was a problem hiding this comment.
style: Consider adding yarn cache cleanup after install to reduce image size
| typescript: { | ||
| ignoreBuildErrors: true, | ||
| }, |
There was a problem hiding this comment.
style: Ignoring TypeScript build errors in production could mask critical type issues. Consider enabling strict mode or handling errors properly.
| if (config.uiDisabled) { | ||
| return null; | ||
| } |
There was a problem hiding this comment.
logic: New check added to prevent rendering when UI is disabled, but no fallback UI provided for disabled state
| return null; | ||
| } | ||
|
|
||
| export default async function ({ children }) { |
There was a problem hiding this comment.
style: Function is now marked async but doesn't use any await operations internally - verify if async is actually needed
| import { REPORT_TYPES } from '@/lib/constants'; | ||
| import ReportDeleteButton from './ReportDeleteButton'; | ||
|
|
||
| export function ReportsTable({ data = [], showDomain }: { data: any[]; showDomain?: boolean }) { |
There was a problem hiding this comment.
style: data parameter uses 'any[]' type which bypasses TypeScript type checking. Consider defining a proper Report interface type.
| : '' | ||
| } | ||
| order by created_at desc | ||
| limit 1000) | ||
| select * from events | ||
| `, | ||
| { ...params, query: `%${query}%` }, | ||
| { ...params, query: `%${search}%` }, |
There was a problem hiding this comment.
logic: Parameter name mismatch - using 'query' in binding but 'search' in the SQL. This will cause the search functionality to fail for relational databases.
| { ...params, query: `%${search}%` }, | |
| { ...params, search: `%${search}%` }, |
| async function clickhouseQuery( | ||
| websiteId: string, | ||
| filters: QueryFilters, | ||
| ): Promise<{ x: string; y: number }[]> { |
There was a problem hiding this comment.
logic: Return type for clickhouseQuery doesn't match the actual query results. The query returns {domain, query, visitors} but the type annotation expects {x, y}
| async function clickhouseQuery( | |
| websiteId: string, | |
| filters: QueryFilters, | |
| ): Promise<{ x: string; y: number }[]> { | |
| async function clickhouseQuery( | |
| websiteId: string, | |
| filters: QueryFilters, | |
| ): Promise<{ domain: string; query: string; visitors: number }[]> { |
| }); | ||
| } | ||
|
|
||
| async function relationalQuery(websiteId: string, filters: QueryFilters) { |
There was a problem hiding this comment.
style: Missing return type annotation for relationalQuery function. Should match clickhouseQuery's return type for consistency
| async function relationalQuery(websiteId: string, filters: QueryFilters) { | |
| async function relationalQuery(websiteId: string, filters: QueryFilters): Promise<{ domain: string; query: string; visitors: number }[]> { |
| @@ -32,7 +32,7 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) { | |||
| where website_event.website_id = {{websiteId::uuid}} | |||
| ${filterQuery} | |||
| ${dateQuery} | |||
| order by website_event.created_at asc | |||
| order by website_event.created_at desc | |||
There was a problem hiding this comment.
logic: The sort order was changed from 'asc' to 'desc' here, but remains 'asc' in the clickhouse query. This inconsistency will cause different ordering between database implementations.
| order by website_event.created_at desc | |
| order by website_event.created_at asc |
| count(distinct d.session_id) as "total" | ||
| from website_event e | ||
| join session_data d | ||
| on d.session_id = e.session_id |
There was a problem hiding this comment.
logic: join condition should include website_id to prevent cross-website data leakage
| on d.session_id = e.session_id | |
| on d.session_id = e.session_id and d.website_id = e.website_id |
No description provided.