Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 29 additions & 29 deletions apps/desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,44 +29,44 @@
"@nut-tree-fork/nut-js": "^4.2.6",
"@pairux/meeting-translation": "workspace:*",
"@profullstack/remote-input": "workspace:*",
"@radix-ui/react-label": "^2.1.8",
"@radix-ui/react-slot": "^1.2.4",
"@radix-ui/react-label": "^2.1.17",
"@radix-ui/react-slot": "^1.5.0",
"class-variance-authority": "^0.7.1",
"dotenv": "^17.2.3",
"linkify-react": "^4.3.2",
"linkifyjs": "^4.3.2",
"livekit-client": "^2.17.0",
"zod": "^3.24.0",
"zustand": "^4.5.0"
"dotenv": "^18.0.9",
"linkify-react": "^4.4.0",
"linkifyjs": "^4.4.0",
"livekit-client": "^2.23.0",
"zod": "^4.6.7",
"zustand": "^5.0.16"
},
"optionalDependencies": {
"@nut-tree-fork/node-mac-permissions": "^2.2.1"
},
"devDependencies": {
"@electron/notarize": "^3.1.1",
"@electron/notarize": "^3.1.2",
"@ffmpeg-installer/ffmpeg": "^1.1.0",
"@pairux/shared-types": "workspace:*",
"@testing-library/jest-dom": "^6.6.0",
"@testing-library/react": "^16.1.0",
"@types/node": "^22.10.0",
"@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0",
"@vitejs/plugin-react": "^4.3.0",
"autoprefixer": "^10.4.20",
"clsx": "^2.1.0",
"electron": "^40.0.0",
"electron-builder": "^26.4.0",
"@testing-library/jest-dom": "^7.0.1",
"@testing-library/react": "^16.3.3",
"@types/node": "^24.19.2",
"@types/react": "^19.3.0",
"@types/react-dom": "^19.3.0",
"@vitejs/plugin-react": "^4.7.0",
"autoprefixer": "^10.6.1",
"clsx": "^2.1.1",
"electron": "^40.10.6",
"electron-builder": "^26.18.0",
"electron-vite": "^2.3.0",
"lucide-react": "^0.468.0",
"postcss": "^8.4.49",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-router-dom": "^7.1.0",
"tailwind-merge": "^2.6.0",
"tailwindcss": "^3.4.17",
"lucide-react": "^1.61.0",
"postcss": "^8.5.31",
"react": "^19.3.1",
"react-dom": "^19.3.1",
"react-router-dom": "^7.18.4",
"tailwind-merge": "^3.7.0",
"tailwindcss": "^3.4.19",
"tailwindcss-animate": "^1.0.7",
"typescript": "^5.7.0",
"vite": "^5.4.0",
"vitest": "^2.1.0"
"typescript": "^5.9.3",
"vite": "^5.4.21",
"vitest": "^2.1.9"
}
}
4 changes: 2 additions & 2 deletions apps/desktop/src/renderer/components/auth/LoginForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,14 @@ export function LoginForm() {
void loadRememberedCredentials();
}, []);

