From 6e649df0af9c37d8c5de6ec5eebc369fd417bfd5 Mon Sep 17 00:00:00 2001 From: Nicolas Cantu Date: Tue, 13 Jan 2026 17:23:28 +0100 Subject: [PATCH] lint wip --- .../2026-01-13-lint-max-lines-author-page.md | 2 +- {pages => lib}/api/nip95-upload/handler.ts | 1 - lib/api/nip95-upload/index.ts | 1 + {pages => lib}/api/nip95-upload/multipart.ts | 1 - .../api/nip95-upload/proxyRequest.ts | 1 - .../api/nip95-upload/proxyRequestErrors.ts | 1 - .../api/nip95-upload/requestErrorResponse.ts | 1 - .../api/nip95-upload/responseFormatting.ts | 1 - .../api/nip95-upload/systemErrors.ts | 1 - {pages => lib}/api/nip95-upload/types.ts | 1 - {pages => lib}/api/nip95-upload/utils.ts | 1 - lib/markdownRenderer.tsx | 22 +++++----- pages/api/nip95-upload.ts | 11 ++++- pages/api/nip95-upload/index.ts | 11 ----- scripts/lint.js | 41 ++++++++----------- 15 files changed, 41 insertions(+), 56 deletions(-) rename {pages => lib}/api/nip95-upload/handler.ts (99%) create mode 100644 lib/api/nip95-upload/index.ts rename {pages => lib}/api/nip95-upload/multipart.ts (99%) rename {pages => lib}/api/nip95-upload/proxyRequest.ts (99%) rename {pages => lib}/api/nip95-upload/proxyRequestErrors.ts (99%) rename {pages => lib}/api/nip95-upload/requestErrorResponse.ts (99%) rename {pages => lib}/api/nip95-upload/responseFormatting.ts (99%) rename {pages => lib}/api/nip95-upload/systemErrors.ts (99%) rename {pages => lib}/api/nip95-upload/types.ts (99%) rename {pages => lib}/api/nip95-upload/utils.ts (99%) delete mode 100644 pages/api/nip95-upload/index.ts diff --git a/fixKnowledge/2026-01-13-lint-max-lines-author-page.md b/fixKnowledge/2026-01-13-lint-max-lines-author-page.md index 0a952a6..35eb444 100644 --- a/fixKnowledge/2026-01-13-lint-max-lines-author-page.md +++ b/fixKnowledge/2026-01-13-lint-max-lines-author-page.md @@ -27,7 +27,7 @@ Refactor purement structurel (sans changement fonctionnel) : - `components/authorPage/SeriesList.tsx` - `components/authorPage/useAuthorData.ts` - `components/authorPage/resolveAuthorHashIdOrPubkey.ts` -- `pages/api/nip95-upload.ts` (shim de compatibilité pour la validation Next/TypeScript) +- `pages/api/nip95-upload.ts` (route API NIP-95 upload; impl déplacée vers `lib/api/nip95-upload/*` pour éviter des routes Next involontaires) - `lib/metadataExtractor/reviewTip.ts` (validation stricte des champs requis) - `lib/paymentNotes/sponsoring.ts` (exactOptionalPropertyTypes) - `components/relayManager/RelayCard.tsx` (typage lastSyncDate) diff --git a/pages/api/nip95-upload/handler.ts b/lib/api/nip95-upload/handler.ts similarity index 99% rename from pages/api/nip95-upload/handler.ts rename to lib/api/nip95-upload/handler.ts index 3659fa6..30973c3 100644 --- a/pages/api/nip95-upload/handler.ts +++ b/lib/api/nip95-upload/handler.ts @@ -34,4 +34,3 @@ export async function nip95UploadHandler(req: NextApiRequest, res: NextApiRespon function readProxyQueryParams(req: NextApiRequest): ProxyQueryParams { return { targetEndpoint: (req.query.endpoint as string) ?? 'https://void.cat/upload', authToken: req.query.auth as string | undefined } } - diff --git a/lib/api/nip95-upload/index.ts b/lib/api/nip95-upload/index.ts new file mode 100644 index 0000000..fdb6942 --- /dev/null +++ b/lib/api/nip95-upload/index.ts @@ -0,0 +1 @@ +export { nip95UploadHandler } from './handler' diff --git a/pages/api/nip95-upload/multipart.ts b/lib/api/nip95-upload/multipart.ts similarity index 99% rename from pages/api/nip95-upload/multipart.ts rename to lib/api/nip95-upload/multipart.ts index 8be196f..f805561 100644 --- a/pages/api/nip95-upload/multipart.ts +++ b/lib/api/nip95-upload/multipart.ts @@ -40,4 +40,3 @@ export function safeUnlink(filepath: string): void { console.error('Error deleting temp file:', unlinkError) } } - diff --git a/pages/api/nip95-upload/proxyRequest.ts b/lib/api/nip95-upload/proxyRequest.ts similarity index 99% rename from pages/api/nip95-upload/proxyRequest.ts rename to lib/api/nip95-upload/proxyRequest.ts index 9dbca5b..644e5a3 100644 --- a/pages/api/nip95-upload/proxyRequest.ts +++ b/lib/api/nip95-upload/proxyRequest.ts @@ -141,4 +141,3 @@ async function readIncomingMessageBody(message: http.IncomingMessage): Promise return typeof rec.code === 'string' ? rec.code : undefined } - diff --git a/pages/api/nip95-upload/types.ts b/lib/api/nip95-upload/types.ts similarity index 99% rename from pages/api/nip95-upload/types.ts rename to lib/api/nip95-upload/types.ts index 868beb6..4f20533 100644 --- a/pages/api/nip95-upload/types.ts +++ b/lib/api/nip95-upload/types.ts @@ -23,4 +23,3 @@ export interface ProxyQueryParams { } export type UploadedFile = FormidableFile - diff --git a/pages/api/nip95-upload/utils.ts b/lib/api/nip95-upload/utils.ts similarity index 99% rename from pages/api/nip95-upload/utils.ts rename to lib/api/nip95-upload/utils.ts index efcbfa9..97503e3 100644 --- a/pages/api/nip95-upload/utils.ts +++ b/lib/api/nip95-upload/utils.ts @@ -36,4 +36,3 @@ export function getRedirectLocation(headers: unknown): string | undefined { } return undefined } - diff --git a/lib/markdownRenderer.tsx b/lib/markdownRenderer.tsx index 645def5..2b6f769 100644 --- a/lib/markdownRenderer.tsx +++ b/lib/markdownRenderer.tsx @@ -55,7 +55,7 @@ function processLine(line: string, index: number, state: RenderState, elements: renderParagraphOrBreak(line, index, state, elements) } -function renderHeading(line: string, index: number, state: RenderState, elements: React.ReactElement[]): boolean { +function renderHeading(line: string, _index: number, state: RenderState, elements: React.ReactElement[]): boolean { if (line.startsWith('# ')) { elements.push(

{line.substring(2)}

) return true @@ -75,7 +75,7 @@ function renderHeading(line: string, index: number, state: RenderState, elements return false } -function renderListLine(line: string, index: number, state: RenderState): boolean { +function renderListLine(line: string, _index: number, state: RenderState): boolean { if (line.startsWith('- ') || line.startsWith('* ')) { state.currentList.push({ key: nextElementKey(state, 'li', line), line }) return true @@ -83,23 +83,23 @@ function renderListLine(line: string, index: number, state: RenderState): boolea return false } -function renderLinkLine(line: string, index: number, state: RenderState, elements: React.ReactElement[]): boolean { +function renderLinkLine(line: string, _index: number, state: RenderState, elements: React.ReactElement[]): boolean { if (line.includes('[') && line.includes('](')) { - renderLink(line, index, state, elements) + renderLink(line, state, elements) return true } return false } -function renderBoldAndCodeLine(line: string, index: number, state: RenderState, elements: React.ReactElement[]): boolean { +function renderBoldAndCodeLine(line: string, _index: number, state: RenderState, elements: React.ReactElement[]): boolean { if (line.includes('**') || line.includes('`')) { - renderBoldAndCode(line, index, state, elements) + renderBoldAndCode(line, state, elements) return true } return false } -function renderParagraphOrBreak(line: string, index: number, state: RenderState, elements: React.ReactElement[]): void { +function renderParagraphOrBreak(line: string, _index: number, state: RenderState, elements: React.ReactElement[]): void { if (line.trim() !== '') { elements.push(

{line}

) return @@ -114,7 +114,7 @@ function renderParagraphOrBreak(line: string, index: number, state: RenderState, function handleCodeBlock( _line: string, - index: number, + _index: number, state: RenderState, elements: React.ReactElement[] ): void { @@ -173,7 +173,7 @@ function createLinkElement( ) } -function renderLink(line: string, index: number, state: RenderState, elements: React.ReactElement[]): void { +function renderLink(line: string, state: RenderState, elements: React.ReactElement[]): void { const linkRegex = /\[([^\]]+)\]\(([^)]+)\)/g let lastIndex = 0 const parts: (string | React.ReactElement)[] = [] @@ -187,7 +187,7 @@ function renderLink(line: string, index: number, state: RenderState, elements: R const href = match[2] const isExternal = href.startsWith('http') if (match[1]) { - parts.push(createLinkElement(match[1], href, `link-${index}-${match.index}`, isExternal)) + parts.push(createLinkElement(match[1], href, `link-${match.index}-${href}`, isExternal)) } lastIndex = match.index + match[0].length } @@ -200,7 +200,7 @@ function renderLink(line: string, index: number, state: RenderState, elements: R elements.push(

{parts}

) } -function renderBoldAndCode(line: string, index: number, state: RenderState, elements: React.ReactElement[]): void { +function renderBoldAndCode(line: string, state: RenderState, elements: React.ReactElement[]): void { const parts: (string | React.ReactElement)[] = [] const codeRegex = /`([^`]+)`/g let codeMatch diff --git a/pages/api/nip95-upload.ts b/pages/api/nip95-upload.ts index f0c9971..cb65fb4 100644 --- a/pages/api/nip95-upload.ts +++ b/pages/api/nip95-upload.ts @@ -1 +1,10 @@ -export { config, default } from './nip95-upload/index' +import type { NextApiRequest, NextApiResponse } from 'next' +import { nip95UploadHandler } from '@/lib/api/nip95-upload' + +export const config = { + api: { bodyParser: false }, +} + +export default async function handler(req: NextApiRequest, res: NextApiResponse): Promise { + return nip95UploadHandler(req, res) +} diff --git a/pages/api/nip95-upload/index.ts b/pages/api/nip95-upload/index.ts deleted file mode 100644 index 2d7a49d..0000000 --- a/pages/api/nip95-upload/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' -import { nip95UploadHandler } from './handler' - -export const config = { - api: { bodyParser: false }, -} - -export default async function handler(req: NextApiRequest, res: NextApiResponse): Promise { - return nip95UploadHandler(req, res) -} - diff --git a/scripts/lint.js b/scripts/lint.js index 0b871f4..974753a 100644 --- a/scripts/lint.js +++ b/scripts/lint.js @@ -9,33 +9,28 @@ const { execSync } = require('child_process') const projectRoot = process.cwd() -try { - // Change to project root and run next lint +function runEslint() { + execSync('npx eslint . --ext .ts,.tsx --ignore-pattern next-env.d.ts', { + stdio: 'inherit', + cwd: projectRoot, + }) +} + +function runNextLint() { process.chdir(projectRoot) execSync('npx next lint', { stdio: 'inherit', cwd: projectRoot, env: { ...process.env, PWD: projectRoot }, }) -} catch { - // If next lint fails, try eslint directly with flat config - console.log('Falling back to eslint directly...') - try { - // Try auto-fix first - try { - execSync('npx eslint . --ext .ts,.tsx --fix', { - stdio: 'inherit', - cwd: projectRoot, - }) - } catch { - // If auto-fix fails, run without fix to show remaining errors - execSync('npx eslint . --ext .ts,.tsx', { - stdio: 'inherit', - cwd: projectRoot, - }) - } - } catch { - console.error('Both next lint and eslint failed') - process.exit(1) - } +} + +try { + if (process.env.USE_NEXT_LINT === '1') { + runNextLint() + } else { + runEslint() + } +} catch { + process.exit(1) }