diff --git a/apps/server/package.json b/apps/server/package.json index aa0163c3a..629fd16ed 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -34,14 +34,18 @@ "@hono/zod-validator": "^0.7.2", "@supabase/supabase-js": "catalog:", "@trigger.dev/sdk": "catalog:", - "drizzle-orm": "catalog:", "ai": "catalog:", + "drizzle-orm": "catalog:", "hono": "catalog:", "hono-pino": "^0.10.1", + "lodash-es": "^4.17.21", "pino": "^9.7.0", "pino-pretty": "^13.0.0", - "typescript": "5.8.3", "tsup": "catalog:", + "typescript": "5.8.3", "zod": "catalog:" + }, + "devDependencies": { + "@types/lodash-es": "^4.17.12" } } diff --git a/apps/server/src/api/v2/reports/GET.ts b/apps/server/src/api/v2/reports/GET.ts index 3f555c387..a77c877a7 100644 --- a/apps/server/src/api/v2/reports/GET.ts +++ b/apps/server/src/api/v2/reports/GET.ts @@ -2,7 +2,7 @@ import type { User } from '@buster/database'; import type { GetReportsListRequest, GetReportsListResponse, - ReportResponse, + ReportListItem, } from '@buster/server-shared/reports'; import { GetReportsListRequestSchema } from '@buster/server-shared/reports'; import { zValidator } from '@hono/zod-validator'; @@ -12,27 +12,14 @@ async function getReportsListHandler( request: GetReportsListRequest, user: User ): Promise { - const stubbedReports: ReportResponse[] = [ + const stubbedReports: ReportListItem[] = [ { id: 'report-1', name: 'Sales Analysis Q4', file_name: 'sales_analysis_q4.md', description: 'Quarterly sales performance analysis', created_by: user.id, - created_at: '2024-01-15T10:00:00Z', updated_at: '2024-01-20T14:30:00Z', - deleted_at: null, - publicly_accessible: false, - content: [ - { - type: 'h1' as const, - children: [{ text: 'Sales Analysis Q4' }], - }, - { - type: 'p' as const, - children: [{ text: 'This report analyzes our Q4 sales performance.' }], - }, - ], }, { id: 'report-2', @@ -40,16 +27,7 @@ async function getReportsListHandler( file_name: 'customer_metrics.md', description: 'Key customer engagement metrics', created_by: user.id, - created_at: '2024-01-10T09:00:00Z', updated_at: '2024-01-18T16:45:00Z', - deleted_at: null, - publicly_accessible: true, - content: [ - { - type: 'h1' as const, - children: [{ text: 'Customer Metrics' }], - }, - ], }, { id: 'report-3', @@ -57,22 +35,7 @@ async function getReportsListHandler( file_name: 'marketing_campaign_results.md', description: 'Analysis of recent marketing campaigns', created_by: user.id, - created_at: '2024-01-05T08:30:00Z', updated_at: '2024-01-12T11:15:00Z', - deleted_at: null, - publicly_accessible: false, - content: [ - { - type: 'h1' as const, - children: [{ text: 'Marketing Campaign Results' }], - }, - { - type: 'p' as const, - children: [ - { text: 'Overview of our recent marketing initiatives and their performance.' }, - ], - }, - ], }, ]; @@ -80,7 +43,7 @@ async function getReportsListHandler( // Page is 1-based, so we need to subtract 1 for array indexing const startIndex = (page - 1) * page_size; const endIndex = startIndex + page_size; - const paginatedReports = stubbedReports.slice(startIndex, endIndex); + const paginatedReports: ReportListItem[] = stubbedReports.slice(startIndex, endIndex); const result: GetReportsListResponse = { data: paginatedReports, diff --git a/apps/server/src/api/v2/reports/[id]/GET.ts b/apps/server/src/api/v2/reports/[id]/GET.ts new file mode 100644 index 000000000..de06cc749 --- /dev/null +++ b/apps/server/src/api/v2/reports/[id]/GET.ts @@ -0,0 +1,55 @@ +import type { User } from '@buster/database'; +import type { + GetReportIndividualResponse, + ReportIndividualResponse, +} from '@buster/server-shared/reports'; +import { zValidator } from '@hono/zod-validator'; +import { Hono } from 'hono'; +import { HTTPException } from 'hono/http-exception'; + +async function getReportHandler( + reportId: string, + user: User +): Promise { + return { + id: reportId, + name: 'Sales Analysis Q4', + file_name: 'sales_analysis_q4.md', + description: 'Quarterly sales performance analysis', + created_by: user.id, + created_at: '2024-01-15T10:00:00Z', + updated_at: '2024-01-20T14:30:00Z', + deleted_at: null, + publicly_accessible: false, + content: [ + { + type: 'h1', + children: [{ text: 'Sales Analysis Q4' }], + }, + { + type: 'p', + children: [{ text: 'This report analyzes our Q4 sales performance.' }], + }, + { + type: 'metric', + metricId: '123', + children: [{ text: '' }], + caption: [{ text: 'This is a metric' }], + }, + ], + }; +} + +const app = new Hono().get('/', async (c) => { + const reportId = c.req.param('id'); + const user = c.get('busterUser'); + + if (!reportId) { + throw new HTTPException(404, { message: 'Report ID is required' }); + } + + const response: GetReportIndividualResponse = await getReportHandler(reportId, user); + return c.json(response); +}); + +export default app; diff --git a/apps/server/src/api/v2/reports/[id].ts b/apps/server/src/api/v2/reports/[id]/PUT.ts similarity index 88% rename from apps/server/src/api/v2/reports/[id].ts rename to apps/server/src/api/v2/reports/[id]/PUT.ts index dec0877b1..dd7f15bc5 100644 --- a/apps/server/src/api/v2/reports/[id].ts +++ b/apps/server/src/api/v2/reports/[id]/PUT.ts @@ -1,9 +1,5 @@ import type { User } from '@buster/database'; -import type { - ReportResponse, - UpdateReportRequest, - UpdateReportResponse, -} from '@buster/server-shared/reports'; +import type { UpdateReportRequest, UpdateReportResponse } from '@buster/server-shared/reports'; import { UpdateReportRequestSchema } from '@buster/server-shared/reports'; import { zValidator } from '@hono/zod-validator'; import { Hono } from 'hono'; @@ -14,7 +10,7 @@ async function updateReportHandler( request: UpdateReportRequest, user: User ): Promise { - const existingReport: ReportResponse = { + const existingReport: UpdateReportResponse = { id: reportId, name: 'Sales Analysis Q4', file_name: 'sales_analysis_q4.md', @@ -42,7 +38,7 @@ async function updateReportHandler( const updatedReport: UpdateReportResponse = { ...existingReport, - ...(request as Partial), + ...(request as Partial), updated_at: new Date().toISOString(), }; diff --git a/apps/server/src/api/v2/reports/[id]/index.ts b/apps/server/src/api/v2/reports/[id]/index.ts new file mode 100644 index 000000000..e92c86d24 --- /dev/null +++ b/apps/server/src/api/v2/reports/[id]/index.ts @@ -0,0 +1,8 @@ +import { Hono } from 'hono'; +import { requireAuth } from '../../../../middleware/auth'; +import GET from './GET'; +import PUT from './PUT'; + +const app = new Hono().route('/', GET).route('/', PUT); + +export default app; diff --git a/apps/server/src/api/v2/reports/index.ts b/apps/server/src/api/v2/reports/index.ts index 9c84aa8a2..47aa2c169 100644 --- a/apps/server/src/api/v2/reports/index.ts +++ b/apps/server/src/api/v2/reports/index.ts @@ -1,11 +1,8 @@ import { Hono } from 'hono'; import { requireAuth } from '../../../middleware/auth'; import GET from './GET'; -import PUT_ID from './[id]'; +import individualReport from './[id]'; -const app = new Hono() - .use('*', requireAuth) - .route('/', GET) - .route('/:id', PUT_ID); +const app = new Hono().use('*', requireAuth).route('/', GET).route('/:id', individualReport); export default app; diff --git a/packages/server-shared/src/reports/reports.types.ts b/packages/server-shared/src/reports/reports.types.ts index 1076d36ef..e1c612ab0 100644 --- a/packages/server-shared/src/reports/reports.types.ts +++ b/packages/server-shared/src/reports/reports.types.ts @@ -2,7 +2,16 @@ import { z } from 'zod'; import type { ReportElement, ReportElements } from './report-elements'; import { ReportElementSchema } from './report-elements'; -const ReportResponseSchema: z.ZodType<{ +export const ReportListItemSchema = z.object({ + id: z.string(), + name: z.string(), + file_name: z.string(), + description: z.string(), + created_by: z.string(), + updated_at: z.string(), +}); + +export const ReportIndividualResponseSchema: z.ZodType<{ id: string; name: string; file_name: string; @@ -26,7 +35,5 @@ const ReportResponseSchema: z.ZodType<{ content: z.array(ReportElementSchema) as z.ZodType, }); -// Export base schema for operations like .pick() -export { ReportResponseSchema }; - -export type ReportResponse = z.infer; +export type ReportListItem = z.infer; +export type ReportIndividualResponse = z.infer; diff --git a/packages/server-shared/src/reports/requests.ts b/packages/server-shared/src/reports/requests.ts index 7bfa39dc6..6d655269a 100644 --- a/packages/server-shared/src/reports/requests.ts +++ b/packages/server-shared/src/reports/requests.ts @@ -2,7 +2,6 @@ import { z } from 'zod'; import { PaginatedRequestSchema } from '../type-utilities/pagination'; import type { ReportElement, ReportElements } from './report-elements'; import { ReportElementSchema } from './report-elements'; -import { ReportResponseSchema } from './reports.types'; export const GetReportsListRequestSchema = PaginatedRequestSchema; diff --git a/packages/server-shared/src/reports/responses.ts b/packages/server-shared/src/reports/responses.ts index 65e525fc6..22b3fda4a 100644 --- a/packages/server-shared/src/reports/responses.ts +++ b/packages/server-shared/src/reports/responses.ts @@ -1,9 +1,10 @@ import type { z } from 'zod'; import { PaginatedResponseSchema } from '../type-utilities/pagination'; -import { ReportResponseSchema } from './reports.types'; +import { ReportIndividualResponseSchema, ReportListItemSchema } from './reports.types'; -export const GetReportsListResponseSchema = PaginatedResponseSchema(ReportResponseSchema); -export const UpdateReportResponseSchema = ReportResponseSchema; +export const GetReportsListResponseSchema = PaginatedResponseSchema(ReportListItemSchema); +export const UpdateReportResponseSchema = ReportIndividualResponseSchema; export type GetReportsListResponse = z.infer; export type UpdateReportResponse = z.infer; +export type GetReportIndividualResponse = z.infer; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e16b3b07..eb33fd8a9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -175,6 +175,9 @@ importers: hono-pino: specifier: ^0.10.1 version: 0.10.1(hono@4.8.4)(pino@9.7.0) + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 pino: specifier: ^9.7.0 version: 9.7.0 @@ -190,6 +193,10 @@ importers: zod: specifier: 'catalog:' version: 3.25.1 + devDependencies: + '@types/lodash-es': + specifier: ^4.17.12 + version: 4.17.12 apps/trigger: dependencies: @@ -298,10 +305,10 @@ importers: version: 49.2.4(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) '@platejs/autoformat': specifier: 'catalog:' - version: 49.0.0(platejs@49.2.4(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 49.0.0(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@platejs/basic-nodes': specifier: 'catalog:' - version: 49.0.0(platejs@49.2.4(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 49.0.0(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@platejs/basic-styles': specifier: ^49.0.0 version: 49.0.0(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -352,7 +359,7 @@ importers: version: 49.2.0(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@platejs/markdown': specifier: 'catalog:' - version: 49.2.1(platejs@49.2.4(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + version: 49.2.1(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) '@platejs/math': specifier: ^49.0.0 version: 49.0.0(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1038,13 +1045,13 @@ importers: version: link:../vitest-config '@platejs/autoformat': specifier: 'catalog:' - version: 49.0.0(platejs@49.2.4(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 49.0.0(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@platejs/basic-nodes': specifier: 'catalog:' - version: 49.0.0(platejs@49.2.4(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 49.0.0(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@platejs/markdown': specifier: 'catalog:' - version: 49.2.1(platejs@49.2.4(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + version: 49.2.1(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) platejs: specifier: 'catalog:' version: 49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)) @@ -5771,6 +5778,9 @@ packages: '@types/katex@0.16.7': resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + '@types/lodash@4.17.20': resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} @@ -6773,6 +6783,7 @@ packages: bun@1.2.18: resolution: {integrity: sha512-OR+EpNckoJN4tHMVZPaTPxDj2RgpJgJwLruTIFYbO3bQMguLd0YrmkWKYqsiihcLgm2ehIjF/H1RLfZiRa7+qQ==} + cpu: [arm64, x64, aarch64] os: [darwin, linux, win32] hasBin: true @@ -16479,7 +16490,7 @@ snapshots: '@platejs/ai@49.2.4(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': dependencies: - '@platejs/markdown': 49.2.1(platejs@49.2.4(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + '@platejs/markdown': 49.2.1(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) '@platejs/selection': 49.2.4(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) lodash: 4.17.21 platejs: 49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)) @@ -16489,14 +16500,14 @@ snapshots: - supports-color - typescript - '@platejs/autoformat@49.0.0(platejs@49.2.4(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@platejs/autoformat@49.0.0(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: lodash: 4.17.21 platejs: 49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@platejs/basic-nodes@49.0.0(platejs@49.2.4(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@platejs/basic-nodes@49.0.0(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: platejs: 49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)) react: 18.3.1 @@ -16552,7 +16563,7 @@ snapshots: html-entities: 2.6.0 is-hotkey: 0.2.0 jotai: 2.8.4(@types/react@18.3.23)(react@18.3.1) - jotai-optics: 0.4.0(jotai@2.8.4(react@18.3.1))(optics-ts@2.4.1) + jotai-optics: 0.4.0(jotai@2.8.4(@types/react@18.3.23)(react@18.3.1))(optics-ts@2.4.1) jotai-x: 2.3.3(@types/react@18.3.23)(jotai@2.8.4(@types/react@18.3.23)(react@18.3.1))(react@18.3.1) lodash: 4.17.21 nanoid: 5.1.5 @@ -16563,7 +16574,7 @@ snapshots: slate-react: 0.117.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0) use-deep-compare: 1.3.0(react@18.3.1) zustand: 5.0.7(@types/react@18.3.23)(immer@10.1.1)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)) - zustand-x: 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(zustand@5.0.7(immer@10.1.1)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1))) + zustand-x: 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(zustand@5.0.7(@types/react@18.3.23)(immer@10.1.1)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1))) transitivePeerDependencies: - '@types/react' - immer @@ -16654,7 +16665,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@platejs/markdown@49.2.1(platejs@49.2.4(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': + '@platejs/markdown@49.2.1(platejs@49.2.4(@types/react@18.3.23)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(slate-dom@0.116.0(slate@0.117.0))(slate@0.117.0)(use-sync-external-store@1.5.0(react@18.3.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3)': dependencies: marked: 15.0.12 mdast-util-math: 3.0.0 @@ -18761,6 +18772,10 @@ snapshots: '@types/katex@0.16.7': {} + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.20 + '@types/lodash@4.17.20': {} '@types/mdast@4.0.4': @@ -19207,14 +19222,14 @@ snapshots: msw: 2.10.4(@types/node@20.19.4)(typescript@5.8.3) vite: 6.3.5(@types/node@20.19.4)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) - '@vitest/mocker@3.2.4(msw@2.10.4(@types/node@24.0.10)(typescript@5.8.3))(vite@6.3.5(@types/node@20.19.4)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(msw@2.10.4(@types/node@24.0.10)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: msw: 2.10.4(@types/node@24.0.10)(typescript@5.8.3) - vite: 6.3.5(@types/node@20.19.4)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) '@vitest/pretty-format@2.0.5': dependencies: @@ -22519,7 +22534,7 @@ snapshots: jose@5.10.0: {} - jotai-optics@0.4.0(jotai@2.8.4(react@18.3.1))(optics-ts@2.4.1): + jotai-optics@0.4.0(jotai@2.8.4(@types/react@18.3.23)(react@18.3.1))(optics-ts@2.4.1): dependencies: jotai: 2.8.4(@types/react@18.3.23)(react@18.3.1) optics-ts: 2.4.1 @@ -26543,7 +26558,7 @@ snapshots: dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.10.4(@types/node@24.0.10)(typescript@5.8.3))(vite@6.3.5(@types/node@20.19.4)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(msw@2.10.4(@types/node@24.0.10)(typescript@5.8.3))(vite@6.3.5(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -26950,7 +26965,7 @@ snapshots: zod@3.25.1: {} - zustand-x@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(zustand@5.0.7(immer@10.1.1)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1))): + zustand-x@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2)(zustand@5.0.7(@types/react@18.3.23)(immer@10.1.1)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1))): dependencies: immer: 10.1.1 lodash.mapvalues: 4.6.0