Skip to content
This repository was archived by the owner on Oct 29, 2024. It is now read-only.

Commit 716d8c0

Browse files
authored
Merge pull request #312 from chiragpat/ssr_builder
Add new option to output rehydratable markup from @glimmer/ssr
2 parents f1b2329 + bf7234d commit 716d8c0

File tree

3 files changed

+20
-5
lines changed

3 files changed

+20
-5
lines changed

packages/@glimmer/core/src/render-component/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
EnvironmentOptions,
1515
WithStaticLayout,
1616
Environment,
17+
ElementBuilder,
1718
} from '@glimmer/interfaces';
1819
import { artifacts } from '@glimmer/program';
1920
import { syntaxCompilationContext } from '@glimmer/opcode-compiler';
@@ -129,10 +130,11 @@ export function getTemplateIterator(
129130
envOptions: EnvironmentOptions,
130131
envDelegate: EnvironmentDelegate,
131132
componentArgs: Dict<unknown> = {},
132-
owner = DEFAULT_OWNER
133+
owner = DEFAULT_OWNER,
134+
builderFactory: (env: Environment, cursor: GlimmerCursor) => ElementBuilder = clientBuilder
133135
): { iterator: TemplateIterator; env: Environment } {
134136
const runtime = runtimeContext(envOptions, envDelegate, sharedArtifacts, resolver);
135-
const builder = clientBuilder(runtime.env, {
137+
const builder = builderFactory(runtime.env, {
136138
element,
137139
nextSibling: null,
138140
} as GlimmerCursor);

packages/@glimmer/ssr/src/render.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import voidMap from '@simple-dom/void-map';
66
import { PassThrough } from 'stream';
77
import { parse } from 'url';
88
import { BaseEnvDelegate } from '@glimmer/core';
9-
import { NodeDOMTreeConstruction } from '@glimmer/node';
10-
import { DOMChanges, renderSync } from '@glimmer/runtime';
9+
import { NodeDOMTreeConstruction, serializeBuilder } from '@glimmer/node';
10+
import { clientBuilder, DOMChanges, renderSync } from '@glimmer/runtime';
1111

1212
/**
1313
* Server-side environment that can be used to configure the glimmer-vm to work
@@ -28,6 +28,7 @@ export interface RenderOptions {
2828
args?: Dict<unknown>;
2929
serializer?: HTMLSerializer;
3030
owner?: object;
31+
rehydrate?: boolean;
3132
}
3233

3334
const defaultSerializer = new HTMLSerializer(voidMap);
@@ -66,7 +67,8 @@ export function renderToStream(
6667
{ appendOperations, updateOperations },
6768
new ServerEnvDelegate(),
6869
options.args,
69-
options.owner
70+
options.owner,
71+
options.rehydrate ? serializeBuilder : clientBuilder
7072
);
7173
renderSync(env, iterator);
7274

packages/@glimmer/ssr/test/render-options-tests.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,15 @@ QUnit.module('@glimmer/ssr rendering', () => {
2323

2424
assert.equal(output, '<h1>Goodbye World</h1>');
2525
});
26+
27+
QUnit.test('setting rehydrate option outputs the block stacks', async (assert) => {
28+
class MyComponent extends Component {}
29+
setComponentTemplate(createTemplate(`<h1>Hello World</h1>`), MyComponent);
30+
const output = await renderToString(MyComponent, { rehydrate: true });
31+
32+
assert.equal(
33+
output,
34+
'<!--%+b:0%--><!--%+b:1%--><h1>Hello World</h1><!--%-b:1%--><!--%-b:0%-->'
35+
);
36+
});
2637
});

0 commit comments

Comments
 (0)