@ox-content/code-play 3.0.0-alpha.3 → 3.0.0-alpha.5
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/dist/browser.mjs +6 -1
- package/dist/hydrate.d.mts +2 -1
- package/dist/hydrate.d.mts.map +1 -1
- package/dist/hydrate.mjs +2 -2
- package/dist/hydrate2.d.mts +2 -2
- package/dist/hydrate2.mjs +7 -2
- package/dist/hydrate2.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +1 -1
- package/dist/payload.mjs +5 -1
- package/dist/payload.mjs.map +1 -1
- package/package.json +1 -1
package/dist/browser.mjs
CHANGED
|
@@ -1775,7 +1775,12 @@ function paintResult(element, _payload, result) {
|
|
|
1775
1775
|
if (timing) timing.innerHTML = renderTimingHtml(result.timing);
|
|
1776
1776
|
const stderr = element.querySelector("[data-panel=\"stderr\"]");
|
|
1777
1777
|
if (stderr) stderr.innerHTML = renderStderrHtml(result);
|
|
1778
|
-
showPanel(element,
|
|
1778
|
+
showPanel(element, resultPanelToShow(result, Boolean(stderr)));
|
|
1779
|
+
}
|
|
1780
|
+
function resultPanelToShow(result, hasStderrPanel) {
|
|
1781
|
+
if (!hasStderrPanel) return "stdio";
|
|
1782
|
+
if (result.diagnostics.some((diagnostic) => diagnostic.severity === "error") || result.status !== "ok" && Boolean(result.stderr)) return "stderr";
|
|
1783
|
+
return "stdio";
|
|
1779
1784
|
}
|
|
1780
1785
|
function showPanel(element, panel) {
|
|
1781
1786
|
const compact = Boolean(element.querySelector(".ox-code-play--compact"));
|
package/dist/hydrate.d.mts
CHANGED
|
@@ -62,6 +62,7 @@ declare function hydrateCodePlay(root?: ParentNode, options?: HydrateOptions): v
|
|
|
62
62
|
declare function mountCodePlay(element: Element, options?: {
|
|
63
63
|
client?: CodePlayClient;
|
|
64
64
|
}): void;
|
|
65
|
+
declare function resultPanelToShow(result: RunResult, hasStderrPanel: boolean): "stderr" | "stdio";
|
|
65
66
|
//#endregion
|
|
66
|
-
export {
|
|
67
|
+
export { decodePayload as a, CodePlayClientOptions as c, resultPanelToShow as i, createCodePlay as l, hydrateCodePlay as n, encodePayload as o, mountCodePlay as r, CodePlayClient as s, HydrateOptions as t, CodePlaySession as u };
|
|
67
68
|
//# sourceMappingURL=hydrate.d.mts.map
|
package/dist/hydrate.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hydrate.d.mts","names":[],"sources":["../src/session.ts","../src/client.ts","../src/payload.ts","../src/hydrate.ts"],"mappings":";;KAkBK,SAAS,MAAM,OAAO;cAEd;WACF,UAAU;EACnB;EACA,QAAQ;EACR,YAAY;;MAGR;;MAKA;mBAIa;mBACA;mBACA;mBACA;mBACA;mBACA;UACT;EAER,YAAY,OAAO;EAWnB,GAAG,UAAU,kBAAkB,OAAO,GAAG,UAAU,SAAS,gBAAgB;EAO5E,QAAQ;EAIR,UAAU,QAAQ;EAKZ,OAAO,QAAQ;EAIf,aAAa,QAAQ;EAI3B;UAIc;UA4BN;UASA;;UAOO,gCAAgC;EAC/C,YAAY;EACZ,SAAS;EACT;EACA,WAAW;EACX,WAAW;EACX,uBAAuB,QAAQ;;;;UC3HhB,8BAA8B;EAC7C,YAAY;EACZ,uBAAuB,QAAQ;;UAGhB;WACN,SAAS;EAClB,cAAc,OAAO,eAAe;EACpC,YAAY;;iBAGE,eAAe,UAAS,wBAA6B;;;iBClBrD,cAAc,SAAS;iBAIvB,cAAc,gBAAgB;;;UCS7B;EACf,SAAS;EACT,OAAO;;iBAKO,gBACd,OAAM,YACN,UAAS;iBAaK,cAAc,SAAS,SAAS;EAAW,SAAS"}
|
|
1
|
+
{"version":3,"file":"hydrate.d.mts","names":[],"sources":["../src/session.ts","../src/client.ts","../src/payload.ts","../src/hydrate.ts"],"mappings":";;KAkBK,SAAS,MAAM,OAAO;cAEd;WACF,UAAU;EACnB;EACA,QAAQ;EACR,YAAY;;MAGR;;MAKA;mBAIa;mBACA;mBACA;mBACA;mBACA;mBACA;UACT;EAER,YAAY,OAAO;EAWnB,GAAG,UAAU,kBAAkB,OAAO,GAAG,UAAU,SAAS,gBAAgB;EAO5E,QAAQ;EAIR,UAAU,QAAQ;EAKZ,OAAO,QAAQ;EAIf,aAAa,QAAQ;EAI3B;UAIc;UA4BN;UASA;;UAOO,gCAAgC;EAC/C,YAAY;EACZ,SAAS;EACT;EACA,WAAW;EACX,WAAW;EACX,uBAAuB,QAAQ;;;;UC3HhB,8BAA8B;EAC7C,YAAY;EACZ,uBAAuB,QAAQ;;UAGhB;WACN,SAAS;EAClB,cAAc,OAAO,eAAe;EACpC,YAAY;;iBAGE,eAAe,UAAS,wBAA6B;;;iBClBrD,cAAc,SAAS;iBAIvB,cAAc,gBAAgB;;;UCS7B;EACf,SAAS;EACT,OAAO;;iBAKO,gBACd,OAAM,YACN,UAAS;iBAaK,cAAc,SAAS,SAAS;EAAW,SAAS;;iBAsGpD,kBAAkB,QAAQ,WAAW"}
|
package/dist/hydrate.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { n as encodePayload, t as decodePayload } from "./payload.mjs";
|
|
2
|
-
import { n as mountCodePlay, t as hydrateCodePlay } from "./hydrate2.mjs";
|
|
3
|
-
export { decodePayload, encodePayload, hydrateCodePlay, mountCodePlay };
|
|
2
|
+
import { n as mountCodePlay, r as resultPanelToShow, t as hydrateCodePlay } from "./hydrate2.mjs";
|
|
3
|
+
export { decodePayload, encodePayload, hydrateCodePlay, mountCodePlay, resultPanelToShow };
|
package/dist/hydrate2.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { HydrateOptions, decodePayload, encodePayload, hydrateCodePlay, mountCodePlay };
|
|
1
|
+
import { a as decodePayload, i as resultPanelToShow, n as hydrateCodePlay, o as encodePayload, r as mountCodePlay, t as HydrateOptions } from "./hydrate.mjs";
|
|
2
|
+
export { HydrateOptions, decodePayload, encodePayload, hydrateCodePlay, mountCodePlay, resultPanelToShow };
|
package/dist/hydrate2.mjs
CHANGED
|
@@ -333,7 +333,12 @@ function paintResult(element, _payload, result) {
|
|
|
333
333
|
if (timing) timing.innerHTML = renderTimingHtml(result.timing);
|
|
334
334
|
const stderr = element.querySelector("[data-panel=\"stderr\"]");
|
|
335
335
|
if (stderr) stderr.innerHTML = renderStderrHtml(result);
|
|
336
|
-
showPanel(element,
|
|
336
|
+
showPanel(element, resultPanelToShow(result, Boolean(stderr)));
|
|
337
|
+
}
|
|
338
|
+
function resultPanelToShow(result, hasStderrPanel) {
|
|
339
|
+
if (!hasStderrPanel) return "stdio";
|
|
340
|
+
if (result.diagnostics.some((diagnostic) => diagnostic.severity === "error") || result.status !== "ok" && Boolean(result.stderr)) return "stderr";
|
|
341
|
+
return "stdio";
|
|
337
342
|
}
|
|
338
343
|
function showPanel(element, panel) {
|
|
339
344
|
const compact = Boolean(element.querySelector(".ox-code-play--compact"));
|
|
@@ -382,6 +387,6 @@ function defaultRoot() {
|
|
|
382
387
|
return document;
|
|
383
388
|
}
|
|
384
389
|
//#endregion
|
|
385
|
-
export {
|
|
390
|
+
export { renderConfigHtml as a, renderStderrHtml as c, CODE_PLAY_STYLES as d, renderPlayUi as i, renderStdioHtml as l, mountCodePlay as n, renderDiagnosticsHtml as o, resultPanelToShow as r, renderProvenanceHtml as s, hydrateCodePlay as t, renderTimingHtml as u };
|
|
386
391
|
|
|
387
392
|
//# sourceMappingURL=hydrate2.mjs.map
|
package/dist/hydrate2.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hydrate2.mjs","names":[],"sources":["../src/hydrate-action.ts","../src/styles.ts","../src/viewers.ts","../src/ui.ts","../src/hydrate.ts"],"sourcesContent":["import { decodePayload } from \"./payload\";\nimport type { PlayPayload, RunResult } from \"./types\";\n\nexport function readPlayPayload(encoded: string): PlayPayload | undefined {\n try {\n return decodePayload(encoded);\n } catch {\n return undefined;\n }\n}\n\nexport async function runPlayAction(input: {\n action: () => Promise<RunResult>;\n setBusy: (busy: boolean) => void;\n onResult: (result: RunResult) => void;\n onError: (error: unknown) => void;\n}): Promise<void> {\n input.setBusy(true);\n try {\n input.onResult(await input.action());\n } catch (error) {\n input.onError(error);\n } finally {\n input.setBusy(false);\n }\n}\n","export const CODE_PLAY_STYLES = `\n.ox-code-play {\n border: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 16%, transparent));\n border-radius: 12px;\n background: var(--octc-color-bg-alt, var(--octc-color-bg, Canvas));\n color: var(--octc-color-text, CanvasText);\n overflow: hidden;\n margin: 1.25rem 0;\n}\n.ox-code-play__toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n padding: 0.6rem 0.8rem;\n border-bottom: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 12%, transparent));\n}\n.ox-code-play__lang {\n font: 600 0.8rem/1.2 ui-sans-serif, system-ui, sans-serif;\n margin-right: auto;\n color: var(--octc-color-text, CanvasText);\n}\n.ox-code-play__toolbar button {\n appearance: none;\n border: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 20%, transparent));\n background: color-mix(in srgb, var(--octc-color-text, CanvasText) 8%, transparent);\n color: var(--octc-color-text, CanvasText);\n border-radius: 999px;\n padding: 0.25rem 0.75rem;\n font: 600 0.75rem/1.4 ui-sans-serif, system-ui, sans-serif;\n cursor: pointer;\n}\n.ox-code-play__toolbar button:disabled { opacity: 0.55; cursor: progress; }\n.ox-code-play .ox-code { margin: 0; }\n.ox-code-play__source pre { margin: 0; border: 0; border-radius: 0; }\n.ox-code-play__tabs {\n display: flex;\n gap: 0.25rem;\n padding: 0.4rem 0.7rem 0;\n}\n.ox-code-play__tabs button {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--octc-color-text, CanvasText);\n padding: 0.35rem 0.55rem;\n border-radius: 8px 8px 0 0;\n font: 600 0.75rem/1.2 ui-sans-serif, system-ui, sans-serif;\n cursor: pointer;\n}\n.ox-code-play__tabs button[aria-selected=\"true\"] {\n background: color-mix(in srgb, var(--octc-color-text, CanvasText) 10%, transparent);\n}\n.ox-code-play__panel { padding: 0.7rem 0.8rem 0.9rem; color: var(--octc-color-text, CanvasText); }\n.ox-code-play__panel pre {\n background: transparent !important;\n color: inherit !important;\n padding: 0 !important;\n margin: 0 !important;\n border: 0 !important;\n border-radius: 0 !important;\n}\n.ox-code-play__empty { margin: 0; opacity: 0.7; font-size: 0.85rem; }\n.ox-code-play__stdio { font: 12px/1.45 ui-monospace, SFMono-Regular, monospace; }\n.ox-code-play__stdio-line { display: grid; grid-template-columns: 8.5rem 1fr; gap: 0.6rem; white-space: pre-wrap; }\n.ox-code-play__stdio-line--stderr { color: var(--octc-danger, #b42318); }\n.ox-code-play__stdio-line--stdin { opacity: 0.75; }\n.ox-code-play__stdio-meta { opacity: 0.6; }\n.ox-code-play__config { display: grid; gap: 0.55rem; }\n.ox-code-play__field { display: grid; gap: 0.25rem; font-size: 0.85rem; }\n.ox-code-play__field input, .ox-code-play__field select {\n font: inherit;\n padding: 0.3rem 0.45rem;\n border-radius: 8px;\n border: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 18%, transparent));\n background: var(--octc-color-bg, Canvas);\n color: var(--octc-color-text, CanvasText);\n}\n.ox-code-play__provenance { display: grid; gap: 0.6rem; margin: 0; }\n.ox-code-play__provenance dt { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.04em; opacity: 0.65; }\n.ox-code-play__provenance dd { margin: 0.15rem 0 0; }\n.ox-code-play__phase { margin: 0.45rem 0; }\n.ox-code-play__phase-meta { display: flex; justify-content: space-between; font-size: 0.8rem; }\n.ox-code-play__phase-bar {\n height: 0.35rem;\n margin-top: 0.25rem;\n border-radius: 999px;\n background: var(--octc-color-primary, var(--octc-accent, #4f46e5));\n}\n.ox-code-play__timing-total { margin: 0 0 0.4rem; font-weight: 600; }\n.ox-code-play__diags { margin: 0 0 0.6rem; padding-left: 1.1rem; }\n.ox-code-play__diag--error { color: var(--octc-danger, #b42318); }\n.ox-code-play__diag--warning { color: var(--octc-warning, #b54708); }\n.ox-code-play--compact .ox-code-play__tabs { display: none; }\n.ox-code-play--compact .ox-code-play__panel[data-panel]:not([data-panel=\"stdio\"]):not([data-panel=\"stderr\"]) { display: none; }\n`;\n","import { escapeHtml } from \"./escape\";\nimport { selectStream } from \"./stdio\";\nimport type { ConfigField, Provenance, RunResult, StdioEvent, TimingReport } from \"./types\";\n\nexport function renderStdioHtml(events: StdioEvent[]): string {\n if (events.length === 0) {\n return `<p class=\"ox-code-play__stdio ox-code-play__empty\">No stdio yet.</p>`;\n }\n const lines = events\n .map((event) => {\n const time = event.timestampMs.toFixed(1);\n return `<div class=\"ox-code-play__stdio-line ox-code-play__stdio-line--${event.stream}\"><span class=\"ox-code-play__stdio-meta\">${escapeHtml(event.stream)} +${escapeHtml(time)}ms</span><span class=\"ox-code-play__stdio-text\">${escapeHtml(event.text)}</span></div>`;\n })\n .join(\"\");\n return `<div class=\"ox-code-play__stdio\" role=\"log\">${lines}</div>`;\n}\n\n/** Dedicated stderr viewer: stderr chunks plus error/warning diagnostics. */\nexport function renderStderrHtml(result: RunResult | undefined): string {\n const chunks = selectStream(result?.stdio ?? [], \"stderr\");\n const diagnostics = (result?.diagnostics ?? []).filter(\n (diagnostic) => diagnostic.severity === \"error\" || diagnostic.severity === \"warning\",\n );\n if (chunks.length === 0 && diagnostics.length === 0) {\n return `<p class=\"ox-code-play__empty\">No stderr.</p>`;\n }\n const stream = chunks.length === 0 ? \"\" : renderStdioHtml(chunks);\n if (diagnostics.length === 0) {\n return stream;\n }\n const items = diagnostics\n .map((diagnostic) => {\n const place = diagnostic.line\n ? `:${diagnostic.line}${diagnostic.column ? `:${diagnostic.column}` : \"\"}`\n : \"\";\n return `<li class=\"ox-code-play__diag ox-code-play__diag--${diagnostic.severity}\">${escapeHtml(diagnostic.severity)}${escapeHtml(place)} ${escapeHtml(diagnostic.message)}</li>`;\n })\n .join(\"\");\n return `${stream}<ul class=\"ox-code-play__diags\">${items}</ul>`;\n}\n\nexport function renderConfigHtml(schema: ConfigField[], config: Record<string, unknown>): string {\n if (schema.length === 0) {\n return `<p class=\"ox-code-play__empty\">This language has no editable config.</p>`;\n }\n const fields = schema\n .map((field) => {\n const value = config[field.key] ?? field.default ?? \"\";\n const label = `<label class=\"ox-code-play__field\"><span>${escapeHtml(field.label)}</span>${renderField(field, value)}</label>`;\n return field.description\n ? `${label}<p class=\"ox-code-play__field-help\">${escapeHtml(field.description)}</p>`\n : label;\n })\n .join(\"\");\n return `<form class=\"ox-code-play__config\">${fields}</form>`;\n}\n\nexport function renderProvenanceHtml(provenance: Provenance | undefined): string {\n if (!provenance?.compile && !provenance?.execute) {\n return `<p class=\"ox-code-play__empty\">No provenance yet. Run or type-check a sample.</p>`;\n }\n return `<dl class=\"ox-code-play__provenance\">${renderLocation(\"Compiled\", provenance.compile)}${renderLocation(\"Executed\", provenance.execute)}</dl>`;\n}\n\nexport function renderTimingHtml(timing: TimingReport | undefined): string {\n if (!timing || timing.phases.length === 0) {\n return `<p class=\"ox-code-play__empty\">No timing yet. Run or type-check a sample.</p>`;\n }\n const rows = timing.phases\n .map((phase) => {\n const width = timing.totalMs > 0 ? Math.max(2, (phase.durationMs / timing.totalMs) * 100) : 0;\n return `<div class=\"ox-code-play__phase\"><div class=\"ox-code-play__phase-meta\"><span>${escapeHtml(phase.label)}</span><span>${phase.durationMs.toFixed(1)}ms</span></div><div class=\"ox-code-play__phase-bar\" style=\"width:${width.toFixed(1)}%\"></div></div>`;\n })\n .join(\"\");\n return `<div class=\"ox-code-play__timing\"><p class=\"ox-code-play__timing-total\">Total ${timing.totalMs.toFixed(1)}ms</p>${rows}</div>`;\n}\n\nexport function renderDiagnosticsHtml(result: RunResult | undefined): string {\n if (!result?.diagnostics.length) {\n return \"\";\n }\n const items = result.diagnostics\n .map((diagnostic) => {\n const place = diagnostic.line\n ? `:${diagnostic.line}${diagnostic.column ? `:${diagnostic.column}` : \"\"}`\n : \"\";\n return `<li class=\"ox-code-play__diag ox-code-play__diag--${diagnostic.severity}\">${escapeHtml(diagnostic.severity)}${escapeHtml(place)} ${escapeHtml(diagnostic.message)}</li>`;\n })\n .join(\"\");\n return `<ul class=\"ox-code-play__diags\">${items}</ul>`;\n}\n\nfunction renderField(field: ConfigField, value: unknown): string {\n const name = escapeHtml(field.key);\n if (field.type === \"boolean\") {\n return `<input type=\"checkbox\" name=\"${name}\" ${value ? \"checked\" : \"\"}>`;\n }\n if (field.type === \"select\") {\n const options = (field.options ?? [])\n .map(\n (option) =>\n `<option value=\"${escapeHtml(option.value)}\" ${String(value) === option.value ? \"selected\" : \"\"}>${escapeHtml(option.label)}</option>`,\n )\n .join(\"\");\n return `<select name=\"${name}\">${options}</select>`;\n }\n const inputType = field.type === \"number\" ? \"number\" : \"text\";\n return `<input type=\"${inputType}\" name=\"${name}\" value=\"${escapeHtml(String(value))}\">`;\n}\n\nfunction renderLocation(label: string, location: Provenance[\"compile\"]): string {\n if (!location) {\n return \"\";\n }\n const details = [location.runtime, location.version, location.sandbox, location.target]\n .filter(Boolean)\n .join(\" · \");\n return `<div><dt>${escapeHtml(label)}</dt><dd><strong>${escapeHtml(location.host)}</strong>${details ? ` <span>${escapeHtml(details)}</span>` : \"\"}</dd></div>`;\n}\n","import { resolveLanguage } from \"./catalog\";\nimport { escapeHtml } from \"./escape\";\nimport type { CodePlayPreset, PlayPayload, RunResult } from \"./types\";\nimport {\n renderConfigHtml,\n renderDiagnosticsHtml,\n renderProvenanceHtml,\n renderStderrHtml,\n renderStdioHtml,\n renderTimingHtml,\n} from \"./viewers\";\n\nexport interface UiState {\n payload: PlayPayload;\n result?: RunResult;\n busy?: boolean;\n panel?: \"stdio\" | \"stderr\" | \"config\" | \"provenance\" | \"timing\";\n}\n\nexport function renderPlayUi(state: UiState): string {\n const definition = resolveLanguage(state.payload.language);\n const preset: CodePlayPreset = state.payload.ui === \"headless\" ? \"headless\" : state.payload.ui;\n if (preset === \"headless\") {\n return \"\";\n }\n const panel = state.panel ?? \"stdio\";\n const canTypecheck = state.payload.capabilities.typecheck;\n const tabs = renderTabs(state, panel);\n const viewers = state.payload.viewers;\n return `<div class=\"ox-code-play ox-code-play--${preset}\" data-ox-code-play-ui>\n <div class=\"ox-code-play__toolbar\">\n <span class=\"ox-code-play__lang\">${escapeHtml(definition?.name ?? state.payload.language)}</span>\n <button type=\"button\" data-ox-action=\"run\"${actionButtonAttrs(\"run\", Boolean(state.busy))}>Run</button>\n ${canTypecheck ? `<button type=\"button\" data-ox-action=\"typecheck\"${actionButtonAttrs(\"typecheck\", Boolean(state.busy))}>Typecheck</button>` : \"\"}\n <button type=\"button\" data-ox-action=\"cancel\"${actionButtonAttrs(\"cancel\", Boolean(state.busy))}>Cancel</button>\n </div>\n <div class=\"ox-code-play__source\"></div>\n ${tabs}\n ${viewers.stdio ? `<div class=\"ox-code-play__panel\" data-panel=\"stdio\">${renderDiagnosticsHtml(state.result)}${renderStdioHtml(state.result?.stdio ?? [])}</div>` : \"\"}\n ${viewers.stderr ? `<div class=\"ox-code-play__panel\" data-panel=\"stderr\"${hidden(panel, \"stderr\", preset)}>${renderStderrHtml(state.result)}</div>` : \"\"}\n <div class=\"ox-code-play__panel\" data-panel=\"config\"${hidden(panel, \"config\", preset)}>${renderConfigHtml(definition?.configSchema ?? [], state.payload.config)}</div>\n <div class=\"ox-code-play__panel\" data-panel=\"provenance\"${hidden(panel, \"provenance\", preset)}>${renderProvenanceHtml(state.result?.provenance)}</div>\n <div class=\"ox-code-play__panel\" data-panel=\"timing\"${hidden(panel, \"timing\", preset)}>${renderTimingHtml(state.result?.timing)}</div>\n</div>`;\n}\n\nfunction renderTabs(state: UiState, panel: string): string {\n if (state.payload.ui === \"compact\") {\n return \"\";\n }\n const viewers = state.payload.viewers;\n const buttons = [\n viewers.stdio ? tab(\"stdio\", \"stdio\", panel) : \"\",\n viewers.stderr ? tab(\"stderr\", \"stderr\", panel) : \"\",\n viewers.config ? tab(\"config\", \"config\", panel) : \"\",\n viewers.provenance ? tab(\"provenance\", \"provenance\", panel) : \"\",\n viewers.timing ? tab(\"timing\", \"timing\", panel) : \"\",\n ]\n .filter(Boolean)\n .join(\"\");\n return buttons ? `<div class=\"ox-code-play__tabs\" role=\"tablist\">${buttons}</div>` : \"\";\n}\n\nfunction tab(id: string, label: string, selected: string): string {\n return `<button type=\"button\" role=\"tab\" data-ox-panel=\"${id}\" aria-selected=\"${selected === id ? \"true\" : \"false\"}\">${label}</button>`;\n}\n\nexport function actionButtonAttrs(action: string, busy: boolean): string {\n const state = actionBusyState(action, busy);\n return `${state.disabled ? \" disabled\" : \"\"}${state.hidden ? \" hidden\" : \"\"}`;\n}\n\nexport function actionBusyState(\n action: string,\n busy: boolean,\n): { disabled: boolean; hidden: boolean } {\n if (action === \"cancel\") {\n return { disabled: !busy, hidden: !busy };\n }\n return { disabled: busy, hidden: false };\n}\n\nexport function applyActionBusy(root: ParentNode, busy: boolean): void {\n for (const button of root.querySelectorAll<HTMLButtonElement>(\"button[data-ox-action]\")) {\n const state = actionBusyState(button.dataset.oxAction ?? \"\", busy);\n button.disabled = state.disabled;\n button.hidden = state.hidden;\n }\n}\n\nfunction hidden(current: string, id: string, preset: CodePlayPreset): string {\n if (preset === \"compact\" && (id === \"stdio\" || id === \"stderr\")) {\n return \"\";\n }\n return current === id ? \"\" : \" hidden\";\n}\n","import { createCodePlay, type CodePlayClient } from \"./client\";\nimport { readPlayPayload, runPlayAction } from \"./hydrate-action\";\nimport { decodePayload, encodePayload } from \"./payload\";\nimport { errorMessage, errorResult } from \"./result\";\nimport { CODE_PLAY_STYLES } from \"./styles\";\nimport { JS_SANDBOX_FLAGS } from \"./javascript-sandbox\";\nimport { applyActionBusy, renderPlayUi } from \"./ui\";\nimport type { PlayPayload, RunResult } from \"./types\";\nimport {\n renderDiagnosticsHtml,\n renderProvenanceHtml,\n renderStderrHtml,\n renderStdioHtml,\n renderTimingHtml,\n} from \"./viewers\";\n\nexport interface HydrateOptions {\n client?: CodePlayClient;\n root?: ParentNode;\n}\n\nconst STYLE_ID = \"ox-code-play-styles\";\n\nexport function hydrateCodePlay(\n root: ParentNode = defaultRoot(),\n options: HydrateOptions = {},\n): void {\n ensureStyles();\n const client = options.client ?? createCodePlayFromPayloads(root);\n for (const element of queryWidgets(root)) {\n try {\n mountCodePlay(element, { client });\n } catch {\n // One broken widget must not abort the rest of the page.\n }\n }\n}\n\nexport function mountCodePlay(element: Element, options: { client?: CodePlayClient } = {}): void {\n if (!(element instanceof HTMLElement) || element.dataset.oxCodePlayMounted === \"true\") {\n return;\n }\n const payload = readPlayPayload(element.getAttribute(\"data-ox-code-play\") ?? \"\");\n if (!payload || payload.ui === \"headless\") {\n return;\n }\n const client =\n options.client ??\n createCodePlay({\n languages: { [payload.language]: true },\n endpoints: payload.endpoints,\n });\n const source = element.innerHTML;\n const ui = document.createElement(\"div\");\n ui.innerHTML = renderPlayUi({ payload });\n const widget = ui.firstElementChild;\n if (!widget) {\n return;\n }\n const sourceSlot = widget.querySelector(\".ox-code-play__source\");\n if (sourceSlot) {\n sourceSlot.innerHTML = source;\n }\n element.replaceChildren(widget);\n element.dataset.oxCodePlayMounted = \"true\";\n bindWidget(element, payload, client);\n}\n\nfunction bindWidget(element: HTMLElement, payload: PlayPayload, client: CodePlayClient): void {\n let current = payload;\n const session = client.createSession({\n language: payload.language,\n code: payload.code,\n config: payload.config,\n });\n const runButton = element.querySelector<HTMLButtonElement>('[data-ox-action=\"run\"]');\n const checkButton = element.querySelector<HTMLButtonElement>('[data-ox-action=\"typecheck\"]');\n const cancelButton = element.querySelector<HTMLButtonElement>('[data-ox-action=\"cancel\"]');\n runButton?.addEventListener(\"click\", () => void run(\"execute\"));\n checkButton?.addEventListener(\"click\", () => void run(\"typecheck\"));\n cancelButton?.addEventListener(\"click\", () => session.cancel());\n element.addEventListener(\"click\", (event) => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n const panel = target.dataset.oxPanel;\n if (panel) {\n showPanel(element, panel);\n }\n });\n element.addEventListener(\"change\", (event) => {\n const form = (event.target as HTMLElement | null)?.closest(\"form\");\n if (!form) {\n return;\n }\n session.setConfig(readForm(form));\n current = { ...current, config: session.config };\n });\n\n async function run(action: \"execute\" | \"typecheck\"): Promise<void> {\n await runPlayAction({\n action: () => (action === \"typecheck\" ? session.typecheck() : session.run()),\n setBusy: (busy) => applyActionBusy(element, busy),\n onResult: (result) => paintResult(element, current, result),\n onError: (error) => paintResult(element, current, errorResult(errorMessage(error))),\n });\n }\n}\n\nfunction paintResult(element: HTMLElement, _payload: PlayPayload, result: RunResult): void {\n const stdio = element.querySelector('[data-panel=\"stdio\"]');\n if (stdio) {\n stdio.innerHTML = `${renderDiagnosticsHtml(result)}${renderStdioHtml(result.stdio)}`;\n if (result.preview) {\n const frame = document.createElement(\"iframe\");\n frame.setAttribute(\"sandbox\", JS_SANDBOX_FLAGS);\n frame.srcdoc = result.preview.html;\n frame.title = \"Code Play preview\";\n frame.style.width = \"100%\";\n frame.style.minHeight = \"12rem\";\n frame.style.border = \"0\";\n stdio.append(frame);\n }\n }\n const provenance = element.querySelector('[data-panel=\"provenance\"]');\n if (provenance) {\n provenance.innerHTML = renderProvenanceHtml(result.provenance);\n }\n const timing = element.querySelector('[data-panel=\"timing\"]');\n if (timing) {\n timing.innerHTML = renderTimingHtml(result.timing);\n }\n const stderr = element.querySelector('[data-panel=\"stderr\"]');\n if (stderr) {\n stderr.innerHTML = renderStderrHtml(result);\n }\n const focusStderr =\n Boolean(stderr) &&\n (Boolean(result.stderr) ||\n result.diagnostics.some((diagnostic) => diagnostic.severity === \"error\"));\n showPanel(element, focusStderr ? \"stderr\" : \"stdio\");\n}\n\nfunction showPanel(element: HTMLElement, panel: string): void {\n const compact = Boolean(element.querySelector(\".ox-code-play--compact\"));\n for (const tab of element.querySelectorAll(\"[data-ox-panel]\")) {\n tab.setAttribute(\n \"aria-selected\",\n tab.getAttribute(\"data-ox-panel\") === panel ? \"true\" : \"false\",\n );\n }\n for (const node of element.querySelectorAll<HTMLElement>(\".ox-code-play__panel\")) {\n const id = node.dataset.panel;\n if (compact && (id === \"stdio\" || id === \"stderr\")) {\n node.hidden = false;\n continue;\n }\n node.hidden = id !== panel;\n }\n}\n\nfunction readForm(form: HTMLFormElement): Record<string, unknown> {\n const data = new FormData(form);\n const config: Record<string, unknown> = {};\n for (const [key, value] of data.entries()) {\n config[key] = value === \"on\" ? true : value;\n }\n for (const input of form.querySelectorAll<HTMLInputElement>('input[type=\"checkbox\"]')) {\n config[input.name] = input.checked;\n }\n return config;\n}\n\nfunction createCodePlayFromPayloads(root: ParentNode) {\n const languages: Record<string, true> = {};\n let endpoints;\n for (const element of queryWidgets(root)) {\n try {\n const payload = decodePayload(element.getAttribute(\"data-ox-code-play\") ?? \"\");\n languages[payload.language] = true;\n endpoints = payload.endpoints ?? endpoints;\n } catch {\n // Ignore malformed widgets so one bad payload cannot block the page.\n }\n }\n return createCodePlay({ languages, endpoints });\n}\n\nfunction queryWidgets(root: ParentNode): HTMLElement[] {\n return [...root.querySelectorAll<HTMLElement>(\"[data-ox-code-play]\")];\n}\n\nfunction ensureStyles(): void {\n if (typeof document === \"undefined\" || document.getElementById(STYLE_ID)) {\n return;\n }\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = CODE_PLAY_STYLES;\n document.head.append(style);\n}\n\nfunction defaultRoot(): ParentNode {\n if (typeof document === \"undefined\") {\n throw new Error(\"hydrateCodePlay() needs a DOM root.\");\n }\n return document;\n}\n\nexport { encodePayload, decodePayload };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hydrate2.mjs","names":[],"sources":["../src/hydrate-action.ts","../src/styles.ts","../src/viewers.ts","../src/ui.ts","../src/hydrate.ts"],"sourcesContent":["import { decodePayload } from \"./payload\";\nimport type { PlayPayload, RunResult } from \"./types\";\n\nexport function readPlayPayload(encoded: string): PlayPayload | undefined {\n try {\n return decodePayload(encoded);\n } catch {\n return undefined;\n }\n}\n\nexport async function runPlayAction(input: {\n action: () => Promise<RunResult>;\n setBusy: (busy: boolean) => void;\n onResult: (result: RunResult) => void;\n onError: (error: unknown) => void;\n}): Promise<void> {\n input.setBusy(true);\n try {\n input.onResult(await input.action());\n } catch (error) {\n input.onError(error);\n } finally {\n input.setBusy(false);\n }\n}\n","export const CODE_PLAY_STYLES = `\n.ox-code-play {\n border: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 16%, transparent));\n border-radius: 12px;\n background: var(--octc-color-bg-alt, var(--octc-color-bg, Canvas));\n color: var(--octc-color-text, CanvasText);\n overflow: hidden;\n margin: 1.25rem 0;\n}\n.ox-code-play__toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n padding: 0.6rem 0.8rem;\n border-bottom: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 12%, transparent));\n}\n.ox-code-play__lang {\n font: 600 0.8rem/1.2 ui-sans-serif, system-ui, sans-serif;\n margin-right: auto;\n color: var(--octc-color-text, CanvasText);\n}\n.ox-code-play__toolbar button {\n appearance: none;\n border: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 20%, transparent));\n background: color-mix(in srgb, var(--octc-color-text, CanvasText) 8%, transparent);\n color: var(--octc-color-text, CanvasText);\n border-radius: 999px;\n padding: 0.25rem 0.75rem;\n font: 600 0.75rem/1.4 ui-sans-serif, system-ui, sans-serif;\n cursor: pointer;\n}\n.ox-code-play__toolbar button:disabled { opacity: 0.55; cursor: progress; }\n.ox-code-play .ox-code { margin: 0; }\n.ox-code-play__source pre { margin: 0; border: 0; border-radius: 0; }\n.ox-code-play__tabs {\n display: flex;\n gap: 0.25rem;\n padding: 0.4rem 0.7rem 0;\n}\n.ox-code-play__tabs button {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--octc-color-text, CanvasText);\n padding: 0.35rem 0.55rem;\n border-radius: 8px 8px 0 0;\n font: 600 0.75rem/1.2 ui-sans-serif, system-ui, sans-serif;\n cursor: pointer;\n}\n.ox-code-play__tabs button[aria-selected=\"true\"] {\n background: color-mix(in srgb, var(--octc-color-text, CanvasText) 10%, transparent);\n}\n.ox-code-play__panel { padding: 0.7rem 0.8rem 0.9rem; color: var(--octc-color-text, CanvasText); }\n.ox-code-play__panel pre {\n background: transparent !important;\n color: inherit !important;\n padding: 0 !important;\n margin: 0 !important;\n border: 0 !important;\n border-radius: 0 !important;\n}\n.ox-code-play__empty { margin: 0; opacity: 0.7; font-size: 0.85rem; }\n.ox-code-play__stdio { font: 12px/1.45 ui-monospace, SFMono-Regular, monospace; }\n.ox-code-play__stdio-line { display: grid; grid-template-columns: 8.5rem 1fr; gap: 0.6rem; white-space: pre-wrap; }\n.ox-code-play__stdio-line--stderr { color: var(--octc-danger, #b42318); }\n.ox-code-play__stdio-line--stdin { opacity: 0.75; }\n.ox-code-play__stdio-meta { opacity: 0.6; }\n.ox-code-play__config { display: grid; gap: 0.55rem; }\n.ox-code-play__field { display: grid; gap: 0.25rem; font-size: 0.85rem; }\n.ox-code-play__field input, .ox-code-play__field select {\n font: inherit;\n padding: 0.3rem 0.45rem;\n border-radius: 8px;\n border: 1px solid var(--octc-color-border, color-mix(in srgb, currentColor 18%, transparent));\n background: var(--octc-color-bg, Canvas);\n color: var(--octc-color-text, CanvasText);\n}\n.ox-code-play__provenance { display: grid; gap: 0.6rem; margin: 0; }\n.ox-code-play__provenance dt { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.04em; opacity: 0.65; }\n.ox-code-play__provenance dd { margin: 0.15rem 0 0; }\n.ox-code-play__phase { margin: 0.45rem 0; }\n.ox-code-play__phase-meta { display: flex; justify-content: space-between; font-size: 0.8rem; }\n.ox-code-play__phase-bar {\n height: 0.35rem;\n margin-top: 0.25rem;\n border-radius: 999px;\n background: var(--octc-color-primary, var(--octc-accent, #4f46e5));\n}\n.ox-code-play__timing-total { margin: 0 0 0.4rem; font-weight: 600; }\n.ox-code-play__diags { margin: 0 0 0.6rem; padding-left: 1.1rem; }\n.ox-code-play__diag--error { color: var(--octc-danger, #b42318); }\n.ox-code-play__diag--warning { color: var(--octc-warning, #b54708); }\n.ox-code-play--compact .ox-code-play__tabs { display: none; }\n.ox-code-play--compact .ox-code-play__panel[data-panel]:not([data-panel=\"stdio\"]):not([data-panel=\"stderr\"]) { display: none; }\n`;\n","import { escapeHtml } from \"./escape\";\nimport { selectStream } from \"./stdio\";\nimport type { ConfigField, Provenance, RunResult, StdioEvent, TimingReport } from \"./types\";\n\nexport function renderStdioHtml(events: StdioEvent[]): string {\n if (events.length === 0) {\n return `<p class=\"ox-code-play__stdio ox-code-play__empty\">No stdio yet.</p>`;\n }\n const lines = events\n .map((event) => {\n const time = event.timestampMs.toFixed(1);\n return `<div class=\"ox-code-play__stdio-line ox-code-play__stdio-line--${event.stream}\"><span class=\"ox-code-play__stdio-meta\">${escapeHtml(event.stream)} +${escapeHtml(time)}ms</span><span class=\"ox-code-play__stdio-text\">${escapeHtml(event.text)}</span></div>`;\n })\n .join(\"\");\n return `<div class=\"ox-code-play__stdio\" role=\"log\">${lines}</div>`;\n}\n\n/** Dedicated stderr viewer: stderr chunks plus error/warning diagnostics. */\nexport function renderStderrHtml(result: RunResult | undefined): string {\n const chunks = selectStream(result?.stdio ?? [], \"stderr\");\n const diagnostics = (result?.diagnostics ?? []).filter(\n (diagnostic) => diagnostic.severity === \"error\" || diagnostic.severity === \"warning\",\n );\n if (chunks.length === 0 && diagnostics.length === 0) {\n return `<p class=\"ox-code-play__empty\">No stderr.</p>`;\n }\n const stream = chunks.length === 0 ? \"\" : renderStdioHtml(chunks);\n if (diagnostics.length === 0) {\n return stream;\n }\n const items = diagnostics\n .map((diagnostic) => {\n const place = diagnostic.line\n ? `:${diagnostic.line}${diagnostic.column ? `:${diagnostic.column}` : \"\"}`\n : \"\";\n return `<li class=\"ox-code-play__diag ox-code-play__diag--${diagnostic.severity}\">${escapeHtml(diagnostic.severity)}${escapeHtml(place)} ${escapeHtml(diagnostic.message)}</li>`;\n })\n .join(\"\");\n return `${stream}<ul class=\"ox-code-play__diags\">${items}</ul>`;\n}\n\nexport function renderConfigHtml(schema: ConfigField[], config: Record<string, unknown>): string {\n if (schema.length === 0) {\n return `<p class=\"ox-code-play__empty\">This language has no editable config.</p>`;\n }\n const fields = schema\n .map((field) => {\n const value = config[field.key] ?? field.default ?? \"\";\n const label = `<label class=\"ox-code-play__field\"><span>${escapeHtml(field.label)}</span>${renderField(field, value)}</label>`;\n return field.description\n ? `${label}<p class=\"ox-code-play__field-help\">${escapeHtml(field.description)}</p>`\n : label;\n })\n .join(\"\");\n return `<form class=\"ox-code-play__config\">${fields}</form>`;\n}\n\nexport function renderProvenanceHtml(provenance: Provenance | undefined): string {\n if (!provenance?.compile && !provenance?.execute) {\n return `<p class=\"ox-code-play__empty\">No provenance yet. Run or type-check a sample.</p>`;\n }\n return `<dl class=\"ox-code-play__provenance\">${renderLocation(\"Compiled\", provenance.compile)}${renderLocation(\"Executed\", provenance.execute)}</dl>`;\n}\n\nexport function renderTimingHtml(timing: TimingReport | undefined): string {\n if (!timing || timing.phases.length === 0) {\n return `<p class=\"ox-code-play__empty\">No timing yet. Run or type-check a sample.</p>`;\n }\n const rows = timing.phases\n .map((phase) => {\n const width = timing.totalMs > 0 ? Math.max(2, (phase.durationMs / timing.totalMs) * 100) : 0;\n return `<div class=\"ox-code-play__phase\"><div class=\"ox-code-play__phase-meta\"><span>${escapeHtml(phase.label)}</span><span>${phase.durationMs.toFixed(1)}ms</span></div><div class=\"ox-code-play__phase-bar\" style=\"width:${width.toFixed(1)}%\"></div></div>`;\n })\n .join(\"\");\n return `<div class=\"ox-code-play__timing\"><p class=\"ox-code-play__timing-total\">Total ${timing.totalMs.toFixed(1)}ms</p>${rows}</div>`;\n}\n\nexport function renderDiagnosticsHtml(result: RunResult | undefined): string {\n if (!result?.diagnostics.length) {\n return \"\";\n }\n const items = result.diagnostics\n .map((diagnostic) => {\n const place = diagnostic.line\n ? `:${diagnostic.line}${diagnostic.column ? `:${diagnostic.column}` : \"\"}`\n : \"\";\n return `<li class=\"ox-code-play__diag ox-code-play__diag--${diagnostic.severity}\">${escapeHtml(diagnostic.severity)}${escapeHtml(place)} ${escapeHtml(diagnostic.message)}</li>`;\n })\n .join(\"\");\n return `<ul class=\"ox-code-play__diags\">${items}</ul>`;\n}\n\nfunction renderField(field: ConfigField, value: unknown): string {\n const name = escapeHtml(field.key);\n if (field.type === \"boolean\") {\n return `<input type=\"checkbox\" name=\"${name}\" ${value ? \"checked\" : \"\"}>`;\n }\n if (field.type === \"select\") {\n const options = (field.options ?? [])\n .map(\n (option) =>\n `<option value=\"${escapeHtml(option.value)}\" ${String(value) === option.value ? \"selected\" : \"\"}>${escapeHtml(option.label)}</option>`,\n )\n .join(\"\");\n return `<select name=\"${name}\">${options}</select>`;\n }\n const inputType = field.type === \"number\" ? \"number\" : \"text\";\n return `<input type=\"${inputType}\" name=\"${name}\" value=\"${escapeHtml(String(value))}\">`;\n}\n\nfunction renderLocation(label: string, location: Provenance[\"compile\"]): string {\n if (!location) {\n return \"\";\n }\n const details = [location.runtime, location.version, location.sandbox, location.target]\n .filter(Boolean)\n .join(\" · \");\n return `<div><dt>${escapeHtml(label)}</dt><dd><strong>${escapeHtml(location.host)}</strong>${details ? ` <span>${escapeHtml(details)}</span>` : \"\"}</dd></div>`;\n}\n","import { resolveLanguage } from \"./catalog\";\nimport { escapeHtml } from \"./escape\";\nimport type { CodePlayPreset, PlayPayload, RunResult } from \"./types\";\nimport {\n renderConfigHtml,\n renderDiagnosticsHtml,\n renderProvenanceHtml,\n renderStderrHtml,\n renderStdioHtml,\n renderTimingHtml,\n} from \"./viewers\";\n\nexport interface UiState {\n payload: PlayPayload;\n result?: RunResult;\n busy?: boolean;\n panel?: \"stdio\" | \"stderr\" | \"config\" | \"provenance\" | \"timing\";\n}\n\nexport function renderPlayUi(state: UiState): string {\n const definition = resolveLanguage(state.payload.language);\n const preset: CodePlayPreset = state.payload.ui === \"headless\" ? \"headless\" : state.payload.ui;\n if (preset === \"headless\") {\n return \"\";\n }\n const panel = state.panel ?? \"stdio\";\n const canTypecheck = state.payload.capabilities.typecheck;\n const tabs = renderTabs(state, panel);\n const viewers = state.payload.viewers;\n return `<div class=\"ox-code-play ox-code-play--${preset}\" data-ox-code-play-ui>\n <div class=\"ox-code-play__toolbar\">\n <span class=\"ox-code-play__lang\">${escapeHtml(definition?.name ?? state.payload.language)}</span>\n <button type=\"button\" data-ox-action=\"run\"${actionButtonAttrs(\"run\", Boolean(state.busy))}>Run</button>\n ${canTypecheck ? `<button type=\"button\" data-ox-action=\"typecheck\"${actionButtonAttrs(\"typecheck\", Boolean(state.busy))}>Typecheck</button>` : \"\"}\n <button type=\"button\" data-ox-action=\"cancel\"${actionButtonAttrs(\"cancel\", Boolean(state.busy))}>Cancel</button>\n </div>\n <div class=\"ox-code-play__source\"></div>\n ${tabs}\n ${viewers.stdio ? `<div class=\"ox-code-play__panel\" data-panel=\"stdio\">${renderDiagnosticsHtml(state.result)}${renderStdioHtml(state.result?.stdio ?? [])}</div>` : \"\"}\n ${viewers.stderr ? `<div class=\"ox-code-play__panel\" data-panel=\"stderr\"${hidden(panel, \"stderr\", preset)}>${renderStderrHtml(state.result)}</div>` : \"\"}\n <div class=\"ox-code-play__panel\" data-panel=\"config\"${hidden(panel, \"config\", preset)}>${renderConfigHtml(definition?.configSchema ?? [], state.payload.config)}</div>\n <div class=\"ox-code-play__panel\" data-panel=\"provenance\"${hidden(panel, \"provenance\", preset)}>${renderProvenanceHtml(state.result?.provenance)}</div>\n <div class=\"ox-code-play__panel\" data-panel=\"timing\"${hidden(panel, \"timing\", preset)}>${renderTimingHtml(state.result?.timing)}</div>\n</div>`;\n}\n\nfunction renderTabs(state: UiState, panel: string): string {\n if (state.payload.ui === \"compact\") {\n return \"\";\n }\n const viewers = state.payload.viewers;\n const buttons = [\n viewers.stdio ? tab(\"stdio\", \"stdio\", panel) : \"\",\n viewers.stderr ? tab(\"stderr\", \"stderr\", panel) : \"\",\n viewers.config ? tab(\"config\", \"config\", panel) : \"\",\n viewers.provenance ? tab(\"provenance\", \"provenance\", panel) : \"\",\n viewers.timing ? tab(\"timing\", \"timing\", panel) : \"\",\n ]\n .filter(Boolean)\n .join(\"\");\n return buttons ? `<div class=\"ox-code-play__tabs\" role=\"tablist\">${buttons}</div>` : \"\";\n}\n\nfunction tab(id: string, label: string, selected: string): string {\n return `<button type=\"button\" role=\"tab\" data-ox-panel=\"${id}\" aria-selected=\"${selected === id ? \"true\" : \"false\"}\">${label}</button>`;\n}\n\nexport function actionButtonAttrs(action: string, busy: boolean): string {\n const state = actionBusyState(action, busy);\n return `${state.disabled ? \" disabled\" : \"\"}${state.hidden ? \" hidden\" : \"\"}`;\n}\n\nexport function actionBusyState(\n action: string,\n busy: boolean,\n): { disabled: boolean; hidden: boolean } {\n if (action === \"cancel\") {\n return { disabled: !busy, hidden: !busy };\n }\n return { disabled: busy, hidden: false };\n}\n\nexport function applyActionBusy(root: ParentNode, busy: boolean): void {\n for (const button of root.querySelectorAll<HTMLButtonElement>(\"button[data-ox-action]\")) {\n const state = actionBusyState(button.dataset.oxAction ?? \"\", busy);\n button.disabled = state.disabled;\n button.hidden = state.hidden;\n }\n}\n\nfunction hidden(current: string, id: string, preset: CodePlayPreset): string {\n if (preset === \"compact\" && (id === \"stdio\" || id === \"stderr\")) {\n return \"\";\n }\n return current === id ? \"\" : \" hidden\";\n}\n","import { createCodePlay, type CodePlayClient } from \"./client\";\nimport { readPlayPayload, runPlayAction } from \"./hydrate-action\";\nimport { decodePayload, encodePayload } from \"./payload\";\nimport { errorMessage, errorResult } from \"./result\";\nimport { CODE_PLAY_STYLES } from \"./styles\";\nimport { JS_SANDBOX_FLAGS } from \"./javascript-sandbox\";\nimport { applyActionBusy, renderPlayUi } from \"./ui\";\nimport type { PlayPayload, RunResult } from \"./types\";\nimport {\n renderDiagnosticsHtml,\n renderProvenanceHtml,\n renderStderrHtml,\n renderStdioHtml,\n renderTimingHtml,\n} from \"./viewers\";\n\nexport interface HydrateOptions {\n client?: CodePlayClient;\n root?: ParentNode;\n}\n\nconst STYLE_ID = \"ox-code-play-styles\";\n\nexport function hydrateCodePlay(\n root: ParentNode = defaultRoot(),\n options: HydrateOptions = {},\n): void {\n ensureStyles();\n const client = options.client ?? createCodePlayFromPayloads(root);\n for (const element of queryWidgets(root)) {\n try {\n mountCodePlay(element, { client });\n } catch {\n // One broken widget must not abort the rest of the page.\n }\n }\n}\n\nexport function mountCodePlay(element: Element, options: { client?: CodePlayClient } = {}): void {\n if (!(element instanceof HTMLElement) || element.dataset.oxCodePlayMounted === \"true\") {\n return;\n }\n const payload = readPlayPayload(element.getAttribute(\"data-ox-code-play\") ?? \"\");\n if (!payload || payload.ui === \"headless\") {\n return;\n }\n const client =\n options.client ??\n createCodePlay({\n languages: { [payload.language]: true },\n endpoints: payload.endpoints,\n });\n const source = element.innerHTML;\n const ui = document.createElement(\"div\");\n ui.innerHTML = renderPlayUi({ payload });\n const widget = ui.firstElementChild;\n if (!widget) {\n return;\n }\n const sourceSlot = widget.querySelector(\".ox-code-play__source\");\n if (sourceSlot) {\n sourceSlot.innerHTML = source;\n }\n element.replaceChildren(widget);\n element.dataset.oxCodePlayMounted = \"true\";\n bindWidget(element, payload, client);\n}\n\nfunction bindWidget(element: HTMLElement, payload: PlayPayload, client: CodePlayClient): void {\n let current = payload;\n const session = client.createSession({\n language: payload.language,\n code: payload.code,\n config: payload.config,\n });\n const runButton = element.querySelector<HTMLButtonElement>('[data-ox-action=\"run\"]');\n const checkButton = element.querySelector<HTMLButtonElement>('[data-ox-action=\"typecheck\"]');\n const cancelButton = element.querySelector<HTMLButtonElement>('[data-ox-action=\"cancel\"]');\n runButton?.addEventListener(\"click\", () => void run(\"execute\"));\n checkButton?.addEventListener(\"click\", () => void run(\"typecheck\"));\n cancelButton?.addEventListener(\"click\", () => session.cancel());\n element.addEventListener(\"click\", (event) => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n const panel = target.dataset.oxPanel;\n if (panel) {\n showPanel(element, panel);\n }\n });\n element.addEventListener(\"change\", (event) => {\n const form = (event.target as HTMLElement | null)?.closest(\"form\");\n if (!form) {\n return;\n }\n session.setConfig(readForm(form));\n current = { ...current, config: session.config };\n });\n\n async function run(action: \"execute\" | \"typecheck\"): Promise<void> {\n await runPlayAction({\n action: () => (action === \"typecheck\" ? session.typecheck() : session.run()),\n setBusy: (busy) => applyActionBusy(element, busy),\n onResult: (result) => paintResult(element, current, result),\n onError: (error) => paintResult(element, current, errorResult(errorMessage(error))),\n });\n }\n}\n\nfunction paintResult(element: HTMLElement, _payload: PlayPayload, result: RunResult): void {\n const stdio = element.querySelector('[data-panel=\"stdio\"]');\n if (stdio) {\n stdio.innerHTML = `${renderDiagnosticsHtml(result)}${renderStdioHtml(result.stdio)}`;\n if (result.preview) {\n const frame = document.createElement(\"iframe\");\n frame.setAttribute(\"sandbox\", JS_SANDBOX_FLAGS);\n frame.srcdoc = result.preview.html;\n frame.title = \"Code Play preview\";\n frame.style.width = \"100%\";\n frame.style.minHeight = \"12rem\";\n frame.style.border = \"0\";\n stdio.append(frame);\n }\n }\n const provenance = element.querySelector('[data-panel=\"provenance\"]');\n if (provenance) {\n provenance.innerHTML = renderProvenanceHtml(result.provenance);\n }\n const timing = element.querySelector('[data-panel=\"timing\"]');\n if (timing) {\n timing.innerHTML = renderTimingHtml(result.timing);\n }\n const stderr = element.querySelector('[data-panel=\"stderr\"]');\n if (stderr) {\n stderr.innerHTML = renderStderrHtml(result);\n }\n showPanel(element, resultPanelToShow(result, Boolean(stderr)));\n}\n\nexport function resultPanelToShow(result: RunResult, hasStderrPanel: boolean): \"stderr\" | \"stdio\" {\n if (!hasStderrPanel) {\n return \"stdio\";\n }\n const hasErrorDiagnostics = result.diagnostics.some(\n (diagnostic) => diagnostic.severity === \"error\",\n );\n if (hasErrorDiagnostics || (result.status !== \"ok\" && Boolean(result.stderr))) {\n return \"stderr\";\n }\n return \"stdio\";\n}\n\nfunction showPanel(element: HTMLElement, panel: string): void {\n const compact = Boolean(element.querySelector(\".ox-code-play--compact\"));\n for (const tab of element.querySelectorAll(\"[data-ox-panel]\")) {\n tab.setAttribute(\n \"aria-selected\",\n tab.getAttribute(\"data-ox-panel\") === panel ? \"true\" : \"false\",\n );\n }\n for (const node of element.querySelectorAll<HTMLElement>(\".ox-code-play__panel\")) {\n const id = node.dataset.panel;\n if (compact && (id === \"stdio\" || id === \"stderr\")) {\n node.hidden = false;\n continue;\n }\n node.hidden = id !== panel;\n }\n}\n\nfunction readForm(form: HTMLFormElement): Record<string, unknown> {\n const data = new FormData(form);\n const config: Record<string, unknown> = {};\n for (const [key, value] of data.entries()) {\n config[key] = value === \"on\" ? true : value;\n }\n for (const input of form.querySelectorAll<HTMLInputElement>('input[type=\"checkbox\"]')) {\n config[input.name] = input.checked;\n }\n return config;\n}\n\nfunction createCodePlayFromPayloads(root: ParentNode) {\n const languages: Record<string, true> = {};\n let endpoints;\n for (const element of queryWidgets(root)) {\n try {\n const payload = decodePayload(element.getAttribute(\"data-ox-code-play\") ?? \"\");\n languages[payload.language] = true;\n endpoints = payload.endpoints ?? endpoints;\n } catch {\n // Ignore malformed widgets so one bad payload cannot block the page.\n }\n }\n return createCodePlay({ languages, endpoints });\n}\n\nfunction queryWidgets(root: ParentNode): HTMLElement[] {\n return [...root.querySelectorAll<HTMLElement>(\"[data-ox-code-play]\")];\n}\n\nfunction ensureStyles(): void {\n if (typeof document === \"undefined\" || document.getElementById(STYLE_ID)) {\n return;\n }\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = CODE_PLAY_STYLES;\n document.head.append(style);\n}\n\nfunction defaultRoot(): ParentNode {\n if (typeof document === \"undefined\") {\n throw new Error(\"hydrateCodePlay() needs a DOM root.\");\n }\n return document;\n}\n\nexport { encodePayload, decodePayload };\n"],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as bootCodePlay } from "./boot.mjs";
|
|
2
2
|
import { C as TimingReport, D as ViewerFlags, S as StdioStream, T as TransportResponse, _ as RunResult, a as resolveCodePlayOptions, b as SessionInput, c as CodePlayTransport, d as LanguageDefinition, f as LanguageEnable, h as Provenance, i as ResolvedCodePlayOptions, l as ConfigField, m as PlaygroundEndpoints, n as DEFAULT_VIEWERS, o as AdapterResult, p as PlayPayload, r as RawCodePlayOptions, s as CodePlayPreset, t as DEFAULT_ENDPOINTS, u as Diagnostic, w as TransportRequest, x as StdioEvent } from "./config.mjs";
|
|
3
|
-
import { a as
|
|
3
|
+
import { a as decodePayload, c as CodePlayClientOptions, l as createCodePlay, n as hydrateCodePlay, o as encodePayload, r as mountCodePlay, s as CodePlayClient, u as CodePlaySession } from "./hydrate.mjs";
|
|
4
4
|
import { CodePlayOptions as CodePlayPluginOptions, codePlay } from "./plugin.mjs";
|
|
5
5
|
//#region src/catalog.d.ts
|
|
6
6
|
declare const LANGUAGE_CATALOG: LanguageDefinition[];
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { c as createMemoryTransport, d as withStdioText, f as PhaseTracker, l as joinStream, n as createCodePlay, r as CodePlaySession, s as createFetchTransport, u as selectStream } from "./client.mjs";
|
|
2
2
|
import { d as LANGUAGE_CATALOG, f as listLanguages, n as encodePayload, o as DEFAULT_ENDPOINTS, p as resolveLanguage, s as DEFAULT_VIEWERS, t as decodePayload, u as resolveCodePlayOptions } from "./payload.mjs";
|
|
3
3
|
import { a as stripPlayMeta, i as rewritePlayFences, n as parseCodePlayTags, o as enhanceGeneratedModule, r as parsePlayFences, s as enhancePlayHtml, t as codePlay } from "./plugin2.mjs";
|
|
4
|
-
import { a as
|
|
4
|
+
import { a as renderConfigHtml, c as renderStderrHtml, d as CODE_PLAY_STYLES, i as renderPlayUi, l as renderStdioHtml, n as mountCodePlay, o as renderDiagnosticsHtml, s as renderProvenanceHtml, t as hydrateCodePlay, u as renderTimingHtml } from "./hydrate2.mjs";
|
|
5
5
|
import { t as bootCodePlay } from "./boot.mjs";
|
|
6
6
|
export { CODE_PLAY_STYLES, CodePlaySession, DEFAULT_ENDPOINTS, DEFAULT_VIEWERS, LANGUAGE_CATALOG, PhaseTracker, bootCodePlay, codePlay, createCodePlay, createFetchTransport, createMemoryTransport, decodePayload, encodePayload, enhanceGeneratedModule, enhancePlayHtml, hydrateCodePlay, joinStream, listLanguages, mountCodePlay, parseCodePlayTags, parsePlayFences, renderConfigHtml, renderDiagnosticsHtml, renderPlayUi, renderProvenanceHtml, renderStderrHtml, renderStdioHtml, renderTimingHtml, resolveCodePlayOptions, resolveLanguage, rewritePlayFences, selectStream, stripPlayMeta, withStdioText };
|
package/dist/payload.mjs
CHANGED
|
@@ -378,7 +378,11 @@ function escapeHtml(value) {
|
|
|
378
378
|
});
|
|
379
379
|
}
|
|
380
380
|
function decodeHtml(value) {
|
|
381
|
-
return value.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, "\"").replace(/'/g, "'").replace(/&/g, "&");
|
|
381
|
+
return value.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, "\"").replace(/'/g, "'").replace(/&#x([0-9a-fA-F]+);/g, (_, hex) => decodeCodePoint(hex, 16)).replace(/&#(\d+);/g, (_, dec) => decodeCodePoint(dec, 10)).replace(/&/g, "&");
|
|
382
|
+
}
|
|
383
|
+
function decodeCodePoint(digits, radix) {
|
|
384
|
+
const code = Number.parseInt(digits, radix);
|
|
385
|
+
return Number.isFinite(code) ? String.fromCodePoint(code) : "";
|
|
382
386
|
}
|
|
383
387
|
function escapeAttribute(value) {
|
|
384
388
|
return escapeHtml(value).replace(/`/g, "`");
|
package/dist/payload.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload.mjs","names":[],"sources":["../src/catalog.ts","../src/config.ts","../src/escape.ts","../src/payload.ts"],"sourcesContent":["import type { ConfigField, LanguageDefinition } from \"./types\";\n\nconst rustSchema: ConfigField[] = [\n {\n key: \"channel\",\n label: \"Channel\",\n type: \"select\",\n options: [\n { value: \"stable\", label: \"stable\" },\n { value: \"beta\", label: \"beta\" },\n { value: \"nightly\", label: \"nightly\" },\n ],\n default: \"stable\",\n },\n {\n key: \"edition\",\n label: \"Edition\",\n type: \"select\",\n options: [\n { value: \"2018\", label: \"2018\" },\n { value: \"2021\", label: \"2021\" },\n { value: \"2024\", label: \"2024\" },\n ],\n default: \"2024\",\n },\n {\n key: \"mode\",\n label: \"Mode\",\n type: \"select\",\n options: [\n { value: \"debug\", label: \"debug\" },\n { value: \"release\", label: \"release\" },\n ],\n default: \"debug\",\n },\n {\n key: \"crateType\",\n label: \"Crate type\",\n type: \"select\",\n options: [\n { value: \"auto\", label: \"auto\" },\n { value: \"bin\", label: \"bin\" },\n { value: \"lib\", label: \"lib\" },\n ],\n default: \"auto\",\n },\n];\n\nconst tsSchema: ConfigField[] = [\n { key: \"strict\", label: \"Strict\", type: \"boolean\", default: true },\n {\n key: \"target\",\n label: \"Target\",\n type: \"select\",\n options: [\n { value: \"ES2020\", label: \"ES2020\" },\n { value: \"ES2022\", label: \"ES2022\" },\n { value: \"ESNext\", label: \"ESNext\" },\n ],\n default: \"ES2022\",\n },\n {\n key: \"jsx\",\n label: \"JSX\",\n type: \"select\",\n options: [\n { value: \"react-jsx\", label: \"react-jsx\" },\n { value: \"preserve\", label: \"preserve\" },\n ],\n default: \"react-jsx\",\n },\n];\n\nfunction remote(\n id: string,\n name: string,\n aliases: string[],\n pistonLanguage: string,\n extra: ConfigField[] = [],\n): LanguageDefinition {\n return {\n id,\n name,\n aliases,\n capabilities: { execute: true, typecheck: false },\n defaultConfig: { version: \"*\" },\n configSchema: [\n { key: \"version\", label: \"Runtime version\", type: \"string\", default: \"*\" },\n ...extra,\n ],\n backend: \"remote\",\n remote: { pistonLanguage },\n };\n}\n\nfunction framework(\n id: \"vue\" | \"react\" | \"svelte\" | \"solid\",\n name: string,\n aliases: string[],\n): LanguageDefinition {\n return {\n id,\n name,\n aliases,\n capabilities: { execute: true, typecheck: false },\n defaultConfig: {},\n configSchema: [],\n backend: \"framework\",\n framework: id,\n };\n}\n\nexport const LANGUAGE_CATALOG: LanguageDefinition[] = [\n {\n id: \"typescript\",\n name: \"TypeScript\",\n aliases: [\"ts\", \"tsx\", \"mts\", \"cts\"],\n capabilities: { execute: true, typecheck: true },\n defaultConfig: { strict: true, target: \"ES2022\", jsx: \"react-jsx\" },\n configSchema: tsSchema,\n backend: \"typescript\",\n },\n {\n id: \"javascript\",\n name: \"JavaScript\",\n aliases: [\"js\", \"jsx\", \"mjs\", \"cjs\"],\n capabilities: { execute: true, typecheck: false },\n defaultConfig: {},\n configSchema: [],\n backend: \"javascript\",\n },\n {\n id: \"rust\",\n name: \"Rust\",\n aliases: [\"rs\"],\n capabilities: { execute: true, typecheck: true },\n defaultConfig: { channel: \"stable\", edition: \"2024\", mode: \"debug\", crateType: \"auto\" },\n configSchema: rustSchema,\n backend: \"rust-playground\",\n },\n {\n id: \"go\",\n name: \"Go\",\n aliases: [\"golang\"],\n capabilities: { execute: true, typecheck: true },\n defaultConfig: { withVet: true },\n configSchema: [{ key: \"withVet\", label: \"Run vet\", type: \"boolean\", default: true }],\n backend: \"go-playground\",\n },\n framework(\"vue\", \"Vue\", [\"vue\"]),\n framework(\"react\", \"React\", [\"react\"]),\n framework(\"svelte\", \"Svelte\", [\"svelte\"]),\n framework(\"solid\", \"Solid\", [\"solid\"]),\n remote(\"python\", \"Python\", [\"py\"], \"python\"),\n remote(\"php\", \"PHP\", [], \"php\"),\n remote(\"ruby\", \"Ruby\", [\"rb\"], \"ruby\"),\n remote(\"sh\", \"sh\", [\"bash\", \"shell\", \"zsh\"], \"bash\", [\n {\n key: \"shell\",\n label: \"Shell\",\n type: \"select\",\n options: [\n { value: \"bash\", label: \"bash\" },\n { value: \"sh\", label: \"sh\" },\n ],\n default: \"bash\",\n },\n ]),\n remote(\"java\", \"Java\", [], \"java\"),\n remote(\"swift\", \"Swift\", [], \"swift\"),\n remote(\"kotlin\", \"Kotlin\", [\"kt\"], \"kotlin\"),\n remote(\"c\", \"C\", [], \"c\"),\n remote(\"cpp\", \"C++\", [\"c++\", \"cc\", \"cxx\"], \"c++\", [\n {\n key: \"std\",\n label: \"Standard\",\n type: \"select\",\n options: [\n { value: \"c++17\", label: \"C++17\" },\n { value: \"c++20\", label: \"C++20\" },\n { value: \"c++23\", label: \"C++23\" },\n ],\n default: \"c++20\",\n },\n ]),\n remote(\"zig\", \"Zig\", [], \"zig\"),\n remote(\"haskell\", \"Haskell\", [\"hs\"], \"haskell\"),\n remote(\"ocaml\", \"OCaml\", [\"ml\"], \"ocaml\"),\n remote(\"csharp\", \"C#\", [\"cs\", \"c#\"], \"csharp\"),\n remote(\"elixir\", \"Elixir\", [\"ex\"], \"elixir\"),\n remote(\"fsharp\", \"F#\", [\"fs\", \"f#\"], \"fsharp\"),\n remote(\"clojure\", \"Clojure\", [\"clj\", \"cloujure\"], \"clojure\"),\n remote(\"scheme\", \"Scheme\", [\"scm\"], \"scheme\"),\n remote(\"moonbit\", \"MoonBit\", [\"mbt\"], \"moonbit\"),\n remote(\"lean\", \"Lean\", [\"lean4\"], \"lean\"),\n remote(\"rocq\", \"Rocq\", [\"coq\"], \"coq\"),\n];\n\nconst byId = new Map(LANGUAGE_CATALOG.map((language) => [language.id, language]));\nconst byAlias = new Map<string, LanguageDefinition>();\nfor (const language of LANGUAGE_CATALOG) {\n byAlias.set(language.id, language);\n for (const alias of language.aliases) {\n byAlias.set(alias.toLowerCase(), language);\n }\n}\n\nexport function resolveLanguage(input: string): LanguageDefinition | undefined {\n return byAlias.get(input.trim().toLowerCase()) ?? byId.get(input.trim().toLowerCase());\n}\n\nexport function listLanguages(): LanguageDefinition[] {\n return LANGUAGE_CATALOG.slice();\n}\n","import { listLanguages, resolveLanguage } from \"./catalog\";\nimport type {\n CodePlayPreset,\n LanguageEnable,\n PlaygroundEndpoints,\n ResolvedLanguageEnable,\n ViewerFlags,\n} from \"./types\";\n\nexport interface ResolvedCodePlayOptions {\n languages: Map<string, ResolvedLanguageEnable>;\n timeoutMs: number;\n ui: CodePlayPreset;\n viewers: ViewerFlags;\n endpoints: PlaygroundEndpoints;\n srcDir?: string;\n outDir?: string;\n base: string;\n proxy: boolean;\n}\n\nexport interface RawCodePlayOptions {\n languages?: Record<string, LanguageEnable>;\n timeoutMs?: number;\n ui?: CodePlayPreset;\n viewers?: Partial<ViewerFlags>;\n endpoints?: Partial<PlaygroundEndpoints>;\n srcDir?: string;\n outDir?: string;\n base?: string;\n proxy?: boolean;\n}\n\nexport const DEFAULT_ENDPOINTS: PlaygroundEndpoints = {\n rust: \"https://play.rust-lang.org/execute\",\n go: \"https://play.golang.org/compile\",\n};\n\n/** Vite dev middleware only. Not present in production SSG output. */\nexport const DEV_TYPECHECK_PATH = \"/__ox-code-play/typecheck\";\n\nexport const DEFAULT_VIEWERS: ViewerFlags = {\n config: true,\n stdio: true,\n stderr: true,\n provenance: true,\n timing: true,\n};\n\nexport function resolveCodePlayOptions(options: RawCodePlayOptions = {}): ResolvedCodePlayOptions {\n return {\n languages: resolveEnabledLanguages(options.languages ?? {}),\n timeoutMs: options.timeoutMs ?? 10_000,\n ui: options.ui ?? \"default\",\n viewers: { ...DEFAULT_VIEWERS, ...options.viewers },\n endpoints: { ...DEFAULT_ENDPOINTS, ...options.endpoints },\n srcDir: options.srcDir,\n outDir: options.outDir,\n base: normalizeBase(options.base ?? \"/\"),\n proxy: options.proxy ?? true,\n };\n}\n\nexport function resolveEnabledLanguages(\n languages: Record<string, LanguageEnable>,\n): Map<string, ResolvedLanguageEnable> {\n const resolved = new Map<string, ResolvedLanguageEnable>();\n for (const [key, enable] of Object.entries(languages)) {\n if (enable === false) {\n continue;\n }\n const definition = resolveLanguage(key);\n if (!definition) {\n throw new Error(`Unknown Code Play language: ${key}.`);\n }\n const explicit = enable === true ? {} : enable;\n resolved.set(definition.id, {\n id: definition.id,\n execute: explicit.execute ?? definition.capabilities.execute,\n typecheck: explicit.typecheck ?? definition.capabilities.typecheck,\n endpoint: explicit.endpoint,\n config: { ...definition.defaultConfig, ...explicit.config },\n });\n }\n return resolved;\n}\n\nexport function mergeConfig(\n languageId: string,\n enabled: ResolvedLanguageEnable | undefined,\n override?: Record<string, unknown>,\n): Record<string, unknown> {\n const definition = resolveLanguage(languageId);\n return {\n ...definition?.defaultConfig,\n ...enabled?.config,\n ...override,\n };\n}\n\nexport function enabledLanguageIds(): string[] {\n return listLanguages().map((language) => language.id);\n}\n\nfunction normalizeBase(base: string): string {\n if (base === \"/\" || base === \"\") {\n return \"/\";\n }\n return base.endsWith(\"/\") ? base : `${base}/`;\n}\n","export function escapeHtml(value: string): string {\n return value.replace(/[&<>\"']/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&\";\n case \"<\":\n return \"<\";\n case \">\":\n return \">\";\n case '\"':\n return \""\";\n default:\n return \"'\";\n }\n });\n}\n\nexport function decodeHtml(value: string): string {\n return value\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\");\n}\n\nexport function escapeAttribute(value: string): string {\n return escapeHtml(value).replace(/`/g, \"`\");\n}\n","import { DEFAULT_VIEWERS } from \"./config\";\nimport type { PlayPayload } from \"./types\";\n\nexport function encodePayload(payload: PlayPayload): string {\n return bytesToBase64(new TextEncoder().encode(JSON.stringify(payload)));\n}\n\nexport function decodePayload(value: string): PlayPayload {\n const json = new TextDecoder().decode(base64ToBytes(value));\n const parsed = JSON.parse(json) as PlayPayload;\n if (!parsed || typeof parsed !== \"object\" || typeof parsed.language !== \"string\") {\n throw new Error(\"Invalid Code Play payload.\");\n }\n return {\n ...parsed,\n viewers: { ...DEFAULT_VIEWERS, ...parsed.viewers },\n };\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes).toString(\"base64\");\n }\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n}\n\nfunction base64ToBytes(value: string): Uint8Array {\n if (typeof Buffer !== \"undefined\") {\n return new Uint8Array(Buffer.from(value, \"base64\"));\n }\n const binary = atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"payload.mjs","names":[],"sources":["../src/catalog.ts","../src/config.ts","../src/escape.ts","../src/payload.ts"],"sourcesContent":["import type { ConfigField, LanguageDefinition } from \"./types\";\n\nconst rustSchema: ConfigField[] = [\n {\n key: \"channel\",\n label: \"Channel\",\n type: \"select\",\n options: [\n { value: \"stable\", label: \"stable\" },\n { value: \"beta\", label: \"beta\" },\n { value: \"nightly\", label: \"nightly\" },\n ],\n default: \"stable\",\n },\n {\n key: \"edition\",\n label: \"Edition\",\n type: \"select\",\n options: [\n { value: \"2018\", label: \"2018\" },\n { value: \"2021\", label: \"2021\" },\n { value: \"2024\", label: \"2024\" },\n ],\n default: \"2024\",\n },\n {\n key: \"mode\",\n label: \"Mode\",\n type: \"select\",\n options: [\n { value: \"debug\", label: \"debug\" },\n { value: \"release\", label: \"release\" },\n ],\n default: \"debug\",\n },\n {\n key: \"crateType\",\n label: \"Crate type\",\n type: \"select\",\n options: [\n { value: \"auto\", label: \"auto\" },\n { value: \"bin\", label: \"bin\" },\n { value: \"lib\", label: \"lib\" },\n ],\n default: \"auto\",\n },\n];\n\nconst tsSchema: ConfigField[] = [\n { key: \"strict\", label: \"Strict\", type: \"boolean\", default: true },\n {\n key: \"target\",\n label: \"Target\",\n type: \"select\",\n options: [\n { value: \"ES2020\", label: \"ES2020\" },\n { value: \"ES2022\", label: \"ES2022\" },\n { value: \"ESNext\", label: \"ESNext\" },\n ],\n default: \"ES2022\",\n },\n {\n key: \"jsx\",\n label: \"JSX\",\n type: \"select\",\n options: [\n { value: \"react-jsx\", label: \"react-jsx\" },\n { value: \"preserve\", label: \"preserve\" },\n ],\n default: \"react-jsx\",\n },\n];\n\nfunction remote(\n id: string,\n name: string,\n aliases: string[],\n pistonLanguage: string,\n extra: ConfigField[] = [],\n): LanguageDefinition {\n return {\n id,\n name,\n aliases,\n capabilities: { execute: true, typecheck: false },\n defaultConfig: { version: \"*\" },\n configSchema: [\n { key: \"version\", label: \"Runtime version\", type: \"string\", default: \"*\" },\n ...extra,\n ],\n backend: \"remote\",\n remote: { pistonLanguage },\n };\n}\n\nfunction framework(\n id: \"vue\" | \"react\" | \"svelte\" | \"solid\",\n name: string,\n aliases: string[],\n): LanguageDefinition {\n return {\n id,\n name,\n aliases,\n capabilities: { execute: true, typecheck: false },\n defaultConfig: {},\n configSchema: [],\n backend: \"framework\",\n framework: id,\n };\n}\n\nexport const LANGUAGE_CATALOG: LanguageDefinition[] = [\n {\n id: \"typescript\",\n name: \"TypeScript\",\n aliases: [\"ts\", \"tsx\", \"mts\", \"cts\"],\n capabilities: { execute: true, typecheck: true },\n defaultConfig: { strict: true, target: \"ES2022\", jsx: \"react-jsx\" },\n configSchema: tsSchema,\n backend: \"typescript\",\n },\n {\n id: \"javascript\",\n name: \"JavaScript\",\n aliases: [\"js\", \"jsx\", \"mjs\", \"cjs\"],\n capabilities: { execute: true, typecheck: false },\n defaultConfig: {},\n configSchema: [],\n backend: \"javascript\",\n },\n {\n id: \"rust\",\n name: \"Rust\",\n aliases: [\"rs\"],\n capabilities: { execute: true, typecheck: true },\n defaultConfig: { channel: \"stable\", edition: \"2024\", mode: \"debug\", crateType: \"auto\" },\n configSchema: rustSchema,\n backend: \"rust-playground\",\n },\n {\n id: \"go\",\n name: \"Go\",\n aliases: [\"golang\"],\n capabilities: { execute: true, typecheck: true },\n defaultConfig: { withVet: true },\n configSchema: [{ key: \"withVet\", label: \"Run vet\", type: \"boolean\", default: true }],\n backend: \"go-playground\",\n },\n framework(\"vue\", \"Vue\", [\"vue\"]),\n framework(\"react\", \"React\", [\"react\"]),\n framework(\"svelte\", \"Svelte\", [\"svelte\"]),\n framework(\"solid\", \"Solid\", [\"solid\"]),\n remote(\"python\", \"Python\", [\"py\"], \"python\"),\n remote(\"php\", \"PHP\", [], \"php\"),\n remote(\"ruby\", \"Ruby\", [\"rb\"], \"ruby\"),\n remote(\"sh\", \"sh\", [\"bash\", \"shell\", \"zsh\"], \"bash\", [\n {\n key: \"shell\",\n label: \"Shell\",\n type: \"select\",\n options: [\n { value: \"bash\", label: \"bash\" },\n { value: \"sh\", label: \"sh\" },\n ],\n default: \"bash\",\n },\n ]),\n remote(\"java\", \"Java\", [], \"java\"),\n remote(\"swift\", \"Swift\", [], \"swift\"),\n remote(\"kotlin\", \"Kotlin\", [\"kt\"], \"kotlin\"),\n remote(\"c\", \"C\", [], \"c\"),\n remote(\"cpp\", \"C++\", [\"c++\", \"cc\", \"cxx\"], \"c++\", [\n {\n key: \"std\",\n label: \"Standard\",\n type: \"select\",\n options: [\n { value: \"c++17\", label: \"C++17\" },\n { value: \"c++20\", label: \"C++20\" },\n { value: \"c++23\", label: \"C++23\" },\n ],\n default: \"c++20\",\n },\n ]),\n remote(\"zig\", \"Zig\", [], \"zig\"),\n remote(\"haskell\", \"Haskell\", [\"hs\"], \"haskell\"),\n remote(\"ocaml\", \"OCaml\", [\"ml\"], \"ocaml\"),\n remote(\"csharp\", \"C#\", [\"cs\", \"c#\"], \"csharp\"),\n remote(\"elixir\", \"Elixir\", [\"ex\"], \"elixir\"),\n remote(\"fsharp\", \"F#\", [\"fs\", \"f#\"], \"fsharp\"),\n remote(\"clojure\", \"Clojure\", [\"clj\", \"cloujure\"], \"clojure\"),\n remote(\"scheme\", \"Scheme\", [\"scm\"], \"scheme\"),\n remote(\"moonbit\", \"MoonBit\", [\"mbt\"], \"moonbit\"),\n remote(\"lean\", \"Lean\", [\"lean4\"], \"lean\"),\n remote(\"rocq\", \"Rocq\", [\"coq\"], \"coq\"),\n];\n\nconst byId = new Map(LANGUAGE_CATALOG.map((language) => [language.id, language]));\nconst byAlias = new Map<string, LanguageDefinition>();\nfor (const language of LANGUAGE_CATALOG) {\n byAlias.set(language.id, language);\n for (const alias of language.aliases) {\n byAlias.set(alias.toLowerCase(), language);\n }\n}\n\nexport function resolveLanguage(input: string): LanguageDefinition | undefined {\n return byAlias.get(input.trim().toLowerCase()) ?? byId.get(input.trim().toLowerCase());\n}\n\nexport function listLanguages(): LanguageDefinition[] {\n return LANGUAGE_CATALOG.slice();\n}\n","import { listLanguages, resolveLanguage } from \"./catalog\";\nimport type {\n CodePlayPreset,\n LanguageEnable,\n PlaygroundEndpoints,\n ResolvedLanguageEnable,\n ViewerFlags,\n} from \"./types\";\n\nexport interface ResolvedCodePlayOptions {\n languages: Map<string, ResolvedLanguageEnable>;\n timeoutMs: number;\n ui: CodePlayPreset;\n viewers: ViewerFlags;\n endpoints: PlaygroundEndpoints;\n srcDir?: string;\n outDir?: string;\n base: string;\n proxy: boolean;\n}\n\nexport interface RawCodePlayOptions {\n languages?: Record<string, LanguageEnable>;\n timeoutMs?: number;\n ui?: CodePlayPreset;\n viewers?: Partial<ViewerFlags>;\n endpoints?: Partial<PlaygroundEndpoints>;\n srcDir?: string;\n outDir?: string;\n base?: string;\n proxy?: boolean;\n}\n\nexport const DEFAULT_ENDPOINTS: PlaygroundEndpoints = {\n rust: \"https://play.rust-lang.org/execute\",\n go: \"https://play.golang.org/compile\",\n};\n\n/** Vite dev middleware only. Not present in production SSG output. */\nexport const DEV_TYPECHECK_PATH = \"/__ox-code-play/typecheck\";\n\nexport const DEFAULT_VIEWERS: ViewerFlags = {\n config: true,\n stdio: true,\n stderr: true,\n provenance: true,\n timing: true,\n};\n\nexport function resolveCodePlayOptions(options: RawCodePlayOptions = {}): ResolvedCodePlayOptions {\n return {\n languages: resolveEnabledLanguages(options.languages ?? {}),\n timeoutMs: options.timeoutMs ?? 10_000,\n ui: options.ui ?? \"default\",\n viewers: { ...DEFAULT_VIEWERS, ...options.viewers },\n endpoints: { ...DEFAULT_ENDPOINTS, ...options.endpoints },\n srcDir: options.srcDir,\n outDir: options.outDir,\n base: normalizeBase(options.base ?? \"/\"),\n proxy: options.proxy ?? true,\n };\n}\n\nexport function resolveEnabledLanguages(\n languages: Record<string, LanguageEnable>,\n): Map<string, ResolvedLanguageEnable> {\n const resolved = new Map<string, ResolvedLanguageEnable>();\n for (const [key, enable] of Object.entries(languages)) {\n if (enable === false) {\n continue;\n }\n const definition = resolveLanguage(key);\n if (!definition) {\n throw new Error(`Unknown Code Play language: ${key}.`);\n }\n const explicit = enable === true ? {} : enable;\n resolved.set(definition.id, {\n id: definition.id,\n execute: explicit.execute ?? definition.capabilities.execute,\n typecheck: explicit.typecheck ?? definition.capabilities.typecheck,\n endpoint: explicit.endpoint,\n config: { ...definition.defaultConfig, ...explicit.config },\n });\n }\n return resolved;\n}\n\nexport function mergeConfig(\n languageId: string,\n enabled: ResolvedLanguageEnable | undefined,\n override?: Record<string, unknown>,\n): Record<string, unknown> {\n const definition = resolveLanguage(languageId);\n return {\n ...definition?.defaultConfig,\n ...enabled?.config,\n ...override,\n };\n}\n\nexport function enabledLanguageIds(): string[] {\n return listLanguages().map((language) => language.id);\n}\n\nfunction normalizeBase(base: string): string {\n if (base === \"/\" || base === \"\") {\n return \"/\";\n }\n return base.endsWith(\"/\") ? base : `${base}/`;\n}\n","export function escapeHtml(value: string): string {\n return value.replace(/[&<>\"']/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&\";\n case \"<\":\n return \"<\";\n case \">\":\n return \">\";\n case '\"':\n return \""\";\n default:\n return \"'\";\n }\n });\n}\n\nexport function decodeHtml(value: string): string {\n return value\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&#x([0-9a-fA-F]+);/g, (_, hex: string) => decodeCodePoint(hex, 16))\n .replace(/&#(\\d+);/g, (_, dec: string) => decodeCodePoint(dec, 10))\n .replace(/&/g, \"&\");\n}\n\nfunction decodeCodePoint(digits: string, radix: number): string {\n const code = Number.parseInt(digits, radix);\n return Number.isFinite(code) ? String.fromCodePoint(code) : \"\";\n}\n\nexport function escapeAttribute(value: string): string {\n return escapeHtml(value).replace(/`/g, \"`\");\n}\n","import { DEFAULT_VIEWERS } from \"./config\";\nimport type { PlayPayload } from \"./types\";\n\nexport function encodePayload(payload: PlayPayload): string {\n return bytesToBase64(new TextEncoder().encode(JSON.stringify(payload)));\n}\n\nexport function decodePayload(value: string): PlayPayload {\n const json = new TextDecoder().decode(base64ToBytes(value));\n const parsed = JSON.parse(json) as PlayPayload;\n if (!parsed || typeof parsed !== \"object\" || typeof parsed.language !== \"string\") {\n throw new Error(\"Invalid Code Play payload.\");\n }\n return {\n ...parsed,\n viewers: { ...DEFAULT_VIEWERS, ...parsed.viewers },\n };\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes).toString(\"base64\");\n }\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n}\n\nfunction base64ToBytes(value: string): Uint8Array {\n if (typeof Buffer !== \"undefined\") {\n return new Uint8Array(Buffer.from(value, \"base64\"));\n }\n const binary = atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n"],"mappings":";AAEA,MAAM,aAA4B;CAChC;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,SAAS;GACP;IAAE,OAAO;IAAU,OAAO;GAAS;GACnC;IAAE,OAAO;IAAQ,OAAO;GAAO;GAC/B;IAAE,OAAO;IAAW,OAAO;GAAU;EACvC;EACA,SAAS;CACX;CACA;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,SAAS;GACP;IAAE,OAAO;IAAQ,OAAO;GAAO;GAC/B;IAAE,OAAO;IAAQ,OAAO;GAAO;GAC/B;IAAE,OAAO;IAAQ,OAAO;GAAO;EACjC;EACA,SAAS;CACX;CACA;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,SAAS,CACP;GAAE,OAAO;GAAS,OAAO;EAAQ,GACjC;GAAE,OAAO;GAAW,OAAO;EAAU,CACvC;EACA,SAAS;CACX;CACA;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,SAAS;GACP;IAAE,OAAO;IAAQ,OAAO;GAAO;GAC/B;IAAE,OAAO;IAAO,OAAO;GAAM;GAC7B;IAAE,OAAO;IAAO,OAAO;GAAM;EAC/B;EACA,SAAS;CACX;AACF;AAEA,MAAM,WAA0B;CAC9B;EAAE,KAAK;EAAU,OAAO;EAAU,MAAM;EAAW,SAAS;CAAK;CACjE;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,SAAS;GACP;IAAE,OAAO;IAAU,OAAO;GAAS;GACnC;IAAE,OAAO;IAAU,OAAO;GAAS;GACnC;IAAE,OAAO;IAAU,OAAO;GAAS;EACrC;EACA,SAAS;CACX;CACA;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,SAAS,CACP;GAAE,OAAO;GAAa,OAAO;EAAY,GACzC;GAAE,OAAO;GAAY,OAAO;EAAW,CACzC;EACA,SAAS;CACX;AACF;AAEA,SAAS,OACP,IACA,MACA,SACA,gBACA,QAAuB,CAAC,GACJ;CACpB,OAAO;EACL;EACA;EACA;EACA,cAAc;GAAE,SAAS;GAAM,WAAW;EAAM;EAChD,eAAe,EAAE,SAAS,IAAI;EAC9B,cAAc,CACZ;GAAE,KAAK;GAAW,OAAO;GAAmB,MAAM;GAAU,SAAS;EAAI,GACzE,GAAG,KACL;EACA,SAAS;EACT,QAAQ,EAAE,eAAe;CAC3B;AACF;AAEA,SAAS,UACP,IACA,MACA,SACoB;CACpB,OAAO;EACL;EACA;EACA;EACA,cAAc;GAAE,SAAS;GAAM,WAAW;EAAM;EAChD,eAAe,CAAC;EAChB,cAAc,CAAC;EACf,SAAS;EACT,WAAW;CACb;AACF;AAEA,MAAa,mBAAyC;CACpD;EACE,IAAI;EACJ,MAAM;EACN,SAAS;GAAC;GAAM;GAAO;GAAO;EAAK;EACnC,cAAc;GAAE,SAAS;GAAM,WAAW;EAAK;EAC/C,eAAe;GAAE,QAAQ;GAAM,QAAQ;GAAU,KAAK;EAAY;EAClE,cAAc;EACd,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,SAAS;GAAC;GAAM;GAAO;GAAO;EAAK;EACnC,cAAc;GAAE,SAAS;GAAM,WAAW;EAAM;EAChD,eAAe,CAAC;EAChB,cAAc,CAAC;EACf,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,SAAS,CAAC,IAAI;EACd,cAAc;GAAE,SAAS;GAAM,WAAW;EAAK;EAC/C,eAAe;GAAE,SAAS;GAAU,SAAS;GAAQ,MAAM;GAAS,WAAW;EAAO;EACtF,cAAc;EACd,SAAS;CACX;CACA;EACE,IAAI;EACJ,MAAM;EACN,SAAS,CAAC,QAAQ;EAClB,cAAc;GAAE,SAAS;GAAM,WAAW;EAAK;EAC/C,eAAe,EAAE,SAAS,KAAK;EAC/B,cAAc,CAAC;GAAE,KAAK;GAAW,OAAO;GAAW,MAAM;GAAW,SAAS;EAAK,CAAC;EACnF,SAAS;CACX;CACA,UAAU,OAAO,OAAO,CAAC,KAAK,CAAC;CAC/B,UAAU,SAAS,SAAS,CAAC,OAAO,CAAC;CACrC,UAAU,UAAU,UAAU,CAAC,QAAQ,CAAC;CACxC,UAAU,SAAS,SAAS,CAAC,OAAO,CAAC;CACrC,OAAO,UAAU,UAAU,CAAC,IAAI,GAAG,QAAQ;CAC3C,OAAO,OAAO,OAAO,CAAC,GAAG,KAAK;CAC9B,OAAO,QAAQ,QAAQ,CAAC,IAAI,GAAG,MAAM;CACrC,OAAO,MAAM,MAAM;EAAC;EAAQ;EAAS;CAAK,GAAG,QAAQ,CACnD;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,SAAS,CACP;GAAE,OAAO;GAAQ,OAAO;EAAO,GAC/B;GAAE,OAAO;GAAM,OAAO;EAAK,CAC7B;EACA,SAAS;CACX,CACF,CAAC;CACD,OAAO,QAAQ,QAAQ,CAAC,GAAG,MAAM;CACjC,OAAO,SAAS,SAAS,CAAC,GAAG,OAAO;CACpC,OAAO,UAAU,UAAU,CAAC,IAAI,GAAG,QAAQ;CAC3C,OAAO,KAAK,KAAK,CAAC,GAAG,GAAG;CACxB,OAAO,OAAO,OAAO;EAAC;EAAO;EAAM;CAAK,GAAG,OAAO,CAChD;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,SAAS;GACP;IAAE,OAAO;IAAS,OAAO;GAAQ;GACjC;IAAE,OAAO;IAAS,OAAO;GAAQ;GACjC;IAAE,OAAO;IAAS,OAAO;GAAQ;EACnC;EACA,SAAS;CACX,CACF,CAAC;CACD,OAAO,OAAO,OAAO,CAAC,GAAG,KAAK;CAC9B,OAAO,WAAW,WAAW,CAAC,IAAI,GAAG,SAAS;CAC9C,OAAO,SAAS,SAAS,CAAC,IAAI,GAAG,OAAO;CACxC,OAAO,UAAU,MAAM,CAAC,MAAM,IAAI,GAAG,QAAQ;CAC7C,OAAO,UAAU,UAAU,CAAC,IAAI,GAAG,QAAQ;CAC3C,OAAO,UAAU,MAAM,CAAC,MAAM,IAAI,GAAG,QAAQ;CAC7C,OAAO,WAAW,WAAW,CAAC,OAAO,UAAU,GAAG,SAAS;CAC3D,OAAO,UAAU,UAAU,CAAC,KAAK,GAAG,QAAQ;CAC5C,OAAO,WAAW,WAAW,CAAC,KAAK,GAAG,SAAS;CAC/C,OAAO,QAAQ,QAAQ,CAAC,OAAO,GAAG,MAAM;CACxC,OAAO,QAAQ,QAAQ,CAAC,KAAK,GAAG,KAAK;AACvC;AAEA,MAAM,OAAO,IAAI,IAAI,iBAAiB,KAAK,aAAa,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC;AAChF,MAAM,0BAAU,IAAI,IAAgC;AACpD,KAAK,MAAM,YAAY,kBAAkB;CACvC,QAAQ,IAAI,SAAS,IAAI,QAAQ;CACjC,KAAK,MAAM,SAAS,SAAS,SAC3B,QAAQ,IAAI,MAAM,YAAY,GAAG,QAAQ;AAE7C;AAEA,SAAgB,gBAAgB,OAA+C;CAC7E,OAAO,QAAQ,IAAI,MAAM,KAAK,CAAC,CAAC,YAAY,CAAC,KAAK,KAAK,IAAI,MAAM,KAAK,CAAC,CAAC,YAAY,CAAC;AACvF;AAEA,SAAgB,gBAAsC;CACpD,OAAO,iBAAiB,MAAM;AAChC;;;ACpLA,MAAa,oBAAyC;CACpD,MAAM;CACN,IAAI;AACN;;AAGA,MAAa,qBAAqB;AAElC,MAAa,kBAA+B;CAC1C,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,QAAQ;AACV;AAEA,SAAgB,uBAAuB,UAA8B,CAAC,GAA4B;CAChG,OAAO;EACL,WAAW,wBAAwB,QAAQ,aAAa,CAAC,CAAC;EAC1D,WAAW,QAAQ,aAAa;EAChC,IAAI,QAAQ,MAAM;EAClB,SAAS;GAAE,GAAG;GAAiB,GAAG,QAAQ;EAAQ;EAClD,WAAW;GAAE,GAAG;GAAmB,GAAG,QAAQ;EAAU;EACxD,QAAQ,QAAQ;EAChB,QAAQ,QAAQ;EAChB,MAAM,cAAc,QAAQ,QAAQ,GAAG;EACvC,OAAO,QAAQ,SAAS;CAC1B;AACF;AAEA,SAAgB,wBACd,WACqC;CACrC,MAAM,2BAAW,IAAI,IAAoC;CACzD,KAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,SAAS,GAAG;EACrD,IAAI,WAAW,OACb;EAEF,MAAM,aAAa,gBAAgB,GAAG;EACtC,IAAI,CAAC,YACH,MAAM,IAAI,MAAM,+BAA+B,IAAI,EAAE;EAEvD,MAAM,WAAW,WAAW,OAAO,CAAC,IAAI;EACxC,SAAS,IAAI,WAAW,IAAI;GAC1B,IAAI,WAAW;GACf,SAAS,SAAS,WAAW,WAAW,aAAa;GACrD,WAAW,SAAS,aAAa,WAAW,aAAa;GACzD,UAAU,SAAS;GACnB,QAAQ;IAAE,GAAG,WAAW;IAAe,GAAG,SAAS;GAAO;EAC5D,CAAC;CACH;CACA,OAAO;AACT;AAEA,SAAgB,YACd,YACA,SACA,UACyB;CAEzB,OAAO;EACL,GAFiB,gBAAgB,UAErB,CAAC,EAAE;EACf,GAAG,SAAS;EACZ,GAAG;CACL;AACF;AAMA,SAAS,cAAc,MAAsB;CAC3C,IAAI,SAAS,OAAO,SAAS,IAC3B,OAAO;CAET,OAAO,KAAK,SAAS,GAAG,IAAI,OAAO,GAAG,KAAK;AAC7C;;;AC7GA,SAAgB,WAAW,OAAuB;CAChD,OAAO,MAAM,QAAQ,aAAa,SAAS;EACzC,QAAQ,MAAR;GACE,KAAK,KACH,OAAO;GACT,KAAK,KACH,OAAO;GACT,KAAK,KACH,OAAO;GACT,KAAK,MACH,OAAO;GACT,SACE,OAAO;EACX;CACF,CAAC;AACH;AAEA,SAAgB,WAAW,OAAuB;CAChD,OAAO,MACJ,QAAQ,SAAS,GAAG,CAAC,CACrB,QAAQ,SAAS,GAAG,CAAC,CACrB,QAAQ,WAAW,IAAG,CAAC,CACvB,QAAQ,UAAU,GAAG,CAAC,CACtB,QAAQ,wBAAwB,GAAG,QAAgB,gBAAgB,KAAK,EAAE,CAAC,CAAC,CAC5E,QAAQ,cAAc,GAAG,QAAgB,gBAAgB,KAAK,EAAE,CAAC,CAAC,CAClE,QAAQ,UAAU,GAAG;AAC1B;AAEA,SAAS,gBAAgB,QAAgB,OAAuB;CAC9D,MAAM,OAAO,OAAO,SAAS,QAAQ,KAAK;CAC1C,OAAO,OAAO,SAAS,IAAI,IAAI,OAAO,cAAc,IAAI,IAAI;AAC9D;AAEA,SAAgB,gBAAgB,OAAuB;CACrD,OAAO,WAAW,KAAK,CAAC,CAAC,QAAQ,MAAM,OAAO;AAChD;;;AChCA,SAAgB,cAAc,SAA8B;CAC1D,OAAO,cAAc,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,UAAU,OAAO,CAAC,CAAC;AACxE;AAEA,SAAgB,cAAc,OAA4B;CACxD,MAAM,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,cAAc,KAAK,CAAC;CAC1D,MAAM,SAAS,KAAK,MAAM,IAAI;CAC9B,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,OAAO,OAAO,aAAa,UACtE,MAAM,IAAI,MAAM,4BAA4B;CAE9C,OAAO;EACL,GAAG;EACH,SAAS;GAAE,GAAG;GAAiB,GAAG,OAAO;EAAQ;CACnD;AACF;AAEA,SAAS,cAAc,OAA2B;CAChD,IAAI,OAAO,WAAW,aACpB,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,QAAQ;CAE7C,IAAI,SAAS;CACb,KAAK,MAAM,QAAQ,OACjB,UAAU,OAAO,aAAa,IAAI;CAEpC,OAAO,KAAK,MAAM;AACpB;AAEA,SAAS,cAAc,OAA2B;CAChD,IAAI,OAAO,WAAW,aACpB,OAAO,IAAI,WAAW,OAAO,KAAK,OAAO,QAAQ,CAAC;CAEpD,MAAM,SAAS,KAAK,KAAK;CACzB,MAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;CAC1C,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAClD,MAAM,SAAS,OAAO,WAAW,KAAK;CAExC,OAAO;AACT"}
|