From 6bd410c886d77344c5bca4b85791c2cebf0648bd Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 12 Dec 2017 22:11:27 -0500 Subject: [PATCH 1/2] implement preload --- src/generators/Generator.ts | 4 ++++ src/generators/dom/index.ts | 2 ++ src/generators/server-side-rendering/index.ts | 2 ++ src/validate/js/propValidators/index.ts | 2 ++ src/validate/js/propValidators/preload.ts | 13 +++++++++++++ .../samples/ssr-no-oncreate-etc/expected-bundle.js | 6 ++++++ test/js/samples/ssr-no-oncreate-etc/expected.js | 6 ++++++ test/js/samples/ssr-no-oncreate-etc/input.html | 4 ++++ test/runtime/samples/preload/_config.js | 6 ++++++ test/runtime/samples/preload/main.html | 9 +++++++++ 10 files changed, 54 insertions(+) create mode 100644 src/validate/js/propValidators/preload.ts create mode 100644 test/runtime/samples/preload/_config.js create mode 100644 test/runtime/samples/preload/main.html diff --git a/src/generators/Generator.ts b/src/generators/Generator.ts index a11a8d962a..363f5118ec 100644 --- a/src/generators/Generator.ts +++ b/src/generators/Generator.ts @@ -598,6 +598,10 @@ export default class Generator { addDeclaration('ondestroy', templateProperties.ondestroy.value); } + if (templateProperties.preload) { + addDeclaration('preload', templateProperties.preload.value); + } + if (templateProperties.props) { this.props = templateProperties.props.value.elements.map((element: Node) => element.value); } diff --git a/src/generators/dom/index.ts b/src/generators/dom/index.ts index 9566ba936f..e3a982df3f 100644 --- a/src/generators/dom/index.ts +++ b/src/generators/dom/index.ts @@ -358,6 +358,8 @@ export default function dom( ` : (!sharedPath && `${name}.prototype._recompute = @noop;`)} ${templateProperties.setup && `%setup(${name});`} + + ${templateProperties.preload && `${name}.preload = %preload;`} `); const usedHelpers = new Set(); diff --git a/src/generators/server-side-rendering/index.ts b/src/generators/server-side-rendering/index.ts index db2e8085d6..22242999ed 100644 --- a/src/generators/server-side-rendering/index.ts +++ b/src/generators/server-side-rendering/index.ts @@ -162,6 +162,8 @@ export default function ssr( }; }; + ${templateProperties.preload && `${name}.preload = %preload;`} + ${ // TODO this is a bit hacky /__escape/.test(generator.renderCode) && deindent` diff --git a/src/validate/js/propValidators/index.ts b/src/validate/js/propValidators/index.ts index 89ccd36f14..9ba12c0dad 100644 --- a/src/validate/js/propValidators/index.ts +++ b/src/validate/js/propValidators/index.ts @@ -9,6 +9,7 @@ import methods from './methods'; import components from './components'; import events from './events'; import namespace from './namespace'; +import preload from './preload'; import props from './props'; import tag from './tag'; import transitions from './transitions'; @@ -26,6 +27,7 @@ export default { components, events, namespace, + preload, props, tag, transitions, diff --git a/src/validate/js/propValidators/preload.ts b/src/validate/js/propValidators/preload.ts new file mode 100644 index 0000000000..22ff2ccf0e --- /dev/null +++ b/src/validate/js/propValidators/preload.ts @@ -0,0 +1,13 @@ +import { Validator } from '../../'; +import { Node } from '../../../interfaces'; + +const validTypes = new Set([ + 'FunctionExpression', + 'ArrowFunctionExpression', + 'Identifier', + 'MemberExpression' +]); + +export default function preload(validator: Validator, prop: Node) { + // not sure there's anything we need to check here... +} diff --git a/test/js/samples/ssr-no-oncreate-etc/expected-bundle.js b/test/js/samples/ssr-no-oncreate-etc/expected-bundle.js index b570c5687c..514e40d54a 100644 --- a/test/js/samples/ssr-no-oncreate-etc/expected-bundle.js +++ b/test/js/samples/ssr-no-oncreate-etc/expected-bundle.js @@ -1,3 +1,7 @@ +function preload(input) { + return output; +} + var SvelteComponent = {}; SvelteComponent.data = function() { @@ -20,4 +24,6 @@ SvelteComponent.renderCss = function() { }; }; +SvelteComponent.preload = preload; + module.exports = SvelteComponent; diff --git a/test/js/samples/ssr-no-oncreate-etc/expected.js b/test/js/samples/ssr-no-oncreate-etc/expected.js index 3a5162aaf3..735d359a1f 100644 --- a/test/js/samples/ssr-no-oncreate-etc/expected.js +++ b/test/js/samples/ssr-no-oncreate-etc/expected.js @@ -1,5 +1,9 @@ "use strict"; +function preload(input) { + return output; +}; + var SvelteComponent = {};; SvelteComponent.data = function() { @@ -22,4 +26,6 @@ SvelteComponent.renderCss = function() { }; }; +SvelteComponent.preload = preload; + module.exports = SvelteComponent; \ No newline at end of file diff --git a/test/js/samples/ssr-no-oncreate-etc/input.html b/test/js/samples/ssr-no-oncreate-etc/input.html index f8c26b5825..a1e4fa7548 100644 --- a/test/js/samples/ssr-no-oncreate-etc/input.html +++ b/test/js/samples/ssr-no-oncreate-etc/input.html @@ -18,6 +18,10 @@ swipe(node, callback) { // TODO implement } + }, + + preload(input) { + return output; } }; \ No newline at end of file diff --git a/test/runtime/samples/preload/_config.js b/test/runtime/samples/preload/_config.js new file mode 100644 index 0000000000..bfc7f6ee7c --- /dev/null +++ b/test/runtime/samples/preload/_config.js @@ -0,0 +1,6 @@ +export default { + test(assert, component) { + const Component = component.constructor; + assert.deepEqual(Component.preload({ foo: 1 }), { bar: 2 }); + } +}; \ No newline at end of file diff --git a/test/runtime/samples/preload/main.html b/test/runtime/samples/preload/main.html new file mode 100644 index 0000000000..ef3f260679 --- /dev/null +++ b/test/runtime/samples/preload/main.html @@ -0,0 +1,9 @@ + \ No newline at end of file From 1edd0e171cab1fd37af3d42ae9da2b9291ca58c5 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 12 Dec 2017 22:13:33 -0500 Subject: [PATCH 2/2] remove unused code --- src/validate/js/propValidators/preload.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/validate/js/propValidators/preload.ts b/src/validate/js/propValidators/preload.ts index 22ff2ccf0e..afcbe79bf1 100644 --- a/src/validate/js/propValidators/preload.ts +++ b/src/validate/js/propValidators/preload.ts @@ -1,13 +1,6 @@ import { Validator } from '../../'; import { Node } from '../../../interfaces'; -const validTypes = new Set([ - 'FunctionExpression', - 'ArrowFunctionExpression', - 'Identifier', - 'MemberExpression' -]); - export default function preload(validator: Validator, prop: Node) { // not sure there's anything we need to check here... }