From 8f71ed134d11a57da9bd0ff2c7718497ab58256f Mon Sep 17 00:00:00 2001 From: Till JS Date: Wed, 18 Mar 2026 17:28:52 +0100 Subject: [PATCH] fix(todo): add default title, remove unused d3-force, add unit tests (39 tests) - Add Todo to app.html for proper browser tab display - Remove unused d3-force and @types/d3-force dependencies - Add vitest config and test scripts - Add task-parser tests (22 tests): priority, project, labels, preview - Add tasks API tests (17 tests): CRUD, complete/uncomplete, move, labels, subtasks, reorder Co-Authored-By: Claude Opus 4.6 --- apps/todo/apps/web/package.json | 22 +- apps/todo/apps/web/src/app.html | 1 + apps/todo/apps/web/src/lib/api/tasks.test.ts | 228 ++++++++ .../web/src/lib/utils/task-parser.test.ts | 155 ++++++ apps/todo/apps/web/vite.config.ts | 6 + pnpm-lock.yaml | 524 +----------------- 6 files changed, 410 insertions(+), 526 deletions(-) create mode 100644 apps/todo/apps/web/src/lib/api/tasks.test.ts create mode 100644 apps/todo/apps/web/src/lib/utils/task-parser.test.ts diff --git a/apps/todo/apps/web/package.json b/apps/todo/apps/web/package.json index 0c70af754..c81c9243e 100644 --- a/apps/todo/apps/web/package.json +++ b/apps/todo/apps/web/package.json @@ -11,7 +11,9 @@ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "lint": "eslint .", "format": "prettier --write .", - "type-check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json" + "type-check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "test": "vitest run", + "test:watch": "vitest" }, "devDependencies": { "@manacore/shared-pwa": "workspace:*", @@ -20,9 +22,9 @@ "@sveltejs/kit": "^2.47.1", "@sveltejs/vite-plugin-svelte": "^5.0.0", "@tailwindcss/vite": "^4.1.7", - "@types/d3-force": "^3.0.0", "@types/node": "^20.0.0", "@vite-pwa/sveltekit": "^1.1.0", + "jsdom": "^25.0.1", "prettier": "^3.1.1", "prettier-plugin-svelte": "^3.1.2", "svelte": "^5.41.0", @@ -30,17 +32,12 @@ "tailwindcss": "^4.1.7", "tslib": "^2.4.1", "typescript": "^5.9.3", - "vite": "^6.0.0" + "vite": "^6.0.0", + "vitest": "^4.1.0" }, "dependencies": { - "@manacore/spiral-db": "workspace:*", "@manacore/shared-api-client": "workspace:*", "@manacore/shared-auth": "workspace:*", - "@manacore/shared-splitscreen": "workspace:*", - "@manacore/shared-stores": "workspace:*", - "@manacore/shared-types": "workspace:*", - "@manacore/shared-utils": "workspace:*", - "@manacore/shared-tags": "workspace:*", "@manacore/shared-auth-ui": "workspace:*", "@manacore/shared-branding": "workspace:*", "@manacore/shared-feedback-service": "workspace:*", @@ -48,13 +45,18 @@ "@manacore/shared-i18n": "workspace:*", "@manacore/shared-icons": "workspace:*", "@manacore/shared-profile-ui": "workspace:*", + "@manacore/shared-splitscreen": "workspace:*", + "@manacore/shared-stores": "workspace:*", "@manacore/shared-subscription-ui": "workspace:*", + "@manacore/shared-tags": "workspace:*", "@manacore/shared-tailwind": "workspace:*", "@manacore/shared-theme": "workspace:*", "@manacore/shared-theme-ui": "workspace:*", + "@manacore/shared-types": "workspace:*", "@manacore/shared-ui": "workspace:*", + "@manacore/shared-utils": "workspace:*", + "@manacore/spiral-db": "workspace:*", "@todo/shared": "workspace:*", - "d3-force": "^3.0.0", "date-fns": "^4.1.0", "svelte-dnd-action": "^0.9.68", "svelte-i18n": "^4.0.1" diff --git a/apps/todo/apps/web/src/app.html b/apps/todo/apps/web/src/app.html index 41e2db8b9..a164e2dda 100644 --- a/apps/todo/apps/web/src/app.html +++ b/apps/todo/apps/web/src/app.html @@ -24,6 +24,7 @@ + Todo %sveltekit.head% diff --git a/apps/todo/apps/web/src/lib/api/tasks.test.ts b/apps/todo/apps/web/src/lib/api/tasks.test.ts new file mode 100644 index 000000000..f52c87c5a --- /dev/null +++ b/apps/todo/apps/web/src/lib/api/tasks.test.ts @@ -0,0 +1,228 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; + +// Mock the client module +vi.mock('./client', () => ({ + apiClient: { + get: vi.fn(), + post: vi.fn(), + put: vi.fn(), + delete: vi.fn(), + }, +})); + +import { + getTasks, + getTask, + createTask, + updateTask, + deleteTask, + completeTask, + uncompleteTask, + moveTask, + updateTaskLabels, + updateSubtasks, + getInboxTasks, + getTodayTasks, + getUpcomingTasks, + reorderTasks, +} from './tasks'; +import { apiClient } from './client'; + +const mockClient = vi.mocked(apiClient); + +beforeEach(() => { + vi.clearAllMocks(); +}); + +describe('getTasks', () => { + it('should fetch tasks without filters', async () => { + mockClient.get.mockResolvedValue({ tasks: [] }); + + const result = await getTasks(); + + expect(mockClient.get).toHaveBeenCalledWith('/api/v1/tasks'); + expect(result).toEqual([]); + }); + + it('should build query string with filters', async () => { + mockClient.get.mockResolvedValue({ tasks: [] }); + + await getTasks({ projectId: 'proj-1', priority: 'high' }); + + const callArg = mockClient.get.mock.calls[0][0]; + expect(callArg).toContain('projectId=proj-1'); + expect(callArg).toContain('priority=high'); + }); + + it('should include search filter', async () => { + mockClient.get.mockResolvedValue({ tasks: [] }); + + await getTasks({ search: 'Meeting' }); + + expect(mockClient.get).toHaveBeenCalledWith('/api/v1/tasks?search=Meeting'); + }); +}); + +describe('getTask', () => { + it('should fetch a single task', async () => { + const task = { id: 't1', title: 'Test' }; + mockClient.get.mockResolvedValue({ task }); + + const result = await getTask('t1'); + + expect(mockClient.get).toHaveBeenCalledWith('/api/v1/tasks/t1'); + expect(result).toEqual(task); + }); +}); + +describe('createTask', () => { + it('should POST new task', async () => { + const task = { id: 't1', title: 'New Task' }; + mockClient.post.mockResolvedValue({ task }); + + const result = await createTask({ title: 'New Task' }); + + expect(mockClient.post).toHaveBeenCalledWith('/api/v1/tasks', { title: 'New Task' }); + expect(result).toEqual(task); + }); +}); + +describe('updateTask', () => { + it('should PUT updated task', async () => { + const task = { id: 't1', title: 'Updated' }; + mockClient.put.mockResolvedValue({ task }); + + const result = await updateTask('t1', { title: 'Updated' }); + + expect(mockClient.put).toHaveBeenCalledWith('/api/v1/tasks/t1', { title: 'Updated' }); + expect(result).toEqual(task); + }); +}); + +describe('deleteTask', () => { + it('should DELETE task', async () => { + mockClient.delete.mockResolvedValue(undefined); + + await deleteTask('t1'); + + expect(mockClient.delete).toHaveBeenCalledWith('/api/v1/tasks/t1'); + }); +}); + +describe('completeTask', () => { + it('should POST to complete endpoint', async () => { + const task = { id: 't1', isCompleted: true }; + mockClient.post.mockResolvedValue({ task }); + + const result = await completeTask('t1'); + + expect(mockClient.post).toHaveBeenCalledWith('/api/v1/tasks/t1/complete'); + expect(result).toEqual(task); + }); +}); + +describe('uncompleteTask', () => { + it('should POST to uncomplete endpoint', async () => { + const task = { id: 't1', isCompleted: false }; + mockClient.post.mockResolvedValue({ task }); + + const result = await uncompleteTask('t1'); + + expect(mockClient.post).toHaveBeenCalledWith('/api/v1/tasks/t1/uncomplete'); + expect(result).toEqual(task); + }); +}); + +describe('moveTask', () => { + it('should POST to move endpoint', async () => { + const task = { id: 't1', projectId: 'proj-2' }; + mockClient.post.mockResolvedValue({ task }); + + const result = await moveTask('t1', 'proj-2'); + + expect(mockClient.post).toHaveBeenCalledWith('/api/v1/tasks/t1/move', { projectId: 'proj-2' }); + expect(result).toEqual(task); + }); + + it('should move to inbox (null project)', async () => { + const task = { id: 't1', projectId: null }; + mockClient.post.mockResolvedValue({ task }); + + const result = await moveTask('t1', null); + + expect(mockClient.post).toHaveBeenCalledWith('/api/v1/tasks/t1/move', { projectId: null }); + expect(result).toEqual(task); + }); +}); + +describe('updateTaskLabels', () => { + it('should PUT label IDs', async () => { + const task = { id: 't1' }; + mockClient.put.mockResolvedValue({ task }); + + const result = await updateTaskLabels('t1', ['l1', 'l2']); + + expect(mockClient.put).toHaveBeenCalledWith('/api/v1/tasks/t1/labels', { + labelIds: ['l1', 'l2'], + }); + expect(result).toEqual(task); + }); +}); + +describe('updateSubtasks', () => { + it('should PUT subtasks', async () => { + const subtasks = [{ id: 's1', title: 'Sub 1', isCompleted: false }]; + const task = { id: 't1', subtasks }; + mockClient.put.mockResolvedValue({ task }); + + const result = await updateSubtasks('t1', subtasks as any); + + expect(mockClient.put).toHaveBeenCalledWith('/api/v1/tasks/t1/subtasks', { subtasks }); + expect(result).toEqual(task); + }); +}); + +describe('getInboxTasks', () => { + it('should fetch inbox tasks', async () => { + mockClient.get.mockResolvedValue({ tasks: [] }); + + const result = await getInboxTasks(); + + expect(mockClient.get).toHaveBeenCalledWith('/api/v1/tasks/inbox'); + expect(result).toEqual([]); + }); +}); + +describe('getTodayTasks', () => { + it('should fetch today tasks', async () => { + mockClient.get.mockResolvedValue({ tasks: [] }); + + const result = await getTodayTasks(); + + expect(mockClient.get).toHaveBeenCalledWith('/api/v1/tasks/today'); + expect(result).toEqual([]); + }); +}); + +describe('getUpcomingTasks', () => { + it('should fetch upcoming tasks', async () => { + mockClient.get.mockResolvedValue({ tasks: [] }); + + const result = await getUpcomingTasks(); + + expect(mockClient.get).toHaveBeenCalledWith('/api/v1/tasks/upcoming'); + expect(result).toEqual([]); + }); +}); + +describe('reorderTasks', () => { + it('should PUT reorder with task IDs', async () => { + mockClient.put.mockResolvedValue(undefined); + + await reorderTasks(['t1', 't2', 't3']); + + expect(mockClient.put).toHaveBeenCalledWith('/api/v1/tasks/reorder', { + taskIds: ['t1', 't2', 't3'], + }); + }); +}); diff --git a/apps/todo/apps/web/src/lib/utils/task-parser.test.ts b/apps/todo/apps/web/src/lib/utils/task-parser.test.ts new file mode 100644 index 000000000..f7da9c3ca --- /dev/null +++ b/apps/todo/apps/web/src/lib/utils/task-parser.test.ts @@ -0,0 +1,155 @@ +import { describe, it, expect } from 'vitest'; +import { parseTaskInput, resolveTaskIds, formatParsedTaskPreview } from './task-parser'; + +describe('parseTaskInput', () => { + it('should parse a simple title', () => { + const result = parseTaskInput('Einkaufen gehen'); + expect(result.title).toBe('Einkaufen gehen'); + expect(result.priority).toBeUndefined(); + expect(result.projectName).toBeUndefined(); + expect(result.labelNames).toEqual([]); + }); + + it('should parse priority !!! as urgent', () => { + const result = parseTaskInput('Deadline !!! fertig machen'); + expect(result.priority).toBe('urgent'); + expect(result.title).not.toContain('!!!'); + }); + + it('should parse priority !! as high', () => { + const result = parseTaskInput('Report !! abgeben'); + expect(result.priority).toBe('high'); + expect(result.title).not.toContain('!!'); + }); + + it('should parse dringend as urgent', () => { + const result = parseTaskInput('Bug fixen dringend'); + expect(result.priority).toBe('urgent'); + }); + + it('should parse wichtig as high', () => { + const result = parseTaskInput('Meeting wichtig'); + expect(result.priority).toBe('high'); + }); + + it('should parse normal as medium', () => { + const result = parseTaskInput('Aufräumen normal'); + expect(result.priority).toBe('medium'); + }); + + it('should parse später as low', () => { + const result = parseTaskInput('Docs lesen später'); + expect(result.priority).toBe('low'); + }); + + it('should parse @project', () => { + const result = parseTaskInput('Task erledigen @Arbeit'); + expect(result.projectName).toBe('Arbeit'); + expect(result.title).not.toContain('@Arbeit'); + }); + + it('should parse #labels', () => { + const result = parseTaskInput('Anrufen #arbeit #privat'); + expect(result.labelNames).toEqual(['arbeit', 'privat']); + expect(result.title).not.toContain('#'); + }); + + it('should parse complex input with all fields', () => { + const result = parseTaskInput('Meeting vorbereiten !!! @Arbeit #wichtig #team'); + expect(result.priority).toBe('urgent'); + expect(result.projectName).toBe('Arbeit'); + expect(result.labelNames).toEqual(['wichtig', 'team']); + expect(result.title).toContain('Meeting vorbereiten'); + }); + + it('should handle empty input', () => { + const result = parseTaskInput(''); + expect(result.title).toBe(''); + expect(result.labelNames).toEqual([]); + }); + + it('should handle only labels', () => { + // Note: "dringend" is consumed by priority extraction before label parsing + const result = parseTaskInput('#arbeit #privat'); + expect(result.labelNames).toEqual(['arbeit', 'privat']); + }); +}); + +describe('resolveTaskIds', () => { + const projects = [ + { id: 'proj-1', name: 'Arbeit' }, + { id: 'proj-2', name: 'Privat' }, + ]; + + const labels = [ + { id: 'label-1', name: 'Wichtig' }, + { id: 'label-2', name: 'Team' }, + { id: 'label-3', name: 'Bug' }, + ]; + + it('should resolve project name to ID (case-insensitive)', () => { + const parsed = parseTaskInput('Task @arbeit'); + const resolved = resolveTaskIds(parsed, projects, labels); + expect(resolved.projectId).toBe('proj-1'); + }); + + it('should resolve label names to IDs (case-insensitive)', () => { + // Note: "wichtig" is consumed by priority extraction, so use "bug" instead + const parsed = parseTaskInput('Task #bug #team'); + const resolved = resolveTaskIds(parsed, projects, labels); + expect(resolved.labelIds).toEqual(['label-3', 'label-2']); + }); + + it('should skip unknown project', () => { + const parsed = parseTaskInput('Task @Unbekannt'); + const resolved = resolveTaskIds(parsed, projects, labels); + expect(resolved.projectId).toBeUndefined(); + }); + + it('should skip unknown labels', () => { + const parsed = parseTaskInput('Task #nichtda'); + const resolved = resolveTaskIds(parsed, projects, labels); + expect(resolved.labelIds).toEqual([]); + }); + + it('should preserve title and priority', () => { + const parsed = parseTaskInput('Meeting vorbereiten !!! @Arbeit #wichtig'); + const resolved = resolveTaskIds(parsed, projects, labels); + expect(resolved.title).toContain('Meeting vorbereiten'); + expect(resolved.priority).toBe('urgent'); + expect(resolved.projectId).toBe('proj-1'); + expect(resolved.labelIds).toEqual(['label-1']); + }); +}); + +describe('formatParsedTaskPreview', () => { + it('should format priority', () => { + const parsed = parseTaskInput('Task !!!'); + const preview = formatParsedTaskPreview(parsed); + expect(preview).toContain('Dringend'); + }); + + it('should format project', () => { + const parsed = parseTaskInput('Task @Arbeit'); + const preview = formatParsedTaskPreview(parsed); + expect(preview).toContain('Arbeit'); + }); + + it('should format labels', () => { + const parsed = parseTaskInput('Task #arbeit #team'); + const preview = formatParsedTaskPreview(parsed); + expect(preview).toContain('arbeit'); + expect(preview).toContain('team'); + }); + + it('should return empty string for title-only input', () => { + const parsed = parseTaskInput('Einfacher Task'); + expect(formatParsedTaskPreview(parsed)).toBe(''); + }); + + it('should join parts with separator', () => { + const parsed = parseTaskInput('Task !!! @Arbeit'); + const preview = formatParsedTaskPreview(parsed); + expect(preview).toContain(' · '); + }); +}); diff --git a/apps/todo/apps/web/vite.config.ts b/apps/todo/apps/web/vite.config.ts index 2c4bd1fed..ee3e8c104 100644 --- a/apps/todo/apps/web/vite.config.ts +++ b/apps/todo/apps/web/vite.config.ts @@ -1,3 +1,4 @@ +/// import { sveltekit } from '@sveltejs/kit/vite'; import tailwindcss from '@tailwindcss/vite'; import { defineConfig } from 'vite'; @@ -28,4 +29,9 @@ export default defineConfig({ optimizeDeps: { exclude: [...MANACORE_SHARED_PACKAGES, '@todo/shared'], }, + test: { + environment: 'jsdom', + include: ['src/**/*.test.ts'], + globals: true, + }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bdd1571a9..2b4ab836b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1606,226 +1606,6 @@ importers: specifier: ^3.4.17 version: 3.4.18(tsx@4.21.0)(yaml@2.8.1) - apps/lightwrite: {} - - apps/lightwrite/apps/backend: - dependencies: - '@lightwrite/shared': - specifier: workspace:* - version: link:../../packages/shared - '@manacore/shared-nestjs-auth': - specifier: workspace:* - version: link:../../../../packages/shared-nestjs-auth - '@manacore/shared-nestjs-health': - specifier: workspace:* - version: link:../../../../packages/shared-nestjs-health - '@manacore/shared-nestjs-setup': - specifier: workspace:* - version: link:../../../../packages/shared-nestjs-setup - '@manacore/shared-storage': - specifier: workspace:* - version: link:../../../../packages/shared-storage - '@nestjs/common': - specifier: ^10.4.15 - version: 10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/config': - specifier: ^3.3.0 - version: 3.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2) - '@nestjs/core': - specifier: ^10.4.15 - version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/platform-express': - specifier: ^10.4.15 - version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.20) - class-transformer: - specifier: ^0.5.1 - version: 0.5.1 - class-validator: - specifier: ^0.14.1 - version: 0.14.3 - dotenv: - specifier: ^16.4.7 - version: 16.6.1 - drizzle-kit: - specifier: ^0.30.2 - version: 0.30.6 - drizzle-orm: - specifier: ^0.38.3 - version: 0.38.4(@opentelemetry/api@1.9.0)(@types/react@19.2.14)(expo-sqlite@55.0.10(expo@55.0.5)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(kysely@0.28.8)(postgres@3.4.7)(react@19.2.4) - postgres: - specifier: ^3.4.5 - version: 3.4.7 - reflect-metadata: - specifier: ^0.2.2 - version: 0.2.2 - rxjs: - specifier: ^7.8.1 - version: 7.8.2 - devDependencies: - '@nestjs/cli': - specifier: ^10.4.9 - version: 10.4.9(esbuild@0.27.0) - '@nestjs/schematics': - specifier: ^10.2.3 - version: 10.2.3(chokidar@3.6.0)(typescript@5.9.3) - '@types/express': - specifier: ^5.0.0 - version: 5.0.6 - '@types/node': - specifier: ^22.10.2 - version: 22.19.1 - '@typescript-eslint/eslint-plugin': - specifier: ^8.18.1 - version: 8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': - specifier: ^8.18.1 - version: 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: - specifier: ^9.17.0 - version: 9.39.1(jiti@2.6.1) - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.2(eslint@9.39.1(jiti@2.6.1)) - eslint-plugin-prettier: - specifier: ^5.2.1 - version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@9.1.2(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1))(prettier@3.6.2) - prettier: - specifier: ^3.4.2 - version: 3.6.2 - source-map-support: - specifier: ^0.5.21 - version: 0.5.21 - ts-loader: - specifier: ^9.5.1 - version: 9.5.4(typescript@5.9.3)(webpack@5.100.2(esbuild@0.27.0)) - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@22.19.1)(typescript@5.9.3) - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 - tsx: - specifier: ^4.19.2 - version: 4.20.6 - typescript: - specifier: ^5.7.2 - version: 5.9.3 - - apps/lightwrite/apps/landing: - dependencies: - '@astrojs/check': - specifier: ^0.9.4 - version: 0.9.5(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3) - '@astrojs/sitemap': - specifier: ^3.3.0 - version: 3.6.0 - '@manacore/shared-landing-ui': - specifier: workspace:* - version: link:../../../../packages/shared-landing-ui - astro: - specifier: ^5.1.1 - version: 5.16.0(@netlify/blobs@10.4.1)(@types/node@24.10.1)(ioredis@5.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.1) - typescript: - specifier: ^5.7.2 - version: 5.9.3 - - apps/lightwrite/apps/web: - dependencies: - '@lightwrite/shared': - specifier: workspace:* - version: link:../../packages/shared - '@manacore/shared-api-client': - specifier: workspace:* - version: link:../../../../packages/shared-api-client - '@manacore/shared-auth': - specifier: workspace:* - version: link:../../../../packages/shared-auth - '@manacore/shared-auth-ui': - specifier: workspace:* - version: link:../../../../packages/shared-auth-ui - '@manacore/shared-branding': - specifier: workspace:* - version: link:../../../../packages/shared-branding - '@manacore/shared-i18n': - specifier: workspace:* - version: link:../../../../packages/shared-i18n - '@manacore/shared-icons': - specifier: workspace:* - version: link:../../../../packages/shared-icons - '@manacore/shared-stores': - specifier: workspace:* - version: link:../../../../packages/shared-stores - '@manacore/shared-tailwind': - specifier: workspace:* - version: link:../../../../packages/shared-tailwind - '@manacore/shared-theme': - specifier: workspace:* - version: link:../../../../packages/shared-theme - '@manacore/shared-theme-ui': - specifier: workspace:* - version: link:../../../../packages/shared-theme-ui - '@manacore/shared-ui': - specifier: workspace:* - version: link:../../../../packages/shared-ui - wavesurfer.js: - specifier: ^7.8.0 - version: 7.12.1 - devDependencies: - '@manacore/shared-pwa': - specifier: workspace:* - version: link:../../../../packages/shared-pwa - '@manacore/shared-vite-config': - specifier: workspace:* - version: link:../../../../packages/shared-vite-config - '@sveltejs/adapter-node': - specifier: ^5.0.0 - version: 5.4.0(@sveltejs/kit@2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))) - '@sveltejs/kit': - specifier: ^2.47.1 - version: 2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) - '@sveltejs/vite-plugin-svelte': - specifier: ^5.0.0 - version: 5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) - '@tailwindcss/vite': - specifier: ^4.1.7 - version: 4.1.17(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) - '@types/node': - specifier: ^20.0.0 - version: 20.19.25 - '@vite-pwa/sveltekit': - specifier: ^1.1.0 - version: 1.1.0(@sveltejs/kit@2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0) - prettier: - specifier: ^3.1.1 - version: 3.6.2 - prettier-plugin-svelte: - specifier: ^3.1.2 - version: 3.4.0(prettier@3.6.2)(svelte@5.44.0) - svelte: - specifier: ^5.41.0 - version: 5.44.0 - svelte-check: - specifier: ^4.3.3 - version: 4.3.4(picomatch@4.0.3)(svelte@5.44.0)(typescript@5.9.3) - tailwindcss: - specifier: ^4.1.7 - version: 4.1.17 - tslib: - specifier: ^2.4.1 - version: 2.8.1 - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vite: - specifier: ^6.0.0 - version: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) - - apps/lightwrite/packages/shared: - devDependencies: - typescript: - specifier: ^5.7.3 - version: 5.9.3 - apps/manacore/apps/landing: dependencies: '@astrojs/react': @@ -2905,130 +2685,6 @@ importers: specifier: ^5.7.2 version: 5.9.3 - apps/mukke/apps/mobile: - dependencies: - '@expo/vector-icons': - specifier: ^15.0.2 - version: 15.0.3(expo-font@55.0.4)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) - '@missingcore/audio-metadata': - specifier: ^1.3.0 - version: 1.3.0(@types/react@19.2.14)(expo-file-system@55.0.10(expo@55.0.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0)))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) - '@mukke/types': - specifier: workspace:* - version: link:../../packages/mukke-types - '@react-native-async-storage/async-storage': - specifier: 2.2.0 - version: 2.2.0(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0)) - '@react-native-community/slider': - specifier: 5.1.2 - version: 5.1.2 - '@react-navigation/native': - specifier: ^7.0.3 - version: 7.1.33(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) - expo: - specifier: ~55.0.0 - version: 55.0.5(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(@expo/metro-runtime@6.1.2)(expo-router@55.0.5)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.12.2(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - expo-audio: - specifier: ~55.0.0 - version: 55.0.8(expo-asset@55.0.8(expo@55.0.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(expo@55.0.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) - expo-constants: - specifier: ~55.0.0 - version: 55.0.7(expo@55.0.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(typescript@5.9.3) - expo-dev-client: - specifier: ~55.0.0 - version: 55.0.16(expo@55.0.5)(typescript@5.9.3) - expo-dev-launcher: - specifier: ~55.0.0 - version: 55.0.17(expo@55.0.5)(typescript@5.9.3) - expo-document-picker: - specifier: ~55.0.0 - version: 55.0.8(expo@55.0.5) - expo-file-system: - specifier: ~55.0.0 - version: 55.0.10(expo@55.0.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0)) - expo-router: - specifier: ~55.0.0 - version: 55.0.5(5ukuo2wceyze3ufp6iesohvm6e) - expo-sqlite: - specifier: ~55.0.0 - version: 55.0.10(expo@55.0.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) - expo-status-bar: - specifier: ~55.0.0 - version: 55.0.4(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) - expo-system-ui: - specifier: ~55.0.0 - version: 55.0.9(expo@55.0.5)(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0)) - nativewind: - specifier: ^4.2.0 - version: 4.2.3(react-native-reanimated@4.2.1(react-native-worklets@0.7.2(@babel/core@7.28.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(tailwindcss@3.4.18(tsx@4.21.0)(yaml@2.8.1)) - react: - specifier: 19.2.0 - version: 19.2.0 - react-dom: - specifier: 19.2.0 - version: 19.2.0(react@19.2.0) - react-native: - specifier: 0.83.2 - version: 0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0) - react-native-gesture-handler: - specifier: ~2.30.0 - version: 2.30.0(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) - react-native-reanimated: - specifier: ~4.2.1 - version: 4.2.1(react-native-worklets@0.7.2(@babel/core@7.28.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) - react-native-safe-area-context: - specifier: ~5.6.2 - version: 5.6.2(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) - react-native-screens: - specifier: ~4.23.0 - version: 4.23.0(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) - react-native-web: - specifier: ~0.21.0 - version: 0.21.2(encoding@0.1.13)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react-native-worklets: - specifier: ~0.7.2 - version: 0.7.2(@babel/core@7.28.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) - uuid: - specifier: ^11.1.0 - version: 11.1.0 - zustand: - specifier: ^5.0.0 - version: 5.0.8(@types/react@19.2.14)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) - devDependencies: - '@babel/core': - specifier: ^7.26.0 - version: 7.28.5 - '@types/react': - specifier: ~19.2.14 - version: 19.2.14 - '@types/uuid': - specifier: ^10.0.0 - version: 10.0.0 - '@typescript-eslint/eslint-plugin': - specifier: ^8.0.0 - version: 8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': - specifier: ^8.0.0 - version: 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: - specifier: ^9.18.0 - version: 9.39.1(jiti@2.6.1) - eslint-config-universe: - specifier: ^14.0.0 - version: 14.3.0(@types/eslint@9.6.1)(eslint@9.39.1(jiti@2.6.1))(prettier@3.6.2)(typescript@5.9.3) - prettier: - specifier: ^3.5.0 - version: 3.6.2 - prettier-plugin-tailwindcss: - specifier: ^0.6.0 - version: 0.6.14(prettier-plugin-astro@0.14.1)(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.44.0))(prettier@3.6.2) - tailwindcss: - specifier: ^3.4.0 - version: 3.4.18(tsx@4.21.0)(yaml@2.8.1) - typescript: - specifier: ~5.9.2 - version: 5.9.3 - apps/mukke/apps/web: dependencies: '@manacore/shared-api-client': @@ -3120,8 +2776,6 @@ importers: specifier: ^6.0.0 version: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) - apps/mukke/packages/mukke-types: {} - apps/mukke/packages/shared: devDependencies: typescript: @@ -5503,9 +5157,6 @@ importers: '@todo/shared': specifier: workspace:* version: link:../../packages/shared - d3-force: - specifier: ^3.0.0 - version: 3.0.0 date-fns: specifier: ^4.1.0 version: 4.1.0 @@ -5534,15 +5185,15 @@ importers: '@tailwindcss/vite': specifier: ^4.1.7 version: 4.1.17(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) - '@types/d3-force': - specifier: ^3.0.0 - version: 3.0.10 '@types/node': specifier: ^20.0.0 version: 20.19.25 '@vite-pwa/sveltekit': specifier: ^1.1.0 version: 1.1.0(@sveltejs/kit@2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0) + jsdom: + specifier: ^25.0.1 + version: 25.0.1 prettier: specifier: ^3.1.1 version: 3.6.2 @@ -5567,6 +5218,9 @@ importers: vite: specifier: ^6.0.0 version: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) + vitest: + specifier: ^4.1.0 + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@25.0.1)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) apps/todo/packages/shared: dependencies: @@ -12066,27 +11720,6 @@ packages: '@microsoft/tsdoc@0.16.0': resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} - '@missingcore/audio-metadata@1.3.0': - resolution: {integrity: sha512-Yl+Tv4GUisCEZSVqZYDiM5Gm182g3IfFx5XJydjtsTyMlJ+408InHFfh+yLkfiMNcvpcbt2a3dQyFMWaABBEeg==} - engines: {node: '>=18'} - peerDependencies: - '@dr.pogodin/react-native-fs': '>=2.22.0' - '@types/react': '>=18.2.0' - expo-file-system: '>=17.0.0' - react: '>=18.2.0' - react-native: '>=0.74.0' - peerDependenciesMeta: - '@dr.pogodin/react-native-fs': - optional: true - '@types/react': - optional: true - expo-file-system: - optional: true - react: - optional: true - react-native: - optional: true - '@mixmark-io/domino@2.2.0': resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} @@ -13029,9 +12662,6 @@ packages: '@react-native-community/slider@5.0.1': resolution: {integrity: sha512-K3JRWkIW4wQ79YJ6+BPZzp1SamoikxfPRw7Yw4B4PElEQmqZFrmH9M5LxvIo460/3QSrZF/wCgi3qizJt7g/iw==} - '@react-native-community/slider@5.1.2': - resolution: {integrity: sha512-UV/MjCyCtSjS5BQDrrGIMmCXm309xEG6XbR0Dj65kzTraJSVDxSjQS2uBUXgX+5SZUOCzCxzv3OufOZBdtQY4w==} - '@react-native-google-signin/google-signin@14.0.2': resolution: {integrity: sha512-L23SBl30VGVjxdX3jb9PZJHuuitsSU/aMGWCNQqSx69PrUqGcP2gkcUeOsK6VPFadPbjh+4ml+0UoAEzZGA3dQ==} peerDependencies: @@ -18431,11 +18061,6 @@ packages: peerDependencies: expo: '*' - expo-dev-client@55.0.16: - resolution: {integrity: sha512-PbbzWcmvm0Cqp5Y33hLxAX5ewsyph32e8UQL6gwz5iL8KL7JSi/Zbnotr+3cCeEUpLmRBF9pAigm6evAod7PIg==} - peerDependencies: - expo: '*' - expo-dev-client@6.0.18: resolution: {integrity: sha512-8QKWvhsoZpMkecAMlmWoRHnaTNiPS3aO7E42spZOMjyiaNRJMHZsnB8W2b63dt3Yg3oLyskLAoI8IOmnqVX8vA==} peerDependencies: @@ -18451,11 +18076,6 @@ packages: peerDependencies: expo: '*' - expo-dev-launcher@55.0.17: - resolution: {integrity: sha512-ZiEPC6lYpWk5WDWAyHnBqSjCf2Mq/QBuuYxtKeV0s9FWzGCFDxB39W2oH2UmDve9PosnC3zCloX99IoJCdJmAw==} - peerDependencies: - expo: '*' - expo-dev-launcher@6.0.18: resolution: {integrity: sha512-JTtcIfNvHO9PTdRJLmHs+7HJILXXZjF95jxgzu6hsJrgsTg/AZDtEsIt/qa6ctEYQTqrLdsLDgDhiXVel3AoQA==} peerDependencies: @@ -18476,16 +18096,6 @@ packages: peerDependencies: expo: '*' - expo-dev-menu-interface@55.0.1: - resolution: {integrity: sha512-FkNtwq1q6NmYoy28pj+ZLuHmirJgc039pQbJ167MZJIaprLcMN1yy67qA7xBHK+FNJ8AN8kGCtMTPByg5UC72A==} - peerDependencies: - expo: '*' - - expo-dev-menu@55.0.14: - resolution: {integrity: sha512-1YgtX6ejSTxIX4P6A+zWnP4ZKbikO+j8dd1ebpSacyHfdnF7kAKXf2nwUjlTBvmbd2zFtofSs7VHQJAIRpWsvA==} - peerDependencies: - expo: '*' - expo-dev-menu@6.0.25: resolution: {integrity: sha512-K2m4z/I+CPWbMtHlDzU68lHaQs52De0v5gbsjAmA5ig8FrYh4MKZvPxSVANaiKENzgmtglu8qaFh7ua9Gt2TfA==} peerDependencies: @@ -18639,9 +18249,6 @@ packages: expo-json-utils@0.15.0: resolution: {integrity: sha512-duRT6oGl80IDzH2LD2yEFWNwGIC2WkozsB6HF3cDYNoNNdUvFk6uN3YiwsTsqVM/D0z6LEAQ01/SlYvN+Fw0JQ==} - expo-json-utils@55.0.0: - resolution: {integrity: sha512-aupt/o5PDAb8dXDCb0JcRdkqnTLxe/F+La7jrnyd/sXlYFfRgBJLFOa1SqVFXm1E/Xam1SE/yw6eAb+DGY7Arg==} - expo-keep-awake@14.0.3: resolution: {integrity: sha512-6Jh94G6NvTZfuLnm2vwIpKe3GdOiVBuISl7FI8GqN0/9UOg9E0WXXp5cDcfAG8bn80RfgLJS8P7EPUGTZyOvhg==} peerDependencies: @@ -18711,11 +18318,6 @@ packages: peerDependencies: expo: '*' - expo-manifests@55.0.9: - resolution: {integrity: sha512-i82j3X4hbxYDe6kxUw4u8WfvbvTj2w+9BD9WKuL0mFRy+MjvdzdyaqAjEViWCKo/alquP/hTApDTQBb3UmWhkg==} - peerDependencies: - expo: '*' - expo-media-library@18.2.0: resolution: {integrity: sha512-aIYLIqmU8LFWrQcfZdwg9f/iWm0wC8uhZ7HiUiTnrigtxf417cVvNokX9afXpIOKBHAHRjVIbcs1nN8KZDE2Fw==} peerDependencies: @@ -19005,11 +18607,6 @@ packages: peerDependencies: expo: '*' - expo-updates-interface@55.1.3: - resolution: {integrity: sha512-UVVIiZqymQZJL+o/jh65kXOI97xdkbqBJJM0LMabaPMNLFnc6/WvOMOzmQs7SPyKb8+0PeBaFd7tj5DzF6JeQg==} - peerDependencies: - expo: '*' - expo-updates@29.0.13: resolution: {integrity: sha512-tf/yex7U7betbIyDNwaSyDWDxMQVgmJ5qyghGEDlHP0052CPKUvbNEdtdf4DNCpsL3uxn8+71A4O4NxQdJEFuA==} hasBin: true @@ -19187,9 +18784,6 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-text-encoding@1.0.6: - resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} - fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} @@ -32584,15 +32178,6 @@ snapshots: '@microsoft/tsdoc@0.16.0': {} - '@missingcore/audio-metadata@1.3.0(@types/react@19.2.14)(expo-file-system@55.0.10(expo@55.0.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0)))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)': - dependencies: - fast-text-encoding: 1.0.6 - optionalDependencies: - '@types/react': 19.2.14 - expo-file-system: 55.0.10(expo@55.0.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0)) - react: 19.2.0 - react-native: 0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0) - '@mixmark-io/domino@2.2.0': {} '@mozilla/readability@0.6.0': {} @@ -34828,8 +34413,6 @@ snapshots: '@react-native-community/slider@5.0.1': {} - '@react-native-community/slider@5.1.2': {} - '@react-native-google-signin/google-signin@14.0.2(expo@54.0.13)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)': dependencies: react: 19.1.0 @@ -40575,7 +40158,8 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - await-lock@2.2.2: {} + await-lock@2.2.2: + optional: true aws-sign2@0.7.0: {} @@ -44117,18 +43701,6 @@ snapshots: transitivePeerDependencies: - supports-color - expo-dev-client@55.0.16(expo@55.0.5)(typescript@5.9.3): - dependencies: - expo: 55.0.5(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(@expo/metro-runtime@6.1.2)(expo-router@55.0.5)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.12.2(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - expo-dev-launcher: 55.0.17(expo@55.0.5)(typescript@5.9.3) - expo-dev-menu: 55.0.14(expo@55.0.5) - expo-dev-menu-interface: 55.0.1(expo@55.0.5) - expo-manifests: 55.0.9(expo@55.0.5)(typescript@5.9.3) - expo-updates-interface: 55.1.3(expo@55.0.5) - transitivePeerDependencies: - - supports-color - - typescript - expo-dev-client@6.0.18(expo@54.0.13): dependencies: expo: 54.0.13(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.12.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) @@ -44181,16 +43753,6 @@ snapshots: transitivePeerDependencies: - supports-color - expo-dev-launcher@55.0.17(expo@55.0.5)(typescript@5.9.3): - dependencies: - '@expo/schema-utils': 55.0.2 - expo: 55.0.5(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(@expo/metro-runtime@6.1.2)(expo-router@55.0.5)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.12.2(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - expo-dev-menu: 55.0.14(expo@55.0.5) - expo-manifests: 55.0.9(expo@55.0.5)(typescript@5.9.3) - transitivePeerDependencies: - - supports-color - - typescript - expo-dev-launcher@6.0.18(expo@54.0.13): dependencies: expo: 54.0.13(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.12.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) @@ -44227,15 +43789,6 @@ snapshots: dependencies: expo: 54.0.25(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.12.2(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) - expo-dev-menu-interface@55.0.1(expo@55.0.5): - dependencies: - expo: 55.0.5(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(@expo/metro-runtime@6.1.2)(expo-router@55.0.5)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.12.2(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - - expo-dev-menu@55.0.14(expo@55.0.5): - dependencies: - expo: 55.0.5(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(@expo/metro-runtime@6.1.2)(expo-router@55.0.5)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.12.2(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - expo-dev-menu-interface: 55.0.1(expo@55.0.5) - expo-dev-menu@6.0.25(expo@52.0.47): dependencies: expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/dom-webview@55.0.3)(@expo/metro-runtime@6.1.2)(encoding@0.1.13)(react-native-webview@13.12.2(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) @@ -44555,8 +44108,6 @@ snapshots: expo-json-utils@0.15.0: {} - expo-json-utils@55.0.0: {} - expo-keep-awake@14.0.3(expo@52.0.47)(react@18.3.1): dependencies: expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/dom-webview@55.0.3)(@expo/metro-runtime@6.1.2)(encoding@0.1.13)(react-native-webview@13.12.2(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) @@ -44771,15 +44322,6 @@ snapshots: transitivePeerDependencies: - supports-color - expo-manifests@55.0.9(expo@55.0.5)(typescript@5.9.3): - dependencies: - '@expo/config': 55.0.8(typescript@5.9.3) - expo: 55.0.5(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(@expo/metro-runtime@6.1.2)(expo-router@55.0.5)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.12.2(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - expo-json-utils: 55.0.0 - transitivePeerDependencies: - - supports-color - - typescript - expo-media-library@18.2.0(expo@54.0.12)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)): dependencies: expo: 54.0.12(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.12.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) @@ -45430,13 +44972,6 @@ snapshots: transitivePeerDependencies: - supports-color - expo-sqlite@55.0.10(expo@55.0.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0): - dependencies: - await-lock: 2.2.2 - expo: 55.0.5(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(@expo/metro-runtime@6.1.2)(expo-router@55.0.5)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.12.2(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - react: 19.2.0 - react-native: 0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0) - expo-sqlite@55.0.10(expo@55.0.5)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.4))(react@19.2.4): dependencies: await-lock: 2.2.2 @@ -45648,10 +45183,6 @@ snapshots: dependencies: expo: 54.0.25(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.12.2(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) - expo-updates-interface@55.1.3(expo@55.0.5): - dependencies: - expo: 55.0.5(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(@expo/metro-runtime@6.1.2)(expo-router@55.0.5)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.12.2(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - expo-updates@29.0.13(expo@54.0.13)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0): dependencies: '@expo/code-signing-certificates': 0.0.5 @@ -46293,8 +45824,6 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-text-encoding@1.0.6: {} - fast-uri@3.1.0: {} fast-xml-parser@4.5.3: @@ -51308,20 +50837,6 @@ snapshots: - react-native-svg - supports-color - nativewind@4.2.3(react-native-reanimated@4.2.1(react-native-worklets@0.7.2(@babel/core@7.28.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(tailwindcss@3.4.18(tsx@4.21.0)(yaml@2.8.1)): - dependencies: - comment-json: 4.4.1 - debug: 4.4.3 - react-native-css-interop: 0.2.3(react-native-reanimated@4.2.1(react-native-worklets@0.7.2(@babel/core@7.28.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(tailwindcss@3.4.18(tsx@4.21.0)(yaml@2.8.1)) - tailwindcss: 3.4.18(tsx@4.21.0)(yaml@2.8.1) - transitivePeerDependencies: - - react - - react-native - - react-native-reanimated - - react-native-safe-area-context - - react-native-svg - - supports-color - natural-compare@1.4.0: {} negotiator@0.6.3: {} @@ -52517,23 +52032,6 @@ snapshots: transitivePeerDependencies: - supports-color - react-native-css-interop@0.2.3(react-native-reanimated@4.2.1(react-native-worklets@0.7.2(@babel/core@7.28.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native-safe-area-context@5.6.2(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0)(tailwindcss@3.4.18(tsx@4.21.0)(yaml@2.8.1)): - dependencies: - '@babel/helper-module-imports': 7.27.1 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - debug: 4.4.3 - lightningcss: 1.27.0 - react: 19.2.0 - react-native: 0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0) - react-native-reanimated: 4.2.1(react-native-worklets@0.7.2(@babel/core@7.28.5)(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) - semver: 7.7.3 - tailwindcss: 3.4.18(tsx@4.21.0)(yaml@2.8.1) - optionalDependencies: - react-native-safe-area-context: 5.6.2(react-native@0.83.2(@babel/core@7.28.5)(@types/react@19.2.14)(react@19.2.0))(react@19.2.0) - transitivePeerDependencies: - - supports-color - react-native-draggable-flatlist@4.0.3(@babel/core@7.28.5)(react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.5(patch_hash=ja2p6dcgbdai4kr2slklwsqegq)(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)): dependencies: '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5) @@ -58213,12 +57711,6 @@ snapshots: react: 18.3.1 use-sync-external-store: 1.6.0(react@18.3.1) - zustand@5.0.8(@types/react@19.2.14)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)): - optionalDependencies: - '@types/react': 19.2.14 - react: 19.2.0 - use-sync-external-store: 1.6.0(react@19.2.0) - zustand@5.0.8(@types/react@19.2.7)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)): optionalDependencies: '@types/react': 19.2.7