diff --git a/docs/ssr.md b/docs/ssr.md new file mode 100644 index 000000000..3a760d1f3 --- /dev/null +++ b/docs/ssr.md @@ -0,0 +1,5 @@ +# Server-side rendering + +```js echo server +`
hello ${process.env.USER}`
+```
diff --git a/src/markdown.ts b/src/markdown.ts
index 72fc03ab6..f9548d580 100644
--- a/src/markdown.ts
+++ b/src/markdown.ts
@@ -6,7 +6,7 @@ import equal from "fast-deep-equal";
import matter from "gray-matter";
import hljs from "highlight.js";
import {parseHTML} from "linkedom";
-import MarkdownIt from "markdown-it";
+import MarkdownIt, {type Token} from "markdown-it";
import {type RuleCore} from "markdown-it/lib/parser_core.js";
import {type RuleInline} from "markdown-it/lib/parser_inline.js";
import {type RenderRule, type default as Renderer} from "markdown-it/lib/renderer.js";
@@ -15,7 +15,7 @@ import {isEnoent} from "./error.js";
import {fileReference, getLocalPath} from "./files.js";
import {computeHash} from "./hash.js";
import {parseInfo} from "./info.js";
-import type {FileReference, ImportReference, PendingTranspile, Transpile} from "./javascript.js";
+import type {FileReference, ImportReference, ParseOptions, PendingTranspile, Transpile} from "./javascript.js";
import {transpileJavaScript} from "./javascript.js";
import {transpileTag} from "./tag.js";
import {resolvePath} from "./url.js";
@@ -101,6 +101,7 @@ function getLiveSource(content: string, tag: string): string | undefined {
}
function makeFenceRenderer(root: string, baseRenderer: RenderRule, sourcePath: string): RenderRule {
+ const transform = makeJavaScriptTransformer(root, sourcePath);
return (tokens, idx, options, context: ParseContext, self) => {
const token = tokens[idx];
const {tag, attributes} = parseInfo(token.info);
@@ -109,27 +110,20 @@ function makeFenceRenderer(root: string, baseRenderer: RenderRule, sourcePath: s
let count = 0;
const source = isFalse(attributes.run) ? undefined : getLiveSource(token.content, tag);
if (source != null) {
- const id = uniqueCodeId(context, token.content);
- const sourceLine = context.startLine + context.currentLine;
- const transpile = transpileJavaScript(source, {
- id,
- root,
- sourcePath,
- sourceLine
- });
- extendPiece(context, {code: [transpile]});
- if (transpile.files) context.files.push(...transpile.files);
- if (transpile.imports) context.imports.push(...transpile.imports);
- result += `\n`;
- count++;
+ if (tag === "js" && (attributes.server === "" || attributes.server?.toLowerCase() === "true")) {
+ result += `