diff --git a/apps/demo/index-react.html b/apps/demo/index-react.html deleted file mode 100644 index 657e8e5e7..000000000 --- a/apps/demo/index-react.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - PierreJS R&D (React) - - -
- - - diff --git a/apps/demo/src/components/App.tsx b/apps/demo/src/components/App.tsx index 551573203..398e368bf 100644 --- a/apps/demo/src/components/App.tsx +++ b/apps/demo/src/components/App.tsx @@ -35,7 +35,7 @@ export function App() { themes.push(item.options.theme); } } - preloadHighlighter({ langs, themes }); + void preloadHighlighter({ langs, themes }); } }, []); diff --git a/apps/demo/src/components/CodeRenderer.tsx b/apps/demo/src/components/CodeRenderer.tsx index 4dfdd91ab..8c4bfe494 100644 --- a/apps/demo/src/components/CodeRenderer.tsx +++ b/apps/demo/src/components/CodeRenderer.tsx @@ -16,7 +16,7 @@ export function CodeRenderer({ stream, options }: CodeRendererProps) { const ref = useRef(null); useEffect(() => { if (ref.current != null) { - codeRenderer.setup(stream, ref.current); + void codeRenderer.setup(stream, ref.current); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/apps/demo/src/main.ts b/apps/demo/src/main.ts index 58a5ecb36..96b9149a7 100644 --- a/apps/demo/src/main.ts +++ b/apps/demo/src/main.ts @@ -27,7 +27,7 @@ async function loadPatchContent() { loadingPatch = loadingPatch ?? new Promise((resolve) => { - import('./mocks/diff.patch?raw').then(({ default: content }) => + void import('./mocks/diff.patch?raw').then(({ default: content }) => resolve(content) ); }); @@ -47,7 +47,7 @@ function startStreaming() { const pre = document.createElement('pre'); container.appendChild(pre); const instance = new CodeRenderer(options); - instance.setup(createFakeContentStream(content, letterByLetter), pre); + void instance.setup(createFakeContentStream(content, letterByLetter), pre); } } @@ -66,7 +66,7 @@ async function handlePreloadDiff() { } } } - preloadHighlighter({ + void preloadHighlighter({ langs: Array.from(langs), themes: ['tokyo-night', 'solarized-light'], }); @@ -135,7 +135,7 @@ function renderDiff(parsedPatches: ParsedPatch[]) { if (fileAnnotations != null) { instance.setLineAnnotations(fileAnnotations); } - instance.render({ fileDiff, wrapper }); + void instance.render({ fileDiff, wrapper }); diffInstances.push(instance); hunkIndex++; } @@ -165,7 +165,7 @@ function handlePreload() { themes.push(item.options.theme); } } - preloadHighlighter({ langs, themes }); + void preloadHighlighter({ langs, themes }); } document.getElementById('toggle-theme')?.addEventListener('click', toggleTheme); @@ -178,10 +178,12 @@ if (streamCode != null) { const loadDiff = document.getElementById('load-diff'); if (loadDiff != null) { - loadDiff.addEventListener('click', async () => { - renderDiff(parsedPatches ?? parsePatchContent(await loadPatchContent())); + loadDiff.addEventListener('click', () => { + void (async () => { + renderDiff(parsedPatches ?? parsePatchContent(await loadPatchContent())); + })(); }); - loadDiff.addEventListener('mouseenter', handlePreloadDiff); + loadDiff.addEventListener('mouseenter', () => void handlePreloadDiff); } const wrapCheckbox = document.getElementById('wrap-lines'); @@ -292,7 +294,7 @@ function toggleTheme() { ? 'dark' : 'light'; const pageTheme = - (document.documentElement.dataset.theme ?? systemTheme === 'dark') + (document.documentElement.dataset.theme ?? systemTheme) === 'dark' ? 'dark' : 'light'; diff --git a/apps/demo/src/main.tsx b/apps/demo/src/main.tsx deleted file mode 100644 index 2e006674d..000000000 --- a/apps/demo/src/main.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import * as React from 'react'; -import * as ReactDOM from 'react-dom/client'; - -import { App } from './components/App'; -import './style.css'; - -ReactDOM.createRoot(document.getElementById('root')!).render(); diff --git a/apps/demo/src/utils/createHighlighterCleanup.ts b/apps/demo/src/utils/createHighlighterCleanup.ts index f4b7e5fbd..5d8d56c5a 100644 --- a/apps/demo/src/utils/createHighlighterCleanup.ts +++ b/apps/demo/src/utils/createHighlighterCleanup.ts @@ -9,7 +9,7 @@ export function createHighlighterCleanup() { onStreamClose() { completed++; if (completed >= totalInstances) { - disposeHighlighter(); + void disposeHighlighter(); } }, }; diff --git a/apps/demo/tsconfig.json b/apps/demo/tsconfig.json index 8511b5145..182cc1fd2 100644 --- a/apps/demo/tsconfig.json +++ b/apps/demo/tsconfig.json @@ -1,12 +1,11 @@ { "extends": "../../tsconfig.options.json", - "include": ["src/**/*"], + "include": ["src/**/*", "vite.config.ts"], "compilerOptions": { "composite": false, "noEmit": true, "emitDeclarationOnly": false, "baseUrl": ".", - "rootDir": "src", "lib": ["ES2023", "DOM", "DOM.Iterable"] } } diff --git a/apps/demo/vite.config.ts b/apps/demo/vite.config.ts index a84df1188..aacf6f31c 100644 --- a/apps/demo/vite.config.ts +++ b/apps/demo/vite.config.ts @@ -28,23 +28,10 @@ export default defineConfig(() => { } } - // Handle /react path - serve React version - if (req.url === '/react' || req.url === '/react/') { - const htmlPath = resolve(__dirname, 'index-react.html'); - try { - const htmlContent = fs.readFileSync(htmlPath, 'utf-8'); - const html = await server.transformIndexHtml('/react', htmlContent); - res.setHeader('Content-Type', 'text/html'); - res.end(html); - return; - } catch (e) { - console.error('Error transforming React HTML:', e); - } - } - next(); }; + // eslint-disable-next-line @typescript-eslint/no-misused-promises server.middlewares.use('/', handleRoutes); }, configurePreviewServer(server: PreviewServer) { @@ -52,6 +39,7 @@ export default defineConfig(() => { req: IncomingMessage, res: ServerResponse, next: () => void + // eslint-disable-next-line @typescript-eslint/require-await ) => { // Handle root path - serve vanilla version if (req.url === '/' || req.url === '/index.html') { @@ -66,22 +54,10 @@ export default defineConfig(() => { } } - // Handle /react path - serve React version - if (req.url === '/react' || req.url === '/react/') { - const htmlPath = resolve(__dirname, 'dist/index-react.html'); - try { - const htmlContent = fs.readFileSync(htmlPath, 'utf-8'); - res.setHeader('Content-Type', 'text/html'); - res.end(htmlContent); - return; - } catch (e) { - console.error('Error serving React HTML:', e); - } - } - next(); }; + // eslint-disable-next-line @typescript-eslint/no-misused-promises server.middlewares.use('/', handleRoutes); }, }); @@ -92,7 +68,6 @@ export default defineConfig(() => { rollupOptions: { input: { main: resolve(__dirname, 'index.html'), - react: resolve(__dirname, 'index-react.html'), }, }, }, diff --git a/apps/docs/app/api/code-storage/github/callback/route.ts b/apps/docs/app/api/code-storage/github/callback/route.ts index 62398d0be..46a256b95 100644 --- a/apps/docs/app/api/code-storage/github/callback/route.ts +++ b/apps/docs/app/api/code-storage/github/callback/route.ts @@ -1,4 +1,4 @@ -import { NextRequest, NextResponse } from 'next/server'; +import { type NextRequest, NextResponse } from 'next/server'; export async function GET(request: NextRequest) { const searchParams = request.nextUrl.searchParams; @@ -7,6 +7,7 @@ export async function GET(request: NextRequest) { const setupAction = searchParams.get('setup_action'); const state = searchParams.get('state'); + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (!code) { return NextResponse.json({ error: 'No code provided' }, { status: 400 }); } @@ -28,19 +29,24 @@ export async function GET(request: NextRequest) { } ); - const tokenData = await tokenResponse.json(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const tokenData: any = await tokenResponse.json(); + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (tokenData.error) { - throw new Error(tokenData.error_description || tokenData.error); + throw new Error(tokenData.error_description ?? tokenData.error); } const successUrl = new URL('/code-storage/success', request.url); + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (setupAction) { successUrl.searchParams.set('setup_action', setupAction); } + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (installationId) { successUrl.searchParams.set('installation_id', installationId); } + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (state) { successUrl.searchParams.set('state', state); } diff --git a/apps/docs/app/api/code-storage/github/installations/route.ts b/apps/docs/app/api/code-storage/github/installations/route.ts index 71f7ac612..eda381a3b 100644 --- a/apps/docs/app/api/code-storage/github/installations/route.ts +++ b/apps/docs/app/api/code-storage/github/installations/route.ts @@ -1,5 +1,5 @@ import type { components } from '@octokit/openapi-types'; -import { NextRequest, NextResponse } from 'next/server'; +import { type NextRequest, NextResponse } from 'next/server'; type Installation = components['schemas']['installation']; @@ -34,13 +34,15 @@ function filterInstallations(installations: Installation[]) { app_id: `${installation.app_id}`, app_slug: installation.app_slug, owner_id: - installation.account && - ('id' in installation.account ? `${installation.account.id}` : null), + installation.account != null && 'id' in installation.account + ? `${installation.account.id}` + : null, permissions: installation.permissions, events: installation.events, type: - installation.account && - ('type' in installation.account ? installation.account.type : null), + installation.account != null && 'type' in installation.account + ? installation.account.type + : null, } satisfies FilteredInstallation; }); } @@ -65,7 +67,7 @@ function getOwnersFromInstallations(installations: Installation[]) { export async function GET(request: NextRequest) { const token = request.cookies.get('github_token')?.value; - if (!token) { + if (token == null || token.trim() === '') { return NextResponse.json({ data: { installations: [], owners: [] } }); } @@ -86,7 +88,7 @@ export async function GET(request: NextRequest) { const data = (await response.json()) as InstallationResponse; - if (!data?.installations?.length) { + if ((data?.installations?.length ?? 0) > 0) { return NextResponse.json({ data: { installations: [], diff --git a/apps/docs/app/api/code-storage/repo/route.ts b/apps/docs/app/api/code-storage/repo/route.ts index e207e69c1..4abe14e4a 100644 --- a/apps/docs/app/api/code-storage/repo/route.ts +++ b/apps/docs/app/api/code-storage/repo/route.ts @@ -1,16 +1,17 @@ import { GitStorage } from '@pierre/storage'; -import { NextRequest, NextResponse } from 'next/server'; +import { type NextRequest, NextResponse } from 'next/server'; export async function POST(request: NextRequest) { try { const store = new GitStorage({ name: 'pierre', - key: process.env.CODE_STORAGE_SYNC_PRIVATE_KEY || '', + key: process.env.CODE_STORAGE_SYNC_PRIVATE_KEY ?? '', }); const body = await request.json(); const { owner, name, defaultBranch } = body; + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (!owner || !name) { return NextResponse.json( { success: false, error: 'Repository owner and name are required' }, @@ -24,8 +25,12 @@ export async function POST(request: NextRequest) { baseRepo: { owner, name, + // NOTE(amadeus): Given these types are `any`, not sure the safest way + // to convert fix them... + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions, @typescript-eslint/prefer-nullish-coalescing defaultBranch: defaultBranch || 'main', // Optional, defaults to 'main' }, + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions, @typescript-eslint/prefer-nullish-coalescing defaultBranch: defaultBranch || 'main', // Optional, defaults to 'main' for the Git Storage repo }); @@ -40,6 +45,7 @@ export async function POST(request: NextRequest) { repository: { owner, name, + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions, @typescript-eslint/prefer-nullish-coalescing defaultBranch: defaultBranch || 'main', }, }); diff --git a/apps/docs/app/code-storage/success/page.tsx b/apps/docs/app/code-storage/success/page.tsx index fcf907d29..e5771deec 100644 --- a/apps/docs/app/code-storage/success/page.tsx +++ b/apps/docs/app/code-storage/success/page.tsx @@ -14,7 +14,8 @@ function SuccessPageContent() { const state = searchParams.get('state'); useEffect(() => { - if (window.opener) { + if (window.opener != null) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call window.opener.postMessage( { type: appInstallType, @@ -43,7 +44,7 @@ function SuccessPageContent() { Your GitHub App has been successfully{' '} {setupAction === 'install' ? 'installed' : 'updated'}.

- {installationId && ( + {installationId != null && (

Installation ID: {installationId}

@@ -54,7 +55,8 @@ function SuccessPageContent() {

- {onHelpAction ? ( + {onHelpAction != null ? (