@ox-content/code-play 3.0.0-alpha.8 → 3.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -6
- package/dist/browser.mjs +587 -68
- package/dist/client.mjs +192 -28
- package/dist/client.mjs.map +1 -1
- package/dist/config.d.mts +47 -2
- package/dist/config.d.mts.map +1 -1
- package/dist/hydrate.d.mts +3 -1
- package/dist/hydrate.d.mts.map +1 -1
- package/dist/hydrate2.mjs +395 -43
- package/dist/hydrate2.mjs.map +1 -1
- package/dist/index.d.mts +49 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/payload.mjs +5 -1
- package/dist/payload.mjs.map +1 -1
- package/dist/plugin.d.mts.map +1 -1
- package/dist/plugin2.mjs +712 -162
- package/dist/plugin2.mjs.map +1 -1
- package/package.json +1 -1
package/dist/plugin2.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin2.mjs","names":["readAttr"],"sources":["../src/payload-factory.ts","../src/html.ts","../src/markdown.ts","../src/plugin-client.ts","../src/plugin-proxy.ts","../src/plugin.ts"],"sourcesContent":["import { resolveLanguage } from \"./catalog\";\nimport type { ResolvedCodePlayOptions } from \"./config\";\nimport type { PlayFence } from \"./markdown\";\nimport type { LanguageDefinition, PlayPayload, PlaygroundEndpoints } from \"./types\";\n\nexport function payloadFromFence(fence: PlayFence, options: ResolvedCodePlayOptions): PlayPayload {\n const definition = resolveLanguage(fence.language);\n const enabled = definition ? options.languages.get(definition.id) : undefined;\n return {\n language: definition?.id ?? fence.language,\n code: fence.code,\n capabilities: {\n execute: enabled?.execute ?? Boolean(definition?.capabilities.execute),\n typecheck: payloadTypecheckEnabled(\n fence.typecheck,\n enabled?.typecheck,\n definition,\n options.endpoints,\n ),\n },\n config: { ...definition?.defaultConfig, ...enabled?.config },\n viewers: options.viewers,\n ui: options.ui,\n timeoutMs: options.timeoutMs,\n endpoints: options.endpoints,\n };\n}\n\n/** TypeScript typecheck in the browser needs a reachable endpoint; hide the dead button otherwise. */\nexport function payloadTypecheckEnabled(\n fenceTypecheck: boolean,\n enabledTypecheck: boolean | undefined,\n definition: LanguageDefinition | undefined,\n endpoints: PlaygroundEndpoints,\n): boolean {\n if (!(fenceTypecheck || enabledTypecheck)) {\n return false;\n }\n if (definition?.id === \"typescript\") {\n return Boolean(endpoints.typecheck);\n }\n return true;\n}\n","import { resolveLanguage } from \"./catalog\";\nimport { DEFAULT_ENDPOINTS, DEFAULT_VIEWERS } from \"./config\";\nimport { decodeHtml, escapeAttribute } from \"./escape\";\nimport { payloadTypecheckEnabled } from \"./payload-factory\";\nimport type { PlaygroundEndpoints, PlayPayload } from \"./types\";\n\nconst COMMENT_PATTERN = /<!--ox-code-play:([A-Za-z0-9+/=]+)-->\\s*(<pre\\b[\\s\\S]*?<\\/pre>)/gi;\nconst CODEPLAY_TAG_PATTERN = /<CodePlay\\b([^>]*)>([\\s\\S]*?)<\\/CodePlay>/gi;\nconst PRE_PATTERN = /<pre\\b[^>]*>\\s*<code\\b([^>]*)>([\\s\\S]*?)<\\/code>\\s*<\\/pre>/gi;\n\nexport interface HtmlEnhanceOptions {\n scriptSrc?: string;\n decodePayload: (value: string) => PlayPayload;\n encodePayload: (payload: PlayPayload) => string;\n matchFences?: Array<{ language: string; code: string; payload: string }>;\n endpoints?: PlaygroundEndpoints;\n}\n\nexport function enhancePlayHtml(html: string, options: HtmlEnhanceOptions): string {\n let next = wrapCommentedBlocks(html, options);\n next = upgradeCodePlayTags(next, options);\n if (options.matchFences?.length) {\n next = wrapMatchingFences(next, options.matchFences);\n }\n if (\n options.scriptSrc &&\n next.includes(\"data-ox-code-play\") &&\n !next.includes(options.scriptSrc)\n ) {\n next += `\\n<script type=\"module\" src=\"${escapeAttribute(options.scriptSrc)}\"></script>\\n`;\n }\n return next;\n}\n\nexport function enhanceGeneratedModule(source: string, options: HtmlEnhanceOptions): string {\n const marker = \"export const html = \";\n const start = source.indexOf(marker);\n if (start === -1) {\n return source;\n }\n const jsonStart = start + marker.length;\n if (source[jsonStart] !== '\"') {\n return source;\n }\n const parsed = readJsonString(source, jsonStart);\n if (!parsed) {\n return source;\n }\n const enhanced = enhancePlayHtml(parsed.value, options);\n return source.slice(0, jsonStart) + JSON.stringify(enhanced) + source.slice(parsed.end);\n}\n\nfunction wrapCommentedBlocks(html: string, _options: HtmlEnhanceOptions): string {\n return html.replace(COMMENT_PATTERN, (_all, payload: string, pre: string) => {\n return wrapWidget(payload, pre);\n });\n}\n\nfunction upgradeCodePlayTags(html: string, options: HtmlEnhanceOptions): string {\n return html.replace(CODEPLAY_TAG_PATTERN, (all, attrs: string, body: string) => {\n if (/\\bdata-ox-code-play=/.test(all)) {\n return all;\n }\n const language = readAttr(attrs, \"lang\") ?? readAttr(attrs, \"language\") ?? \"text\";\n const code = decodeHtml(body).replace(/^\\n/, \"\").replace(/\\n$/, \"\");\n const definition = resolveLanguage(language);\n const endpoints = options.endpoints ?? DEFAULT_ENDPOINTS;\n const payload = options.encodePayload({\n language: definition?.id ?? language,\n code,\n capabilities: {\n execute: true,\n typecheck: payloadTypecheckEnabled(\n /\\btypecheck\\b/i.test(attrs),\n undefined,\n definition,\n endpoints,\n ),\n },\n config: {},\n viewers: { ...DEFAULT_VIEWERS },\n ui: \"default\",\n timeoutMs: 10_000,\n endpoints,\n });\n return wrapWidget(\n payload,\n `<pre><code class=\"language-${escapeAttribute(language)}\">${body}</code></pre>`,\n );\n });\n}\n\nfunction wrapMatchingFences(\n html: string,\n matches: Array<{ language: string; code: string; payload: string }>,\n): string {\n const unused = matches.map((item) => ({ ...item, used: false }));\n return html.replace(PRE_PATTERN, (all, attrs: string, body: string) => {\n const className = readAttr(attrs, \"class\") ?? \"\";\n const language = className\n .split(/\\s+/)\n .find((token) => token.startsWith(\"language-\"))\n ?.slice(\"language-\".length);\n const code = normalizeCode(decodeHtml(stripTags(body)));\n const match = unused.find(\n (item) =>\n !item.used && aliasesEqual(item.language, language) && normalizeCode(item.code) === code,\n );\n if (!match) {\n return all;\n }\n match.used = true;\n return wrapWidget(match.payload, all);\n });\n}\n\nfunction wrapWidget(payload: string, inner: string): string {\n return `<ox-code-play data-ox-code-play=\"${escapeAttribute(payload)}\">${inner}</ox-code-play>`;\n}\n\nfunction readJsonString(source: string, start: number): { value: string; end: number } | undefined {\n try {\n const raw = sliceJsonString(source, start);\n return { value: JSON.parse(raw) as string, end: start + raw.length };\n } catch {\n return undefined;\n }\n}\n\nfunction sliceJsonString(source: string, start: number): string {\n let end = start + 1;\n let escaped = false;\n while (end < source.length) {\n const char = source[end];\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === '\"') {\n return source.slice(start, end + 1);\n }\n end += 1;\n }\n throw new Error(\"Unterminated HTML JSON string.\");\n}\n\nfunction readAttr(attrs: string, name: string): string | undefined {\n const match = new RegExp(`(?:^|\\\\s)${name}\\\\s*=\\\\s*\"([^\"]+)\"`, \"i\").exec(attrs);\n return match?.[1];\n}\n\nfunction stripTags(value: string): string {\n return value.replace(/<[^>]+>/g, \"\");\n}\n\nfunction normalizeCode(value: string): string {\n return value.replace(/\\r\\n/g, \"\\n\").replace(/\\n$/, \"\");\n}\n\nfunction aliasesEqual(left: string | undefined, right: string | undefined): boolean {\n if (!left || !right) {\n return false;\n }\n return left.toLowerCase() === right.toLowerCase();\n}\n","export interface PlayFence {\n language: string;\n meta: string;\n code: string;\n raw: string;\n start: number;\n end: number;\n typecheck: boolean;\n}\n\nexport interface ParsedFence {\n language: string;\n meta: string;\n code: string;\n raw: string;\n start: number;\n end: number;\n indent: string;\n marker: string;\n}\n\nconst FENCE_OPEN = /^( {0,3})(`{3,}|~{3,})([^\\n]*)$/;\n\nexport function parseTopLevelFences(source: string): ParsedFence[] {\n const lines = source.split(\"\\n\");\n const fences: ParsedFence[] = [];\n let index = 0;\n let offset = 0;\n\n while (index < lines.length) {\n const line = lines[index] ?? \"\";\n const open = FENCE_OPEN.exec(line);\n if (!open) {\n offset += line.length + 1;\n index += 1;\n continue;\n }\n\n const indent = open[1] ?? \"\";\n const marker = open[2] ?? \"```\";\n const info = (open[3] ?? \"\").trim();\n const [language = \"\", ...metaParts] = splitInfo(info);\n const start = offset;\n index += 1;\n offset += line.length + 1;\n const body: string[] = [];\n\n while (index < lines.length) {\n const candidate = lines[index] ?? \"\";\n const close = new RegExp(`^ {0,3}${escapeRegExp(marker)}[ \\t]*$`).exec(candidate);\n if (close) {\n const raw = `${line}\\n${body.join(\"\\n\")}${body.length > 0 ? \"\\n\" : \"\"}${candidate}`;\n fences.push({\n language,\n meta: metaParts.join(\" \"),\n code: body.join(\"\\n\"),\n raw,\n start,\n end: start + raw.length,\n indent,\n marker,\n });\n offset += candidate.length + 1;\n index += 1;\n break;\n }\n body.push(candidate);\n offset += candidate.length + 1;\n index += 1;\n }\n }\n\n return fences;\n}\n\nexport function parsePlayFences(source: string): PlayFence[] {\n return parseTopLevelFences(source)\n .filter((fence) => hasToken(fence.meta, \"play\"))\n .map((fence) => ({\n language: fence.language,\n meta: fence.meta,\n code: fence.code,\n raw: fence.raw,\n start: fence.start,\n end: fence.end,\n typecheck: hasToken(fence.meta, \"typecheck\"),\n }));\n}\n\nexport function stripPlayMeta(meta: string): string {\n return meta\n .split(/\\s+/)\n .filter(\n (token) => token && token !== \"play\" && token !== \"typecheck\" && !token.startsWith(\"play-\"),\n )\n .join(\" \");\n}\n\nexport function rewritePlayFences(\n source: string,\n encode: (fence: PlayFence) => string | null,\n): string {\n const fences = parsePlayFences(source);\n if (fences.length === 0) {\n return source;\n }\n\n let cursor = 0;\n let output = \"\";\n for (const fence of fences) {\n output += source.slice(cursor, fence.start);\n const encoded = encode(fence);\n if (encoded === null) {\n output += source.slice(fence.start, fence.end);\n } else {\n const cleanedMeta = stripPlayMeta(fence.meta);\n const info = [fence.language, cleanedMeta].filter(Boolean).join(\" \");\n output += `<!--ox-code-play:${encoded}-->\\n\\`\\`\\`${info}\\n${fence.code}\\n\\`\\`\\``;\n }\n cursor = fence.end;\n }\n output += source.slice(cursor);\n return output;\n}\n\nexport function parseCodePlayTags(source: string): PlayFence[] {\n const tags: PlayFence[] = [];\n const pattern = /<CodePlay\\b([^>]*)>([\\s\\S]*?)<\\/CodePlay>/gi;\n for (const match of source.matchAll(pattern)) {\n const attrs = match[1] ?? \"\";\n const language = readAttr(attrs, \"lang\") ?? readAttr(attrs, \"language\") ?? \"text\";\n tags.push({\n language,\n meta: \"play\",\n code: stripIndent((match[2] ?? \"\").replace(/^\\n/, \"\").replace(/\\n$/, \"\")),\n raw: match[0] ?? \"\",\n start: match.index ?? 0,\n end: (match.index ?? 0) + (match[0]?.length ?? 0),\n typecheck: /\\btypecheck\\b/i.test(attrs),\n });\n }\n return tags;\n}\n\nfunction splitInfo(info: string): string[] {\n return info.trim().split(/\\s+/).filter(Boolean);\n}\n\nfunction hasToken(meta: string, token: string): boolean {\n return meta.split(/\\s+/).includes(token);\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction readAttr(attrs: string, name: string): string | undefined {\n const match = new RegExp(`(?:^|\\\\s)${name}\\\\s*=\\\\s*\"([^\"]+)\"`, \"i\").exec(attrs);\n return match?.[1];\n}\n\nfunction stripIndent(value: string): string {\n const lines = value.split(\"\\n\");\n const indents = lines\n .filter((line) => line.trim())\n .map((line) => line.match(/^ */)?.[0].length ?? 0);\n const indent = indents.length > 0 ? Math.min(...indents) : 0;\n return lines.map((line) => line.slice(indent)).join(\"\\n\");\n}\n","import { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\nexport const CLIENT_FILE_CANDIDATES = [\n \"browser.mjs\",\n \"browser.js\",\n \"hydrate.mjs\",\n \"hydrate.js\",\n] as const;\n\nexport function resolveClientFile(baseUrl = import.meta.url): string | undefined {\n return CLIENT_FILE_CANDIDATES.map((name) => fileURLToPath(new URL(`./${name}`, baseUrl))).find(\n (candidate) => existsSync(candidate),\n );\n}\n\nexport function resolveHydrateSpecifier(baseUrl = import.meta.url): string {\n return resolveClientFile(baseUrl) ?? fileURLToPath(new URL(\"./hydrate.ts\", baseUrl));\n}\n\nexport function isStandaloneBrowserClient(source: string): boolean {\n return (\n !/\\bfrom\\s+[\"']\\.\\.?\\/[^\"']+[\"']/.test(source) &&\n !/\\bimport\\s*\\(\\s*[\"']\\.\\.?\\/[^\"']+[\"']/.test(source)\n );\n}\n\nexport function isAutoHydratingClient(source: string): boolean {\n return source.includes(\"bootCodePlay\") && source.includes(\"DOMContentLoaded\");\n}\n\nexport function assertBrowserClientSource(source: string): string {\n if (!isAutoHydratingClient(source) || !isStandaloneBrowserClient(source)) {\n throw new Error(\n \"@ox-content/code-play must emit a standalone ox-code-play.js that calls bootCodePlay(). Run the package build.\",\n );\n }\n return source;\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nexport const PROXY_MAX_BODY_BYTES = 256 * 1024;\n\nexport class ProxyRequestError extends Error {\n readonly statusCode: number;\n\n constructor(statusCode: number, message: string) {\n super(message);\n this.name = \"ProxyRequestError\";\n this.statusCode = statusCode;\n }\n}\n\nexport function assertHttpUrl(url: string): URL {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new ProxyRequestError(400, \"Invalid Code Play proxy destination.\");\n }\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n throw new ProxyRequestError(400, \"Code Play proxy destination must be http(s).\");\n }\n if (parsed.username || parsed.password) {\n throw new ProxyRequestError(400, \"Code Play proxy destination must not include credentials.\");\n }\n return parsed;\n}\n\nexport async function readLimitedBody(\n req: IncomingMessage,\n limit = PROXY_MAX_BODY_BYTES,\n): Promise<Buffer> {\n if (req.method !== \"POST\") {\n throw new ProxyRequestError(405, \"Code Play proxy only accepts POST.\");\n }\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of req) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n size += buffer.byteLength;\n if (size > limit) {\n throw new ProxyRequestError(413, \"Code Play proxy request body is too large.\");\n }\n chunks.push(buffer);\n }\n return Buffer.concat(chunks);\n}\n\nexport async function typecheckProxy(req: IncomingMessage, res: ServerResponse): Promise<void> {\n try {\n const body = JSON.parse((await readLimitedBody(req)).toString(\"utf8\")) as {\n language?: string;\n code?: string;\n config?: Record<string, unknown>;\n };\n const { createCodePlay } = await import(\"./client\");\n const language = body.language ?? \"typescript\";\n const play = createCodePlay({ languages: { [language]: true } });\n const result = await play\n .createSession({ language, code: body.code ?? \"\", config: body.config })\n .typecheck();\n writeJson(res, 200, result);\n } catch (error) {\n writeProxyError(res, error, 400, \"Typecheck failed.\");\n }\n}\n\nexport async function proxy(\n req: IncomingMessage,\n res: ServerResponse,\n url: string,\n contentType: string,\n): Promise<void> {\n try {\n assertHttpUrl(url);\n const body = await readLimitedBody(req);\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": contentType },\n body: Uint8Array.from(body),\n });\n res.statusCode = response.status;\n res.setHeader(\"Content-Type\", response.headers.get(\"content-type\") ?? \"application/json\");\n res.end(await response.text());\n } catch (error) {\n writeProxyError(res, error, 502, \"Code Play proxy failed.\");\n }\n}\n\nexport function writeProxyError(\n res: ServerResponse,\n error: unknown,\n fallbackStatus: number,\n fallbackMessage: string,\n): void {\n if (error instanceof ProxyRequestError) {\n writeJson(res, error.statusCode, { error: error.message });\n return;\n }\n writeJson(res, fallbackStatus, { error: fallbackMessage });\n}\n\nfunction writeJson(res: ServerResponse, status: number, body: unknown): void {\n res.statusCode = status;\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(body));\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin, ViteDevServer } from \"vite\";\nimport { resolveLanguage } from \"./catalog\";\nimport {\n DEV_TYPECHECK_PATH,\n resolveCodePlayOptions,\n type RawCodePlayOptions,\n type ResolvedCodePlayOptions,\n} from \"./config\";\nimport { enhanceGeneratedModule, enhancePlayHtml, type HtmlEnhanceOptions } from \"./html\";\nimport { parseCodePlayTags, parsePlayFences, rewritePlayFences } from \"./markdown\";\nimport { decodePayload, encodePayload } from \"./payload\";\nimport { payloadFromFence } from \"./payload-factory\";\nimport {\n assertBrowserClientSource,\n resolveClientFile,\n resolveHydrateSpecifier,\n} from \"./plugin-client\";\nimport { proxy, typecheckProxy } from \"./plugin-proxy\";\n\nexport type CodePlayPluginOptions = RawCodePlayOptions;\n\nconst VIRTUAL_ID = \"virtual:ox-content/code-play\";\nconst RESOLVED_VIRTUAL = `\\0${VIRTUAL_ID}`;\nconst MARKDOWN_RE = /\\.(?:md|markdown|mdx)(?:$|\\?)/i;\n\nexport function codePlay(options: CodePlayPluginOptions = {}): Plugin {\n const resolved = resolveCodePlayOptions(options);\n const explicitTypecheck = options.endpoints?.typecheck;\n let base = resolved.base;\n let command: \"build\" | \"serve\" = \"serve\";\n let outDir = resolved.outDir;\n let root = process.cwd();\n\n const enhanceOptions = (\n matchFences?: Array<{ language: string; code: string; payload: string }>,\n ) => ({\n scriptSrc: `${base}ox-code-play.js`,\n decodePayload,\n encodePayload,\n matchFences,\n endpoints: resolved.endpoints,\n });\n\n return {\n name: \"@ox-content/code-play\",\n\n configResolved(config) {\n command = config.command;\n root = config.root;\n base = resolved.base === \"/\" ? normalizeBase(config.base) : resolved.base;\n outDir = resolved.outDir ?? config.build.outDir;\n if (explicitTypecheck === undefined) {\n if (command === \"serve\" && resolved.proxy) {\n resolved.endpoints.typecheck = DEV_TYPECHECK_PATH;\n } else {\n delete resolved.endpoints.typecheck;\n }\n }\n },\n\n resolveId(id) {\n return id === VIRTUAL_ID ? RESOLVED_VIRTUAL : null;\n },\n\n load(id) {\n if (id !== RESOLVED_VIRTUAL) {\n return null;\n }\n return `export { hydrateCodePlay, mountCodePlay } from ${JSON.stringify(resolveHydrateSpecifier())};`;\n },\n\n transform(code, id) {\n if (!MARKDOWN_RE.test(id)) {\n if (code.includes(\"export const html = \") && code.includes(\"ox-code-play:\")) {\n return enhanceGeneratedModule(code, enhanceOptions());\n }\n return null;\n }\n const rewritten = rewritePlayFences(code, (fence) => {\n const definition = resolveLanguage(fence.language);\n if (!definition || !resolved.languages.has(definition.id)) {\n return null;\n }\n return encodePayload(payloadFromFence(fence, resolved));\n });\n return rewritten === code ? null : rewritten;\n },\n\n configureServer(server) {\n if (resolved.proxy) {\n mountProxies(server, resolved.endpoints.rust, resolved.endpoints.go);\n }\n server.middlewares.use(async (req, res, next) => {\n const urlPath = req.url?.split(\"?\")[0] ?? \"\";\n if (urlPath === `${base}ox-code-play.js`.replace(/\\/{2,}/g, \"/\")) {\n const file = resolveClientFile();\n if (!file) {\n return next();\n }\n res.setHeader(\"Content-Type\", \"text/javascript; charset=utf-8\");\n res.end(assertBrowserClientSource(await readFile(file, \"utf8\")));\n return;\n }\n interceptHtml(res, (html) =>\n enhanceHtmlForUrl(urlPath, html, root, resolved, enhanceOptions),\n );\n next();\n });\n },\n\n async generateBundle() {\n const file = resolveClientFile();\n if (!file || command !== \"build\") {\n return;\n }\n this.emitFile({\n type: \"asset\",\n fileName: \"ox-code-play.js\",\n source: assertBrowserClientSource(await readFile(file, \"utf8\")),\n });\n },\n\n async closeBundle() {\n if (command !== \"build\") {\n return;\n }\n const srcDir = path.resolve(root, resolved.srcDir ?? \"docs\");\n const destination = path.resolve(root, outDir ?? \"dist\");\n if (!existsSync(srcDir) || !existsSync(destination)) {\n return;\n }\n await enhanceWrittenPages(srcDir, destination, resolved, enhanceOptions);\n },\n };\n}\n\nfunction interceptHtml(\n res: import(\"node:http\").ServerResponse,\n enhance: (html: string) => string | undefined,\n): void {\n const originalEnd = res.end.bind(res);\n res.end = ((chunk?: unknown, encoding?: BufferEncoding | (() => void), cb?: () => void) => {\n const html =\n typeof chunk === \"string\"\n ? chunk\n : Buffer.isBuffer(chunk)\n ? chunk.toString(\"utf8\")\n : undefined;\n const type = String(res.getHeader(\"content-type\") ?? \"\");\n if (html && (type.includes(\"html\") || html.includes(\"<pre\"))) {\n const next = enhance(html);\n if (next && next !== html) {\n if (typeof encoding === \"function\") {\n return originalEnd(next, encoding);\n }\n return originalEnd(next, encoding ?? \"utf8\", cb);\n }\n }\n if (typeof encoding === \"function\") {\n return originalEnd(chunk as never, encoding);\n }\n return originalEnd(chunk as never, encoding ?? \"utf8\", cb);\n }) as typeof res.end;\n}\n\nfunction enhanceHtmlForUrl(\n urlPath: string,\n html: string,\n root: string,\n resolved: ResolvedCodePlayOptions,\n enhance: (\n matchFences?: Array<{ language: string; code: string; payload: string }>,\n ) => HtmlEnhanceOptions,\n): string | undefined {\n const markdownPath = urlToMarkdown(urlPath, root, resolved.srcDir ?? \"docs\", resolved.base);\n if (!markdownPath || !existsSync(markdownPath)) {\n return undefined;\n }\n const source = readFileSync(markdownPath, \"utf8\");\n const fences = [...parsePlayFences(source), ...parseCodePlayTags(source)].filter((fence) => {\n const definition = resolveLanguage(fence.language);\n return Boolean(definition && resolved.languages.has(definition.id));\n });\n if (fences.length === 0) {\n return undefined;\n }\n return enhancePlayHtml(\n html,\n enhance(\n fences.map((fence) => ({\n language: fence.language,\n code: fence.code,\n payload: encodePayload(payloadFromFence(fence, resolved)),\n })),\n ),\n );\n}\n\nfunction urlToMarkdown(\n urlPath: string,\n root: string,\n srcDir: string,\n base: string,\n): string | undefined {\n let relative = urlPath;\n if (base !== \"/\" && relative.startsWith(base)) {\n relative = relative.slice(base.length);\n }\n relative = relative.replace(/^\\//, \"\").replace(/\\.html$/, \"\");\n if (!relative || relative.includes(\"..\")) {\n return undefined;\n }\n const candidates = [\n path.resolve(root, srcDir, `${relative}.md`),\n path.resolve(root, srcDir, relative, \"index.md\"),\n ];\n return candidates.find((candidate) => existsSync(candidate));\n}\n\nfunction mountProxies(server: ViteDevServer, rustUrl: string, goUrl: string): void {\n server.middlewares.use(\"/__ox-code-play/rust\", (req, res) => {\n void proxy(req, res, rustUrl, \"application/json\");\n });\n server.middlewares.use(\"/__ox-code-play/go\", (req, res) => {\n void proxy(req, res, goUrl, \"application/x-www-form-urlencoded\");\n });\n server.middlewares.use(DEV_TYPECHECK_PATH, (req, res) => {\n void typecheckProxy(req, res);\n });\n}\n\nasync function enhanceWrittenPages(\n srcDir: string,\n outDir: string,\n resolved: ResolvedCodePlayOptions,\n enhance: (\n matchFences?: Array<{ language: string; code: string; payload: string }>,\n ) => HtmlEnhanceOptions,\n): Promise<void> {\n for (const file of walkFiles(srcDir)) {\n if (!MARKDOWN_RE.test(file)) {\n continue;\n }\n const source = await readFile(file, \"utf8\");\n const fences = [...parsePlayFences(source), ...parseCodePlayTags(source)].filter((fence) => {\n const definition = resolveLanguage(fence.language);\n return Boolean(definition && resolved.languages.has(definition.id));\n });\n if (fences.length === 0) {\n continue;\n }\n const htmlPath = guessHtmlPath(file, srcDir, outDir);\n if (!htmlPath || !existsSync(htmlPath)) {\n continue;\n }\n const html = await readFile(htmlPath, \"utf8\");\n const enhanced = enhancePlayHtml(\n html,\n enhance(\n fences.map((fence) => ({\n language: fence.language,\n code: fence.code,\n payload: encodePayload(payloadFromFence(fence, resolved)),\n })),\n ),\n );\n if (enhanced !== html) {\n await writeFile(htmlPath, enhanced);\n }\n }\n}\n\nfunction guessHtmlPath(file: string, srcDir: string, outDir: string): string | undefined {\n const relative = path.relative(srcDir, file).replace(/\\.(?:md|markdown|mdx)$/i, \"\");\n const candidates = [\n path.join(outDir, `${relative}.html`),\n path.join(outDir, relative, \"index.html\"),\n ];\n return candidates.find((candidate) => existsSync(candidate));\n}\n\nfunction walkFiles(dir: string): string[] {\n const entries = readdirSync(dir);\n const files: string[] = [];\n for (const entry of entries) {\n const full = path.join(dir, entry);\n const stat = statSync(full);\n if (stat.isDirectory()) {\n files.push(...walkFiles(full));\n } else {\n files.push(full);\n }\n }\n return files;\n}\n\nfunction normalizeBase(base: string): string {\n if (!base || base === \"/\") {\n return \"/\";\n }\n return base.endsWith(\"/\") ? base : `${base}/`;\n}\n\nexport type { CodePlayPluginOptions as CodePlayOptions };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin2.mjs","names":[],"sources":["../src/authoring.ts","../src/markdown.ts","../src/project-sandbox.ts","../src/payload-factory.ts","../src/html.ts","../src/project-files.ts","../src/plugin-paths.ts","../src/plugin-client.ts","../src/plugin-assets.ts","../src/plugin-proxy.ts","../src/plugin.ts"],"sourcesContent":["import type { CodePlayPreset, ViewerFlags } from \"./types\";\n\nexport interface ParsedPlayOptions {\n typecheck: boolean;\n title?: string;\n config: Record<string, unknown>;\n ui?: CodePlayPreset;\n viewers?: Partial<ViewerFlags>;\n timeoutMs?: number;\n project?: ParsedProjectOptions;\n}\n\nexport interface ParsedProjectOptions {\n provider: string;\n entry?: string;\n file?: string;\n files: string[];\n openUrl?: string;\n fallbackUrl?: string;\n}\n\nexport function parsePlayMeta(meta: string): ParsedPlayOptions {\n const options = emptyPlayOptions();\n for (const token of splitPlayInfo(meta)) {\n if (token === \"typecheck\") {\n options.typecheck = true;\n continue;\n }\n if (token === \"play-compact\") {\n options.ui = \"compact\";\n continue;\n }\n if (token === \"play-headless\") {\n options.ui = \"headless\";\n continue;\n }\n const pair = readTokenPair(token);\n if (!pair) {\n continue;\n }\n applyPlayOption(options, pair.name, pair.value);\n }\n return options;\n}\n\nexport function parseCodePlayAttributes(attrs: string): ParsedPlayOptions {\n const options = emptyPlayOptions();\n for (const [name, value] of readAttributes(attrs)) {\n if (name === \"typecheck\") {\n options.typecheck = value !== \"false\";\n continue;\n }\n if (name === \"title\") {\n options.title = value;\n continue;\n }\n if (name === \"ui\") {\n options.ui = parseUi(value);\n continue;\n }\n if (name === \"timeout\" || name === \"timeout-ms\" || name === \"timeoutms\") {\n options.timeoutMs = parsePositiveInt(value);\n continue;\n }\n if (name === \"viewers\") {\n options.viewers = parseViewers(value);\n continue;\n }\n if (applyProjectAttribute(options, name, value)) {\n continue;\n }\n if (name.startsWith(\"config-\")) {\n options.config[configKeyFromAttribute(name.slice(\"config-\".length))] =\n coerceOptionValue(value);\n }\n }\n return options;\n}\n\nexport function readCodePlayAttribute(attrs: string, name: string): string | undefined {\n return readAttributes(attrs).get(name.toLowerCase());\n}\n\nexport function splitPlayInfo(info: string): string[] {\n const tokens: string[] = [];\n let current = \"\";\n let quote: '\"' | \"'\" | undefined;\n let escaped = false;\n for (const char of info.trim()) {\n if (escaped) {\n current += `\\\\${char}`;\n escaped = false;\n continue;\n }\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (quote) {\n if (char === quote) {\n current += char;\n quote = undefined;\n } else {\n current += char;\n }\n continue;\n }\n if (char === '\"' || char === \"'\") {\n current += char;\n quote = char;\n continue;\n }\n if (/\\s/.test(char)) {\n if (current) {\n tokens.push(current);\n current = \"\";\n }\n continue;\n }\n current += char;\n }\n if (current) {\n tokens.push(current);\n }\n return tokens;\n}\n\nfunction emptyPlayOptions(): ParsedPlayOptions {\n return { typecheck: false, config: {} };\n}\n\nfunction applyPlayOption(options: ParsedPlayOptions, rawName: string, value: string): void {\n const name = rawName.toLowerCase();\n if (name === \"play-title\") {\n options.title = value;\n return;\n }\n if (name === \"play-ui\") {\n options.ui = parseUi(value);\n return;\n }\n if (name === \"play-timeout\" || name === \"play-timeout-ms\" || name === \"play-timeoutms\") {\n options.timeoutMs = parsePositiveInt(value);\n return;\n }\n if (name === \"play-viewers\") {\n options.viewers = parseViewers(value);\n return;\n }\n if (applyProjectMeta(options, rawName, value)) {\n return;\n }\n const configKey =\n name.startsWith(\"play-config:\") || name.startsWith(\"play-config.\")\n ? rawName.slice(\"play-config:\".length)\n : name.startsWith(\"play-\")\n ? rawName.slice(\"play-\".length)\n : \"\";\n if (configKey) {\n options.config[configKey] = coerceOptionValue(value);\n }\n}\n\nfunction applyProjectMeta(options: ParsedPlayOptions, rawName: string, value: string): boolean {\n const name = rawName.toLowerCase();\n switch (name) {\n case \"play-project\":\n case \"play-sandbox\":\n case \"play-provider\":\n ensureProject(options, value);\n return true;\n case \"play-entry\":\n ensureProject(options).entry = value;\n return true;\n case \"play-file\":\n ensureProject(options).file = value;\n return true;\n case \"play-files\":\n ensureProject(options).files.push(...splitList(value));\n return true;\n case \"play-project-url\":\n case \"play-open-url\":\n ensureProject(options).openUrl = value;\n return true;\n case \"play-fallback-url\":\n ensureProject(options).fallbackUrl = value;\n return true;\n default:\n return false;\n }\n}\n\nfunction applyProjectAttribute(options: ParsedPlayOptions, name: string, value: string): boolean {\n switch (name) {\n case \"project\":\n case \"sandbox\":\n case \"provider\":\n ensureProject(options, value);\n return true;\n case \"entry\":\n ensureProject(options).entry = value;\n return true;\n case \"file\":\n ensureProject(options).file = value;\n return true;\n case \"files\":\n ensureProject(options).files.push(...splitList(value));\n return true;\n case \"project-url\":\n case \"open-url\":\n ensureProject(options).openUrl = value;\n return true;\n case \"fallback-url\":\n ensureProject(options).fallbackUrl = value;\n return true;\n default:\n return false;\n }\n}\n\nfunction ensureProject(options: ParsedPlayOptions, provider = \"external\"): ParsedProjectOptions {\n options.project ??= { provider, files: [] };\n if (provider && options.project.provider === \"external\") {\n options.project.provider = provider;\n }\n return options.project;\n}\n\nfunction readTokenPair(token: string): { name: string; value: string } | undefined {\n const index = token.indexOf(\"=\");\n if (index === -1) {\n return undefined;\n }\n return { name: token.slice(0, index), value: unquote(token.slice(index + 1)) };\n}\n\nfunction readAttributes(attrs: string): Map<string, string> {\n const values = new Map<string, string>();\n const pattern = /([:\\w-]+)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'>]+)))?/g;\n for (const match of attrs.matchAll(pattern)) {\n const name = match[1]?.toLowerCase();\n if (!name) {\n continue;\n }\n values.set(name, match[2] ?? match[3] ?? match[4] ?? \"true\");\n }\n return values;\n}\n\nfunction parseUi(value: string): CodePlayPreset | undefined {\n return value === \"default\" || value === \"compact\" || value === \"headless\" ? value : undefined;\n}\n\nfunction parsePositiveInt(value: string): number | undefined {\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction parseViewers(value: string): Partial<ViewerFlags> | undefined {\n const viewers: Partial<ViewerFlags> = {};\n for (const token of value.split(\",\")) {\n const trimmed = token.trim();\n const enabled = !trimmed.startsWith(\"-\");\n const key = (enabled ? trimmed : trimmed.slice(1)) as keyof ViewerFlags;\n if (\n key === \"config\" ||\n key === \"stdio\" ||\n key === \"stderr\" ||\n key === \"provenance\" ||\n key === \"timing\"\n ) {\n viewers[key] = enabled;\n }\n }\n return Object.keys(viewers).length > 0 ? viewers : undefined;\n}\n\nfunction splitList(value: string): string[] {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction coerceOptionValue(value: string): string | number | boolean {\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n const numeric = Number(value);\n return value.trim() !== \"\" && Number.isFinite(numeric) ? numeric : value;\n}\n\nfunction configKeyFromAttribute(value: string): string {\n return value.replace(/-([a-z])/g, (_, char: string) => char.toUpperCase());\n}\n\nfunction unquote(value: string): string {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n}\n","import {\n parseCodePlayAttributes,\n parsePlayMeta,\n readCodePlayAttribute,\n splitPlayInfo,\n} from \"./authoring\";\nimport type { CodePlayPreset, ViewerFlags } from \"./types\";\nimport type { ParsedProjectOptions } from \"./authoring\";\n\nexport { parseCodePlayAttributes, parsePlayMeta, type ParsedPlayOptions } from \"./authoring\";\n\nexport interface PlayFence {\n language: string;\n meta: string;\n code: string;\n raw: string;\n start: number;\n end: number;\n typecheck: boolean;\n title?: string;\n config: Record<string, unknown>;\n ui?: CodePlayPreset;\n viewers?: Partial<ViewerFlags>;\n timeoutMs?: number;\n project?: ParsedProjectOptions;\n}\n\nexport interface ParsedFence {\n language: string;\n meta: string;\n code: string;\n raw: string;\n start: number;\n end: number;\n indent: string;\n marker: string;\n}\n\nconst FENCE_OPEN = /^( {0,3})(`{3,}|~{3,})([^\\n]*)$/;\n\nexport function parseTopLevelFences(source: string): ParsedFence[] {\n const lines = source.split(\"\\n\");\n const fences: ParsedFence[] = [];\n let index = 0;\n let offset = 0;\n\n while (index < lines.length) {\n const line = lines[index] ?? \"\";\n const open = FENCE_OPEN.exec(line);\n if (!open) {\n offset += line.length + 1;\n index += 1;\n continue;\n }\n\n const indent = open[1] ?? \"\";\n const marker = open[2] ?? \"```\";\n const info = (open[3] ?? \"\").trim();\n const { language, meta } = readFenceInfo(info);\n const start = offset;\n index += 1;\n offset += line.length + 1;\n const body: string[] = [];\n\n while (index < lines.length) {\n const candidate = lines[index] ?? \"\";\n const close = new RegExp(`^ {0,3}${escapeRegExp(marker)}[ \\t]*$`).exec(candidate);\n if (close) {\n const raw = `${line}\\n${body.join(\"\\n\")}${body.length > 0 ? \"\\n\" : \"\"}${candidate}`;\n fences.push({\n language,\n meta,\n code: body.join(\"\\n\"),\n raw,\n start,\n end: start + raw.length,\n indent,\n marker,\n });\n offset += candidate.length + 1;\n index += 1;\n break;\n }\n body.push(candidate);\n offset += candidate.length + 1;\n index += 1;\n }\n }\n\n return fences;\n}\n\nexport function parsePlayFences(source: string): PlayFence[] {\n return parseTopLevelFences(source)\n .filter((fence) => hasToken(fence.meta, \"play\"))\n .map((fence) => {\n const options = parsePlayMeta(fence.meta);\n return {\n language: fence.language,\n meta: fence.meta,\n code: fence.code,\n raw: fence.raw,\n start: fence.start,\n end: fence.end,\n typecheck: options.typecheck,\n title: options.title,\n config: options.config,\n ui: options.ui,\n viewers: options.viewers,\n timeoutMs: options.timeoutMs,\n project: options.project,\n };\n });\n}\n\nexport function stripPlayMeta(meta: string): string {\n return splitPlayInfo(meta)\n .filter(\n (token) =>\n token &&\n token !== \"play\" &&\n token !== \"typecheck\" &&\n !token.startsWith(\"play-\") &&\n !token.startsWith(\"play:\"),\n )\n .join(\" \");\n}\n\nexport function rewritePlayFences(\n source: string,\n encode: (fence: PlayFence) => string | null,\n): string {\n const fences = parsePlayFences(source);\n if (fences.length === 0) {\n return source;\n }\n\n let cursor = 0;\n let output = \"\";\n for (const fence of fences) {\n output += source.slice(cursor, fence.start);\n const encoded = encode(fence);\n if (encoded === null) {\n output += source.slice(fence.start, fence.end);\n } else {\n const cleanedMeta = stripPlayMeta(fence.meta);\n const info = [fence.language, cleanedMeta].filter(Boolean).join(\" \");\n output += `<!--ox-code-play:${encoded}-->\\n\\`\\`\\`${info}\\n${fence.code}\\n\\`\\`\\``;\n }\n cursor = fence.end;\n }\n output += source.slice(cursor);\n return output;\n}\n\nexport function parseCodePlayTags(source: string): PlayFence[] {\n const tags: PlayFence[] = [];\n const pattern = /<CodePlay\\b([^>]*)>([\\s\\S]*?)<\\/CodePlay>/gi;\n for (const match of source.matchAll(pattern)) {\n const attrs = match[1] ?? \"\";\n const language =\n readCodePlayAttribute(attrs, \"lang\") ?? readCodePlayAttribute(attrs, \"language\") ?? \"text\";\n const options = parseCodePlayAttributes(attrs);\n tags.push({\n language,\n meta: \"play\",\n code: stripIndent((match[2] ?? \"\").replace(/^\\n/, \"\").replace(/\\n$/, \"\")),\n raw: match[0] ?? \"\",\n start: match.index ?? 0,\n end: (match.index ?? 0) + (match[0]?.length ?? 0),\n typecheck: options.typecheck,\n title: options.title,\n config: options.config,\n ui: options.ui,\n viewers: options.viewers,\n timeoutMs: options.timeoutMs,\n project: options.project,\n });\n }\n return tags;\n}\n\nfunction readFenceInfo(info: string): { language: string; meta: string } {\n const match = /^(\\S+)(?:\\s+([\\s\\S]*))?$/.exec(info);\n return { language: match?.[1] ?? \"\", meta: match?.[2]?.trim() ?? \"\" };\n}\n\nfunction hasToken(meta: string, token: string): boolean {\n return splitPlayInfo(meta).includes(token);\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction stripIndent(value: string): string {\n const lines = value.split(\"\\n\");\n const indents = lines\n .filter((line) => line.trim())\n .map((line) => line.match(/^ */)?.[0].length ?? 0);\n const indent = indents.length > 0 ? Math.min(...indents) : 0;\n return lines.map((line) => line.slice(indent)).join(\"\\n\");\n}\n","import type { ParsedProjectOptions } from \"./authoring\";\nimport type {\n LanguageDefinition,\n ProjectSandbox,\n ProjectSandboxAdapter,\n ProjectSandboxFile,\n ProjectSandboxProvider,\n ProjectSandboxTarget,\n} from \"./types\";\n\nexport interface ProjectSandboxPayloadInput {\n language: string;\n code: string;\n definition?: LanguageDefinition;\n project?: ParsedProjectOptions;\n files?: ProjectSandboxFile[];\n warnings?: string[];\n}\n\nexport const PROJECT_SANDBOX_ADAPTERS: Record<ProjectSandboxProvider, ProjectSandboxAdapter> = {\n stackblitz: adapter(\"stackblitz\", \"StackBlitz\", \"browser\"),\n codesandbox: adapter(\"codesandbox\", \"CodeSandbox\", \"browser\"),\n webcontainer: adapter(\"webcontainer\", \"WebContainer\", \"node\"),\n external: adapter(\"external\", \"External sandbox\", \"external\"),\n};\n\nexport function projectSandboxFromPayloadInput(\n input: ProjectSandboxPayloadInput,\n): ProjectSandbox | undefined {\n if (!input.project) {\n return undefined;\n }\n const warnings = [...(input.warnings ?? [])];\n const adapter = resolveProjectSandboxAdapter(input.project.provider, warnings);\n const sourceFile = normalizeProjectPath(input.project.file, warnings, \"source file\");\n const entry = normalizeProjectPath(input.project.entry, warnings, \"entry path\");\n const primary = {\n path: sourceFile ?? entry ?? defaultProjectFile(input.language, input.definition),\n code: input.code,\n };\n const files = mergeProjectFiles([primary, ...(input.files ?? [])]);\n const openUrl = safeProjectUrl(input.project.openUrl, adapter.provider, warnings);\n const fallbackUrl = safeProjectUrl(input.project.fallbackUrl, adapter.provider, warnings);\n return adapter.resolve({\n provider: input.project.provider,\n entry: entry ?? primary.path,\n files,\n openUrl,\n fallbackUrl,\n warnings,\n });\n}\n\nexport function normalizeProjectPath(\n value: string | undefined,\n warnings: string[] = [],\n label = \"file path\",\n): string | undefined {\n const trimmed = value?.trim();\n if (!trimmed) {\n return undefined;\n }\n const normalized = trimmed.replace(/^\\.\\//, \"\");\n if (\n normalized.startsWith(\"/\") ||\n normalized.includes(\"\\\\\") ||\n normalized.includes(\"\\0\") ||\n normalized.split(\"/\").some((part) => part === \"\" || part === \".\" || part === \"..\") ||\n /^[a-z]+:/i.test(normalized)\n ) {\n warnings.push(`Skipped unsafe project ${label}: ${trimmed}`);\n return undefined;\n }\n if (normalized.length > 256) {\n warnings.push(`Skipped long project ${label}: ${trimmed}`);\n return undefined;\n }\n return normalized;\n}\n\nexport function projectSandboxProviderLabel(provider: ProjectSandboxProvider): string {\n return PROJECT_SANDBOX_ADAPTERS[provider].label;\n}\n\nfunction adapter(\n provider: ProjectSandboxProvider,\n label: string,\n target: ProjectSandboxTarget,\n): ProjectSandboxAdapter {\n return {\n provider,\n label,\n target,\n resolve(input) {\n return compactProjectSandbox({\n provider,\n label,\n target,\n entry: input.entry,\n files: input.files,\n openUrl: input.openUrl,\n fallbackUrl: input.fallbackUrl,\n warnings: input.warnings,\n });\n },\n };\n}\n\nfunction defaultProjectFile(language: string, definition: LanguageDefinition | undefined): string {\n if (definition?.framework === \"vue\") {\n return \"src/App.vue\";\n }\n if (definition?.framework === \"react\" || definition?.framework === \"solid\") {\n return \"src/App.tsx\";\n }\n if (definition?.framework === \"svelte\") {\n return \"src/App.svelte\";\n }\n switch (language) {\n case \"javascript\":\n return \"index.js\";\n case \"typescript\":\n return \"index.ts\";\n case \"go\":\n return \"main.go\";\n case \"rust\":\n return \"src/main.rs\";\n default:\n return \"snippet.txt\";\n }\n}\n\nfunction resolveProjectSandboxAdapter(\n rawProvider: string,\n warnings: string[],\n): ProjectSandboxAdapter {\n const provider = rawProvider.trim().toLowerCase();\n switch (provider) {\n case \"stackblitz\":\n case \"stack-blitz\":\n case \"sb\":\n return PROJECT_SANDBOX_ADAPTERS.stackblitz;\n case \"codesandbox\":\n case \"code-sandbox\":\n case \"csb\":\n return PROJECT_SANDBOX_ADAPTERS.codesandbox;\n case \"webcontainer\":\n case \"web-container\":\n return PROJECT_SANDBOX_ADAPTERS.webcontainer;\n case \"external\":\n case \"\":\n return PROJECT_SANDBOX_ADAPTERS.external;\n default:\n warnings.push(`Unknown project sandbox provider: ${rawProvider}`);\n return PROJECT_SANDBOX_ADAPTERS.external;\n }\n}\n\nfunction mergeProjectFiles(files: ProjectSandboxFile[]): ProjectSandboxFile[] {\n const merged = new Map<string, ProjectSandboxFile>();\n for (const file of files) {\n merged.set(file.path, file);\n }\n return [...merged.values()];\n}\n\nfunction safeProjectUrl(\n value: string | undefined,\n provider: ProjectSandboxProvider,\n warnings: string[],\n): string | undefined {\n if (!value) {\n return undefined;\n }\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n warnings.push(`Skipped invalid project URL: ${value}`);\n return undefined;\n }\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\n warnings.push(`Skipped non-http project URL: ${value}`);\n return undefined;\n }\n if (url.username || url.password) {\n warnings.push(`Skipped project URL with credentials: ${url.origin}`);\n return undefined;\n }\n if (!providerAllowsHost(provider, url.hostname)) {\n warnings.push(`Skipped ${provider} project URL on unexpected host: ${url.hostname}`);\n return undefined;\n }\n return url.href;\n}\n\nfunction providerAllowsHost(provider: ProjectSandboxProvider, host: string): boolean {\n if (provider === \"external\") {\n return true;\n }\n const normalized = host.toLowerCase();\n const allowed: Record<Exclude<ProjectSandboxProvider, \"external\">, string[]> = {\n stackblitz: [\"stackblitz.com\"],\n codesandbox: [\"codesandbox.io\", \"csb.app\"],\n webcontainer: [\"webcontainers.io\", \"webcontainer.io\"],\n };\n return allowed[provider].some(\n (suffix) => normalized === suffix || normalized.endsWith(`.${suffix}`),\n );\n}\n\nfunction compactProjectSandbox(project: ProjectSandbox): ProjectSandbox {\n const next: ProjectSandbox = {\n provider: project.provider,\n label: project.label,\n target: project.target,\n files: project.files,\n };\n if (project.entry) {\n next.entry = project.entry;\n }\n if (project.openUrl) {\n next.openUrl = project.openUrl;\n }\n if (project.fallbackUrl) {\n next.fallbackUrl = project.fallbackUrl;\n }\n if (project.warnings?.length) {\n next.warnings = project.warnings;\n }\n return next;\n}\n","import { resolveLanguage } from \"./catalog\";\nimport type { ResolvedCodePlayOptions } from \"./config\";\nimport type { PlayFence } from \"./markdown\";\nimport { projectSandboxFromPayloadInput } from \"./project-sandbox\";\nimport type {\n LanguageDefinition,\n PlayPayload,\n PlaygroundEndpoints,\n ProjectSandboxFile,\n} from \"./types\";\n\nexport interface PayloadFromFenceContext {\n files?: ProjectSandboxFile[];\n warnings?: string[];\n}\n\nexport function payloadFromFence(\n fence: PlayFence,\n options: ResolvedCodePlayOptions,\n context: PayloadFromFenceContext = {},\n): PlayPayload {\n const definition = resolveLanguage(fence.language);\n const enabled = definition ? options.languages.get(definition.id) : undefined;\n const payload: PlayPayload = {\n language: definition?.id ?? fence.language,\n code: fence.code,\n title: fence.title,\n capabilities: {\n execute: enabled?.execute ?? Boolean(definition?.capabilities.execute),\n typecheck: payloadTypecheckEnabled(\n fence.typecheck,\n enabled?.typecheck,\n definition,\n options.endpoints,\n ),\n },\n config: { ...definition?.defaultConfig, ...enabled?.config, ...fence.config },\n viewers: { ...options.viewers, ...fence.viewers },\n ui: fence.ui ?? options.ui,\n timeoutMs: fence.timeoutMs ?? options.timeoutMs,\n endpoints: options.endpoints,\n };\n if (enabled?.endpoint) {\n payload.endpoint = enabled.endpoint;\n }\n const project = projectSandboxFromPayloadInput({\n language: payload.language,\n code: payload.code,\n definition,\n project: fence.project,\n files: context.files,\n warnings: context.warnings,\n });\n if (project) {\n payload.project = project;\n }\n return payload;\n}\n\n/** TypeScript typecheck in the browser needs a reachable endpoint; hide the dead button otherwise. */\nexport function payloadTypecheckEnabled(\n fenceTypecheck: boolean,\n enabledTypecheck: boolean | undefined,\n definition: LanguageDefinition | undefined,\n endpoints: PlaygroundEndpoints,\n): boolean {\n if (!(fenceTypecheck || enabledTypecheck)) {\n return false;\n }\n if (definition?.id === \"typescript\") {\n return Boolean(endpoints.typecheck);\n }\n return true;\n}\n","import { resolveLanguage } from \"./catalog\";\nimport { DEFAULT_ENDPOINTS, DEFAULT_VIEWERS } from \"./config\";\nimport { decodeHtml, escapeAttribute } from \"./escape\";\nimport { parseCodePlayAttributes } from \"./markdown\";\nimport { payloadTypecheckEnabled } from \"./payload-factory\";\nimport { projectSandboxFromPayloadInput } from \"./project-sandbox\";\nimport type { PlaygroundEndpoints, PlayPayload } from \"./types\";\n\nconst COMMENT_PATTERN = /<!--ox-code-play:([A-Za-z0-9+/=]+)-->\\s*(<pre\\b[\\s\\S]*?<\\/pre>)/gi;\nconst CODEPLAY_TAG_PATTERN = /<CodePlay\\b([^>]*)>([\\s\\S]*?)<\\/CodePlay>/gi;\nconst PRE_PATTERN = /<pre\\b[^>]*>\\s*<code\\b([^>]*)>([\\s\\S]*?)<\\/code>\\s*<\\/pre>/gi;\n\nexport interface HtmlEnhanceOptions {\n scriptSrc?: string;\n decodePayload: (value: string) => PlayPayload;\n encodePayload: (payload: PlayPayload) => string;\n matchFences?: Array<{ language: string; code: string; payload: string }>;\n endpoints?: PlaygroundEndpoints;\n}\n\nexport function enhancePlayHtml(html: string, options: HtmlEnhanceOptions): string {\n let next = wrapCommentedBlocks(html, options);\n next = upgradeCodePlayTags(next, options);\n if (options.matchFences?.length) {\n next = wrapMatchingFences(next, options.matchFences);\n }\n if (\n options.scriptSrc &&\n next.includes(\"data-ox-code-play\") &&\n !next.includes(options.scriptSrc)\n ) {\n next += `\\n<script type=\"module\" src=\"${escapeAttribute(options.scriptSrc)}\"></script>\\n`;\n }\n return next;\n}\n\nexport function enhanceGeneratedModule(source: string, options: HtmlEnhanceOptions): string {\n const marker = \"export const html = \";\n const start = source.indexOf(marker);\n if (start === -1) {\n return source;\n }\n const jsonStart = start + marker.length;\n if (source[jsonStart] !== '\"') {\n return source;\n }\n const parsed = readJsonString(source, jsonStart);\n if (!parsed) {\n return source;\n }\n const enhanced = enhancePlayHtml(parsed.value, options);\n return source.slice(0, jsonStart) + JSON.stringify(enhanced) + source.slice(parsed.end);\n}\n\nfunction wrapCommentedBlocks(html: string, _options: HtmlEnhanceOptions): string {\n return html.replace(COMMENT_PATTERN, (_all, payload: string, pre: string) => {\n return wrapWidget(payload, pre);\n });\n}\n\nfunction upgradeCodePlayTags(html: string, options: HtmlEnhanceOptions): string {\n return html.replace(CODEPLAY_TAG_PATTERN, (all, attrs: string, body: string) => {\n if (/\\bdata-ox-code-play=/.test(all)) {\n return all;\n }\n const language = readAttr(attrs, \"lang\") ?? readAttr(attrs, \"language\") ?? \"text\";\n const code = decodeHtml(body).replace(/^\\n/, \"\").replace(/\\n$/, \"\");\n const definition = resolveLanguage(language);\n const endpoints = options.endpoints ?? DEFAULT_ENDPOINTS;\n const playOptions = parseCodePlayAttributes(attrs);\n const payloadValue: PlayPayload = {\n language: definition?.id ?? language,\n code,\n title: playOptions.title,\n capabilities: {\n execute: true,\n typecheck: payloadTypecheckEnabled(playOptions.typecheck, undefined, definition, endpoints),\n },\n config: { ...definition?.defaultConfig, ...playOptions.config },\n viewers: { ...DEFAULT_VIEWERS, ...playOptions.viewers },\n ui: playOptions.ui ?? \"default\",\n timeoutMs: playOptions.timeoutMs ?? 10_000,\n endpoints,\n };\n const project = projectSandboxFromPayloadInput({\n language: payloadValue.language,\n code,\n definition,\n project: playOptions.project,\n });\n if (project) {\n payloadValue.project = project;\n }\n const payload = options.encodePayload(payloadValue);\n return wrapWidget(\n payload,\n `<pre><code class=\"language-${escapeAttribute(language)}\">${body}</code></pre>`,\n );\n });\n}\n\nfunction wrapMatchingFences(\n html: string,\n matches: Array<{ language: string; code: string; payload: string }>,\n): string {\n const unused = matches.map((item) => ({ ...item, used: false }));\n return html.replace(PRE_PATTERN, (all, attrs: string, body: string) => {\n const className = readAttr(attrs, \"class\") ?? \"\";\n const language = className\n .split(/\\s+/)\n .find((token) => token.startsWith(\"language-\"))\n ?.slice(\"language-\".length);\n const code = normalizeCode(decodeHtml(stripTags(body)));\n const match = unused.find(\n (item) =>\n !item.used && aliasesEqual(item.language, language) && normalizeCode(item.code) === code,\n );\n if (!match) {\n return all;\n }\n match.used = true;\n return wrapWidget(match.payload, all);\n });\n}\n\nfunction wrapWidget(payload: string, inner: string): string {\n return `<ox-code-play data-ox-code-play=\"${escapeAttribute(payload)}\" inert>${inner}</ox-code-play>`;\n}\n\nfunction readJsonString(source: string, start: number): { value: string; end: number } | undefined {\n try {\n const raw = sliceJsonString(source, start);\n return { value: JSON.parse(raw) as string, end: start + raw.length };\n } catch {\n return undefined;\n }\n}\n\nfunction sliceJsonString(source: string, start: number): string {\n let end = start + 1;\n let escaped = false;\n while (end < source.length) {\n const char = source[end];\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === '\"') {\n return source.slice(start, end + 1);\n }\n end += 1;\n }\n throw new Error(\"Unterminated HTML JSON string.\");\n}\n\nfunction readAttr(attrs: string, name: string): string | undefined {\n const match = new RegExp(`(?:^|\\\\s)${name}\\\\s*=\\\\s*\"([^\"]+)\"`, \"i\").exec(attrs);\n return match?.[1];\n}\n\nfunction stripTags(value: string): string {\n return value.replace(/<[^>]+>/g, \"\");\n}\n\nfunction normalizeCode(value: string): string {\n return value.replace(/\\r\\n/g, \"\\n\").replace(/\\n$/, \"\");\n}\n\nfunction aliasesEqual(left: string | undefined, right: string | undefined): boolean {\n if (!left || !right) {\n return false;\n }\n return left.toLowerCase() === right.toLowerCase();\n}\n","import { existsSync, readFileSync, realpathSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { ParsedProjectOptions } from \"./authoring\";\nimport { normalizeProjectPath } from \"./project-sandbox\";\nimport type { ProjectSandboxFile } from \"./types\";\n\nexport interface ProjectFileCollectionContext {\n documentPath?: string;\n sourceRoot?: string;\n maxFiles?: number;\n maxBytes?: number;\n}\n\nexport interface ProjectFileCollection {\n files: ProjectSandboxFile[];\n warnings: string[];\n}\n\nconst DEFAULT_MAX_FILES = 32;\nconst DEFAULT_MAX_BYTES = 256 * 1024;\n\nexport function collectProjectFiles(\n project: ParsedProjectOptions | undefined,\n context: ProjectFileCollectionContext = {},\n): ProjectFileCollection {\n const warnings: string[] = [];\n if (!project?.files.length) {\n return { files: [], warnings };\n }\n if (!context.documentPath) {\n warnings.push(\"Skipped project files because the Markdown source path is unavailable.\");\n return { files: [], warnings };\n }\n\n const documentDir = path.dirname(context.documentPath);\n const sourceRoot = path.resolve(context.sourceRoot ?? documentDir);\n const realSourceRoot = realpathIfExists(sourceRoot) ?? sourceRoot;\n const files: ProjectSandboxFile[] = [];\n for (const requested of project.files) {\n if (files.length >= (context.maxFiles ?? DEFAULT_MAX_FILES)) {\n warnings.push(`Skipped project file after ${files.length} files: ${requested}`);\n continue;\n }\n const safePath = normalizeProjectPath(requested, warnings);\n if (!safePath) {\n continue;\n }\n const absolute = path.resolve(documentDir, safePath);\n if (!pathInside(absolute, sourceRoot)) {\n warnings.push(`Skipped project file outside source root: ${safePath}`);\n continue;\n }\n const realAbsolute = realpathIfExists(absolute);\n if (!realAbsolute) {\n warnings.push(`Skipped missing project file: ${safePath}`);\n continue;\n }\n if (!pathInside(realAbsolute, realSourceRoot)) {\n warnings.push(`Skipped project file outside real source root: ${safePath}`);\n continue;\n }\n const stat = statSync(realAbsolute);\n if (!stat.isFile()) {\n warnings.push(`Skipped non-file project path: ${safePath}`);\n continue;\n }\n if (stat.size > (context.maxBytes ?? DEFAULT_MAX_BYTES)) {\n warnings.push(`Skipped large project file: ${safePath}`);\n continue;\n }\n files.push({ path: safePath, code: readFileSync(realAbsolute, \"utf8\") });\n }\n return { files, warnings };\n}\n\nfunction realpathIfExists(file: string): string | undefined {\n if (!existsSync(file)) {\n return undefined;\n }\n return realpathSync(file);\n}\n\nfunction pathInside(file: string, root: string): boolean {\n const relative = path.relative(root, file);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { ResolvedCodePlayOptions } from \"./config\";\n\nexport const MARKDOWN_RE = /\\.(?:md|markdown|mdx)(?:$|\\?)/i;\n\nexport function cleanMarkdownPath(id: string, root: string): string | undefined {\n const file = id.split(\"?\")[0];\n if (!file || file.startsWith(\"\\0\")) {\n return undefined;\n }\n return path.isAbsolute(file) ? file : path.resolve(root, file);\n}\n\nexport function guessHtmlPath(file: string, srcDir: string, outDir: string): string | undefined {\n const relative = path.relative(srcDir, file).replace(/\\.(?:md|markdown|mdx)$/i, \"\");\n const candidates = [\n path.join(outDir, `${relative}.html`),\n path.join(outDir, relative, \"index.html\"),\n ];\n return candidates.find((candidate) => existsSync(candidate));\n}\n\nexport function normalizeBase(base: string): string {\n if (!base || base === \"/\") {\n return \"/\";\n }\n return base.endsWith(\"/\") ? base : `${base}/`;\n}\n\nexport function sourceRoot(root: string, resolved: ResolvedCodePlayOptions): string {\n return path.resolve(root, resolved.srcDir ?? \"docs\");\n}\n\nexport function urlToMarkdown(\n urlPath: string,\n root: string,\n srcDir: string,\n base: string,\n): string | undefined {\n let relative = urlPath;\n if (base !== \"/\" && relative.startsWith(base)) {\n relative = relative.slice(base.length);\n }\n relative = relative.replace(/^\\//, \"\").replace(/\\.html$/, \"\");\n if (!relative || relative.includes(\"..\")) {\n return undefined;\n }\n const candidates = [\n path.resolve(root, srcDir, `${relative}.md`),\n path.resolve(root, srcDir, relative, \"index.md\"),\n ];\n return candidates.find((candidate) => existsSync(candidate));\n}\n\nexport function walkFiles(dir: string): string[] {\n const entries = readdirSync(dir);\n const files: string[] = [];\n for (const entry of entries) {\n const full = path.join(dir, entry);\n const stat = statSync(full);\n if (stat.isDirectory()) {\n files.push(...walkFiles(full));\n } else {\n files.push(full);\n }\n }\n return files;\n}\n","import { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\nexport const CLIENT_FILE_CANDIDATES = [\n \"browser.mjs\",\n \"browser.js\",\n \"hydrate.mjs\",\n \"hydrate.js\",\n] as const;\n\nexport function resolveClientFile(baseUrl = import.meta.url): string | undefined {\n return CLIENT_FILE_CANDIDATES.map((name) => fileURLToPath(new URL(`./${name}`, baseUrl))).find(\n (candidate) => existsSync(candidate),\n );\n}\n\nexport function resolveHydrateSpecifier(baseUrl = import.meta.url): string {\n return resolveClientFile(baseUrl) ?? fileURLToPath(new URL(\"./hydrate.ts\", baseUrl));\n}\n\nexport function isStandaloneBrowserClient(source: string): boolean {\n return (\n !/\\bfrom\\s+[\"']\\.\\.?\\/[^\"']+[\"']/.test(source) &&\n !/\\bimport\\s*\\(\\s*[\"']\\.\\.?\\/[^\"']+[\"']/.test(source)\n );\n}\n\nexport function isAutoHydratingClient(source: string): boolean {\n return source.includes(\"bootCodePlay\") && source.includes(\"DOMContentLoaded\");\n}\n\nexport function assertBrowserClientSource(source: string): string {\n if (!isAutoHydratingClient(source) || !isStandaloneBrowserClient(source)) {\n throw new Error(\n \"@ox-content/code-play must emit a standalone ox-code-play.js that calls bootCodePlay(). Run the package build.\",\n );\n }\n return source;\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function writeClientAsset(outDir: string, source: string | undefined): Promise<void> {\n if (!source) {\n return;\n }\n await mkdir(outDir, { recursive: true });\n await writeFile(path.join(outDir, \"ox-code-play.js\"), source);\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nexport const PROXY_MAX_BODY_BYTES = 256 * 1024;\n\nexport class ProxyRequestError extends Error {\n readonly statusCode: number;\n\n constructor(statusCode: number, message: string) {\n super(message);\n this.name = \"ProxyRequestError\";\n this.statusCode = statusCode;\n }\n}\n\nexport function assertHttpUrl(url: string): URL {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new ProxyRequestError(400, \"Invalid Code Play proxy destination.\");\n }\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n throw new ProxyRequestError(400, \"Code Play proxy destination must be http(s).\");\n }\n if (parsed.username || parsed.password) {\n throw new ProxyRequestError(400, \"Code Play proxy destination must not include credentials.\");\n }\n return parsed;\n}\n\nexport async function readLimitedBody(\n req: IncomingMessage,\n limit = PROXY_MAX_BODY_BYTES,\n): Promise<Buffer> {\n if (req.method !== \"POST\") {\n throw new ProxyRequestError(405, \"Code Play proxy only accepts POST.\");\n }\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of req) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n size += buffer.byteLength;\n if (size > limit) {\n throw new ProxyRequestError(413, \"Code Play proxy request body is too large.\");\n }\n chunks.push(buffer);\n }\n return Buffer.concat(chunks);\n}\n\nexport async function typecheckProxy(req: IncomingMessage, res: ServerResponse): Promise<void> {\n try {\n const body = JSON.parse((await readLimitedBody(req)).toString(\"utf8\")) as {\n language?: string;\n code?: string;\n config?: Record<string, unknown>;\n };\n const { createCodePlay } = await import(\"./client\");\n const language = body.language ?? \"typescript\";\n const play = createCodePlay({ languages: { [language]: true } });\n const result = await play\n .createSession({ language, code: body.code ?? \"\", config: body.config })\n .typecheck();\n writeJson(res, 200, result);\n } catch (error) {\n writeProxyError(res, error, 400, \"Typecheck failed.\");\n }\n}\n\nexport async function proxy(\n req: IncomingMessage,\n res: ServerResponse,\n url: string,\n contentType: string,\n): Promise<void> {\n try {\n assertHttpUrl(url);\n const body = await readLimitedBody(req);\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": contentType },\n body: Uint8Array.from(body),\n });\n res.statusCode = response.status;\n res.setHeader(\"Content-Type\", response.headers.get(\"content-type\") ?? \"application/json\");\n res.end(await response.text());\n } catch (error) {\n writeProxyError(res, error, 502, \"Code Play proxy failed.\");\n }\n}\n\nexport function writeProxyError(\n res: ServerResponse,\n error: unknown,\n fallbackStatus: number,\n fallbackMessage: string,\n): void {\n if (error instanceof ProxyRequestError) {\n writeJson(res, error.statusCode, { error: error.message });\n return;\n }\n writeJson(res, fallbackStatus, { error: fallbackMessage });\n}\n\nfunction writeJson(res: ServerResponse, status: number, body: unknown): void {\n res.statusCode = status;\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(body));\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin, ViteDevServer } from \"vite\";\nimport { resolveLanguage } from \"./catalog\";\nimport {\n DEV_GO_PATH,\n DEV_RUST_PATH,\n DEV_TYPECHECK_PATH,\n resolveCodePlayOptions,\n type RawCodePlayOptions,\n type ResolvedCodePlayOptions,\n} from \"./config\";\nimport { enhanceGeneratedModule, enhancePlayHtml, type HtmlEnhanceOptions } from \"./html\";\nimport { parseCodePlayTags, parsePlayFences, rewritePlayFences, type PlayFence } from \"./markdown\";\nimport { decodePayload, encodePayload } from \"./payload\";\nimport { payloadFromFence, type PayloadFromFenceContext } from \"./payload-factory\";\nimport { collectProjectFiles } from \"./project-files\";\nimport {\n MARKDOWN_RE,\n cleanMarkdownPath,\n guessHtmlPath,\n normalizeBase,\n sourceRoot,\n urlToMarkdown,\n walkFiles,\n} from \"./plugin-paths\";\nimport {\n assertBrowserClientSource,\n resolveClientFile,\n resolveHydrateSpecifier,\n} from \"./plugin-client\";\nimport { writeClientAsset } from \"./plugin-assets\";\nimport { proxy, typecheckProxy } from \"./plugin-proxy\";\n\nexport type CodePlayPluginOptions = RawCodePlayOptions;\n\nconst VIRTUAL_ID = \"virtual:ox-content/code-play\";\nconst RESOLVED_VIRTUAL = `\\0${VIRTUAL_ID}`;\n\nexport function codePlay(options: CodePlayPluginOptions = {}): Plugin {\n const resolved = resolveCodePlayOptions(options);\n const explicitTypecheck = options.endpoints?.typecheck;\n const proxyTargets = { rust: resolved.endpoints.rust, go: resolved.endpoints.go };\n let base = resolved.base;\n let command: \"build\" | \"serve\" = \"serve\";\n let outDir = resolved.outDir;\n let root = process.cwd();\n let needsClientAsset = false;\n let emittedClientAsset = false;\n let clientSource: string | undefined;\n\n const enhanceOptions = (\n matchFences?: Array<{ language: string; code: string; payload: string }>,\n ) => ({\n scriptSrc: `${base}ox-code-play.js`,\n decodePayload,\n encodePayload,\n matchFences,\n endpoints: resolved.endpoints,\n });\n\n return {\n name: \"@ox-content/code-play\",\n\n configResolved(config) {\n command = config.command;\n root = config.root;\n base = resolved.base === \"/\" ? normalizeBase(config.base) : resolved.base;\n outDir = resolved.outDir ?? config.build.outDir;\n if (command === \"serve\" && resolved.proxy) {\n resolved.endpoints.rust = options.endpoints?.rust ?? DEV_RUST_PATH;\n resolved.endpoints.go = options.endpoints?.go ?? DEV_GO_PATH;\n }\n if (explicitTypecheck === undefined && command === \"serve\" && resolved.proxy) {\n resolved.endpoints.typecheck = DEV_TYPECHECK_PATH;\n } else if (explicitTypecheck === undefined) {\n delete resolved.endpoints.typecheck;\n }\n },\n\n resolveId(id) {\n return id === VIRTUAL_ID ? RESOLVED_VIRTUAL : null;\n },\n\n load(id) {\n if (id !== RESOLVED_VIRTUAL) {\n return null;\n }\n return `export { hydrateCodePlay, mountCodePlay } from ${JSON.stringify(resolveHydrateSpecifier())};`;\n },\n\n transform(code, id) {\n if (!MARKDOWN_RE.test(id)) {\n if (code.includes(\"export const html = \") && code.includes(\"ox-code-play:\")) {\n const enhanced = enhanceGeneratedModule(code, enhanceOptions());\n if (enhanced !== code) {\n needsClientAsset = true;\n }\n return enhanced;\n }\n return null;\n }\n const rewritten = rewritePlayFences(code, (fence) => {\n const definition = resolveLanguage(fence.language);\n if (!definition || !resolved.languages.has(definition.id)) {\n return null;\n }\n return encodePayload(\n payloadFromFence(\n fence,\n resolved,\n projectContextForFence(fence, cleanMarkdownPath(id, root), sourceRoot(root, resolved)),\n ),\n );\n });\n if (rewritten === code) {\n return null;\n }\n needsClientAsset = true;\n return rewritten;\n },\n\n configureServer(server) {\n if (resolved.proxy) {\n mountProxies(server, proxyTargets.rust, proxyTargets.go);\n }\n server.middlewares.use(async (req, res, next) => {\n const urlPath = req.url?.split(\"?\")[0] ?? \"\";\n if (urlPath === `${base}ox-code-play.js`.replace(/\\/{2,}/g, \"/\")) {\n const file = resolveClientFile();\n if (!file) {\n return next();\n }\n res.setHeader(\"Content-Type\", \"text/javascript; charset=utf-8\");\n res.end(assertBrowserClientSource(await readFile(file, \"utf8\")));\n return;\n }\n interceptHtml(res, (html) =>\n enhanceHtmlForUrl(urlPath, html, root, resolved, enhanceOptions),\n );\n next();\n });\n },\n\n async generateBundle() {\n if (command !== \"build\" || !needsClientAsset) {\n return;\n }\n const source = await loadClientSource();\n if (!source) {\n return;\n }\n this.emitFile({\n type: \"asset\",\n fileName: \"ox-code-play.js\",\n source,\n });\n emittedClientAsset = true;\n },\n\n async closeBundle() {\n if (command !== \"build\") {\n return;\n }\n const srcDir = path.resolve(root, resolved.srcDir ?? \"docs\");\n const destination = path.resolve(root, outDir ?? \"dist\");\n if (!existsSync(srcDir) || !existsSync(destination)) {\n return;\n }\n const enhancedAny = await enhanceWrittenPages(srcDir, destination, resolved, enhanceOptions);\n if (!enhancedAny) {\n return;\n }\n needsClientAsset = true;\n if (!emittedClientAsset) {\n await writeClientAsset(destination, await loadClientSource());\n }\n },\n };\n\n async function loadClientSource(): Promise<string | undefined> {\n if (clientSource) {\n return clientSource;\n }\n const file = resolveClientFile();\n if (!file) {\n return undefined;\n }\n clientSource = assertBrowserClientSource(await readFile(file, \"utf8\"));\n return clientSource;\n }\n}\n\nfunction interceptHtml(\n res: import(\"node:http\").ServerResponse,\n enhance: (html: string) => string | undefined,\n): void {\n const originalEnd = res.end.bind(res);\n res.end = ((chunk?: unknown, encoding?: BufferEncoding | (() => void), cb?: () => void) => {\n const html =\n typeof chunk === \"string\"\n ? chunk\n : Buffer.isBuffer(chunk)\n ? chunk.toString(\"utf8\")\n : undefined;\n const type = String(res.getHeader(\"content-type\") ?? \"\");\n if (html && (type.includes(\"html\") || html.includes(\"<pre\"))) {\n const next = enhance(html);\n if (next && next !== html) {\n if (typeof encoding === \"function\") {\n return originalEnd(next, encoding);\n }\n return originalEnd(next, encoding ?? \"utf8\", cb);\n }\n }\n if (typeof encoding === \"function\") {\n return originalEnd(chunk as never, encoding);\n }\n return originalEnd(chunk as never, encoding ?? \"utf8\", cb);\n }) as typeof res.end;\n}\n\nfunction enhanceHtmlForUrl(\n urlPath: string,\n html: string,\n root: string,\n resolved: ResolvedCodePlayOptions,\n enhance: (\n matchFences?: Array<{ language: string; code: string; payload: string }>,\n ) => HtmlEnhanceOptions,\n): string | undefined {\n const markdownPath = urlToMarkdown(urlPath, root, resolved.srcDir ?? \"docs\", resolved.base);\n if (!markdownPath || !existsSync(markdownPath)) {\n return undefined;\n }\n const source = readFileSync(markdownPath, \"utf8\");\n const srcRoot = sourceRoot(root, resolved);\n const fences = [...parsePlayFences(source), ...parseCodePlayTags(source)].filter((fence) => {\n const definition = resolveLanguage(fence.language);\n return Boolean(definition && resolved.languages.has(definition.id));\n });\n if (fences.length === 0) {\n return undefined;\n }\n return enhancePlayHtml(\n html,\n enhance(\n fences.map((fence) => ({\n language: fence.language,\n code: fence.code,\n payload: encodePayload(\n payloadFromFence(fence, resolved, projectContextForFence(fence, markdownPath, srcRoot)),\n ),\n })),\n ),\n );\n}\n\nfunction mountProxies(server: ViteDevServer, rustUrl: string, goUrl: string): void {\n server.middlewares.use(\"/__ox-code-play/rust\", (req, res) => {\n void proxy(req, res, rustUrl, \"application/json\");\n });\n server.middlewares.use(\"/__ox-code-play/go\", (req, res) => {\n void proxy(req, res, goUrl, \"application/x-www-form-urlencoded\");\n });\n server.middlewares.use(DEV_TYPECHECK_PATH, (req, res) => {\n void typecheckProxy(req, res);\n });\n}\n\nasync function enhanceWrittenPages(\n srcDir: string,\n outDir: string,\n resolved: ResolvedCodePlayOptions,\n enhance: (\n matchFences?: Array<{ language: string; code: string; payload: string }>,\n ) => HtmlEnhanceOptions,\n): Promise<boolean> {\n let enhancedAny = false;\n for (const file of walkFiles(srcDir)) {\n if (!MARKDOWN_RE.test(file)) {\n continue;\n }\n const source = await readFile(file, \"utf8\");\n const fences = [...parsePlayFences(source), ...parseCodePlayTags(source)].filter((fence) => {\n const definition = resolveLanguage(fence.language);\n return Boolean(definition && resolved.languages.has(definition.id));\n });\n if (fences.length === 0) {\n continue;\n }\n const htmlPath = guessHtmlPath(file, srcDir, outDir);\n if (!htmlPath || !existsSync(htmlPath)) {\n continue;\n }\n const html = await readFile(htmlPath, \"utf8\");\n const enhanced = enhancePlayHtml(\n html,\n enhance(\n fences.map((fence) => ({\n language: fence.language,\n code: fence.code,\n payload: encodePayload(\n payloadFromFence(fence, resolved, projectContextForFence(fence, file, srcDir)),\n ),\n })),\n ),\n );\n if (enhanced !== html) {\n await writeFile(htmlPath, enhanced);\n enhancedAny = true;\n }\n }\n return enhancedAny;\n}\n\nfunction projectContextForFence(\n fence: Pick<PlayFence, \"project\">,\n documentPath: string | undefined,\n srcRoot: string,\n): PayloadFromFenceContext {\n if (!fence.project) {\n return {};\n }\n return collectProjectFiles(fence.project, {\n documentPath,\n sourceRoot: srcRoot,\n });\n}\n\nexport type { CodePlayPluginOptions as CodePlayOptions };\n"],"mappings":"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"}
|