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