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() {