From c54b6d09f7629b54def0207cb0e5b9401452de49 Mon Sep 17 00:00:00 2001 From: Efthymis Sarmpanis Date: Wed, 22 Nov 2017 22:01:42 +0200 Subject: [PATCH] Add support for intercepting different file extensions, other than .html, in ssr. Proposal for #939 --- src/server-side-rendering/register.js | 29 ++++++++++++++----- test/server-side-rendering/index.js | 12 ++++++-- .../Widget.svelte | 1 + .../_expected.html | 1 + .../main.svelte | 11 +++++++ 5 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 test/server-side-rendering/samples/component-with-different-extension/Widget.svelte create mode 100644 test/server-side-rendering/samples/component-with-different-extension/_expected.html create mode 100644 test/server-side-rendering/samples/component-with-different-extension/main.svelte diff --git a/src/server-side-rendering/register.js b/src/server-side-rendering/register.js index 442888e99e5d..9dfea5bb6f93 100644 --- a/src/server-side-rendering/register.js +++ b/src/server-side-rendering/register.js @@ -6,12 +6,25 @@ function capitalise(name) { return name[0].toUpperCase() + name.slice(1); } -require.extensions['.html'] = function(module, filename) { - const { code } = compile(fs.readFileSync(filename, 'utf-8'), { - filename, - name: capitalise(path.basename(filename).replace(/\.html$/, '')), - generate: 'ssr' - }); +export default function register(extensions) { + _deregister('.html'); + extensions.forEach(_register); +} + +function _deregister(extension) { + delete require.extensions[extension]; +} + +function _register(extension) { + require.extensions[extension] = function(module, filename) { + const {code} = compile(fs.readFileSync(filename, 'utf-8'), { + filename, + name: capitalise(path.basename(filename).replace(new RegExp(`${extension}$`), '')), + generate: 'ssr' + }); + + return module._compile(code, filename); + }; +} - return module._compile(code, filename); -}; +_register('.html'); diff --git a/test/server-side-rendering/index.js b/test/server-side-rendering/index.js index 008293427756..90ba3ca08265 100644 --- a/test/server-side-rendering/index.js +++ b/test/server-side-rendering/index.js @@ -23,7 +23,7 @@ describe("ssr", () => { before(() => { require(process.env.COVERAGE ? "../../src/server-side-rendering/register.js" - : "../../ssr/register"); + : "../../ssr/register")(['.svelte', '.html']); return setupHtmlEqual(); }); @@ -43,7 +43,15 @@ describe("ssr", () => { (solo ? it.only : it)(dir, () => { dir = path.resolve("test/server-side-rendering/samples", dir); try { - const component = require(`${dir}/main.html`); + let component; + + const mainHtmlFile = `${dir}/main.html`; + const mainSvelteFile = `${dir}/main.svelte`; + if (fs.existsSync(mainHtmlFile)) { + component = require(mainHtmlFile); + } else if(fs.existsSync(mainSvelteFile)) { + component = require(mainSvelteFile); + } const expectedHtml = tryToReadFile(`${dir}/_expected.html`); const expectedCss = tryToReadFile(`${dir}/_expected.css`) || ""; diff --git a/test/server-side-rendering/samples/component-with-different-extension/Widget.svelte b/test/server-side-rendering/samples/component-with-different-extension/Widget.svelte new file mode 100644 index 000000000000..460a2a1c0195 --- /dev/null +++ b/test/server-side-rendering/samples/component-with-different-extension/Widget.svelte @@ -0,0 +1 @@ +

i am a widget

diff --git a/test/server-side-rendering/samples/component-with-different-extension/_expected.html b/test/server-side-rendering/samples/component-with-different-extension/_expected.html new file mode 100644 index 000000000000..3551c5971edc --- /dev/null +++ b/test/server-side-rendering/samples/component-with-different-extension/_expected.html @@ -0,0 +1 @@ +

i am a widget

diff --git a/test/server-side-rendering/samples/component-with-different-extension/main.svelte b/test/server-side-rendering/samples/component-with-different-extension/main.svelte new file mode 100644 index 000000000000..4f02f2f94ea9 --- /dev/null +++ b/test/server-side-rendering/samples/component-with-different-extension/main.svelte @@ -0,0 +1,11 @@ +
+ +
+ +