diff --git a/src/Repl.vue b/src/Repl.vue index 66138ec7..0994db39 100644 --- a/src/Repl.vue +++ b/src/Repl.vue @@ -19,6 +19,7 @@ export interface Props { autoResize?: boolean showCompileOutput?: boolean showImportMap?: boolean + showSsrOutput?: boolean showTsConfig?: boolean clearConsole?: boolean layout?: 'horizontal' | 'vertical' @@ -54,6 +55,7 @@ const props = withDefaults(defineProps(), { autoResize: true, showCompileOutput: true, showImportMap: true, + showSsrOutput: false, showTsConfig: true, clearConsole: true, layoutReverse: false, @@ -105,6 +107,7 @@ defineExpose({ reload }) ref="output" :editor-component="editor" :show-compile-output="props.showCompileOutput" + :show-ssr-output="props.showSsrOutput" :ssr="!!props.ssr" /> diff --git a/src/output/Output.vue b/src/output/Output.vue index 62085293..fc31d5b3 100644 --- a/src/output/Output.vue +++ b/src/output/Output.vue @@ -1,6 +1,7 @@ + + + + diff --git a/src/output/srcdoc.html b/src/output/srcdoc.html index 189c19ca..75fa51b3 100644 --- a/src/output/srcdoc.html +++ b/src/output/srcdoc.html @@ -35,7 +35,8 @@ const send_message = (payload) => parent.postMessage({ ...payload }, ev.origin) const send_reply = (payload) => send_message({ ...payload, cmd_id }) - const send_ok = () => send_reply({ action: 'cmd_ok' }) + const send_ok = (response) => + send_reply({ action: 'cmd_ok', args: response }) const send_error = (message, stack) => send_reply({ action: 'cmd_error', message, stack }) @@ -65,7 +66,11 @@ scriptEls.push(scriptEl) await done } - send_ok() + if (window.__ssr_promise__) { + send_ok(await window.__ssr_promise__) + } else { + send_ok() + } } catch (e) { send_error(e.message, e.stack) } diff --git a/src/store.ts b/src/store.ts index 2508b679..0c2949ad 100644 --- a/src/store.ts +++ b/src/store.ts @@ -368,6 +368,7 @@ export function useStore( showOutput, outputMode, sfcOptions, + ssrOutput: { html: '', context: '' }, compiler, loading, vueVersion, @@ -429,6 +430,10 @@ export type StoreState = ToRefs<{ showOutput: boolean outputMode: OutputModes sfcOptions: SFCOptions + ssrOutput: { + html: string + context: unknown + } /** `@vue/compiler-sfc` */ compiler: typeof defaultCompiler /* only apply for compiler-sfc */ @@ -474,6 +479,7 @@ export type Store = Pick< | 'showOutput' | 'outputMode' | 'sfcOptions' + | 'ssrOutput' | 'compiler' | 'vueVersion' | 'locale' diff --git a/src/types.ts b/src/types.ts index 19b8c609..7018ca63 100644 --- a/src/types.ts +++ b/src/types.ts @@ -13,7 +13,7 @@ export interface EditorEmits { } export type EditorComponentType = Component -export type OutputModes = 'preview' | EditorMode +export type OutputModes = 'preview' | 'ssr output' | EditorMode export const injectKeyProps: InjectionKey< ToRefs> diff --git a/test/main.ts b/test/main.ts index 85cce24f..5480c576 100644 --- a/test/main.ts +++ b/test/main.ts @@ -60,6 +60,7 @@ const App = { editor: MonacoEditor, // layout: 'vertical', ssr: true, + showSsrOutput: true, sfcOptions: { script: { // inlineTemplate: false