Skip to content

Commit be68cd9

Browse files
committed
use store in SSR mode
1 parent f64e473 commit be68cd9

File tree

6 files changed

+41
-11
lines changed

6 files changed

+41
-11
lines changed

src/generators/server-side-rendering/index.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -73,16 +73,22 @@ export default function ssr(
7373
generator.stylesheet.render(options.filename, true);
7474

7575
// generate initial state object
76-
// TODO this doesn't work, because expectedProperties isn't populated
77-
const globals = Array.from(generator.expectedProperties).filter(prop => globalWhitelist.has(prop));
76+
const expectedProperties = Array.from(generator.expectedProperties);
77+
const globals = expectedProperties.filter(prop => globalWhitelist.has(prop));
78+
const storeProps = options.store ? expectedProperties.filter(prop => prop[0] === '$') : [];
79+
7880
const initialState = [];
7981
if (globals.length > 0) {
8082
initialState.push(`{ ${globals.map(prop => `${prop} : ${prop}`).join(', ')} }`);
8183
}
8284

85+
if (storeProps.length > 0) {
86+
initialState.push(`options.store._init([${storeProps.map(prop => `"${prop.slice(1)}"`)}])`);
87+
}
88+
8389
if (templateProperties.data) {
8490
initialState.push(`%data()`);
85-
} else if (globals.length === 0) {
91+
} else if (globals.length === 0 && storeProps.length === 0) {
8692
initialState.push('{}');
8793
}
8894

@@ -99,7 +105,7 @@ export default function ssr(
99105
return ${templateProperties.data ? `%data()` : `{}`};
100106
};
101107
102-
${name}.render = function(state, options) {
108+
${name}.render = function(state, options = {}) {
103109
state = Object.assign(${initialState.join(', ')});
104110
105111
${computations.map(

src/generators/server-side-rendering/visitors/Component.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@ export default function visitComponent(
7979

8080
let open = `\${${expression}.render({${props}}`;
8181

82+
const options = [];
83+
if (generator.options.store) {
84+
options.push(`store: options.store`);
85+
}
86+
8287
if (node.children.length) {
8388
const appendTarget: AppendTarget = {
8489
slots: { default: '' },
@@ -95,11 +100,15 @@ export default function visitComponent(
95100
.map(name => `${name}: () => \`${appendTarget.slots[name]}\``)
96101
.join(', ');
97102

98-
open += `, { slotted: { ${slotted} } }`;
103+
options.push(`slotted: { ${slotted} }`);
99104

100105
generator.appendTargets.pop();
101106
}
102107

108+
if (options.length) {
109+
open += `, { ${options.join(', ')} }`;
110+
}
111+
103112
generator.append(open);
104113
generator.append(')}');
105114
}

src/server-side-rendering/register.js

+10-2
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,22 @@ import * as fs from 'fs';
22
import * as path from 'path';
33
import { compile } from '../index.ts';
44

5+
const compileOptions = {};
6+
57
function capitalise(name) {
68
return name[0].toUpperCase() + name.slice(1);
79
}
810

911
export default function register(options) {
1012
const { extensions } = options;
13+
1114
if (extensions) {
1215
_deregister('.html');
1316
extensions.forEach(_register);
1417
}
18+
19+
// TODO make this the default and remove in v2
20+
if ('store' in options) compileOptions.store = options.store;
1521
}
1622

1723
function _deregister(extension) {
@@ -20,13 +26,15 @@ function _deregister(extension) {
2026

2127
function _register(extension) {
2228
require.extensions[extension] = function(module, filename) {
23-
const {code} = compile(fs.readFileSync(filename, 'utf-8'), {
29+
const options = Object.assign({}, compileOptions, {
2430
filename,
2531
name: capitalise(path.basename(filename)
2632
.replace(new RegExp(`${extension.replace('.', '\\.')}$`), '')),
27-
generate: 'ssr',
33+
generate: 'ssr'
2834
});
2935

36+
const {code} = compile(fs.readFileSync(filename, 'utf-8'), options);
37+
3038
return module._compile(code, filename);
3139
};
3240
}

test/js/samples/ssr-no-oncreate-etc/expected-bundle.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ SvelteComponent.data = function() {
44
return {};
55
};
66

7-
SvelteComponent.render = function(state, options) {
7+
SvelteComponent.render = function(state, options = {}) {
88
state = Object.assign({}, state);
99

1010
return ``.trim();

test/js/samples/ssr-no-oncreate-etc/expected.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ SvelteComponent.data = function() {
66
return {};
77
};
88

9-
SvelteComponent.render = function(state, options) {
9+
SvelteComponent.render = function(state, options = {}) {
1010
state = Object.assign({}, state);
1111

1212
return ``.trim();

test/server-side-rendering/index.js

+9-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ function tryToReadFile(file) {
2222
describe("ssr", () => {
2323
before(() => {
2424
require("../../ssr/register")({
25-
extensions: ['.svelte', '.html']
25+
extensions: ['.svelte', '.html'],
26+
store: true
2627
});
2728

2829
return setupHtmlEqual();
@@ -98,9 +99,15 @@ describe("ssr", () => {
9899
delete require.cache[resolved];
99100
});
100101

102+
require("../../ssr/register")({
103+
store: !!config.store
104+
});
105+
101106
try {
102107
const component = require(`../runtime/samples/${dir}/main.html`);
103-
const html = component.render(config.data);
108+
const html = component.render(config.data, {
109+
store: config.store
110+
});
104111

105112
if (config.html) {
106113
assert.htmlEqual(html, config.html);

0 commit comments

Comments
 (0)