From 7e45aaa1da2070ce7c0899a6f5953ed88426618d Mon Sep 17 00:00:00 2001 From: Wael Nasreddine Date: Thu, 25 Dec 2025 21:40:42 -0800 Subject: [PATCH 1/6] for frontend js files add .js --- apps/server/src/services/export/zip/share_theme.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/server/src/services/export/zip/share_theme.ts b/apps/server/src/services/export/zip/share_theme.ts index 1788e38b9..592eb94ec 100644 --- a/apps/server/src/services/export/zip/share_theme.ts +++ b/apps/server/src/services/export/zip/share_theme.ts @@ -115,6 +115,10 @@ export default class ShareThemeExportProvider extends ZipExportProvider { return null; } + if (type === "code" && mime === "application/javascript;env=frontend"){ + return "js"; + } + return "html"; } From 94d1181fe8611eecb17a370b99bfeebdae2d1d2c Mon Sep 17 00:00:00 2001 From: Wael Nasreddine Date: Thu, 25 Dec 2025 21:52:35 -0800 Subject: [PATCH 2/6] render js notes as-is --- apps/server/src/services/export/zip/share_theme.ts | 1 + apps/server/src/share/content_renderer.ts | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/apps/server/src/services/export/zip/share_theme.ts b/apps/server/src/services/export/zip/share_theme.ts index 592eb94ec..44571dbd7 100644 --- a/apps/server/src/services/export/zip/share_theme.ts +++ b/apps/server/src/services/export/zip/share_theme.ts @@ -70,6 +70,7 @@ export default class ShareThemeExportProvider extends ZipExportProvider { }) : ""; content = renderNoteForExport(note, branch, basePath, noteMeta.notePath.slice(0, -1)); + // TODO: This will probably never match, but should it be exclude from running on code/jsFrontend notes? if (typeof content === "string") { content = content.replace(/href="[^"]*\.\/([a-zA-Z0-9_\/]{12})[^"]*"/g, (match, id) => { if (match.includes("/assets/")) return match; diff --git a/apps/server/src/share/content_renderer.ts b/apps/server/src/share/content_renderer.ts index 70d7f2b82..897f10394 100644 --- a/apps/server/src/share/content_renderer.ts +++ b/apps/server/src/share/content_renderer.ts @@ -149,6 +149,15 @@ interface RenderArgs { } function renderNoteContentInternal(note: SNote | BNote, renderArgs: RenderArgs) { + if (renderArgs.isStatic && note.type == "code" && note.mime === "application/javascript;env=frontend") { + if (note.isProtected) { + // TODO: how to handle this case here? + throw new Error(`note ${note.noteId} is protected and cannot be exported`); + } + + return note.getContent(); + } + const { header, content, isEmpty } = getContent(note); const showLoginInShareTheme = options.getOption("showLoginInShareTheme"); const opts = { From afcd23cb99d953cda6574955b44f8f38d75848a4 Mon Sep 17 00:00:00 2001 From: Wael Nasreddine Date: Thu, 25 Dec 2025 22:03:06 -0800 Subject: [PATCH 3/6] add a todo --- apps/server/src/services/export/zip/share_theme.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/server/src/services/export/zip/share_theme.ts b/apps/server/src/services/export/zip/share_theme.ts index 44571dbd7..7775b52d6 100644 --- a/apps/server/src/services/export/zip/share_theme.ts +++ b/apps/server/src/services/export/zip/share_theme.ts @@ -116,6 +116,7 @@ export default class ShareThemeExportProvider extends ZipExportProvider { return null; } + // TODO: Should we allow mime to also include backend, i.e loosely check that it starts with application/javascript and ignore the rest? if (type === "code" && mime === "application/javascript;env=frontend"){ return "js"; } From 03eaebc71c61e3794f701d51acb8347edd0a39b5 Mon Sep 17 00:00:00 2001 From: Wael Nasreddine Date: Thu, 25 Dec 2025 22:54:14 -0800 Subject: [PATCH 4/6] be loosy and honor startsWith application/javascript --- apps/server/src/services/export/zip/share_theme.ts | 3 +-- apps/server/src/share/content_renderer.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/server/src/services/export/zip/share_theme.ts b/apps/server/src/services/export/zip/share_theme.ts index 7775b52d6..2f1784c13 100644 --- a/apps/server/src/services/export/zip/share_theme.ts +++ b/apps/server/src/services/export/zip/share_theme.ts @@ -116,8 +116,7 @@ export default class ShareThemeExportProvider extends ZipExportProvider { return null; } - // TODO: Should we allow mime to also include backend, i.e loosely check that it starts with application/javascript and ignore the rest? - if (type === "code" && mime === "application/javascript;env=frontend"){ + if (mime.startsWith("application/javascript")) { return "js"; } diff --git a/apps/server/src/share/content_renderer.ts b/apps/server/src/share/content_renderer.ts index 897f10394..b217560a3 100644 --- a/apps/server/src/share/content_renderer.ts +++ b/apps/server/src/share/content_renderer.ts @@ -149,7 +149,7 @@ interface RenderArgs { } function renderNoteContentInternal(note: SNote | BNote, renderArgs: RenderArgs) { - if (renderArgs.isStatic && note.type == "code" && note.mime === "application/javascript;env=frontend") { + if (renderArgs.isStatic && note.mime.startsWith("application/javascript")) { if (note.isProtected) { // TODO: how to handle this case here? throw new Error(`note ${note.noteId} is protected and cannot be exported`); From 7e7f3ba78f91d4540c4a4ba62b8c565f4d89a391 Mon Sep 17 00:00:00 2001 From: Wael Nasreddine Date: Thu, 25 Dec 2025 23:01:01 -0800 Subject: [PATCH 5/6] improve the protected note handling --- apps/server/src/share/content_renderer.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/server/src/share/content_renderer.ts b/apps/server/src/share/content_renderer.ts index b217560a3..cb2a9aaa6 100644 --- a/apps/server/src/share/content_renderer.ts +++ b/apps/server/src/share/content_renderer.ts @@ -149,11 +149,11 @@ interface RenderArgs { } function renderNoteContentInternal(note: SNote | BNote, renderArgs: RenderArgs) { + // When rendering static share, non-protected JavaScript notes should be rendered as-is. if (renderArgs.isStatic && note.mime.startsWith("application/javascript")) { if (note.isProtected) { - // TODO: how to handle this case here? - throw new Error(`note ${note.noteId} is protected and cannot be exported`); - } + return `console.log("Protected note cannot be exported.");` + }; return note.getContent(); } From d96528dae4d361d82d9afcd569b1b32937638281 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 29 Dec 2025 20:38:48 +0200 Subject: [PATCH 6/6] chore(server): fix type error --- apps/server/src/share/content_renderer.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/server/src/share/content_renderer.ts b/apps/server/src/share/content_renderer.ts index 465d99196..4f9646e82 100644 --- a/apps/server/src/share/content_renderer.ts +++ b/apps/server/src/share/content_renderer.ts @@ -168,10 +168,10 @@ function renderNoteContentInternal(note: SNote | BNote, renderArgs: RenderArgs) // When rendering static share, non-protected JavaScript notes should be rendered as-is. if (renderArgs.isStatic && note.mime.startsWith("application/javascript")) { if (note.isProtected) { - return `console.log("Protected note cannot be exported.");` - }; + return `console.log("Protected note cannot be exported.");`; + } - return note.getContent(); + return note.getContent() ?? ""; } const { header, content, isEmpty } = getContent(note);