const handleSubmit = async (e: React.FormEvent) => {
const handleSubmit = async (e: React.SyntheticEvent) => {
e.preventDefault();
setError('');

// Validate input
const result = loginSchema.safeParse({ email, password });
if (!result.success) {
setError(result.error.errors[0].message);
setError(result.error.issues[0].message);
return;
}

Expand Down
16 changes: 4 additions & 12 deletions apps/desktop/src/renderer/components/control/InputCapture.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -155,9 +155,7 @@ describe('InputCapture pointer lock', () => {
});

act(() => {
document.dispatchEvent(
Object.assign(new MouseEvent('mousemove'), { movementX: 100, movementY: 50 })
);
document.dispatchEvent(new MouseEvent('mousemove', { movementX: 100, movementY: 50 }));
});

onInputEvent.mockClear();
Expand All @@ -183,9 +181,7 @@ describe('InputCapture pointer lock', () => {
});

act(() => {
document.dispatchEvent(
Object.assign(new MouseEvent('pointermove'), { movementX: 100, movementY: 50 })
);
document.dispatchEvent(new MouseEvent('pointermove', { movementX: 100, movementY: 50 }));
});

onInputEvent.mockClear();
Expand Down Expand Up @@ -218,12 +214,8 @@ describe('InputCapture pointer lock', () => {
const now = vi.spyOn(performance, 'now').mockReturnValue(1000);
try {
act(() => {
document.dispatchEvent(
Object.assign(new MouseEvent('pointermove'), { movementX: 100, movementY: 50 })
);
document.dispatchEvent(
Object.assign(new MouseEvent('mousemove'), { movementX: 100, movementY: 50 })
);
document.dispatchEvent(new MouseEvent('pointermove', { movementX: 100, movementY: 50 }));
document.dispatchEvent(new MouseEvent('mousemove', { movementX: 100, movementY: 50 }));
});
} finally {
now.mockRestore();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ import { renderHook } from '@testing-library/react';
import { useAutoStopServerStream } from './useAutoStopServerStream';

describe('useAutoStopServerStream', () => {
let stop: ReturnType<typeof vi.fn>;
let stop: ReturnType<typeof vi.fn<() => Promise<unknown>>>;

beforeEach(() => {
stop = vi.fn();
stop = vi.fn<() => Promise<unknown>>();
});

it('stops the egress when hosting ends while a server stream is running', () => {
Expand Down
12 changes: 3 additions & 9 deletions apps/desktop/src/renderer/hooks/usePointerLock.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -170,9 +170,7 @@ describe('usePointerLock', () => {
});

act(() => {
document.dispatchEvent(
Object.assign(new MouseEvent('mousemove'), { movementX: 100, movementY: 50 })
);
document.dispatchEvent(new MouseEvent('mousemove', { movementX: 100, movementY: 50 }));
});

expect(onMove).toHaveBeenCalledWith(0.6, 0.6, true);
Expand All @@ -196,9 +194,7 @@ describe('usePointerLock', () => {
});

act(() => {
document.dispatchEvent(
Object.assign(new MouseEvent('mousemove'), { movementX: 0, movementY: -5000 })
);
document.dispatchEvent(new MouseEvent('mousemove', { movementX: 0, movementY: -5000 }));
});

expect(result.current.positionRef.current.y).toBe(0);
Expand All @@ -216,9 +212,7 @@ describe('usePointerLock', () => {
onMove.mockClear();

act(() => {
document.dispatchEvent(
Object.assign(new MouseEvent('mousemove'), { movementX: 100, movementY: 100 })
);
document.dispatchEvent(new MouseEvent('mousemove', { movementX: 100, movementY: 100 }));
});

expect(onMove).not.toHaveBeenCalled();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,10 @@ class TestPeer {
ontrack: ((event: { track: MediaStreamTrack }) => void) | null = null;
onconnectionstatechange: (() => void) | null = null;
senders: { track: MediaStreamTrack | null; replaceTrack: ReturnType<typeof vi.fn> }[] = [];
createOffer = vi.fn(
async (): Promise<RTCSessionDescriptionInit> => ({ type: 'offer', sdp: 'local-offer' })
);
createOffer = vi.fn(async (): Promise<RTCSessionDescriptionInit> => ({
type: 'offer',
sdp: 'local-offer',
}));
setLocalDescription = vi.fn(async (description: RTCSessionDescriptionInit) => {
this.localDescription = description;
this.signalingState = description.type === 'rollback' ? 'stable' : 'have-local-offer';
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/renderer/lib/validations.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { z } from 'zod';

export const loginSchema = z.object({
email: z.string().email('Please enter a valid email address'),
email: z.email('Please enter a valid email address'),
password: z.string().min(1, 'Password is required'),
});

Expand Down
4 changes: 2 additions & 2 deletions apps/desktop/src/renderer/routes/join.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ export function JoinPage() {
};
}, [scheduled]);

const handleLookup = async (e: React.FormEvent) => {
const handleLookup = async (e: React.SyntheticEvent) => {
e.preventDefault();
if (!joinCode.trim()) return;

Expand Down Expand Up @@ -249,7 +249,7 @@ export function JoinPage() {
}
};

const handleJoin = async (e: React.FormEvent) => {
const handleJoin = async (e: React.SyntheticEvent) => {
e.preventDefault();
if (!session) return;

Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/test/setup.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { vi } from 'vitest';
import '@testing-library/jest-dom';
import '@testing-library/jest-dom/vitest';

// Mock the electron API with the correct property name
const mockElectronAPI = {
Expand Down
10 changes: 5 additions & 5 deletions apps/installer/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@hono/node-server": "^1.13.0",
"@hono/node-server": "^2.1.5",
"@profullstack/footer": "^0.2.6",
"hono": "^4.6.0"
"hono": "^4.13.14"
},
"devDependencies": {
"@types/node": "^22.10.0",
"tsx": "^4.19.0",
"typescript": "^5.7.0"
"@types/node": "^24.19.2",
"tsx": "^4.23.15",
"typescript": "^5.9.3"
},
"pnpm": {
"onlyBuiltDependencies": [
Expand Down
2 changes: 1 addition & 1 deletion apps/web/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
# binary copied in, the same pattern icemap.app runs in production.
# ===========================================

FROM oven/bun:1.4.0-alpine AS bun
FROM oven/bun:1.4.4-alpine AS bun

# Stage 1: Dependencies
FROM node:24-alpine AS deps
Expand Down
78 changes: 39 additions & 39 deletions apps/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,54 +16,54 @@
"clean": "rm -rf .next out node_modules"
},
"dependencies": {
"@anthropic-ai/sdk": "^0.128.0",
"@anthropic-ai/sdk": "^1.3.0",
"@pairux/meeting-translation": "workspace:*",
"@profullstack/autoblog": "github:profullstack/autoblog#75e54af",
"@profullstack/emailer": "^1.0.3",
"@profullstack/footer": "latest",
"@profullstack/live-translate": "^0.2.1",
"@profullstack/notifications": "0.1.0",
"@profullstack/live-translate": "^0.3.0",
"@profullstack/notifications": "0.1.4",
"@profullstack/pairux-embed": "workspace:*",
"@profullstack/profile": "0.1.3",
"@profullstack/stack": "^0.1.3",
"@profullstack/x402-gateway": "^0.11.0",
"@serwist/next": "^9.5.0",
"@supabase/ssr": "^0.5.0",
"@supabase/supabase-js": "^2.47.0",
"clsx": "^2.1.0",
"linkify-react": "^4.3.2",
"linkifyjs": "^4.3.2",
"livekit-client": "^2.17.0",
"livekit-server-sdk": "^2.15.0",
"lucide-react": "^0.468.0",
"marked": "^18.0.5",
"next": "16.3.8",
"@profullstack/profile": "0.1.6",
"@profullstack/stack": "^0.5.0",
"@profullstack/x402-gateway": "^0.13.1",
"@serwist/next": "^9.5.13",
"@supabase/ssr": "^0.12.7",
"@supabase/supabase-js": "^2.118.0",
"clsx": "^2.1.1",
"linkify-react": "^4.4.0",
"linkifyjs": "^4.4.0",
"livekit-client": "^2.23.0",
"livekit-server-sdk": "^2.19.2",
"lucide-react": "^1.61.0",
"marked": "^18.1.1",
"next": "16.4.3",
"next-intl": "^4.14.9",
"posthog-js": "^1.381.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"posthog-js": "^1.438.23",
"react": "^19.3.1",
"react-dom": "^19.3.1",
"react-type-animation": "^3.2.0",
"serwist": "^9.5.0",
"tailwind-merge": "^2.6.0",
"zod": "^3.24.0"
"serwist": "^9.5.13",
"tailwind-merge": "^3.7.0",
"zod": "^4.6.7"
},
"devDependencies": {
"@pairux/shared-types": "workspace:*",
"@tailwindcss/postcss": "^4.0.0",
"@tailwindcss/typography": "^0.5.15",
"@testing-library/jest-dom": "^6.6.0",
"@testing-library/react": "^16.1.0",
"@testing-library/user-event": "^14.5.0",
"@types/node": "^22.10.0",
"@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0",
"autoprefixer": "^10.4.20",
"intl-messageformat": "11.2.15",
"jsdom": "^25.0.0",
"postcss": "^8.4.49",
"sharp": "^0.34.5",
"tailwindcss": "^4.0.0",
"typescript": "^5.7.0",
"vitest": "^3.2.0"
"@tailwindcss/postcss": "^4.3.3",
"@tailwindcss/typography": "^0.5.20",
"@testing-library/jest-dom": "^7.0.1",
"@testing-library/react": "^16.3.3",
"@testing-library/user-event": "^14.6.8",
"@types/node": "^24.19.2",
"@types/react": "^19.3.0",
"@types/react-dom": "^19.3.0",
"autoprefixer": "^10.6.1",
"intl-messageformat": "12.1.4",
"jsdom": "^30.1.3",
"postcss": "^8.5.31",
"sharp": "^0.35.5",
"tailwindcss": "^4.3.3",
"typescript": "^5.9.3",
"vitest": "^3.2.7"
}
}
2 changes: 1 addition & 1 deletion apps/web/src/app/(auth)/reset-password/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ function ResetPasswordForm() {
verifyToken();
}, [searchParams]);

async function handleSubmit(e: React.FormEvent) {
async function handleSubmit(e: React.SyntheticEvent) {
e.preventDefault();
setError('');

Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/app/admin/email-composer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export function EmailComposer() {
const [result, setResult] = useState<SendResult | null>(null);
const [error, setError] = useState<string | null>(null);

const onSubmit = (e: React.FormEvent) => {
const onSubmit = (e: React.SyntheticEvent) => {
e.preventDefault();
setError(null);
setResult(null);
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/app/admin/integrations-form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export function IntegrationsManager({ initial }: { initial: Integration[] }) {
const origin = typeof window !== 'undefined' ? window.location.origin : '';
const webhookUrl = `${origin}/api/webhooks/autoblog`;

const onCreate = (e: React.FormEvent) => {
const onCreate = (e: React.SyntheticEvent) => {
e.preventDefault();
setError(null);
setJustCreatedToken(null);
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/app/api/channels/[channelId]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ interface RouteParams {
const Body = z.object({
name: z.string().trim().max(80).optional(),
description: z.string().trim().max(500).optional(),
avatar_url: z.string().url().max(600).optional(),
banner_url: z.string().url().max(600).optional(),
avatar_url: z.url().max(600).optional(),
banner_url: z.url().max(600).optional(),
// Free text from the owner; normalized below. '' (or null) clears it.
website_url: z.string().max(2048).nullable().optional(),
});
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/app/api/channels/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ const CreateBody = z.object({
name: z.string().trim().max(80).optional(),
description: z.string().trim().max(500).optional(),
// Owned by an organization, or by one of its teams: its members can go live on it.
orgId: z.string().uuid().optional(),
teamId: z.string().uuid().optional(),
orgId: z.guid().optional(),
teamId: z.guid().optional(),
});

// POST /api/channels — create a channel
Expand Down
Loading
Loading