shuffle things around

pull/1864/head
Rich Harris 7 years ago
parent 8d3fd4d1f6
commit ae3a7dd369

@ -1,7 +1,7 @@
export { export {
onMount, onMount,
onDestroy, onDestroy,
beforeRender, beforeUpdate,
afterRender, afterUpdate,
createEventDispatcher createEventDispatcher
} from './internal.js'; } from './internal.js';

@ -133,6 +133,7 @@ export default function dom(
const debug_name = `<${component.customElement ? component.tag : name}>`; const debug_name = `<${component.customElement ? component.tag : name}>`;
const not_equal = component.options.immutable ? `@not_equal` : `@safe_not_equal`; const not_equal = component.options.immutable ? `@not_equal` : `@safe_not_equal`;
let dev_props_check;
if (component.options.dev) { if (component.options.dev) {
// TODO check no uunexpected props were passed, as well as // TODO check no uunexpected props were passed, as well as
@ -142,17 +143,14 @@ export default function dom(
.filter(name => !component.initialised_declarations.has(name)); .filter(name => !component.initialised_declarations.has(name));
if (expected.length) { if (expected.length) {
body.push(deindent` dev_props_check = deindent`
$$checkProps() { const state = this.$$.get();
const state = this.$$.get(); ${expected.map(name => deindent`
${expected.map(name => deindent`
if (state.${name} === undefined) {
if (state.${name} === undefined) { console.warn("${debug_name} was created without expected data property '${name}'");
console.warn("${debug_name} was created without expected data property '${name}'"); }`)}
} `;
`)}
}
`);
} }
} }
@ -180,7 +178,7 @@ export default function dom(
}); });
builder.addBlock(deindent` builder.addBlock(deindent`
function $$create_fragment(${component.alias('component')}, ctx) { function create_fragment(${component.alias('component')}, ctx) {
${block.getContents()} ${block.getContents()}
} }
@ -188,7 +186,7 @@ export default function dom(
${component.fully_hoisted.length > 0 && component.fully_hoisted.join('\n\n')} ${component.fully_hoisted.length > 0 && component.fully_hoisted.join('\n\n')}
function $$init($$self, $$make_dirty) { function define($$self, $$make_dirty) {
${should_add_css && ${should_add_css &&
`if (!document.getElementById("${component.stylesheet.id}-style")) @add_css();`} `if (!document.getElementById("${component.stylesheet.id}-style")) @add_css();`}
@ -206,7 +204,10 @@ export default function dom(
class ${name} extends ${superclass} { class ${name} extends ${superclass} {
constructor(options) { constructor(options) {
super(options, $$init, $$create_fragment, ${not_equal}); super(${options.dev && `options`});
@init(this, options, define, create_fragment, ${not_equal});
${dev_props_check}
} }
${body.join('\n\n')} ${body.join('\n\n')}

@ -9,7 +9,9 @@ export function bind(component, name, callback) {
callback(component.$$.get()[name]); callback(component.$$.get()[name]);
} }
export function mount_component({ $$: { fragment }}, target, anchor, hydrate) { export function mount_component(component, target, anchor, hydrate) {
const { fragment, refs, inject_refs, on_mount, on_destroy, after_render } = component.$$;
if (hydrate) { if (hydrate) {
fragment.l(children(target)); fragment.l(children(target));
fragment.m(target, anchor); // TODO can we avoid moving DOM? fragment.m(target, anchor); // TODO can we avoid moving DOM?
@ -18,24 +20,24 @@ export function mount_component({ $$: { fragment }}, target, anchor, hydrate) {
fragment[fragment.i ? 'i' : 'm'](target, anchor); fragment[fragment.i ? 'i' : 'm'](target, anchor);
} }
component.$$.inject_refs(component.$$.refs); inject_refs(refs);
// onMount happens after the initial afterUpdate. Because // onMount happens after the initial afterUpdate. Because
// afterUpdate callbacks happen in reverse order (inner first) // afterUpdate callbacks happen in reverse order (inner first)
// we schedule onMount callbacks before afterUpdate callbacks // we schedule onMount callbacks before afterUpdate callbacks
add_render_callback(() => { add_render_callback(() => {
const onDestroy = component.$$.on_mount.map(run).filter(is_function); const new_on_destroy = on_mount.map(run).filter(is_function);
if (component.$$.on_destroy) { if (on_destroy) {
component.$$.on_destroy.push(...onDestroy); on_destroy.push(...new_on_destroy);
} else { } else {
// Edge case — component was destroyed immediately, // Edge case — component was destroyed immediately,
// most likely as a result of a binding initialising // most likely as a result of a binding initialising
run_all(onDestroy); run_all(new_on_destroy);
} }
component.$$.on_mount = []; component.$$.on_mount = [];
}); });
component.$$.after_render.forEach(add_render_callback); after_render.forEach(add_render_callback);
} }
function destroy(component, detach) { function destroy(component, detach) {
@ -58,57 +60,57 @@ function make_dirty(component, key) {
component.$$.dirty[key] = true; component.$$.dirty[key] = true;
} }
export class $$Component { export function init(component, options, define, create_fragment, not_equal) {
constructor(options, init, create_fragment, not_equal) { const previous_component = current_component;
const previous_component = current_component; set_current_component(component);
set_current_component(this);
component.$$ = {
this.$$ = { fragment: null,
fragment: null,
// state
// state get: null,
get: null, set: noop,
set: noop, inject_refs: noop,
inject_refs: noop, not_equal,
not_equal, bound: blankObject(),
bound: blankObject(),
// lifecycle
// lifecycle on_mount: [],
on_mount: [], on_destroy: [],
on_destroy: [], before_render: [],
before_render: [], after_render: [],
after_render: [],
// everything else
// everything else callbacks: blankObject(),
callbacks: blankObject(), slotted: options.slots || {},
slotted: options.slots || {}, refs: {},
refs: {}, dirty: null,
dirty: null, binding_groups: []
binding_groups: [] };
};
define(component, key => {
init(this, key => { make_dirty(component, key);
make_dirty(this, key); if (component.$$.bound[key]) component.$$.bound[key](component.$$.get()[key]);
if (this.$$.bound[key]) this.$$.bound[key](this.$$.get()[key]); });
});
if (options.props) {
this.$$.set(options.props);
}
run_all(this.$$.before_render); if (options.props) {
this.$$.fragment = create_fragment(this, this.$$.get()); component.$$.set(options.props);
}
if (options.target) { run_all(component.$$.before_render);
intro.enabled = !!options.intro; component.$$.fragment = create_fragment(component, component.$$.get());
mount_component(this, options.target, options.anchor, options.hydrate);
flush();
intro.enabled = true;
}
set_current_component(previous_component); if (options.target) {
intro.enabled = !!options.intro;
mount_component(component, options.target, options.anchor, options.hydrate);
flush();
intro.enabled = true;
} }
set_current_component(previous_component);
}
export class $$Component {
$destroy() { $destroy() {
destroy(this, true); destroy(this, true);
this.$destroy = noop; this.$destroy = noop;
@ -141,8 +143,7 @@ export class $$ComponentDev extends $$Component {
throw new Error(`'target' is a required option`); throw new Error(`'target' is a required option`);
} }
super(...arguments); super();
this.$$checkProps();
} }
$destroy() { $destroy() {
@ -151,8 +152,4 @@ export class $$ComponentDev extends $$Component {
console.warn(`Component was already destroyed`); console.warn(`Component was already destroyed`);
}; };
} }
$$checkProps() {
// noop by default
}
} }

@ -1,10 +1,10 @@
<script> <script>
import { afterRender } from 'svelte'; import { afterUpdate } from 'svelte';
export let value; export let value;
let mirror; let mirror;
afterRender(() => { afterUpdate(() => {
mirror = value; mirror = value;
}); });
</script> </script>

@ -1,12 +1,12 @@
<script> <script>
import { afterRender } from 'svelte'; import { afterUpdate } from 'svelte';
export let a; export let a;
export let b; export let b;
export let value; export let value;
afterRender(() => { afterUpdate(() => {
b.textContent = a.textContent; b.textContent = a.textContent;
}); });
</script> </script>

@ -1,10 +1,10 @@
<script> <script>
import { beforeRender } from 'svelte'; import { beforeUpdate } from 'svelte';
export let item; export let item;
export let foo = 'XX'; export let foo = 'XX';
beforeRender(() => { beforeUpdate(() => {
foo = item; foo = item;
}); });
</script> </script>

@ -1,10 +1,10 @@
<script> <script>
import { beforeRender } from 'svelte'; import { beforeUpdate } from 'svelte';
export let value; export let value;
let mirror; let mirror;
beforeRender(() => { beforeUpdate(() => {
mirror = value; mirror = value;
}); });
</script> </script>

@ -1,5 +1,5 @@
<script> <script>
import { beforeRender } from 'svelte'; import { beforeUpdate } from 'svelte';
import Editor from './Editor.html'; import Editor from './Editor.html';
import ComponentSelector from './ComponentSelector.html'; import ComponentSelector from './ComponentSelector.html';
@ -10,7 +10,7 @@
let previouslySelectedComponent; let previouslySelectedComponent;
beforeRender(() => { beforeUpdate(() => {
components.forEach(component => { components.forEach(component => {
if (component === selectedComponent) return; if (component === selectedComponent) return;
component.compiled = component.source.toUpperCase(); component.compiled = component.source.toUpperCase();

@ -1,11 +1,11 @@
<script> <script>
import { beforeRender } from 'svelte'; import { beforeUpdate } from 'svelte';
import Nested from './Nested.html'; import Nested from './Nested.html';
export let snapshots; export let snapshots;
export let visibleThings = []; export let visibleThings = [];
beforeRender(() => { beforeUpdate(() => {
if (!snapshots) { if (!snapshots) {
// first run // first run
snapshots = []; snapshots = [];

@ -1,5 +1,5 @@
<script> <script>
import { beforeRender, onMount } from 'svelte'; import { beforeUpdate, onMount } from 'svelte';
let mounted; let mounted;
export let count = 0; export let count = 0;
@ -9,7 +9,7 @@
mounted = true; mounted = true;
}); });
beforeRender(() => { beforeUpdate(() => {
if (mounted) count += 1; if (mounted) count += 1;
}); });
</script> </script>

@ -5,9 +5,9 @@ export default {
test({ assert, component, target }) { test({ assert, component, target }) {
assert.deepEqual(order, [ assert.deepEqual(order, [
'beforeRender', 'beforeUpdate',
'render', 'render',
'afterRender', 'afterUpdate',
'onMount' 'onMount'
]); ]);

@ -1,5 +1,5 @@
<script> <script>
import { onMount, beforeRender, afterRender } from 'svelte'; import { onMount, beforeUpdate, afterUpdate } from 'svelte';
import order from './order.js'; import order from './order.js';
@ -8,12 +8,12 @@
return x; return x;
} }
beforeRender(() => { beforeUpdate(() => {
order.push('beforeRender'); order.push('beforeUpdate');
}); });
afterRender(() => { afterUpdate(() => {
order.push('afterRender'); order.push('afterUpdate');
}); });
onMount(() => { onMount(() => {

@ -1,10 +1,10 @@
<script> <script>
import { beforeRender } from 'svelte'; import { beforeUpdate } from 'svelte';
export let foo; export let foo;
export let bar; export let bar;
beforeRender(() => { beforeUpdate(() => {
if (foo.x !== bar.x) { if (foo.x !== bar.x) {
throw new Error('mismatch'); throw new Error('mismatch');
} }

@ -1,12 +1,12 @@
<script> <script>
import { beforeRender } from 'svelte'; import { beforeUpdate } from 'svelte';
import Widget from './Widget.html'; import Widget from './Widget.html';
export let foo = { x: 1 }; export let foo = { x: 1 };
export let bar = { x: 1 }; export let bar = { x: 1 };
beforeRender(() => { beforeUpdate(() => {
bar = foo; bar = foo;
}); });
</script> </script>

@ -1,10 +1,10 @@
<script> <script>
import { beforeRender } from 'svelte'; import { beforeUpdate } from 'svelte';
export let foo = 1; export let foo = 1;
export let bar; export let bar;
beforeRender(() => { beforeUpdate(() => {
bar = foo * 2; bar = foo * 2;
}); });
</script> </script>

@ -4,7 +4,7 @@ export default {
oncreate: true, oncreate: true,
onDestroy: false, onDestroy: false,
onstate: false, onstate: false,
afterRender: false afterUpdate: false
}); });
} }
}; };

@ -1,5 +1,5 @@
<script> <script>
import { beforeRender } from 'svelte'; import { beforeUpdate } from 'svelte';
beforeRender(() => console.log('updating')); beforeUpdate(() => console.log('updating'));
</script> </script>

@ -1,5 +1,5 @@
<script> <script>
import { afterRender } from 'svelte'; import { afterUpdate } from 'svelte';
afterRender(() => console.log('updating')); afterUpdate(() => console.log('updating'));
</script> </script>

@ -1,6 +1,6 @@
[{ [{
"code": "invalid-afterRender-property", "code": "invalid-afterUpdate-property",
"message": "'afterRender' should be a function expression, not an arrow function expression", "message": "'afterUpdate' should be a function expression, not an arrow function expression",
"pos": 29, "pos": 29,
"start": { "start": {
"line": 3, "line": 3,

@ -1,6 +1,6 @@
<script> <script>
export default { export default {
afterRender: () => { afterUpdate: () => {
this.set({ a: 1 }); this.set({ a: 1 });
} }
}; };

Loading…
Cancel
Save