fix(todo): add default title, remove unused d3-force, add unit tests (39 tests)

- Add <title>Todo</title> 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 <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-03-18 17:28:52 +01:00
parent 8debd2b8c7
commit 8f71ed134d
6 changed files with 410 additions and 526 deletions

View file

@ -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"

View file

@ -24,6 +24,7 @@
<!-- Microsoft Tiles -->
<meta name="msapplication-config" content="none" />
<title>Todo</title>
%sveltekit.head%
<!-- Umami Analytics -->
<script defer src="https://stats.mana.how/script.js" data-website-id="ec1bb158-d871-4bc6-bdbc-147c97b9c1c7"></script>

View file

@ -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'],
});
});
});

View file

@ -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(' · ');
});
});

View file

@ -1,3 +1,4 @@
/// <reference types="vitest/config" />
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,
},
});

524
pnpm-lock.yaml generated
View file

@ -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